1 /*
2  * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 // The LL layer for ESP32-C6 MODEM LPCON register operations
8 
9 #pragma once
10 
11 #include <stdlib.h>
12 #include "soc/soc.h"
13 #include "hal/assert.h"
14 #include "modem/modem_lpcon_struct.h"
15 #include "hal/modem_clock_types.h"
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 __attribute__((always_inline))
modem_lpcon_ll_enable_test_clk(modem_lpcon_dev_t * hw,bool en)22 static inline void modem_lpcon_ll_enable_test_clk(modem_lpcon_dev_t *hw, bool en)
23 {
24     hw->test_conf.clk_en = en;
25 }
26 
27 __attribute__((always_inline))
modem_lpcon_ll_enable_ble_rtc_timer_slow_osc(modem_lpcon_dev_t * hw,bool en)28 static inline void modem_lpcon_ll_enable_ble_rtc_timer_slow_osc(modem_lpcon_dev_t *hw, bool en)
29 {
30     hw->lp_timer_conf.clk_lp_timer_sel_osc_slow = en;
31 }
32 
33 __attribute__((always_inline))
modem_lpcon_ll_enable_ble_rtc_timer_fast_osc(modem_lpcon_dev_t * hw,bool en)34 static inline void modem_lpcon_ll_enable_ble_rtc_timer_fast_osc(modem_lpcon_dev_t *hw, bool en)
35 {
36     hw->lp_timer_conf.clk_lp_timer_sel_osc_fast = en;
37 }
38 
39 __attribute__((always_inline))
modem_lpcon_ll_enable_ble_rtc_timer_main_xtal(modem_lpcon_dev_t * hw,bool en)40 static inline void modem_lpcon_ll_enable_ble_rtc_timer_main_xtal(modem_lpcon_dev_t *hw, bool en)
41 {
42     hw->lp_timer_conf.clk_lp_timer_sel_xtal = en;
43 }
44 
45 __attribute__((always_inline))
modem_lpcon_ll_enable_ble_rtc_timer_32k_xtal(modem_lpcon_dev_t * hw,bool en)46 static inline void modem_lpcon_ll_enable_ble_rtc_timer_32k_xtal(modem_lpcon_dev_t *hw, bool en)
47 {
48     hw->lp_timer_conf.clk_lp_timer_sel_xtal32k = en;
49 }
50 
51 __attribute__((always_inline))
modem_lpcon_ll_set_ble_rtc_timer_divisor_value(modem_lpcon_dev_t * hw,uint32_t value)52 static inline void modem_lpcon_ll_set_ble_rtc_timer_divisor_value(modem_lpcon_dev_t *hw, uint32_t value)
53 {
54     hw->lp_timer_conf.clk_lp_timer_div_num = value;
55 }
56 
57 __attribute__((always_inline))
modem_lpcon_ll_get_ble_rtc_timer_divisor_value(modem_lpcon_dev_t * hw)58 static inline uint32_t modem_lpcon_ll_get_ble_rtc_timer_divisor_value(modem_lpcon_dev_t *hw)
59 {
60     return hw->lp_timer_conf.clk_lp_timer_div_num;
61 }
62 
63 __attribute__((always_inline))
modem_lpcon_ll_enable_coex_lpclk_slow_osc(modem_lpcon_dev_t * hw,bool en)64 static inline void modem_lpcon_ll_enable_coex_lpclk_slow_osc(modem_lpcon_dev_t *hw, bool en)
65 {
66     hw->coex_lp_clk_conf.clk_coex_lp_sel_osc_slow = en;
67 }
68 
69 __attribute__((always_inline))
modem_lpcon_ll_enable_coex_lpclk_fast_osc(modem_lpcon_dev_t * hw,bool en)70 static inline void modem_lpcon_ll_enable_coex_lpclk_fast_osc(modem_lpcon_dev_t *hw, bool en)
71 {
72     hw->coex_lp_clk_conf.clk_coex_lp_sel_osc_fast = en;
73 }
74 
75 __attribute__((always_inline))
modem_lpcon_ll_enable_coex_lpclk_main_xtal(modem_lpcon_dev_t * hw,bool en)76 static inline void modem_lpcon_ll_enable_coex_lpclk_main_xtal(modem_lpcon_dev_t *hw, bool en)
77 {
78     hw->coex_lp_clk_conf.clk_coex_lp_sel_xtal = en;
79 }
80 
81 __attribute__((always_inline))
modem_lpcon_ll_enable_coex_lpclk_32k_xtal(modem_lpcon_dev_t * hw,bool en)82 static inline void modem_lpcon_ll_enable_coex_lpclk_32k_xtal(modem_lpcon_dev_t *hw, bool en)
83 {
84     hw->coex_lp_clk_conf.clk_coex_lp_sel_xtal32k = en;
85 }
86 
87 __attribute__((always_inline))
modem_lpcon_ll_set_coex_lpclk_divisor_value(modem_lpcon_dev_t * hw,uint32_t value)88 static inline void modem_lpcon_ll_set_coex_lpclk_divisor_value(modem_lpcon_dev_t *hw, uint32_t value)
89 {
90     hw->coex_lp_clk_conf.clk_coex_lp_div_num = value;
91 }
92 
93 __attribute__((always_inline))
modem_lpcon_ll_get_coex_lpclk_divisor_value(modem_lpcon_dev_t * hw)94 static inline uint32_t modem_lpcon_ll_get_coex_lpclk_divisor_value(modem_lpcon_dev_t *hw)
95 {
96     return hw->coex_lp_clk_conf.clk_coex_lp_div_num;
97 }
98 
99 __attribute__((always_inline))
modem_lpcon_ll_enable_wifi_lpclk_slow_osc(modem_lpcon_dev_t * hw,bool en)100 static inline void modem_lpcon_ll_enable_wifi_lpclk_slow_osc(modem_lpcon_dev_t *hw, bool en)
101 {
102     hw->wifi_lp_clk_conf.clk_wifipwr_lp_sel_osc_slow = en;
103 }
104 
105 __attribute__((always_inline))
modem_lpcon_ll_enable_wifi_lpclk_fast_osc(modem_lpcon_dev_t * hw,bool en)106 static inline void modem_lpcon_ll_enable_wifi_lpclk_fast_osc(modem_lpcon_dev_t *hw, bool en)
107 {
108     hw->wifi_lp_clk_conf.clk_wifipwr_lp_sel_osc_fast = en;
109 }
110 
111 __attribute__((always_inline))
modem_lpcon_ll_enable_wifi_lpclk_main_xtal(modem_lpcon_dev_t * hw,bool en)112 static inline void modem_lpcon_ll_enable_wifi_lpclk_main_xtal(modem_lpcon_dev_t *hw, bool en)
113 {
114     hw->wifi_lp_clk_conf.clk_wifipwr_lp_sel_xtal = en;
115 }
116 
117 __attribute__((always_inline))
modem_lpcon_ll_enable_wifi_lpclk_32k_xtal(modem_lpcon_dev_t * hw,bool en)118 static inline void modem_lpcon_ll_enable_wifi_lpclk_32k_xtal(modem_lpcon_dev_t *hw, bool en)
119 {
120     hw->wifi_lp_clk_conf.clk_wifipwr_lp_sel_xtal32k = en;
121 }
122 
123 __attribute__((always_inline))
modem_lpcon_ll_set_wifi_lpclk_divisor_value(modem_lpcon_dev_t * hw,uint32_t value)124 static inline void modem_lpcon_ll_set_wifi_lpclk_divisor_value(modem_lpcon_dev_t *hw, uint32_t value)
125 {
126     hw->wifi_lp_clk_conf.clk_wifipwr_lp_div_num = value;
127 }
128 
129 __attribute__((always_inline))
modem_lpcon_ll_get_wifi_lpclk_divisor_value(modem_lpcon_dev_t * hw)130 static inline uint32_t modem_lpcon_ll_get_wifi_lpclk_divisor_value(modem_lpcon_dev_t *hw)
131 {
132     return hw->wifi_lp_clk_conf.clk_wifipwr_lp_div_num;
133 }
134 
135 __attribute__((always_inline))
modem_lpcon_ll_enable_i2c_master_160m_clock(modem_lpcon_dev_t * hw,bool en)136 static inline void modem_lpcon_ll_enable_i2c_master_160m_clock(modem_lpcon_dev_t *hw, bool en)
137 {
138     hw->i2c_mst_clk_conf.clk_i2c_mst_sel_160m = en;
139 }
140 
141 __attribute__((always_inline))
modem_lpcon_ll_select_modem_32k_clock_source(modem_lpcon_dev_t * hw,uint32_t src)142 static inline void modem_lpcon_ll_select_modem_32k_clock_source(modem_lpcon_dev_t *hw, uint32_t src)
143 {
144     hw->modem_32k_clk_conf.clk_modem_32k_sel = src;
145 }
146 
147 __attribute__((always_inline))
modem_lpcon_ll_enable_wifipwr_clock(modem_lpcon_dev_t * hw,bool en)148 static inline void modem_lpcon_ll_enable_wifipwr_clock(modem_lpcon_dev_t *hw, bool en)
149 {
150     hw->clk_conf.clk_wifipwr_en = en;
151 }
152 
153 __attribute__((always_inline))
modem_lpcon_ll_enable_coex_clock(modem_lpcon_dev_t * hw,bool en)154 static inline void modem_lpcon_ll_enable_coex_clock(modem_lpcon_dev_t *hw, bool en)
155 {
156     hw->clk_conf.clk_coex_en = en;
157 }
158 
159 __attribute__((always_inline))
modem_lpcon_ll_enable_i2c_master_clock(modem_lpcon_dev_t * hw,bool en)160 static inline void modem_lpcon_ll_enable_i2c_master_clock(modem_lpcon_dev_t *hw, bool en)
161 {
162     hw->clk_conf.clk_i2c_mst_en = en;
163 }
164 
165 __attribute__((always_inline))
modem_lpcon_ll_enable_ble_rtc_timer_clock(modem_lpcon_dev_t * hw,bool en)166 static inline void modem_lpcon_ll_enable_ble_rtc_timer_clock(modem_lpcon_dev_t *hw, bool en)
167 {
168     hw->clk_conf.clk_lp_timer_en = en;
169 }
170 
171 __attribute__((always_inline))
modem_lpcon_ll_enable_wifipwr_force_clock(modem_lpcon_dev_t * hw,bool en)172 static inline void modem_lpcon_ll_enable_wifipwr_force_clock(modem_lpcon_dev_t *hw, bool en)
173 {
174     hw->clk_conf_force_on.clk_wifipwr_fo = en;
175 }
176 
177 __attribute__((always_inline))
modem_lpcon_ll_enable_coex_force_clock(modem_lpcon_dev_t * hw,bool en)178 static inline void modem_lpcon_ll_enable_coex_force_clock(modem_lpcon_dev_t *hw, bool en)
179 {
180     hw->clk_conf_force_on.clk_coex_fo = en;
181 }
182 
183 __attribute__((always_inline))
modem_lpcon_ll_enable_i2c_master_force_clock(modem_lpcon_dev_t * hw,bool en)184 static inline void modem_lpcon_ll_enable_i2c_master_force_clock(modem_lpcon_dev_t *hw, bool en)
185 {
186     hw->clk_conf_force_on.clk_i2c_mst_fo = en;
187 }
188 
189 __attribute__((always_inline))
modem_lpcon_ll_enable_ble_rtc_timer_force_clock(modem_lpcon_dev_t * hw,bool en)190 static inline void modem_lpcon_ll_enable_ble_rtc_timer_force_clock(modem_lpcon_dev_t *hw, bool en)
191 {
192     hw->clk_conf_force_on.clk_lp_timer_fo = en;
193 }
194 
195 __attribute__((always_inline))
modem_lpcon_ll_get_wifipwr_icg_bitmap(modem_lpcon_dev_t * hw)196 static inline uint32_t modem_lpcon_ll_get_wifipwr_icg_bitmap(modem_lpcon_dev_t *hw)
197 {
198     return hw->clk_conf_power_st.clk_wifipwr_st_map;
199 }
200 
201 __attribute__((always_inline))
modem_lpcon_ll_set_wifipwr_icg_bitmap(modem_lpcon_dev_t * hw,uint32_t bitmap)202 static inline void modem_lpcon_ll_set_wifipwr_icg_bitmap(modem_lpcon_dev_t *hw, uint32_t bitmap)
203 {
204     hw->clk_conf_power_st.clk_wifipwr_st_map = bitmap;
205 }
206 
207 __attribute__((always_inline))
modem_lpcon_ll_get_coex_icg_bitmap(modem_lpcon_dev_t * hw)208 static inline uint32_t modem_lpcon_ll_get_coex_icg_bitmap(modem_lpcon_dev_t *hw)
209 {
210     return hw->clk_conf_power_st.clk_coex_st_map;
211 }
212 
213 __attribute__((always_inline))
modem_lpcon_ll_set_coex_icg_bitmap(modem_lpcon_dev_t * hw,uint32_t bitmap)214 static inline void modem_lpcon_ll_set_coex_icg_bitmap(modem_lpcon_dev_t *hw, uint32_t bitmap)
215 {
216     hw->clk_conf_power_st.clk_coex_st_map = bitmap;
217 }
218 
219 __attribute__((always_inline))
modem_lpcon_ll_get_i2c_master_icg_bitmap(modem_lpcon_dev_t * hw)220 static inline uint32_t modem_lpcon_ll_get_i2c_master_icg_bitmap(modem_lpcon_dev_t *hw)
221 {
222     return hw->clk_conf_power_st.clk_i2c_mst_st_map;
223 }
224 
225 __attribute__((always_inline))
modem_lpcon_ll_set_i2c_master_icg_bitmap(modem_lpcon_dev_t * hw,uint32_t bitmap)226 static inline void modem_lpcon_ll_set_i2c_master_icg_bitmap(modem_lpcon_dev_t *hw, uint32_t bitmap)
227 {
228     hw->clk_conf_power_st.clk_i2c_mst_st_map = bitmap;
229 }
230 
231 __attribute__((always_inline))
modem_lpcon_ll_get_lp_apb_icg_bitmap(modem_lpcon_dev_t * hw)232 static inline uint32_t modem_lpcon_ll_get_lp_apb_icg_bitmap(modem_lpcon_dev_t *hw)
233 {
234     return hw->clk_conf_power_st.clk_lp_apb_st_map;
235 }
236 
237 __attribute__((always_inline))
modem_lpcon_ll_set_lp_apb_icg_bitmap(modem_lpcon_dev_t * hw,uint32_t bitmap)238 static inline void modem_lpcon_ll_set_lp_apb_icg_bitmap(modem_lpcon_dev_t *hw, uint32_t bitmap)
239 {
240     hw->clk_conf_power_st.clk_lp_apb_st_map = bitmap;
241 }
242 
243 __attribute__((always_inline))
modem_lpcon_ll_reset_wifipwr(modem_lpcon_dev_t * hw)244 static inline void modem_lpcon_ll_reset_wifipwr(modem_lpcon_dev_t *hw)
245 {
246     hw->rst_conf.rst_wifipwr = 1;
247     hw->rst_conf.rst_wifipwr = 0;
248 }
249 
250 __attribute__((always_inline))
modem_lpcon_ll_reset_coex(modem_lpcon_dev_t * hw)251 static inline void modem_lpcon_ll_reset_coex(modem_lpcon_dev_t *hw)
252 {
253     hw->rst_conf.rst_coex = 1;
254     hw->rst_conf.rst_coex = 0;
255 }
256 
257 __attribute__((always_inline))
modem_lpcon_ll_reset_i2c_master(modem_lpcon_dev_t * hw)258 static inline void modem_lpcon_ll_reset_i2c_master(modem_lpcon_dev_t *hw)
259 {
260     hw->rst_conf.rst_i2c_mst = 1;
261     hw->rst_conf.rst_i2c_mst = 0;
262 }
263 
264 __attribute__((always_inline))
modem_lpcon_ll_reset_ble_rtc_timer(modem_lpcon_dev_t * hw)265 static inline void modem_lpcon_ll_reset_ble_rtc_timer(modem_lpcon_dev_t *hw)
266 {
267     hw->rst_conf.rst_lp_timer = 1;
268     hw->rst_conf.rst_lp_timer = 0;
269 }
270 
271 __attribute__((always_inline))
modem_lpcon_ll_reset_all(modem_lpcon_dev_t * hw)272 static inline void modem_lpcon_ll_reset_all(modem_lpcon_dev_t *hw)
273 {
274     hw->rst_conf.val = 0xf;
275     hw->rst_conf.val = 0;
276 }
277 
278 __attribute__((always_inline))
modem_lpcon_ll_get_date(modem_lpcon_dev_t * hw)279 static inline uint32_t modem_lpcon_ll_get_date(modem_lpcon_dev_t *hw)
280 {
281     return hw->date.val;
282 }
283 
284 #ifdef __cplusplus
285 }
286 #endif
287