1 /* Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
2
3 * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
4 * the the People's Republic of China and other countries.
5 * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
6
7 * DISCLAIMER
8 * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
9 * IF YOU NEED TO INTEGRATE THIRD PARTY¡¯S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
10 * IN ALLWINNERS¡¯SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
11 * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
12 * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
13 * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
14 * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY¡¯S TECHNOLOGY.
15
16
17 * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
18 * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
19 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
20 * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
21 * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22 * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
29 * OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32
33 #include <sunxi_hal_lradc.h>
34
35
36 lradc_func_data lradc_priv;
37
38 static uint32_t base_addr = LRADC_BASE;
39
40 static uint32_t ctrl_para = FIRST_CONCERT_DLY | ADC_CHAN_SELECT | KEY_MODE_SELECT
41 | LRADC_HOLD_EN & LEVELB_VOL & LRADC_SAMPLE_2KHZ | LRADC_EN;
42
43 static uint32_t irq_para = LRADC_ADC0_UP_EN | LRADC_ADC0_DOWN_EN | LRADC_ADC0_DATA_EN;
44
lradc_ctrl_set(void)45 static void lradc_ctrl_set(void)
46 {
47 uint32_t reg_val = 0;
48
49 reg_val = hal_readl(base_addr + LRADC_CTRL_REG);
50 reg_val |= ctrl_para;
51 hal_writel(reg_val, base_addr + LRADC_CTRL_REG);
52 }
53
lradc_ctrl_reset(void)54 static void lradc_ctrl_reset(void)
55 {
56 uint32_t reg_val = 0;
57
58 reg_val = hal_readl(base_addr + LRADC_CTRL_REG);
59 reg_val &= ~ctrl_para;
60 hal_writel(reg_val, base_addr + LRADC_CTRL_REG);
61 }
62
lradc_irq_set(void)63 static void lradc_irq_set(void)
64 {
65 uint32_t reg_val = 0;
66
67 reg_val = hal_readl(base_addr + LRADC_INTC_REG);
68 reg_val |= irq_para;
69 hal_writel(reg_val, base_addr + LRADC_INTC_REG);
70 }
71
lradc_irq_reset(void)72 static void lradc_irq_reset(void)
73 {
74 uint32_t reg_val = 0;
75
76 reg_val = hal_readl(base_addr + LRADC_INTC_REG);
77 reg_val &= ~irq_para;
78 hal_writel(reg_val, base_addr + LRADC_INTC_REG);
79 }
80
lradc_register_callback(lradc_callback_t user_callback)81 static void lradc_register_callback(lradc_callback_t user_callback)
82 {
83 lradc_priv.func = user_callback;
84 }
85
lradc_irq_handler(int dummy,void * priv_data)86 static irqreturn_t lradc_irq_handler(int dummy, void *priv_data)
87 {
88 lradc_func_data *lradc_priv = priv_data;
89 lradc_callback_t callback = lradc_priv->func;
90 void *arg = lradc_priv->arg;
91
92 uint32_t irq_status = hal_readl(base_addr + LRADC_INTS_REG);
93 uint32_t reg_val = hal_readl(base_addr + LRADC_DATA0_REG);
94
95 if (NULL != callback)
96 callback(irq_status, reg_val);
97
98 hal_writel(reg_val, base_addr + LRADC_INTS_REG);
99
100 return 0;
101 }
102
lradc_init_irq(void)103 static int32_t lradc_init_irq(void)
104 {
105 uint32_t irqn = SUNXI_IRQ_LRADC;
106 if (request_irq(irqn, lradc_irq_handler, 0, "lradc", &lradc_priv) < 0) {
107 return -1;
108 }
109
110 enable_irq(irqn);
111
112 return 0;
113 }
114
hal_lradc_init(void)115 hal_lradc_status_t hal_lradc_init(void)
116 {
117 //sunxi_clk_init();
118 lradc_ctrl_set();
119 lradc_irq_set();
120 lradc_init_irq();
121
122 return HAL_ADC_STATUS_OK;
123 }
124
hal_lradc_deinit(void)125 hal_lradc_status_t hal_lradc_deinit(void)
126 {
127 lradc_irq_reset();
128 lradc_ctrl_reset();
129
130 return HAL_ADC_STATUS_OK;
131 }
132
hal_lradc_register_callback(lradc_callback_t callback)133 hal_lradc_status_t hal_lradc_register_callback(lradc_callback_t callback)
134 {
135 lradc_register_callback(callback);
136
137 return HAL_ADC_STATUS_OK;
138 }
139
140