1 /* 2 * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved. 3 * 4 * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in 5 * the the People's Republic of China and other countries. 6 * All Allwinner Technology Co.,Ltd. trademarks are used with permission. 7 * 8 * DISCLAIMER 9 * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT. 10 * IF YOU NEED TO INTEGRATE THIRD PARTY¡¯S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.) 11 * IN ALLWINNERS¡¯SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN 12 * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES. 13 * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS 14 * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE. 15 * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY¡¯S TECHNOLOGY. 16 * 17 * 18 * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT 19 * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND, 20 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING 21 * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE 22 * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 23 * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 26 * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 30 * OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 #ifndef __SUNXI_HTIMER_H__ 33 #define __SUNXI_HTIMER_H__ 34 35 #include <stdint.h> 36 #include <stdio.h> 37 #include "platform.h" 38 #include "irqs.h" 39 #include "aw_types.h" 40 #include <spinlock.h> 41 42 #ifdef __cplusplus 43 extern "C" { 44 #endif 45 46 #ifndef BIT 47 #define BIT(_x) (1UL << (_x)) 48 #endif 49 50 #define HTIMER_INFO(fmt, arg...) printf("HTIMER : %s()%d "fmt, __func__, __LINE__, ##arg) 51 52 #ifdef CONFIG_DRIVERS_HTIMER_DEBUG 53 #define HTIMER_ERR(fmt, arg...) printf("HTIMER : %s()%d "fmt, __func__, __LINE__, ##arg) 54 #else 55 #define HTIMER_ERR(fmt, arg...) do {}while(0) 56 #endif 57 58 typedef void (*timer_callback)(void *param); 59 60 61 #define HTIMER_IRQ_EN_REG (SUNXI_HSTIMER_PBASE + 0x00) 62 #define HTIMER_IRQ_EN(val) BIT(val) 63 #define HTIMER_IRQ_ST_REG (SUNXI_HSTIMER_PBASE + 0x04) 64 #define HTIMER_CTL_REG(val) (SUNXI_HSTIMER_PBASE + (0x20 * val + 0x20)) 65 #define HTIMER_CTL_ENABLE BIT(0) 66 #define HTIMER_CTL_RELOAD BIT(1) 67 #define HTIMER_CTL_CLK_PRES(val) (((val) & 0x7) << 4) 68 #define HTIMER_CTL_ONESHOT BIT(7) 69 #define HTIMER_INTVAL_LO_REG(val) (SUNXI_HSTIMER_PBASE + (0x20 * (val) + 0x24)) 70 #define HTIMER_INTVAL_HI_REG(val) (SUNXI_HSTIMER_PBASE + (0x20 * (val) + 0x28)) 71 #define HTIMER_CNTVAL_LO_REG(val) (SUNXI_HSTIMER_PBASE + (0x20 * (val) + 0x2c)) 72 #define HTIMER_CNTVAL_HI_REG(val) (SUNXI_HSTIMER_PBASE + (0x20 * (val) + 0x30)) 73 74 #define HTIMER_SYNC_TICKS 3 75 76 struct sunxi_htimer 77 { 78 uint32_t timer_id; 79 uint32_t ticks; 80 uint32_t clk_rate; 81 uint32_t irq; 82 uint32_t min_delta_ticks; 83 uint32_t max_delta_ticks; 84 timer_callback callback; 85 void *param; 86 }; 87 88 int sunxi_htimer_set_oneshot(uint32_t delay_us, uint32_t timer, timer_callback callback, void *callback_param); 89 int sunxi_htimer_set_periodic(uint32_t delay_us, uint32_t timer, timer_callback callback, void *callback_param); 90 void sunxi_htimer_stop(uint32_t timer); 91 void sunxi_htimer_start(uint32_t timer, bool periodic); 92 void sunxi_htimer_init(); 93 94 #ifdef __cplusplus 95 } 96 #endif 97 98 #endif 99