1 /******************************************************************************
2 ** File Name: ldo_drv.c *
5 ** Copyright: 2007 Spreatrum, Incoporated. All Rights Reserved. *
6 ** Description: This file defines the basic function for ldo management. *
7 ******************************************************************************/
9 /******************************************************************************
11 ** ------------------------------------------------------------------------- *
12 ** DATE NAME DESCRIPTION *
13 ** 01/09/2009 Yi.Qiu Create. *
14 ******************************************************************************/
16 /**---------------------------------------------------------------------------*
18 **---------------------------------------------------------------------------*/
22 #include <asm/arch/regs_global.h>
23 #include <asm/arch/bits.h>
24 #include <asm/arch/ldo.h>
25 #include <asm/arch/regs_ana.h>
27 #define LDO_INVALID_REG 0xFFFFFFFF
28 #define LDO_INVALID_BIT 0xFFFFFFFF
31 #define CURRENT_STATUS_INIT 0x00000001
32 #define CURRENT_STATUS_ON 0x00000002
33 #define CURRENT_STATUS_OFF 0x00000004
35 #define LDO_INVALID_REG_ADDR (0x1)
37 #define CHIP_REG_OR(reg_addr, value) (*(volatile unsigned int *)(reg_addr) |= (unsigned int)(value))
38 #define CHIP_REG_AND(reg_addr, value) (*(volatile unsigned int *)(reg_addr) &= (unsigned int)(value))
39 #define CHIP_REG_GET(reg_addr) (*(volatile unsigned int *)(reg_addr))
40 #define CHIP_REG_SET(reg_addr, value) (*(volatile unsigned int *)(reg_addr) = (unsigned int)(value))
42 #define SCI_PASSERT(condition, format...) \
45 printf("function :%s\r\n", __FUNCTION__);\
57 unsigned int bp_rst_reg;
58 unsigned int bp_rst;//bits
60 unsigned int level_reg_b0;
64 unsigned int level_reg_b1;
68 unsigned int init_level;
74 int current_volt_level;
77 struct ldo_sleep_ctl_info {
79 unsigned int ldo_sleep_reg;
83 #ifdef CONFIG_SC7710G2
84 static struct ldo_ctl_info ldo_ctl_data[] =
88 .bp_reg = ANA_LDO_PD_SET,
90 .bp_rst_reg = ANA_LDO_PD_RST,
92 .level_reg_b0 = LDO_INVALID_REG_ADDR,
95 .level_reg_b1 = LDO_INVALID_REG_ADDR,
98 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
102 .bp_reg = ANA_LDO_PD_SET,
104 .bp_rst_reg = ANA_LDO_PD_RST,
106 .level_reg_b0 = ANA_LDO_VCTL3,
109 .level_reg_b1 = ANA_LDO_VCTL3,
112 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
116 .bp_reg = ANA_LDO_PD_SET,
118 .bp_rst_reg = ANA_LDO_PD_RST,
120 .level_reg_b0 = ANA_LDO_VCTL3,
123 .level_reg_b1 = ANA_LDO_VCTL3,
126 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
130 .bp_reg = ANA_LDO_PD_SET,
132 .bp_rst_reg = ANA_LDO_PD_RST,
134 .level_reg_b0 = ANA_LDO_VCTL3,
137 .level_reg_b1 = ANA_LDO_VCTL3,
140 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
144 .bp_reg = ANA_LDO_PD_SET,
146 .bp_rst_reg = ANA_LDO_PD_RST,
148 .level_reg_b0 = ANA_LDO_VCTL0,
151 .level_reg_b1 = ANA_LDO_VCTL0,
154 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
158 .bp_reg = ANA_LDO_PD_SET,
160 .bp_rst_reg = ANA_LDO_PD_RST,
162 .level_reg_b0 = ANA_LDO_VCTL0,
165 .level_reg_b1 = ANA_LDO_VCTL0,
168 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
172 .bp_reg = ANA_LDO_PD_SET,
174 .bp_rst_reg = ANA_LDO_PD_RST,
176 .level_reg_b0 = ANA_LDO_VCTL0,
179 .level_reg_b1 = ANA_LDO_VCTL0,
182 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
186 .bp_reg = ANA_LDO_PD_SET,
188 .bp_rst_reg = ANA_LDO_PD_RST,
190 .level_reg_b0 = LDO_INVALID_REG_ADDR,
193 .level_reg_b1 = LDO_INVALID_REG_ADDR,
196 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
200 .bp_reg = ANA_LDO_PD_SET,
202 .bp_rst_reg = ANA_LDO_PD_RST,
204 .level_reg_b0 = LDO_INVALID_REG_ADDR,
207 .level_reg_b1 = LDO_INVALID_REG_ADDR,
210 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
214 .bp_reg = ANA_LDO_PD_SET,
216 .bp_rst_reg = ANA_LDO_PD_RST,
218 .level_reg_b0 = LDO_INVALID_REG_ADDR,
221 .level_reg_b1 = LDO_INVALID_REG_ADDR,
224 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
228 .bp_reg = ANA_LDO_PD_CTL0,
230 .bp_rst_reg = ANA_LDO_PD_CTL0,
232 .level_reg_b0 = ANA_LDO_VCTL1,
235 .level_reg_b1 = ANA_LDO_VCTL1,
238 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
242 .bp_reg = ANA_LDO_PD_CTL0,
244 .bp_rst_reg = ANA_LDO_PD_CTL0,
246 .level_reg_b0 = ANA_LDO_VCTL2,
249 .level_reg_b1 = ANA_LDO_VCTL2,
252 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
256 .bp_reg = ANA_LDO_PD_CTL0,
258 .bp_rst_reg = ANA_LDO_PD_CTL0,
260 .level_reg_b0 = ANA_LDO_VCTL2,
263 .level_reg_b1 = ANA_LDO_VCTL2,
266 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
270 .bp_reg = ANA_LDO_PD_CTL0,
272 .bp_rst_reg = ANA_LDO_PD_CTL0,
274 .level_reg_b0 = ANA_LDO_VCTL2,
277 .level_reg_b1 = ANA_LDO_VCTL2,
280 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
284 .bp_reg = ANA_LDO_PD_CTL0,
286 .bp_rst_reg = ANA_LDO_PD_CTL0,
288 .level_reg_b0 = ANA_LDO_VCTL1,
291 .level_reg_b1 = ANA_LDO_VCTL1,
294 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
298 .bp_reg = ANA_LDO_PD_CTL0,
300 .bp_rst_reg = ANA_LDO_PD_CTL0,
302 .level_reg_b0 = ANA_LDO_VCTL1,
305 .level_reg_b1 = ANA_LDO_VCTL1,
308 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
312 .bp_reg = ANA_LDO_PD_CTL0,
314 .bp_rst_reg = ANA_LDO_PD_CTL0,
316 .level_reg_b0 = ANA_LDO_VCTL1,
319 .level_reg_b1 = ANA_LDO_VCTL1,
322 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
326 .bp_reg = ANA_LDO_PD_CTL0,
328 .bp_rst_reg = ANA_LDO_PD_CTL0,
330 .level_reg_b0 = ANA_LDO_VCTL2,
333 .level_reg_b1 = ANA_LDO_VCTL2,
336 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
340 .bp_reg = ANA_LDO_PD_CTL1,
342 .bp_rst_reg = ANA_LDO_PD_CTL1,
344 .level_reg_b0 = ANA_LDO_VCTL4,
347 .level_reg_b1 = ANA_LDO_VCTL4,
350 .init_level = LDO_VOLT_LEVEL2, //WIFI 1.8V
354 .bp_reg = ANA_LDO_PD_CTL1,
356 .bp_rst_reg = ANA_LDO_PD_CTL1,
358 .level_reg_b0 = ANA_LDO_VCTL3,
361 .level_reg_b1 = ANA_LDO_VCTL3,
364 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
368 .bp_reg = LDO_INVALID_REG_ADDR,
370 .bp_rst_reg = LDO_INVALID_REG_ADDR,
372 .level_reg_b0 = ANA_LDO_VCTL0,
375 .level_reg_b1 = ANA_LDO_VCTL0,
378 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
382 .bp_reg = LDO_INVALID_REG_ADDR,
384 .bp_rst_reg = LDO_INVALID_REG_ADDR,
386 .level_reg_b0 = LDO_INVALID_REG_ADDR,
389 .level_reg_b1 = LDO_INVALID_REG_ADDR,
392 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
395 .id = LDO_LDO_SDIO3,//LDO_EMMIO
396 .bp_reg = ANA_LDO_PD_SET,
398 .bp_rst_reg = ANA_LDO_PD_RST,
400 .level_reg_b0 = ANA_LDO_VCTL4,
403 .level_reg_b1 = ANA_LDO_VCTL0,
406 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
409 .id = LDO_LDO_VDD30,//LDO_EMMCORE
410 .bp_reg = ANA_LDO_PD_SET,
412 .bp_rst_reg = ANA_LDO_PD_RST,
414 .level_reg_b0 = ANA_LDO_VCTL4,
417 .level_reg_b1 = ANA_LDO_VCTL4,
420 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
423 static struct ldo_sleep_ctl_info slp_ldo_ctl_data[] = {
428 static struct ldo_ctl_info ldo_ctl_data[] =
432 .bp_reg = ANA_LDO_PD_SET,
434 .bp_rst_reg = ANA_LDO_PD_RST,
436 .level_reg_b0 = LDO_INVALID_REG_ADDR,
439 .level_reg_b1 = LDO_INVALID_REG_ADDR,
442 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
446 .bp_reg = ANA_LDO_PD_SET,
448 .bp_rst_reg = ANA_LDO_PD_RST,
450 .level_reg_b0 = ANA_LDO_VCTL3,
453 .level_reg_b1 = ANA_LDO_VCTL3,
456 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
460 .bp_reg = ANA_LDO_PD_SET,
462 .bp_rst_reg = ANA_LDO_PD_RST,
464 .level_reg_b0 = ANA_LDO_VCTL3,
467 .level_reg_b1 = ANA_LDO_VCTL3,
470 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
474 .bp_reg = ANA_LDO_PD_SET,
476 .bp_rst_reg = ANA_LDO_PD_RST,
478 .level_reg_b0 = ANA_LDO_VCTL3,
481 .level_reg_b1 = ANA_LDO_VCTL3,
484 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
488 .bp_reg = ANA_LDO_PD_SET,
490 .bp_rst_reg = ANA_LDO_PD_RST,
492 .level_reg_b0 = ANA_LDO_VCTL0,
495 .level_reg_b1 = ANA_LDO_VCTL0,
498 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
502 .bp_reg = ANA_LDO_PD_SET,
504 .bp_rst_reg = ANA_LDO_PD_RST,
506 .level_reg_b0 = ANA_LDO_VCTL0,
509 .level_reg_b1 = ANA_LDO_VCTL0,
512 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
516 .bp_reg = ANA_LDO_PD_SET,
518 .bp_rst_reg = ANA_LDO_PD_RST,
520 .level_reg_b0 = ANA_LDO_VCTL0,
523 .level_reg_b1 = ANA_LDO_VCTL0,
526 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
530 .bp_reg = ANA_LDO_PD_SET,
532 .bp_rst_reg = ANA_LDO_PD_RST,
534 .level_reg_b0 = LDO_INVALID_REG_ADDR,
537 .level_reg_b1 = LDO_INVALID_REG_ADDR,
540 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
544 .bp_reg = ANA_LDO_PD_SET,
546 .bp_rst_reg = ANA_LDO_PD_RST,
548 .level_reg_b0 = LDO_INVALID_REG_ADDR,
551 .level_reg_b1 = LDO_INVALID_REG_ADDR,
554 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
558 .bp_reg = ANA_LDO_PD_SET,
560 .bp_rst_reg = ANA_LDO_PD_RST,
562 .level_reg_b0 = LDO_INVALID_REG_ADDR,
565 .level_reg_b1 = LDO_INVALID_REG_ADDR,
568 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
572 .bp_reg = ANA_LDO_PD_CTL0,
574 .bp_rst_reg = ANA_LDO_PD_CTL0,
576 .level_reg_b0 = ANA_LDO_VCTL1,
579 .level_reg_b1 = ANA_LDO_VCTL1,
582 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
586 .bp_reg = ANA_LDO_PD_CTL0,
588 .bp_rst_reg = ANA_LDO_PD_CTL0,
590 .level_reg_b0 = ANA_LDO_VCTL2,
593 .level_reg_b1 = ANA_LDO_VCTL2,
596 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
600 .bp_reg = ANA_LDO_PD_CTL0,
602 .bp_rst_reg = ANA_LDO_PD_CTL0,
604 .level_reg_b0 = ANA_LDO_VCTL2,
607 .level_reg_b1 = ANA_LDO_VCTL2,
610 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
614 .bp_reg = ANA_LDO_PD_CTL0,
616 .bp_rst_reg = ANA_LDO_PD_CTL0,
618 .level_reg_b0 = ANA_LDO_VCTL2,
621 .level_reg_b1 = ANA_LDO_VCTL2,
624 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
628 .bp_reg = ANA_LDO_PD_CTL0,
630 .bp_rst_reg = ANA_LDO_PD_CTL0,
632 .level_reg_b0 = ANA_LDO_VCTL1,
635 .level_reg_b1 = ANA_LDO_VCTL1,
638 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
642 .bp_reg = ANA_LDO_PD_CTL0,
644 .bp_rst_reg = ANA_LDO_PD_CTL0,
646 .level_reg_b0 = ANA_LDO_VCTL1,
649 .level_reg_b1 = ANA_LDO_VCTL1,
652 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
656 .bp_reg = ANA_LDO_PD_CTL0,
658 .bp_rst_reg = ANA_LDO_PD_CTL0,
660 .level_reg_b0 = ANA_LDO_VCTL1,
663 .level_reg_b1 = ANA_LDO_VCTL1,
666 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
670 .bp_reg = ANA_LDO_PD_CTL0,
672 .bp_rst_reg = ANA_LDO_PD_CTL0,
674 .level_reg_b0 = ANA_LDO_VCTL2,
677 .level_reg_b1 = ANA_LDO_VCTL2,
680 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
684 .bp_reg = ANA_LDO_PD_CTL1,
686 .bp_rst_reg = ANA_LDO_PD_CTL1,
688 .level_reg_b0 = ANA_LDO_VCTL4,
691 .level_reg_b1 = ANA_LDO_VCTL4,
694 .init_level = LDO_VOLT_LEVEL3, //CMMB 1.2V
698 .bp_reg = ANA_LDO_PD_CTL1,
700 .bp_rst_reg = ANA_LDO_PD_CTL1,
702 .level_reg_b0 = ANA_LDO_VCTL4,
705 .level_reg_b1 = ANA_LDO_VCTL4,
708 .init_level = LDO_VOLT_LEVEL1, //E-NAND 3.0V
712 .bp_reg = ANA_LDO_PD_CTL1,
714 .bp_rst_reg = ANA_LDO_PD_CTL1,
716 .level_reg_b0 = ANA_LDO_VCTL4,
719 .level_reg_b1 = ANA_LDO_VCTL4,
722 .init_level = LDO_VOLT_LEVEL2, //WIFI 1.8V
726 .bp_reg = ANA_LDO_PD_CTL1,
728 .bp_rst_reg = ANA_LDO_PD_CTL1,
730 .level_reg_b0 = ANA_LDO_VCTL4,
733 .level_reg_b1 = ANA_LDO_VCTL4,
736 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
740 .bp_reg = ANA_LDO_PD_CTL1,
742 .bp_rst_reg = ANA_LDO_PD_CTL1,
744 .level_reg_b0 = ANA_LDO_VCTL3,
747 .level_reg_b1 = ANA_LDO_VCTL3,
750 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
754 .bp_reg = LDO_INVALID_REG_ADDR,
756 .bp_rst_reg = LDO_INVALID_REG_ADDR,
758 .level_reg_b0 = ANA_LDO_VCTL0,
761 .level_reg_b1 = ANA_LDO_VCTL0,
764 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
768 .bp_reg = LDO_INVALID_REG_ADDR,
770 .bp_rst_reg = LDO_INVALID_REG_ADDR,
772 .level_reg_b0 = LDO_INVALID_REG_ADDR,
775 .level_reg_b1 = LDO_INVALID_REG_ADDR,
778 .init_level = LDO_VOLT_LEVEL_FAULT_MAX,
782 static struct ldo_sleep_ctl_info slp_ldo_ctl_data[] = {
783 {SLP_LDO_SDIO1, ANA_LDO_SLP_CTL0, BIT_14, 0},
784 {SLP_LDO_VDD25, ANA_LDO_SLP_CTL0, BIT_13, 1},
785 {SLP_LDO_VDD18, ANA_LDO_SLP_CTL0, BIT_12, 0},
786 {SLP_LDO_VDD28, ANA_LDO_SLP_CTL0, BIT_11, 0},
787 {SLP_LDO_AVDDBB, ANA_LDO_SLP_CTL0, BIT_10, 1},
788 {SLP_LDO_SDIO0, ANA_LDO_SLP_CTL0, BIT_9, 1},
789 {SLP_LDO_VB, ANA_LDO_SLP_CTL0, BIT_8, 0},
790 {SLP_LDO_CAMA, ANA_LDO_SLP_CTL0, BIT_7, 1},
791 {SLP_LDO_CAMD1, ANA_LDO_SLP_CTL0, BIT_6, 1},
792 {SLP_LDO_CAMD0, ANA_LDO_SLP_CTL0, BIT_5, 1},
793 {SLP_LDO_USBH, ANA_LDO_SLP_CTL0, BIT_4, 1},
794 {SLP_LDO_SIM1, ANA_LDO_SLP_CTL0, BIT_3, 1},
795 {SLP_LDO_SIM0, ANA_LDO_SLP_CTL0, BIT_2, 0},
796 {SLP_LDO_RF1, ANA_LDO_SLP_CTL0, BIT_1, 1},
797 {SLP_LDO_RF0, ANA_LDO_SLP_CTL0, BIT_0, 1},
802 /**---------------------------------------------------------------------------*
803 ** Function Declaration *
804 **---------------------------------------------------------------------------*/
805 static struct ldo_ctl_info* LDO_GetLdoCtl(LDO_ID_E ldo_id)
808 struct ldo_ctl_info* ctl = NULL;
810 for ( i = 0; i < (int) ARRAY_SIZE(ldo_ctl_data); ++i) {
811 if (ldo_ctl_data[i].id == ldo_id) {
812 ctl = &ldo_ctl_data[i];
817 SCI_PASSERT(ctl != NULL, ("ldo_id = %d", ldo_id));
821 LDO_ERR_E LDO_TurnOnLDO(LDO_ID_E ldo_id)
823 struct ldo_ctl_info* ctl = NULL;
825 ctl = LDO_GetLdoCtl(ldo_id);
826 SCI_PASSERT(ctl != NULL, ("ldo_id = %d", ldo_id));
828 if ((ctl->ref++) == 0) {
829 if(ctl->bp_reg == LDO_INVALID_REG_ADDR) {
830 if (LDO_LDO_USBD == ldo_id)
831 CHIP_REG_AND((~LDO_USB_PD), GR_CLK_GEN5);
834 if (ctl->bp_reg == ctl->bp_rst_reg) {
835 REG_SETCLRBIT(ctl->bp_rst_reg, ctl->bp_rst, ctl->bp_bits);
838 ANA_REG_BIC(ctl->bp_reg, ctl->bp_bits);
839 ANA_REG_OR(ctl->bp_rst_reg, ctl->bp_rst);//high priority
842 ctl->current_status = CURRENT_STATUS_ON;
849 LDO_ERR_E LDO_TurnOffLDO(LDO_ID_E ldo_id)
851 struct ldo_ctl_info* ctl = NULL;
854 ctl = LDO_GetLdoCtl(ldo_id);
855 SCI_PASSERT(ctl != NULL, ("ldo_id = %d", ldo_id));
857 local_irq_save(flags);
859 if ((--ctl->ref) == 0) {
860 if(ctl->bp_reg == LDO_INVALID_REG_ADDR) {
861 if (LDO_LDO_USBD == ldo_id)
862 CHIP_REG_OR((LDO_USB_PD), GR_CLK_GEN5);
864 if (ctl->bp_reg == ctl->bp_rst_reg) {
865 REG_SETCLRBIT(ctl->bp_reg, ctl->bp_bits, ctl->bp_rst);
868 ANA_REG_BIC(ctl->bp_rst_reg, ctl->bp_rst);//high priority
869 ANA_REG_OR(ctl->bp_reg, ctl->bp_bits);
872 ctl->current_status = CURRENT_STATUS_OFF;
875 local_irq_restore(flags);
880 int LDO_IsLDOOn(LDO_ID_E ldo_id)
882 unsigned int masked_val = 0;
883 struct ldo_ctl_info* ctl = NULL;
885 ctl = LDO_GetLdoCtl(ldo_id);
886 SCI_PASSERT(ctl != NULL, ("ldo_id = %d", ldo_id));
888 if (ctl->current_status == CURRENT_STATUS_INIT)
889 masked_val = (LDO_REG_GET(ctl->bp_reg) & ctl->bp_bits);
891 return (ctl->current_status == CURRENT_STATUS_OFF ? 0 : 1);
893 return (masked_val ? 0 : 1);
896 LDO_ERR_E LDO_SetVoltLevel(LDO_ID_E ldo_id, LDO_VOLT_LEVEL_E volt_level)
898 unsigned int b0_mask,b1_mask;
899 struct ldo_ctl_info* ctl = NULL;
902 b0_mask = (volt_level & BIT_0)?~0:0;
903 b1_mask = (volt_level & BIT_1)?~0:0;
905 ctl = LDO_GetLdoCtl(ldo_id);
906 SCI_PASSERT(ctl != NULL, ("ldo_id = %d", ldo_id));
908 if(ctl->level_reg_b0 == ctl->level_reg_b1) {
909 if (ctl->level_reg_b0 == LDO_INVALID_REG_ADDR)
912 SET_LEVEL(ctl->level_reg_b0, b0_mask, b1_mask, ctl->b0, ctl->b0_rst, ctl->b1, ctl->b1_rst);
914 if (ctl->level_reg_b0 == LDO_INVALID_REG_ADDR || ctl->level_reg_b1 == LDO_INVALID_REG_ADDR) {
917 SET_LEVELBIT(ctl->level_reg_b0, b0_mask, ctl->b0, ctl->b0_rst);
918 SET_LEVELBIT(ctl->level_reg_b1, b1_mask, ctl->b1, ctl->b1_rst);
922 ctl->current_volt_level = volt_level;
929 LDO_VOLT_LEVEL_E LDO_GetVoltLevel(LDO_ID_E ldo_id)
931 unsigned int level_ret = 0;
932 struct ldo_ctl_info* ctl = NULL;
935 ctl = LDO_GetLdoCtl(ldo_id);
936 SCI_PASSERT(ctl != NULL, ("ldo_id = %d", ldo_id));
938 if (ctl->current_volt_level == LDO_VOLT_LEVEL_FAULT_MAX) {
939 if(ctl->level_reg_b0 == ctl->level_reg_b1) {
940 GET_LEVEL(ctl->level_reg_b0, ctl->b0, ctl->b1, level_ret);
942 GET_LEVELBIT(ctl->level_reg_b0, ctl->b0, BIT_0, level_ret);
943 GET_LEVELBIT(ctl->level_reg_b1, ctl->b1, BIT_1, level_ret);
948 level_ret = ctl->current_volt_level;
954 void LDO_DeepSleepInit(void)
959 for ( i = 0; i < ARRAY_SIZE(slp_ldo_ctl_data); ++i) {
960 aux = ANA_REG_GET(slp_ldo_ctl_data[i].ldo_sleep_reg);
962 if(slp_ldo_ctl_data[i].value)
964 aux |= slp_ldo_ctl_data[i].mask;
968 aux &= ~slp_ldo_ctl_data[i].mask;
971 ANA_REG_SET(slp_ldo_ctl_data[i].ldo_sleep_reg, aux);
979 for ( i = 0; i < ARRAY_SIZE(ldo_ctl_data); ++i) {
980 if( ldo_ctl_data[i].init_level != LDO_VOLT_LEVEL_FAULT_MAX) {
981 LDO_SetVoltLevel(ldo_ctl_data[i].id, ldo_ctl_data[i].init_level);
983 ldo_ctl_data[i].ref = 0;
984 ldo_ctl_data[i].current_status = CURRENT_STATUS_INIT;
985 ldo_ctl_data[i].current_volt_level = ldo_ctl_data[i].init_level;
993 static void LDO_TurnOffCoreLDO(void)
995 ANA_REG_SET (ANA_LDO_PD_RST, 0);
996 ANA_REG_SET (ANA_LDO_PD_SET, ANA_LDO_PD_SET_MSK);/// turn off system core ldo
999 static void LDO_TurnOffAllModuleLDO(void)
1001 #ifndef CONFIG_SC7710G2
1002 ANA_REG_OR(ANA_AUDIO_PA_CTL1, PA_LDO_EN_RST);///PA poweroff
1004 ANA_REG_SET (ANA_LDO_PD_CTL1, ANA_LDO_PD_CTL_MSK);
1005 ANA_REG_SET (ANA_LDO_PD_CTL0, ANA_LDO_PD_CTL_MSK);
1008 void LDO_TurnOffAllLDO(void)
1010 LDO_TurnOffAllModuleLDO();
1011 LDO_TurnOffCoreLDO();