1 /*
2  * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 // The LL layer for ESP32-C6 PMU register operations
8 
9 #pragma once
10 
11 #include <stdlib.h>
12 #include <stdbool.h>
13 #include "soc/soc.h"
14 #include "esp_attr.h"
15 #include "hal/assert.h"
16 #include "soc/pmu_struct.h"
17 #include "hal/pmu_types.h"
18 #include "hal/misc.h"
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 /**
25  * @brief Set the power domain that needs to be powered down in the digital power
26  *
27  * @param hw Beginning address of the peripheral registers.
28  * @param mode The pmu mode
29  * @param flag Digital power domain flag
30  *
31  * @return None
32  */
pmu_ll_hp_set_dig_power(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t flag)33 FORCE_INLINE_ATTR void pmu_ll_hp_set_dig_power(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t flag)
34 {
35     hw->hp_sys[mode].dig_power.val = flag;
36 }
37 
pmu_ll_hp_set_icg_func(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t icg_func)38 FORCE_INLINE_ATTR void pmu_ll_hp_set_icg_func(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t icg_func)
39 {
40     hw->hp_sys[mode].icg_func = icg_func;
41 }
42 
pmu_ll_hp_set_icg_apb(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t bitmap)43 FORCE_INLINE_ATTR void pmu_ll_hp_set_icg_apb(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t bitmap)
44 {
45     hw->hp_sys[mode].icg_apb = bitmap;
46 }
47 
pmu_ll_hp_set_icg_modem(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t code)48 FORCE_INLINE_ATTR void pmu_ll_hp_set_icg_modem(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t code)
49 {
50     hw->hp_sys[mode].icg_modem.code = code;
51 }
52 
pmu_ll_hp_set_uart_wakeup_enable(pmu_dev_t * hw,pmu_hp_mode_t mode,bool wakeup_en)53 FORCE_INLINE_ATTR void pmu_ll_hp_set_uart_wakeup_enable(pmu_dev_t *hw, pmu_hp_mode_t mode, bool wakeup_en)
54 {
55     hw->hp_sys[mode].syscntl.uart_wakeup_en = wakeup_en;
56 }
57 
pmu_ll_hp_set_hold_all_lp_pad(pmu_dev_t * hw,pmu_hp_mode_t mode,bool hold_all)58 FORCE_INLINE_ATTR void pmu_ll_hp_set_hold_all_lp_pad(pmu_dev_t *hw, pmu_hp_mode_t mode, bool hold_all)
59 {
60     hw->hp_sys[mode].syscntl.lp_pad_hold_all = hold_all;
61 }
62 
pmu_ll_hp_set_hold_all_hp_pad(pmu_dev_t * hw,pmu_hp_mode_t mode,bool hold_all)63 FORCE_INLINE_ATTR void pmu_ll_hp_set_hold_all_hp_pad(pmu_dev_t *hw, pmu_hp_mode_t mode, bool hold_all)
64 {
65     hw->hp_sys[mode].syscntl.hp_pad_hold_all = hold_all;
66 }
67 
pmu_ll_hp_set_dig_pad_slp_sel(pmu_dev_t * hw,pmu_hp_mode_t mode,bool slp_sel)68 FORCE_INLINE_ATTR void pmu_ll_hp_set_dig_pad_slp_sel(pmu_dev_t *hw, pmu_hp_mode_t mode, bool slp_sel)
69 {
70     hw->hp_sys[mode].syscntl.dig_pad_slp_sel = slp_sel;
71 }
72 
pmu_ll_hp_set_pause_watchdog(pmu_dev_t * hw,pmu_hp_mode_t mode,bool pause_wdt)73 FORCE_INLINE_ATTR void pmu_ll_hp_set_pause_watchdog(pmu_dev_t *hw, pmu_hp_mode_t mode, bool pause_wdt)
74 {
75     hw->hp_sys[mode].syscntl.dig_pause_wdt = pause_wdt;
76 }
77 
pmu_ll_hp_set_cpu_stall(pmu_dev_t * hw,pmu_hp_mode_t mode,bool cpu_stall)78 FORCE_INLINE_ATTR void pmu_ll_hp_set_cpu_stall(pmu_dev_t *hw, pmu_hp_mode_t mode, bool cpu_stall)
79 {
80     hw->hp_sys[mode].syscntl.dig_cpu_stall = cpu_stall;
81 }
82 
83 /**
84  * @brief Set the power domain that needs to be powered down in the clock power
85  *
86  * @param hw Beginning address of the peripheral registers.
87  * @param mode The pmu mode
88  * @param flag Clock power domain flag
89  *
90  * @return None
91  */
pmu_ll_hp_set_clk_power(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t xpd_flag)92 FORCE_INLINE_ATTR void pmu_ll_hp_set_clk_power(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t xpd_flag)
93 {
94     hw->hp_sys[mode].clk_power.val = xpd_flag;
95 }
96 
pmu_ll_hp_set_xtal_xpd(pmu_dev_t * hw,pmu_hp_mode_t mode,bool xpd_xtal)97 FORCE_INLINE_ATTR void pmu_ll_hp_set_xtal_xpd(pmu_dev_t *hw, pmu_hp_mode_t mode, bool xpd_xtal)
98 {
99     hw->hp_sys[mode].xtal.xpd_xtal = xpd_xtal;
100 }
101 
pmu_ll_hp_set_bias_xpd(pmu_dev_t * hw,pmu_hp_mode_t mode,bool xpd_bias)102 FORCE_INLINE_ATTR void pmu_ll_hp_set_bias_xpd(pmu_dev_t *hw, pmu_hp_mode_t mode, bool xpd_bias)
103 {
104     hw->hp_sys[mode].bias.xpd_bias = xpd_bias;
105 }
106 
pmu_ll_hp_set_dbg_atten(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t value)107 FORCE_INLINE_ATTR void pmu_ll_hp_set_dbg_atten(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t value)
108 {
109     hw->hp_sys[mode].bias.dbg_atten = value;
110 }
111 
pmu_ll_hp_set_current_power_off(pmu_dev_t * hw,pmu_hp_mode_t mode,bool off)112 FORCE_INLINE_ATTR void pmu_ll_hp_set_current_power_off(pmu_dev_t *hw, pmu_hp_mode_t mode, bool off)
113 {
114     hw->hp_sys[mode].bias.pd_cur = off;
115 }
116 
pmu_ll_hp_set_bias_sleep_enable(pmu_dev_t * hw,pmu_hp_mode_t mode,bool en)117 FORCE_INLINE_ATTR void pmu_ll_hp_set_bias_sleep_enable(pmu_dev_t *hw, pmu_hp_mode_t mode, bool en)
118 {
119     hw->hp_sys[mode].bias.bias_sleep = en;
120 }
121 
pmu_ll_hp_set_retention_param(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t param)122 FORCE_INLINE_ATTR void pmu_ll_hp_set_retention_param(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t param)
123 {
124     hw->hp_sys[mode].backup.val = param;
125 }
126 
pmu_ll_hp_set_sleep_to_active_backup_enable(pmu_dev_t * hw)127 FORCE_INLINE_ATTR void pmu_ll_hp_set_sleep_to_active_backup_enable(pmu_dev_t *hw)
128 {
129     hw->hp_sys[PMU_MODE_HP_ACTIVE].backup.hp_sleep2active_backup_en = 1;
130 }
131 
pmu_ll_hp_set_sleep_to_active_backup_disable(pmu_dev_t * hw)132 FORCE_INLINE_ATTR void pmu_ll_hp_set_sleep_to_active_backup_disable(pmu_dev_t *hw)
133 {
134     hw->hp_sys[PMU_MODE_HP_ACTIVE].backup.hp_sleep2active_backup_en = 0;
135 }
136 
pmu_ll_hp_set_modem_to_active_backup_enable(pmu_dev_t * hw)137 FORCE_INLINE_ATTR void pmu_ll_hp_set_modem_to_active_backup_enable(pmu_dev_t *hw)
138 {
139     hw->hp_sys[PMU_MODE_HP_ACTIVE].backup.hp_modem2active_backup_en = 1;
140 }
141 
pmu_ll_hp_set_modem_to_active_backup_disable(pmu_dev_t * hw)142 FORCE_INLINE_ATTR void pmu_ll_hp_set_modem_to_active_backup_disable(pmu_dev_t *hw)
143 {
144     hw->hp_sys[PMU_MODE_HP_ACTIVE].backup.hp_modem2active_backup_en = 0;
145 }
146 
pmu_ll_hp_set_sleep_to_modem_backup_enable(pmu_dev_t * hw)147 FORCE_INLINE_ATTR void pmu_ll_hp_set_sleep_to_modem_backup_enable(pmu_dev_t *hw)
148 {
149     hw->hp_sys[PMU_MODE_HP_MODEM].backup.hp_sleep2modem_backup_en = 1;
150 }
151 
pmu_ll_hp_set_sleep_to_modem_backup_disable(pmu_dev_t * hw)152 FORCE_INLINE_ATTR void pmu_ll_hp_set_sleep_to_modem_backup_disable(pmu_dev_t *hw)
153 {
154     hw->hp_sys[PMU_MODE_HP_MODEM].backup.hp_sleep2modem_backup_en = 0;
155 }
156 
pmu_ll_hp_set_active_to_sleep_backup_enable(pmu_dev_t * hw)157 FORCE_INLINE_ATTR void pmu_ll_hp_set_active_to_sleep_backup_enable(pmu_dev_t *hw)
158 {
159     hw->hp_sys[PMU_MODE_HP_SLEEP].backup.hp_active2sleep_backup_en = 1;
160 }
161 
pmu_ll_hp_set_active_to_sleep_backup_disable(pmu_dev_t * hw)162 FORCE_INLINE_ATTR void pmu_ll_hp_set_active_to_sleep_backup_disable(pmu_dev_t *hw)
163 {
164     hw->hp_sys[PMU_MODE_HP_SLEEP].backup.hp_active2sleep_backup_en = 0;
165 }
166 
pmu_ll_hp_set_modem_to_sleep_backup_enable(pmu_dev_t * hw)167 FORCE_INLINE_ATTR void pmu_ll_hp_set_modem_to_sleep_backup_enable(pmu_dev_t *hw)
168 {
169     hw->hp_sys[PMU_MODE_HP_SLEEP].backup.hp_modem2sleep_backup_en = 1;
170 }
171 
pmu_ll_hp_set_modem_to_sleep_backup_disable(pmu_dev_t * hw)172 FORCE_INLINE_ATTR void pmu_ll_hp_set_modem_to_sleep_backup_disable(pmu_dev_t *hw)
173 {
174     hw->hp_sys[PMU_MODE_HP_SLEEP].backup.hp_modem2sleep_backup_en = 0;
175 }
176 
pmu_ll_hp_set_backup_icg_func(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t icg_func)177 FORCE_INLINE_ATTR void pmu_ll_hp_set_backup_icg_func(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t icg_func)
178 {
179     hw->hp_sys[mode].backup_clk = icg_func;
180 }
181 
pmu_ll_hp_set_sysclk_nodiv(pmu_dev_t * hw,pmu_hp_mode_t mode,bool sysclk_nodiv)182 FORCE_INLINE_ATTR void pmu_ll_hp_set_sysclk_nodiv(pmu_dev_t *hw, pmu_hp_mode_t mode, bool sysclk_nodiv)
183 {
184     hw->hp_sys[mode].sysclk.dig_sysclk_nodiv = sysclk_nodiv;
185 }
186 
pmu_ll_hp_set_icg_sysclk_enable(pmu_dev_t * hw,pmu_hp_mode_t mode,bool icg_sysclk_en)187 FORCE_INLINE_ATTR void pmu_ll_hp_set_icg_sysclk_enable(pmu_dev_t *hw, pmu_hp_mode_t mode, bool icg_sysclk_en)
188 {
189     hw->hp_sys[mode].sysclk.icg_sysclk_en = icg_sysclk_en;
190 }
191 
pmu_ll_hp_set_sysclk_slp_sel(pmu_dev_t * hw,pmu_hp_mode_t mode,bool slp_sel)192 FORCE_INLINE_ATTR void pmu_ll_hp_set_sysclk_slp_sel(pmu_dev_t *hw, pmu_hp_mode_t mode, bool slp_sel)
193 {
194     hw->hp_sys[mode].sysclk.sysclk_slp_sel = slp_sel;
195 }
196 
pmu_ll_hp_set_icg_sysclk_slp_sel(pmu_dev_t * hw,pmu_hp_mode_t mode,bool slp_sel)197 FORCE_INLINE_ATTR void pmu_ll_hp_set_icg_sysclk_slp_sel(pmu_dev_t *hw, pmu_hp_mode_t mode, bool slp_sel)
198 {
199     hw->hp_sys[mode].sysclk.icg_slp_sel = slp_sel;
200 }
201 
pmu_ll_hp_set_dig_sysclk(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t sysclk_sel)202 FORCE_INLINE_ATTR void pmu_ll_hp_set_dig_sysclk(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t sysclk_sel)
203 {
204     hw->hp_sys[mode].sysclk.dig_sysclk_sel = sysclk_sel;
205 }
206 
pmu_ll_hp_set_regulator_sleep_logic_xpd(pmu_dev_t * hw,pmu_hp_mode_t mode,bool slp_xpd)207 FORCE_INLINE_ATTR void pmu_ll_hp_set_regulator_sleep_logic_xpd(pmu_dev_t *hw, pmu_hp_mode_t mode, bool slp_xpd)
208 {
209     hw->hp_sys[mode].regulator0.slp_logic_xpd = slp_xpd;
210 }
211 
pmu_ll_hp_set_regulator_sleep_memory_xpd(pmu_dev_t * hw,pmu_hp_mode_t mode,bool slp_xpd)212 FORCE_INLINE_ATTR void pmu_ll_hp_set_regulator_sleep_memory_xpd(pmu_dev_t *hw, pmu_hp_mode_t mode, bool slp_xpd)
213 {
214     hw->hp_sys[mode].regulator0.slp_mem_xpd = slp_xpd;
215 }
216 
pmu_ll_hp_set_regulator_xpd(pmu_dev_t * hw,pmu_hp_mode_t mode,bool xpd)217 FORCE_INLINE_ATTR void pmu_ll_hp_set_regulator_xpd(pmu_dev_t *hw, pmu_hp_mode_t mode, bool xpd)
218 {
219     hw->hp_sys[mode].regulator0.xpd = xpd;
220 }
221 
pmu_ll_hp_set_regulator_sleep_logic_dbias(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t slp_dbias)222 FORCE_INLINE_ATTR void pmu_ll_hp_set_regulator_sleep_logic_dbias(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t slp_dbias)
223 {
224     hw->hp_sys[mode].regulator0.slp_logic_dbias = slp_dbias;
225 }
226 
pmu_ll_hp_set_regulator_sleep_memory_dbias(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t slp_dbias)227 FORCE_INLINE_ATTR void pmu_ll_hp_set_regulator_sleep_memory_dbias(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t slp_dbias)
228 {
229     hw->hp_sys[mode].regulator0.slp_mem_dbias = slp_dbias;
230 }
231 
pmu_ll_hp_set_regulator_dbias(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t dbias)232 FORCE_INLINE_ATTR void pmu_ll_hp_set_regulator_dbias(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t dbias)
233 {
234     hw->hp_sys[mode].regulator0.dbias = dbias;
235 }
236 
pmu_ll_hp_set_regulator_driver_bar(pmu_dev_t * hw,pmu_hp_mode_t mode,uint32_t drv_b)237 FORCE_INLINE_ATTR void pmu_ll_hp_set_regulator_driver_bar(pmu_dev_t *hw, pmu_hp_mode_t mode, uint32_t drv_b)
238 {
239     hw->hp_sys[mode].regulator1.drv_b = drv_b;
240 }
241 
242 
pmu_ll_lp_set_regulator_slp_xpd(pmu_dev_t * hw,pmu_lp_mode_t mode,bool slp_xpd)243 FORCE_INLINE_ATTR void pmu_ll_lp_set_regulator_slp_xpd(pmu_dev_t *hw, pmu_lp_mode_t mode, bool slp_xpd)
244 {
245     hw->lp_sys[mode].regulator0.slp_xpd = slp_xpd;
246 }
247 
pmu_ll_lp_set_regulator_xpd(pmu_dev_t * hw,pmu_lp_mode_t mode,bool xpd)248 FORCE_INLINE_ATTR void pmu_ll_lp_set_regulator_xpd(pmu_dev_t *hw, pmu_lp_mode_t mode, bool xpd)
249 {
250     hw->lp_sys[mode].regulator0.xpd = xpd;
251 }
252 
pmu_ll_lp_set_regulator_sleep_dbias(pmu_dev_t * hw,pmu_lp_mode_t mode,uint32_t slp_dbias)253 FORCE_INLINE_ATTR void pmu_ll_lp_set_regulator_sleep_dbias(pmu_dev_t *hw, pmu_lp_mode_t mode, uint32_t slp_dbias)
254 {
255     hw->lp_sys[mode].regulator0.slp_dbias = slp_dbias;
256 }
257 
pmu_ll_lp_set_regulator_dbias(pmu_dev_t * hw,pmu_lp_mode_t mode,uint32_t dbias)258 FORCE_INLINE_ATTR void pmu_ll_lp_set_regulator_dbias(pmu_dev_t *hw, pmu_lp_mode_t mode, uint32_t dbias)
259 {
260     hw->lp_sys[mode].regulator0.dbias = dbias;
261 }
262 
pmu_ll_lp_set_regulator_driver_bar(pmu_dev_t * hw,pmu_lp_mode_t mode,uint32_t drv_b)263 FORCE_INLINE_ATTR void pmu_ll_lp_set_regulator_driver_bar(pmu_dev_t *hw, pmu_lp_mode_t mode, uint32_t drv_b)
264 {
265     hw->lp_sys[mode].regulator1.drv_b = drv_b;
266 }
267 
pmu_ll_lp_set_xtal_xpd(pmu_dev_t * hw,pmu_lp_mode_t mode,bool xpd_xtal)268 FORCE_INLINE_ATTR void pmu_ll_lp_set_xtal_xpd(pmu_dev_t *hw, pmu_lp_mode_t mode, bool xpd_xtal)
269 {
270     HAL_ASSERT(mode == PMU_MODE_LP_SLEEP);
271     hw->lp_sys[mode].xtal.xpd_xtal = xpd_xtal;
272 }
273 
274 
pmu_ll_lp_set_dig_power(pmu_dev_t * hw,pmu_lp_mode_t mode,uint32_t flag)275 FORCE_INLINE_ATTR void pmu_ll_lp_set_dig_power(pmu_dev_t *hw, pmu_lp_mode_t mode, uint32_t flag)
276 {
277     hw->lp_sys[mode].dig_power.val = flag;
278 }
279 
pmu_ll_lp_set_clk_power(pmu_dev_t * hw,pmu_lp_mode_t mode,uint32_t xpd_flag)280 FORCE_INLINE_ATTR void pmu_ll_lp_set_clk_power(pmu_dev_t *hw, pmu_lp_mode_t mode, uint32_t xpd_flag)
281 {
282     hw->lp_sys[mode].clk_power.val = xpd_flag;
283 }
284 
pmu_ll_lp_get_clk_power(pmu_dev_t * hw,pmu_lp_mode_t mode)285 FORCE_INLINE_ATTR uint32_t pmu_ll_lp_get_clk_power(pmu_dev_t *hw, pmu_lp_mode_t mode)
286 {
287     return hw->lp_sys[mode].clk_power.val;
288 }
289 
pmu_ll_lp_set_bias_xpd(pmu_dev_t * hw,pmu_lp_mode_t mode,bool xpd_bias)290 FORCE_INLINE_ATTR void pmu_ll_lp_set_bias_xpd(pmu_dev_t *hw, pmu_lp_mode_t mode, bool xpd_bias)
291 {
292     HAL_ASSERT(mode == PMU_MODE_LP_SLEEP);
293     hw->lp_sys[mode].bias.xpd_bias = xpd_bias;
294 }
295 
pmu_ll_lp_set_dbg_atten(pmu_dev_t * hw,pmu_lp_mode_t mode,uint32_t value)296 FORCE_INLINE_ATTR void pmu_ll_lp_set_dbg_atten(pmu_dev_t *hw, pmu_lp_mode_t mode, uint32_t value)
297 {
298     HAL_ASSERT(mode == PMU_MODE_LP_SLEEP);
299     hw->lp_sys[mode].bias.dbg_atten = value;
300 }
301 
pmu_ll_lp_set_current_power_off(pmu_dev_t * hw,pmu_lp_mode_t mode,bool off)302 FORCE_INLINE_ATTR void pmu_ll_lp_set_current_power_off(pmu_dev_t *hw, pmu_lp_mode_t mode, bool off)
303 {
304     HAL_ASSERT(mode == PMU_MODE_LP_SLEEP);
305     hw->lp_sys[mode].bias.pd_cur = off;
306 }
307 
pmu_ll_lp_set_bias_sleep_enable(pmu_dev_t * hw,pmu_lp_mode_t mode,bool en)308 FORCE_INLINE_ATTR void pmu_ll_lp_set_bias_sleep_enable(pmu_dev_t *hw, pmu_lp_mode_t mode, bool en)
309 {
310     HAL_ASSERT(mode == PMU_MODE_LP_SLEEP);
311     hw->lp_sys[mode].bias.bias_sleep = en;
312 }
313 
314 
315 /****/
pmu_ll_imm_set_clk_power(pmu_dev_t * hw,uint32_t flag)316 FORCE_INLINE_ATTR void pmu_ll_imm_set_clk_power(pmu_dev_t *hw, uint32_t flag)
317 {
318     hw->imm.clk_power.val = flag;
319 }
320 
pmu_ll_imm_set_icg_slp_sel(pmu_dev_t * hw,bool slp_sel)321 FORCE_INLINE_ATTR void pmu_ll_imm_set_icg_slp_sel(pmu_dev_t *hw, bool slp_sel)
322 {
323     if (slp_sel) {
324         hw->imm.sleep_sysclk.tie_high_icg_slp_sel = 1;
325     } else {
326         hw->imm.sleep_sysclk.tie_low_icg_slp_sel = 1;
327     }
328 }
329 
pmu_ll_imm_update_dig_sysclk_sel(pmu_dev_t * hw,bool update)330 FORCE_INLINE_ATTR void pmu_ll_imm_update_dig_sysclk_sel(pmu_dev_t *hw, bool update)
331 {
332     hw->imm.sleep_sysclk.update_dig_sysclk_sel = update;
333 }
334 
pmu_ll_imm_update_dig_icg_switch(pmu_dev_t * hw,bool update)335 FORCE_INLINE_ATTR void pmu_ll_imm_update_dig_icg_switch(pmu_dev_t *hw, bool update)
336 {
337     hw->imm.sleep_sysclk.update_dig_icg_switch = update;
338 }
339 
pmu_ll_imm_update_dig_icg_func(pmu_dev_t * hw,bool icg_func_update)340 FORCE_INLINE_ATTR void pmu_ll_imm_update_dig_icg_func(pmu_dev_t *hw, bool icg_func_update)
341 {
342     hw->imm.hp_func_icg.update_dig_icg_func_en = icg_func_update;
343 }
344 
pmu_ll_imm_update_dig_icg_apb(pmu_dev_t * hw,bool icg_apb_update)345 FORCE_INLINE_ATTR void pmu_ll_imm_update_dig_icg_apb(pmu_dev_t *hw, bool icg_apb_update)
346 {
347     hw->imm.hp_apb_icg.update_dig_icg_apb_en = icg_apb_update;
348 }
349 
pmu_ll_imm_update_dig_icg_modem_code(pmu_dev_t * hw,bool icg_modem_update)350 FORCE_INLINE_ATTR void pmu_ll_imm_update_dig_icg_modem_code(pmu_dev_t *hw, bool icg_modem_update)
351 {
352     hw->imm.modem_icg.update_dig_icg_modem_en = icg_modem_update;
353 }
354 
pmu_ll_imm_set_lp_rootclk_sel(pmu_dev_t * hw,bool rootclk_sel)355 FORCE_INLINE_ATTR void pmu_ll_imm_set_lp_rootclk_sel(pmu_dev_t *hw, bool rootclk_sel)
356 {
357     if (rootclk_sel) {
358         hw->imm.lp_icg.tie_high_lp_rootclk_sel = 1;
359     } else {
360         hw->imm.lp_icg.tie_low_lp_rootclk_sel = 1;
361     }
362 }
363 
pmu_ll_imm_set_hp_pad_hold_all(pmu_dev_t * hw,bool hold_all)364 FORCE_INLINE_ATTR void pmu_ll_imm_set_hp_pad_hold_all(pmu_dev_t *hw, bool hold_all)
365 {
366     if (hold_all) {
367         hw->imm.pad_hold_all.tie_high_hp_pad_hold_all = 1;
368     } else {
369         hw->imm.pad_hold_all.tie_low_hp_pad_hold_all = 1;
370     }
371 }
372 
pmu_ll_imm_set_lp_pad_hold_all(pmu_dev_t * hw,bool hold_all)373 FORCE_INLINE_ATTR void pmu_ll_imm_set_lp_pad_hold_all(pmu_dev_t *hw, bool hold_all)
374 {
375     if (hold_all) {
376         hw->imm.pad_hold_all.tie_high_lp_pad_hold_all = 1;
377     } else {
378         hw->imm.pad_hold_all.tie_low_lp_pad_hold_all = 1;
379     }
380 }
381 
382 /*** */
pmu_ll_hp_set_power_force_reset(pmu_dev_t * hw,pmu_hp_power_domain_t domain,bool rst)383 FORCE_INLINE_ATTR void pmu_ll_hp_set_power_force_reset(pmu_dev_t *hw, pmu_hp_power_domain_t domain, bool rst)
384 {
385     hw->power.hp_pd[domain].force_reset = rst;
386 }
387 
pmu_ll_hp_set_power_force_isolate(pmu_dev_t * hw,pmu_hp_power_domain_t domain,bool iso)388 FORCE_INLINE_ATTR void pmu_ll_hp_set_power_force_isolate(pmu_dev_t *hw, pmu_hp_power_domain_t domain, bool iso)
389 {
390     hw->power.hp_pd[domain].force_iso = iso;
391 }
392 
pmu_ll_hp_set_power_force_power_up(pmu_dev_t * hw,pmu_hp_power_domain_t domain,bool fpu)393 FORCE_INLINE_ATTR void pmu_ll_hp_set_power_force_power_up(pmu_dev_t *hw, pmu_hp_power_domain_t domain, bool fpu)
394 {
395     hw->power.hp_pd[domain].force_pu = fpu;
396 }
397 
pmu_ll_hp_set_power_force_no_reset(pmu_dev_t * hw,pmu_hp_power_domain_t domain,bool no_rst)398 FORCE_INLINE_ATTR void pmu_ll_hp_set_power_force_no_reset(pmu_dev_t *hw, pmu_hp_power_domain_t domain, bool no_rst)
399 {
400     hw->power.hp_pd[domain].force_no_reset = no_rst;
401 }
402 
pmu_ll_hp_set_power_force_no_isolate(pmu_dev_t * hw,pmu_hp_power_domain_t domain,bool no_iso)403 FORCE_INLINE_ATTR void pmu_ll_hp_set_power_force_no_isolate(pmu_dev_t *hw, pmu_hp_power_domain_t domain, bool no_iso)
404 {
405     hw->power.hp_pd[domain].force_no_iso = no_iso;
406 }
407 
pmu_ll_hp_set_power_force_power_down(pmu_dev_t * hw,pmu_hp_power_domain_t domain,bool fpd)408 FORCE_INLINE_ATTR void pmu_ll_hp_set_power_force_power_down(pmu_dev_t *hw, pmu_hp_power_domain_t domain, bool fpd)
409 {
410     hw->power.hp_pd[domain].force_pd = fpd;
411 }
412 
pmu_ll_lp_set_power_force_reset(pmu_dev_t * hw,bool rst)413 FORCE_INLINE_ATTR void pmu_ll_lp_set_power_force_reset(pmu_dev_t *hw, bool rst)
414 {
415     hw->power.lp_peri.force_reset = rst;
416 }
417 
pmu_ll_lp_set_power_force_isolate(pmu_dev_t * hw,bool iso)418 FORCE_INLINE_ATTR void pmu_ll_lp_set_power_force_isolate(pmu_dev_t *hw, bool iso)
419 {
420     hw->power.lp_peri.force_iso = iso;
421 }
422 
pmu_ll_lp_set_power_force_power_up(pmu_dev_t * hw,bool fpu)423 FORCE_INLINE_ATTR void pmu_ll_lp_set_power_force_power_up(pmu_dev_t *hw, bool fpu)
424 {
425     hw->power.lp_peri.force_pu = fpu;
426 }
427 
pmu_ll_lp_set_power_force_no_reset(pmu_dev_t * hw,bool no_rst)428 FORCE_INLINE_ATTR void pmu_ll_lp_set_power_force_no_reset(pmu_dev_t *hw, bool no_rst)
429 {
430     hw->power.lp_peri.force_no_reset = no_rst;
431 }
432 
pmu_ll_lp_set_power_force_no_isolate(pmu_dev_t * hw,bool no_iso)433 FORCE_INLINE_ATTR void pmu_ll_lp_set_power_force_no_isolate(pmu_dev_t *hw, bool no_iso)
434 {
435     hw->power.lp_peri.force_no_iso = no_iso;
436 }
437 
pmu_ll_lp_set_power_force_power_down(pmu_dev_t * hw,bool fpd)438 FORCE_INLINE_ATTR void pmu_ll_lp_set_power_force_power_down(pmu_dev_t *hw, bool fpd)
439 {
440     hw->power.lp_peri.force_pd = fpd;
441 }
442 
pmu_ll_hp_set_memory_isolate(pmu_dev_t * hw,uint32_t iso)443 FORCE_INLINE_ATTR void pmu_ll_hp_set_memory_isolate(pmu_dev_t *hw, uint32_t iso)
444 {
445     hw->power.mem_cntl.force_hp_mem_iso = iso;
446 }
447 
pmu_ll_hp_set_memory_power_down(pmu_dev_t * hw,uint32_t fpd)448 FORCE_INLINE_ATTR void pmu_ll_hp_set_memory_power_down(pmu_dev_t *hw, uint32_t fpd)
449 {
450     hw->power.mem_cntl.force_hp_mem_pd = fpd;
451 }
452 
pmu_ll_hp_set_memory_no_isolate(pmu_dev_t * hw,uint32_t no_iso)453 FORCE_INLINE_ATTR void pmu_ll_hp_set_memory_no_isolate(pmu_dev_t *hw, uint32_t no_iso)
454 {
455     hw->power.mem_cntl.force_hp_mem_no_iso = no_iso;
456 }
457 
pmu_ll_hp_set_memory_power_up(pmu_dev_t * hw,uint32_t fpu)458 FORCE_INLINE_ATTR void pmu_ll_hp_set_memory_power_up(pmu_dev_t *hw, uint32_t fpu)
459 {
460     hw->power.mem_cntl.force_hp_mem_pu = fpu;
461 }
462 
463 /*** */
pmu_ll_hp_set_sleep_enable(pmu_dev_t * hw)464 FORCE_INLINE_ATTR void pmu_ll_hp_set_sleep_enable(pmu_dev_t *hw)
465 {
466     hw->wakeup.cntl0.sleep_req = 1;
467 }
468 
pmu_ll_hp_set_reject_enable(pmu_dev_t * hw,uint32_t reject)469 FORCE_INLINE_ATTR void pmu_ll_hp_set_reject_enable(pmu_dev_t *hw, uint32_t reject)
470 {
471     hw->wakeup.cntl1.sleep_reject_ena = reject;
472     hw->wakeup.cntl1.slp_reject_en = 1;
473 }
474 
pmu_ll_hp_set_reject_disable(pmu_dev_t * hw)475 FORCE_INLINE_ATTR void pmu_ll_hp_set_reject_disable(pmu_dev_t *hw)
476 {
477     hw->wakeup.cntl1.slp_reject_en = 0;
478 }
479 
pmu_ll_hp_set_wakeup_enable(pmu_dev_t * hw,uint32_t wakeup)480 FORCE_INLINE_ATTR void pmu_ll_hp_set_wakeup_enable(pmu_dev_t *hw, uint32_t wakeup)
481 {
482     hw->wakeup.cntl2 = wakeup;
483 }
484 
pmu_ll_hp_set_sleep_protect_mode(pmu_dev_t * hw,int mode)485 FORCE_INLINE_ATTR void pmu_ll_hp_set_sleep_protect_mode(pmu_dev_t *hw, int mode)
486 {
487     hw->wakeup.cntl3.sleep_prt_sel = mode;
488 }
489 
pmu_ll_hp_set_min_sleep_cycle(pmu_dev_t * hw,uint32_t slow_clk_cycle)490 FORCE_INLINE_ATTR void pmu_ll_hp_set_min_sleep_cycle(pmu_dev_t *hw, uint32_t slow_clk_cycle)
491 {
492     HAL_FORCE_MODIFY_U32_REG_FIELD(hw->wakeup.cntl3, hp_min_slp_val, slow_clk_cycle);
493 }
494 
pmu_ll_hp_clear_reject_cause(pmu_dev_t * hw)495 FORCE_INLINE_ATTR void pmu_ll_hp_clear_reject_cause(pmu_dev_t *hw)
496 {
497     hw->wakeup.cntl4.slp_reject_cause_clr = 1;
498 }
499 
pmu_ll_hp_is_sleep_wakeup(pmu_dev_t * hw)500 FORCE_INLINE_ATTR bool pmu_ll_hp_is_sleep_wakeup(pmu_dev_t *hw)
501 {
502     return (hw->hp_ext.int_raw.wakeup == 1);
503 }
504 
pmu_ll_hp_is_sleep_reject(pmu_dev_t * hw)505 FORCE_INLINE_ATTR bool pmu_ll_hp_is_sleep_reject(pmu_dev_t *hw)
506 {
507     return (hw->hp_ext.int_raw.reject == 1);
508 }
509 
pmu_ll_hp_clear_sw_intr_status(pmu_dev_t * hw)510 FORCE_INLINE_ATTR void pmu_ll_hp_clear_sw_intr_status(pmu_dev_t *hw)
511 {
512     hw->hp_ext.int_clr.sw = 1;
513 }
514 
pmu_ll_hp_clear_wakeup_intr_status(pmu_dev_t * hw)515 FORCE_INLINE_ATTR void pmu_ll_hp_clear_wakeup_intr_status(pmu_dev_t *hw)
516 {
517     hw->hp_ext.int_clr.wakeup = 1;
518 }
519 
pmu_ll_hp_clear_reject_intr_status(pmu_dev_t * hw)520 FORCE_INLINE_ATTR void pmu_ll_hp_clear_reject_intr_status(pmu_dev_t *hw)
521 {
522     hw->hp_ext.int_clr.reject = 1;
523 }
524 
pmu_ll_hp_get_wakeup_cause(pmu_dev_t * hw)525 FORCE_INLINE_ATTR uint32_t pmu_ll_hp_get_wakeup_cause(pmu_dev_t *hw)
526 {
527     return hw->wakeup.status0;
528 }
529 
pmu_ll_hp_get_reject_cause(pmu_dev_t * hw)530 FORCE_INLINE_ATTR uint32_t pmu_ll_hp_get_reject_cause(pmu_dev_t *hw)
531 {
532     return hw->wakeup.status1;
533 }
534 
pmu_ll_lp_get_interrupt_raw(pmu_dev_t * hw)535 FORCE_INLINE_ATTR uint32_t pmu_ll_lp_get_interrupt_raw(pmu_dev_t *hw)
536 {
537     return hw->lp_ext.int_raw.val;
538 }
539 
pmu_ll_lp_clear_intsts_mask(pmu_dev_t * hw,uint32_t mask)540 FORCE_INLINE_ATTR void pmu_ll_lp_clear_intsts_mask(pmu_dev_t *hw, uint32_t mask)
541 {
542     hw->lp_ext.int_clr.val = mask;
543 }
544 
pmu_ll_lp_set_min_sleep_cycle(pmu_dev_t * hw,uint32_t slow_clk_cycle)545 FORCE_INLINE_ATTR void pmu_ll_lp_set_min_sleep_cycle(pmu_dev_t *hw, uint32_t slow_clk_cycle)
546 {
547     HAL_FORCE_MODIFY_U32_REG_FIELD(hw->wakeup.cntl3, lp_min_slp_val, slow_clk_cycle);
548 }
549 
pmu_ll_hp_set_modify_icg_cntl_wait_cycle(pmu_dev_t * hw,uint32_t cycle)550 FORCE_INLINE_ATTR void pmu_ll_hp_set_modify_icg_cntl_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
551 {
552     HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hp_ext.clk_cntl, modify_icg_cntl_wait, cycle);
553 }
554 
pmu_ll_hp_get_modify_icg_cntl_wait_cycle(pmu_dev_t * hw)555 FORCE_INLINE_ATTR uint32_t pmu_ll_hp_get_modify_icg_cntl_wait_cycle(pmu_dev_t *hw)
556 {
557     return HAL_FORCE_READ_U32_REG_FIELD(hw->hp_ext.clk_cntl, modify_icg_cntl_wait);
558 }
559 
pmu_ll_hp_set_switch_icg_cntl_wait_cycle(pmu_dev_t * hw,uint32_t cycle)560 FORCE_INLINE_ATTR void pmu_ll_hp_set_switch_icg_cntl_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
561 {
562     HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hp_ext.clk_cntl, switch_icg_cntl_wait, cycle);
563 }
564 
pmu_ll_hp_get_switch_icg_cntl_wait_cycle(pmu_dev_t * hw)565 FORCE_INLINE_ATTR uint32_t pmu_ll_hp_get_switch_icg_cntl_wait_cycle(pmu_dev_t *hw)
566 {
567     return HAL_FORCE_READ_U32_REG_FIELD(hw->hp_ext.clk_cntl, switch_icg_cntl_wait);
568 }
569 
pmu_ll_hp_set_digital_power_down_wait_cycle(pmu_dev_t * hw,uint32_t cycle)570 FORCE_INLINE_ATTR void pmu_ll_hp_set_digital_power_down_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
571 {
572     hw->power.wait_timer0.powerdown_timer = cycle;
573 }
574 
pmu_ll_hp_get_digital_power_down_wait_cycle(pmu_dev_t * hw)575 FORCE_INLINE_ATTR uint32_t pmu_ll_hp_get_digital_power_down_wait_cycle(pmu_dev_t *hw)
576 {
577     return hw->power.wait_timer0.powerdown_timer;
578 }
579 
pmu_ll_lp_set_digital_power_down_wait_cycle(pmu_dev_t * hw,uint32_t cycle)580 FORCE_INLINE_ATTR void pmu_ll_lp_set_digital_power_down_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
581 {
582     hw->power.wait_timer1.powerdown_timer = cycle;
583 }
584 
pmu_ll_lp_get_digital_power_down_wait_cycle(pmu_dev_t * hw)585 FORCE_INLINE_ATTR uint32_t pmu_ll_lp_get_digital_power_down_wait_cycle(pmu_dev_t *hw)
586 {
587     return hw->power.wait_timer1.powerdown_timer;
588 }
589 
pmu_ll_lp_set_analog_wait_target_cycle(pmu_dev_t * hw,uint32_t slow_clk_cycle)590 FORCE_INLINE_ATTR void pmu_ll_lp_set_analog_wait_target_cycle(pmu_dev_t *hw, uint32_t slow_clk_cycle)
591 {
592     HAL_FORCE_MODIFY_U32_REG_FIELD(hw->wakeup.cntl5, lp_ana_wait_target, slow_clk_cycle);
593 }
594 
pmu_ll_lp_get_analog_wait_target_cycle(pmu_dev_t * hw)595 FORCE_INLINE_ATTR uint32_t pmu_ll_lp_get_analog_wait_target_cycle(pmu_dev_t *hw)
596 {
597     return HAL_FORCE_READ_U32_REG_FIELD(hw->wakeup.cntl5, lp_ana_wait_target);
598 }
599 
pmu_ll_set_modem_wait_target_cycle(pmu_dev_t * hw,uint32_t cycle)600 FORCE_INLINE_ATTR void pmu_ll_set_modem_wait_target_cycle(pmu_dev_t *hw, uint32_t cycle)
601 {
602     hw->wakeup.cntl5.modem_wait_target = cycle;
603 }
604 
pmu_ll_get_modem_wait_target_cycle(pmu_dev_t * hw)605 FORCE_INLINE_ATTR uint32_t pmu_ll_get_modem_wait_target_cycle(pmu_dev_t *hw)
606 {
607     return hw->wakeup.cntl5.modem_wait_target;
608 }
609 
pmu_ll_set_xtal_stable_wait_cycle(pmu_dev_t * hw,uint32_t cycle)610 FORCE_INLINE_ATTR void pmu_ll_set_xtal_stable_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
611 {
612     HAL_FORCE_MODIFY_U32_REG_FIELD(hw->power.clk_wait, wait_xtal_stable, cycle);
613 }
614 
pmu_ll_get_xtal_stable_wait_cycle(pmu_dev_t * hw)615 FORCE_INLINE_ATTR uint32_t pmu_ll_get_xtal_stable_wait_cycle(pmu_dev_t *hw)
616 {
617     return HAL_FORCE_READ_U32_REG_FIELD(hw->power.clk_wait, wait_xtal_stable);
618 }
619 
pmu_ll_set_pll_stable_wait_cycle(pmu_dev_t * hw,uint32_t cycle)620 FORCE_INLINE_ATTR void pmu_ll_set_pll_stable_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
621 {
622     HAL_FORCE_MODIFY_U32_REG_FIELD(hw->power.clk_wait, wait_pll_stable, cycle);
623 }
624 
pmu_ll_get_pll_stable_wait_cycle(pmu_dev_t * hw)625 FORCE_INLINE_ATTR uint32_t pmu_ll_get_pll_stable_wait_cycle(pmu_dev_t *hw)
626 {
627     return HAL_FORCE_READ_U32_REG_FIELD(hw->power.clk_wait, wait_pll_stable);
628 }
629 
pmu_ll_lp_set_digital_power_supply_wait_cycle(pmu_dev_t * hw,uint32_t cycle)630 FORCE_INLINE_ATTR void pmu_ll_lp_set_digital_power_supply_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
631 {
632     hw->power.wait_timer1.wait_timer = cycle;
633 }
634 
pmu_ll_lp_get_digital_power_supply_wait_cycle(pmu_dev_t * hw)635 FORCE_INLINE_ATTR uint32_t pmu_ll_lp_get_digital_power_supply_wait_cycle(pmu_dev_t *hw)
636 {
637     return hw->power.wait_timer1.wait_timer;
638 }
639 
pmu_ll_lp_set_digital_power_up_wait_cycle(pmu_dev_t * hw,uint32_t cycle)640 FORCE_INLINE_ATTR void pmu_ll_lp_set_digital_power_up_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
641 {
642     hw->power.wait_timer1.powerup_timer = cycle;
643 }
644 
pmu_ll_lp_get_digital_power_up_wait_cycle(pmu_dev_t * hw)645 FORCE_INLINE_ATTR uint32_t pmu_ll_lp_get_digital_power_up_wait_cycle(pmu_dev_t *hw)
646 {
647     return hw->power.wait_timer1.powerup_timer;
648 }
649 
pmu_ll_hp_set_analog_wait_target_cycle(pmu_dev_t * hw,uint32_t cycle)650 FORCE_INLINE_ATTR void pmu_ll_hp_set_analog_wait_target_cycle(pmu_dev_t *hw, uint32_t cycle)
651 {
652     HAL_FORCE_MODIFY_U32_REG_FIELD(hw->wakeup.cntl7, ana_wait_target, cycle);
653 }
654 
pmu_ll_hp_get_analog_wait_target_cycle(pmu_dev_t * hw)655 FORCE_INLINE_ATTR uint32_t pmu_ll_hp_get_analog_wait_target_cycle(pmu_dev_t *hw)
656 {
657     return HAL_FORCE_READ_U32_REG_FIELD(hw->wakeup.cntl7, ana_wait_target);
658 }
659 
pmu_ll_hp_set_digital_power_supply_wait_cycle(pmu_dev_t * hw,uint32_t cycle)660 FORCE_INLINE_ATTR void pmu_ll_hp_set_digital_power_supply_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
661 {
662     hw->power.wait_timer0.wait_timer = cycle;
663 }
664 
pmu_ll_hp_get_digital_power_supply_wait_cycle(pmu_dev_t * hw)665 FORCE_INLINE_ATTR uint32_t pmu_ll_hp_get_digital_power_supply_wait_cycle(pmu_dev_t *hw)
666 {
667     return hw->power.wait_timer0.wait_timer;
668 }
669 
pmu_ll_hp_set_digital_power_up_wait_cycle(pmu_dev_t * hw,uint32_t cycle)670 FORCE_INLINE_ATTR void pmu_ll_hp_set_digital_power_up_wait_cycle(pmu_dev_t *hw, uint32_t cycle)
671 {
672     hw->power.wait_timer0.powerup_timer = cycle;
673 }
674 
pmu_ll_hp_get_digital_power_up_wait_cycle(pmu_dev_t * hw)675 FORCE_INLINE_ATTR uint32_t pmu_ll_hp_get_digital_power_up_wait_cycle(pmu_dev_t *hw)
676 {
677     return hw->power.wait_timer0.powerup_timer;
678 }
679 
pmu_ll_get_sysclk_sleep_select_state(pmu_dev_t * hw)680 FORCE_INLINE_ATTR uint32_t pmu_ll_get_sysclk_sleep_select_state(pmu_dev_t *hw)
681 {
682     return hw->clk_state0.sysclk_slp_sel;
683 }
684 
685 #ifdef __cplusplus
686 }
687 #endif
688