1 #include <asm/arch/sci_types.h>
2 #include <asm/arch/adi_hal_internal.h>
3 #include <asm/arch/chip_drv_common_io.h>
4 #include <asm/arch/sprd_reg.h>
5 #include <asm/arch/low_power.h>
7 //#define LDO_SLP_DEBUG
9 typedef struct slp_test {
15 void test_store (test_t *buf)
17 unsigned int i = 0, j = 0;
18 buf[i].reg = ANA_REG_GLB_LDO_PD_CTRL;
19 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_LDO_PD_CTRL);
21 buf[i].reg = ANA_REG_GLB_LDO_SLP_CTRL0;
22 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_LDO_SLP_CTRL0);
24 buf[i].reg = ANA_REG_GLB_LDO_SLP_CTRL1;
25 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_LDO_SLP_CTRL1);
27 buf[i].reg = ANA_REG_GLB_LDO_SLP_CTRL2;
28 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_LDO_SLP_CTRL2);
30 buf[i].reg = ANA_REG_GLB_LDO_SLP_CTRL3;
31 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_LDO_SLP_CTRL3);
33 buf[i].reg = ANA_REG_GLB_PWR_XTL_EN0;
34 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_PWR_XTL_EN0);
36 buf[i].reg = ANA_REG_GLB_PWR_XTL_EN1;
37 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_PWR_XTL_EN1);
39 buf[i].reg = ANA_REG_GLB_PWR_XTL_EN2;
40 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_PWR_XTL_EN2);
42 buf[i].reg = ANA_REG_GLB_PWR_XTL_EN3;
43 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_PWR_XTL_EN3);
45 buf[i].reg = ANA_REG_GLB_PWR_XTL_EN4;
46 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_PWR_XTL_EN4);
48 buf[i].reg = ANA_REG_GLB_PWR_XTL_EN5;
49 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_PWR_XTL_EN5);
51 buf[i].reg = ANA_REG_GLB_LDO1828_XTL_CTL;
52 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_LDO1828_XTL_CTL);
54 buf[i].reg = ANA_REG_GLB_SLP_WAIT_DCDCARM;
55 buf[i++].val = ANA_REG_GET(ANA_REG_GLB_SLP_WAIT_DCDCARM);
57 buf[i].reg = REG_PMU_APB_XTL0_REL_CFG;
58 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_XTL0_REL_CFG);
60 buf[i].reg = REG_PMU_APB_XTL1_REL_CFG;
61 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_XTL1_REL_CFG);
63 buf[i].reg = REG_PMU_APB_XTL2_REL_CFG;
64 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_XTL2_REL_CFG);
66 buf[i].reg = REG_PMU_APB_XTLBUF0_REL_CFG;
67 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_XTLBUF0_REL_CFG);
69 buf[i].reg = REG_PMU_APB_XTLBUF1_REL_CFG;
70 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_XTLBUF1_REL_CFG);
72 buf[i].reg = REG_PMU_APB_MPLL_REL_CFG;
73 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_MPLL_REL_CFG);
75 buf[i].reg = REG_PMU_APB_DPLL_REL_CFG;
76 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_DPLL_REL_CFG);
78 buf[i].reg = REG_PMU_APB_TDPLL_REL_CFG;
79 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_TDPLL_REL_CFG);
81 buf[i].reg = REG_PMU_APB_WPLL_REL_CFG;
82 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_WPLL_REL_CFG);
84 buf[i].reg = REG_PMU_APB_CPLL_REL_CFG;
85 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_CPLL_REL_CFG);
87 buf[i].reg = REG_PMU_APB_WIFIPLL1_REL_CFG;
88 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_WIFIPLL1_REL_CFG);
90 buf[i].reg = REG_PMU_APB_WIFIPLL2_REL_CFG;
91 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_WIFIPLL2_REL_CFG);
93 // buf[i].reg = REG_PMU_APB_CGM_AP_EN;
94 // buf[i++].val = CHIP_REG_GET(REG_PMU_APB_CGM_AP_EN);
96 buf[i].reg = REG_PMU_APB_PD_CA7_TOP_CFG;
97 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PD_CA7_TOP_CFG);
99 buf[i].reg = REG_PMU_APB_PD_CA7_C0_CFG;
100 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PD_CA7_C0_CFG);
102 buf[i].reg = REG_PMU_APB_PD_CA7_C1_CFG;
103 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PD_CA7_C1_CFG);
105 buf[i].reg = REG_PMU_APB_PD_CA7_C2_CFG;
106 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PD_CA7_C2_CFG);
108 buf[i].reg = REG_PMU_APB_PD_CA7_C3_CFG;
109 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PD_CA7_C3_CFG);
111 buf[i].reg = REG_PMU_APB_PD_AP_SYS_CFG;
112 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PD_AP_SYS_CFG);
114 buf[i].reg = REG_PMU_APB_PD_MM_TOP_CFG;
115 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PD_MM_TOP_CFG);
117 buf[i].reg = REG_PMU_APB_PD_GPU_TOP_CFG;
118 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PD_GPU_TOP_CFG);
120 buf[i].reg = REG_PMU_APB_PD_PUB_SYS_CFG;
121 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PD_PUB_SYS_CFG);
123 buf[i].reg = REG_PMU_APB_XTL_WAIT_CNT;
124 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_XTL_WAIT_CNT);
126 buf[i].reg = REG_PMU_APB_XTLBUF_WAIT_CNT;
127 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_XTLBUF_WAIT_CNT);
129 buf[i].reg = REG_PMU_APB_PLL_WAIT_CNT1;
130 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PLL_WAIT_CNT1);
132 buf[i].reg = REG_PMU_APB_PLL_WAIT_CNT2;
133 buf[i++].val = CHIP_REG_GET(REG_PMU_APB_PLL_WAIT_CNT2);
137 buf[i].val = 0x55AA55AA;
139 for(j = 0; j < i; j++) {
140 printf("addr:0x%.8x, val:0x%.8x\n",buf[j].reg,buf[j].val);
145 static struct ldo_lowpower_cfg *gp_ldo_cfg = NULL;
146 static struct pll_cfg *gp_pll_cfg = NULL;
147 static struct shutdown_cfg *gp_shutdown_cfg = NULL;
149 void customize_low_power_init_prepare(struct ldo_lowpower_cfg *ldo,
151 struct shutdown_cfg *shutdown)
155 gp_shutdown_cfg = shutdown;
158 static void switch_protect(unsigned int rf_id)
160 unsigned int pll_reg;
161 /* before switch reference crystal, it must be sure that no module is using TDPLL */
162 pll_reg = CHIP_REG_GET(REG_AP_CLK_AP_AHB_CFG);
163 pll_reg &= ~AP_AHB_CLK_SEL_MASK;
164 CHIP_REG_SET(REG_AP_CLK_AP_AHB_CFG,pll_reg);
166 pll_reg = CHIP_REG_GET(REG_AON_CLK_PUB_AHB_CFG);
167 pll_reg &= ~PUB_AHB_CLK_SEL_MASK;
168 CHIP_REG_SET(REG_AON_CLK_PUB_AHB_CFG,pll_reg);
170 pll_reg = CHIP_REG_GET(REG_AP_CLK_AP_APB_CFG);
171 pll_reg &= ~AP_APB_CLK_SEL_MASK;
172 CHIP_REG_SET(REG_AP_CLK_AP_APB_CFG,pll_reg);
174 pll_reg = CHIP_REG_GET(REG_AON_CLK_AON_APB_CFG);
175 pll_reg &= ~PUB_APB_CLK_SEL_MASK;
176 CHIP_REG_SET(REG_AON_CLK_AON_APB_CFG,pll_reg);
178 pll_reg = CHIP_REG_GET(REG_AON_APB_PLL_SOFT_CNT_DONE);
179 pll_reg &= ~(BIT_TDPLL_SOFT_CNT_DONE);
180 CHIP_REG_SET(REG_AON_APB_PLL_SOFT_CNT_DONE,pll_reg);
183 /* switch TDPLL reference crystal */
186 pll_reg = CHIP_REG_GET(REG_PMU_APB_TDPLL_REL_CFG);
187 pll_reg &= ~(0x1 << 4);
188 CHIP_REG_SET(REG_PMU_APB_TDPLL_REL_CFG,pll_reg);
190 pll_reg = CHIP_REG_GET(REG_PMU_APB_XTL0_REL_CFG);
191 pll_reg |= BIT_XTL1_AP_SEL;
192 CHIP_REG_SET(REG_PMU_APB_XTL0_REL_CFG,pll_reg);
194 pll_reg = CHIP_REG_GET(REG_PMU_APB_XTLBUF0_REL_CFG);
195 pll_reg |= BIT_XTLBUF1_AP_SEL;
196 CHIP_REG_SET(REG_PMU_APB_XTLBUF0_REL_CFG,pll_reg);
201 pll_reg = CHIP_REG_GET(REG_PMU_APB_TDPLL_REL_CFG);
202 pll_reg |= (0x1 << 4);
203 CHIP_REG_SET(REG_PMU_APB_TDPLL_REL_CFG,pll_reg);
205 pll_reg = CHIP_REG_GET(REG_PMU_APB_XTL1_REL_CFG);
206 pll_reg |= BIT_XTL1_AP_SEL;
207 CHIP_REG_SET(REG_PMU_APB_XTL1_REL_CFG,pll_reg);
209 pll_reg = CHIP_REG_GET(REG_PMU_APB_XTLBUF1_REL_CFG);
210 pll_reg |= BIT_XTLBUF1_AP_SEL;
211 CHIP_REG_SET(REG_PMU_APB_XTLBUF1_REL_CFG,pll_reg);
216 pll_reg = CHIP_REG_GET(REG_AON_APB_PLL_SOFT_CNT_DONE);
217 pll_reg |= (BIT_TDPLL_SOFT_CNT_DONE);
218 CHIP_REG_SET(REG_AON_APB_PLL_SOFT_CNT_DONE,pll_reg);
222 /* after switch, up ahb clock to 128M, APB to 64M */
223 pll_reg = CHIP_REG_GET(REG_AP_CLK_AP_AHB_CFG);
225 CHIP_REG_SET(REG_AP_CLK_AP_AHB_CFG,pll_reg);
227 pll_reg = CHIP_REG_GET(REG_AON_CLK_PUB_AHB_CFG);
229 CHIP_REG_SET(REG_AON_CLK_PUB_AHB_CFG,pll_reg);
231 pll_reg = CHIP_REG_GET(REG_AP_CLK_AP_APB_CFG);
233 CHIP_REG_SET(REG_AP_CLK_AP_APB_CFG,pll_reg);
235 pll_reg = CHIP_REG_GET(REG_AON_CLK_AON_APB_CFG);
237 CHIP_REG_SET(REG_AON_CLK_AON_APB_CFG,pll_reg);
238 printf("switch_protect end\n");
241 static void lowpower_earlyinit(void)
243 // ANA_REG_SET(REG_PMU_APB_PD_CP0_SYS_CFG, BIT_CP0_FORCE_DEEP_SLEEP);
244 // ANA_REG_SET(REG_PMU_APB_PD_CP1_SYS_CFG, BIT_CP1_FORCE_DEEP_SLEEP);
245 // ANA_REG_SET(REG_PMU_APB_PD_CP2_SYS_CFG, BIT_CP2_FORCE_DEEP_SLEEP);
247 ANA_REG_SET(ANA_REG_GLB_LDO_SLP_CTRL0, BIT_SLP_IO_EN);
248 ANA_REG_SET(ANA_REG_GLB_LDO_SLP_CTRL1, BIT_SLP_LDO_PD_EN);
249 ANA_REG_SET(ANA_REG_GLB_PWR_XTL_EN0, BIT_LDO_XTL_EN);
251 ANA_REG_SET(ANA_REG_GLB_SLP_WAIT_DCDCARM,0x0908);
252 // ANA_REG_SET(REG_PMU_APB_CGM_AP_EN,0x1fff81 );
254 // ANA_REG_SET(ANA_REG_GLB_LDO_DCDC_PD_RTCSET, 0xffff);
255 // ANA_REG_SET(ANA_REG_GLB_LDO_DCDC_PD_RTCCLR, 0xffff);
257 // switch_protect(1);
258 // ANA_REG_SET(REG_PMU_APB_WPLL_REL_CFG,BIT_WPLL_REF_SEL);
259 // ANA_REG_SET(REG_PMU_APB_TDPLL_REL_CFG,BIT_TDPLL_REF_SEL);
260 /*plls wait, xtl0/1 wait, xtlbuf0/1 wait time*/
263 static unsigned long ffs(unsigned int x)
269 while((x & (1<<i)) == 0) {
277 static unsigned long __ffs(unsigned int x)
283 static void pll_xtl_with_sys_config(struct pll_cfg *cfg, struct pll_reg_bit *pll_reg)
285 /*enable all xtl for simply config. xtlbuf0 is for ap, xtlbuf1 is for tdpll, choose!*/
286 unsigned int i = 0, j;
287 unsigned int sel_mode = 0, sel_tmp = 0;
289 if ((!cfg) || (cfg[0].pll_id == RESERVED_NUM) || (pll_reg == NULL)) {
293 /*collecting the current system mode, like TD only ..etc.*/
294 while (cfg[i].pll_id != RESERVED_NUM) {
296 while (pll_reg[j].pll_id != RESERVED_NUM) {
297 if (cfg[i].pll_id == pll_reg[j].pll_id) {
304 /* set select by ap,cp0,cp1,cp2 */
305 if (pll_reg[j].pll_sys_reg != -1) {
306 if(cfg[i].sys != DEFAULT) {
307 if (cfg[i].sys & AP_SYS) {
310 if (cfg[i].sys & CP0_SYS) {
313 if (cfg[i].sys & CP1_SYS) {
316 if (cfg[i].sys & CP2_SYS) {
320 sel_tmp = CHIP_REG_GET(pll_reg[j].pll_sys_reg);
321 sel_tmp &= ~pll_reg[j].pll_sys_reg_bitmsk;
322 sel_tmp |= (sel_mode << __ffs(pll_reg[j].pll_sys_reg_bitmsk)
323 & pll_reg[j].pll_sys_reg_bitmsk);
325 CHIP_REG_SET(pll_reg[j].pll_sys_reg, sel_tmp);
329 if (pll_reg[j].pll_wait_reg != -1) {
330 if (cfg[i].wait != DEFAULT) {
331 sel_mode = cfg[i].wait << __ffs(pll_reg[j].pll_wait_reg_bitmsk);
332 sel_mode &= pll_reg[j].pll_wait_reg_bitmsk;
334 sel_tmp = CHIP_REG_GET(pll_reg[j].pll_wait_reg);
335 sel_tmp &= ~pll_reg[j].pll_wait_reg_bitmsk;
338 CHIP_REG_SET(pll_reg[j].pll_wait_reg, sel_tmp);
346 static void pd_shutdown_config(struct shutdown_cfg *cfg,
347 struct pd_reg_bit *pd_reg)
349 /*enable all xtl for simply config. xtlbuf0 is for ap, xtlbuf1 is for tdpll, choose!*/
350 unsigned int i = 0, j;
351 unsigned int reg_value = 0;
353 if ((!cfg) || (cfg[0].pd_shutdown_id == RESERVED_NUM) || (pd_reg == NULL)) {
357 /*collecting the current system mode, like TD only ..etc.*/
358 while (cfg[i].pd_shutdown_id != RESERVED_NUM) {
360 while (pd_reg[j].pd_shutdown_id != RESERVED_NUM) {
361 if (cfg[i].pd_shutdown_id == pd_reg[j].pd_shutdown_id) {
367 if (pd_reg[j].pd_shutdown_id == RESERVED_NUM) {
371 if (pd_reg[j].pd_reg != -1) {
372 if(cfg[i].iso_on_delay != DEFAULT) {
373 reg_value = cfg[i].iso_on_delay << __ffs(pd_reg[j].iso_on_delay_bitmsk);
374 CHIP_REG_AND(pd_reg[j].pd_reg, ~pd_reg[j].iso_on_delay_bitmsk);
375 CHIP_REG_OR(pd_reg[j].pd_reg, reg_value);
378 if(cfg[i].pwr_on_seq_delay != DEFAULT) {//pwr_on_seq_delay
379 reg_value = cfg[i].pwr_on_seq_delay
380 << __ffs(pd_reg[j].pwr_on_seq_delay_bitmsk);
381 CHIP_REG_AND(pd_reg[j].pd_reg, ~pd_reg[j].pwr_on_seq_delay_bitmsk);
382 CHIP_REG_OR(pd_reg[j].pd_reg, reg_value);
385 if(cfg[i].pwr_on_delay != DEFAULT) {//pwr_on_delay
386 reg_value = cfg[i].pwr_on_delay << __ffs(pd_reg[j].pwr_on_delay_bitmsk);
387 CHIP_REG_AND(pd_reg[j].pd_reg, ~pd_reg[j].pwr_on_delay_bitmsk);
388 CHIP_REG_OR(pd_reg[j].pd_reg,reg_value);
391 if(cfg[i].auto_shutdown != DEFAULT) {
392 if(cfg[i].auto_shutdown == ENABLE) {//auto_shutdown
393 CHIP_REG_OR(pd_reg[j].pd_reg, pd_reg[j].auto_shutdown_bitmsk);
395 else if(cfg[i].auto_shutdown == DISABLE) {
396 CHIP_REG_AND(pd_reg[j].pd_reg, ~pd_reg[j].auto_shutdown_bitmsk);
400 if(cfg[i].force_shutdown != DEFAULT) {
401 if(cfg[i].force_shutdown == ENABLE) {//force_shutdown
402 CHIP_REG_OR(pd_reg[j].pd_reg, pd_reg[j].force_shutdown_bitmsk);
404 else if(cfg[i].force_shutdown == DISABLE) {
405 CHIP_REG_AND(pd_reg[j].pd_reg, ~pd_reg[j].force_shutdown_bitmsk);
409 if(cfg[i].debug_shutdown != DEFAULT) {
410 if(cfg[i].debug_shutdown == ENABLE) {//debug_shutdown
411 CHIP_REG_OR(pd_reg[j].pd_reg, pd_reg[j].debug_shutdown_bitmsk);
413 else if(cfg[i].debug_shutdown == DISABLE) {
414 CHIP_REG_AND(pd_reg[j].pd_reg, ~(pd_reg[j].debug_shutdown_bitmsk));
422 static void ddie_pll_lowpower_init(void)
424 /*default all:xtl0/1/2 to ap, default all:xtlbuf0/1 to ap +*/
425 pll_xtl_with_sys_config(gp_pll_cfg, pll_reg_tb);
426 pd_shutdown_config(gp_shutdown_cfg, shutdown_tb);
431 static void ldo_set_sts(struct ldo_lowpower_cfg *cfg, struct ldo_reg_bit *reg)
433 if (reg->ldo_pd_reg != -1) {
434 if (cfg->ldo_pd == ON) {
435 ANA_REG_OR(reg->ldo_pd_reg, reg->ldo_pd_reg_bitmsk);
436 } else if (cfg->ldo_pd == OFF) {
437 ANA_REG_BIC(reg->ldo_pd_reg, reg->ldo_pd_reg_bitmsk);
442 static void ldo_set_sts_sleep(struct ldo_lowpower_cfg *cfg, struct ldo_reg_bit *reg)
444 if (cfg->status_in_sleep == SLP_PD_MODE) {
445 if (reg->slp_pd_reg != -1) {
446 ANA_REG_OR(reg->slp_pd_reg, reg->slp_pd_reg_bitmsk);
448 if (reg->slp_lp_reg != -1) {
449 ANA_REG_BIC(reg->slp_lp_reg, reg->slp_lp_reg_bitmsk);
451 } else if (cfg->status_in_sleep == SLP_LP_MODE) {
452 if (reg->slp_pd_reg != -1) {
453 ANA_REG_BIC(reg->slp_pd_reg, reg->slp_pd_reg_bitmsk);
455 if (reg->slp_lp_reg != -1) {
456 ANA_REG_OR(reg->slp_lp_reg, reg->slp_lp_reg_bitmsk);
458 } else if (cfg->status_in_sleep == SLP_NO_MODE) {
459 if (reg->slp_pd_reg != -1) {
460 ANA_REG_BIC(reg->slp_pd_reg, reg->slp_pd_reg_bitmsk);
462 if (reg->slp_lp_reg != -1) {
463 ANA_REG_BIC(reg->slp_lp_reg, reg->slp_lp_reg_bitmsk);
466 // printf("error for this callback ldo_set_sts_sleep\n");
470 /* ldo_id, cfg_to_xtl, cfg_to_ext_xtl,power_sts_in_sleep; */
471 static void ldo_set_xtl(struct ldo_lowpower_cfg *cfg, struct ldo_reg_bit *reg)
473 unsigned int v = 0, tmp = 0;
474 unsigned int shft = 0;
476 if (reg->xtl_reg != -1) {
477 shft = __ffs(reg->xtl_reg_bitmsk);
479 if (cfg->select_by_xtl & BY_XTL0)
481 if (cfg->select_by_xtl & BY_XTL1)
483 if (cfg->select_by_xtl & BY_XTL2)
486 v &= reg->xtl_reg_bitmsk;
488 tmp = ANA_REG_GET(reg->xtl_reg);
489 tmp &= ~reg->xtl_reg_bitmsk;
492 ANA_REG_SET(reg->xtl_reg, tmp);
496 static void ldo_set_exxtl(struct ldo_lowpower_cfg *cfg, struct ldo_reg_bit *reg)
498 unsigned int v = 0, tmp = 0;
499 unsigned int shft = 0;
501 if (reg->ext_xtl_reg != -1) {
502 shft = __ffs(reg->ext_xtl_reg_bitmsk);
504 if (cfg->select_by_ext_xtl & BY_EXT_XTL0)
506 if (cfg->select_by_ext_xtl & BY_EXT_XTL1)
508 if (cfg->select_by_ext_xtl & BY_EXT_XTL2)
512 v &= reg->ext_xtl_reg_bitmsk;
514 tmp = ANA_REG_GET(reg->ext_xtl_reg);
515 tmp &= ~reg->ext_xtl_reg_bitmsk;
518 ANA_REG_SET(reg->ext_xtl_reg, tmp);
522 static void adie_ldo_lowpower_init()
524 struct ldo_lowpower_cfg *ldo_cfg = gp_ldo_cfg;
525 struct ldo_reg_bit *ldo_reg = ldo_reg_tb;
526 unsigned int i = 0, j = 0;
528 if ((!ldo_cfg) || (ldo_reg == NULL))
531 while (ldo_cfg[i].ldo_id != RESERVED_NUM) {
533 while (ldo_reg[j].ldo_id != RESERVED_NUM) {
534 if (ldo_cfg[i].ldo_id == ldo_reg[j].ldo_id) {
540 if (ldo_reg[j].ldo_id == RESERVED_NUM) {
544 if (ldo_cfg[i].ldo_pd != DEFAULT) {
545 ldo_set_sts(&ldo_cfg[i], &ldo_reg[j]);
547 if (ldo_cfg[i].status_in_sleep != DEFAULT) {
548 ldo_set_sts_sleep(&ldo_cfg[i], &ldo_reg[j]);
550 if (ldo_cfg[i].select_by_xtl!= DEFAULT) {
551 ldo_set_xtl(&ldo_cfg[i], &ldo_reg[j]);
553 if (ldo_cfg[i].select_by_ext_xtl != DEFAULT) {
554 ldo_set_exxtl(&ldo_cfg[i], &ldo_reg[j]);
560 void low_power_init(void)
563 Every ldo LP/PD depend on AP, we can make ap select xtl_buf_en0, xtl_buf_en1,
564 xtl_buf_en2 and cp0 select xtl_buf_en0, cp1 select xtl-buf_en1, cp2 select xtl_buf_en2, so
565 ldo_x can flexiblly config to xtl0/cp0, xtl1/cp1, xtl2/cp2. But now, we can make this process
566 to simple. make xtl_buf_en0 == xtl_buf_en1 == xtl_buf_en2
567 if cp(X) is exist, slecet all xtl_Buf_en0/1/2.
569 lowpower_earlyinit();
570 ddie_pll_lowpower_init();
571 adie_ldo_lowpower_init();
573 /* used test register */