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