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