"Das U-Boot" Source Tree
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

power: rk8xx: On RK818, enable battery charging if battery present

Also fix RK818 registers which were off by one.

+109 -57
+52
drivers/power/pmic/rk8xx.c
··· 15 15 #include <spi.h> 16 16 #include <sysreset.h> 17 17 18 + static void rk818_init_charger(struct udevice *dev) 19 + { 20 + int val; 21 + 22 + /* Enable gas gauge so battery detection works */ 23 + val = pmic_reg_read(dev, REG_GGCON); 24 + if (val >= 0) 25 + pmic_reg_write(dev, REG_GGCON, val | BIT(0) | BIT(3)); 26 + 27 + /* Check battery presence */ 28 + val = pmic_reg_read(dev, REG_GGSTS); 29 + if (val >= 0 && !(val & BIT(7))) { 30 + /* GGSTS says no battery; check voltage as fallback */ 31 + int volh = pmic_reg_read(dev, REGH_BAT_VOL); 32 + int voll = pmic_reg_read(dev, REGL_BAT_VOL); 33 + 34 + if (volh <= 0 && voll <= 0) 35 + return; 36 + } 37 + 38 + /* 39 + * Configure charging: 4.2V / 1000mA. 40 + * Without this, the PMIC only trickle-charges and the power 41 + * budget with the screen on drains the battery. 42 + */ 43 + pmic_reg_write(dev, REG1_CHRG_CTRL, 44 + BIT(7) | /* charge enable */ 45 + 0x30 | /* 4.2V charge voltage */ 46 + 0x00); /* 1000mA charge current */ 47 + 48 + /* Digital termination, 150mA threshold */ 49 + pmic_reg_write(dev, REG2_CHRG_CTRL, 50 + BIT(5) | /* digital termination */ 51 + BIT(6)); /* 150mA */ 52 + 53 + /* Trickle charge 60min, CC/CV timeout 5h */ 54 + pmic_reg_write(dev, REG3_CHRG_CTRL, 55 + BIT(0) | /* trickle enable */ 56 + BIT(1) | /* 60 min trickle */ 57 + BIT(3) | /* CC/CV enable */ 58 + BIT(4)); /* 5h CC/CV timeout */ 59 + 60 + /* USB input: 2A current limit, 4.4V voltage limit */ 61 + pmic_reg_write(dev, REG_USB_CTRL, 62 + 0x07 | /* 2000mA input current */ 63 + (4 << 4)); /* 4.4V input voltage */ 64 + 65 + printf("RK818: battery charging enabled\n"); 66 + } 67 + 18 68 static int rk8xx_sysreset_request(struct udevice *dev, enum sysreset_t type) 19 69 { 20 70 struct rk8xx_priv *priv = dev_get_priv(dev->parent); ··· 284 334 case RK818_ID: 285 335 on_source = RK8XX_ON_SOURCE; 286 336 off_source = RK8XX_OFF_SOURCE; 337 + if (priv->variant == RK818_ID) 338 + rk818_init_charger(dev); 287 339 break; 288 340 case RK809_ID: 289 341 case RK817_ID:
+57 -57
include/power/rk8xx_pmic.h
··· 91 91 REG_DCDC_ILMAX = 0x90, 92 92 REG_CHRG_COMP = 0x9a, 93 93 REG_SUP_STS = 0xa0, 94 - REG_USB_CTRL, 95 - REG1_CHRG_CTRL, 96 - REG2_CHRG_CTRL, 97 - REG3_CHRG_CTRL, 98 - REG_BAT_CTRL, 99 - REG_BAT_HTS_TS1, 100 - REG_BAT_LTS_TS1, 101 - REG_BAT_HTS_TS2, 102 - REG_BAT_LTS_TS2, 103 - REG_TS_CTRL, 104 - REG_ADC_CTRL, 105 - REG_ON_SOURCE, 106 - REG_OFF_SOURCE, 107 - REG_GGCON, 108 - REG_GGSTS, 109 - REG_FRAME_SMP_INTERV, 110 - REG_AUTO_SLP_CUR_THR, 111 - REG3_GASCNT_CAL, 112 - REG2_GASCNT_CAL, 113 - REG1_GASCNT_CAL, 114 - REG0_GASCNT_CAL, 115 - REG3_GASCNT, 116 - REG2_GASCNT, 117 - REG1_GASCNT, 118 - REG0_GASCNT, 119 - REGH_BAT_CUR_AVG, 120 - REGL_BAT_CUR_AVG, 121 - REGH_TS1_ADC, 122 - REGL_TS1_ADC, 123 - REGH_TS2_ADC, 124 - REGL_TS2_ADC, 125 - REGH_BAT_OCV, 126 - REGL_BAT_OCV, 127 - REGH_BAT_VOL, 128 - REGL_BAT_VOL, 129 - REGH_RELAX_ENTRY_THRES, 130 - REGL_RELAX_ENTRY_THRES, 131 - REGH_RELAX_EXIT_THRES, 132 - REGL_RELAX_EXIT_THRES, 133 - REGH_RELAX_VOL1, 134 - REGL_RELAX_VOL1, 135 - REGH_RELAX_VOL2, 136 - REGL_RELAX_VOL2, 137 - REGH_BAT_CUR_R_CALC, 138 - REGL_BAT_CUR_R_CALC, 139 - REGH_BAT_VOL_R_CALC, 140 - REGL_BAT_VOL_R_CALC, 141 - REGH_CAL_OFFSET, 142 - REGL_CAL_OFFSET, 143 - REG_NON_ACT_TIMER_CNT, 144 - REGH_VCALIB0, 145 - REGL_VCALIB0, 146 - REGH_VCALIB1, 147 - REGL_VCALIB1, 148 - REGH_IOFFSET, 149 - REGL_IOFFSET, 150 - REG_SOC, 94 + REG_USB_CTRL = 0xa1, 95 + REG1_CHRG_CTRL = 0xa3, 96 + REG2_CHRG_CTRL = 0xa4, 97 + REG3_CHRG_CTRL = 0xa5, 98 + REG_BAT_CTRL = 0xa6, 99 + REG_BAT_HTS_TS1 = 0xa8, 100 + REG_BAT_LTS_TS1 = 0xa9, 101 + REG_BAT_HTS_TS2 = 0xaa, 102 + REG_BAT_LTS_TS2 = 0xab, 103 + REG_TS_CTRL = 0xac, 104 + REG_ADC_CTRL = 0xad, 105 + REG_ON_SOURCE = 0xae, 106 + REG_OFF_SOURCE = 0xaf, 107 + REG_GGCON = 0xb0, 108 + REG_GGSTS = 0xb1, 109 + REG_FRAME_SMP_INTERV = 0xb2, 110 + REG_AUTO_SLP_CUR_THR = 0xb3, 111 + REG3_GASCNT_CAL = 0xb4, 112 + REG2_GASCNT_CAL = 0xb5, 113 + REG1_GASCNT_CAL = 0xb6, 114 + REG0_GASCNT_CAL = 0xb7, 115 + REG3_GASCNT = 0xb8, 116 + REG2_GASCNT = 0xb9, 117 + REG1_GASCNT = 0xba, 118 + REG0_GASCNT = 0xbb, 119 + REGH_BAT_CUR_AVG = 0xbc, 120 + REGL_BAT_CUR_AVG = 0xbd, 121 + REGH_TS1_ADC = 0xbe, 122 + REGL_TS1_ADC = 0xbf, 123 + REGH_TS2_ADC = 0xc0, 124 + REGL_TS2_ADC = 0xc1, 125 + REGH_BAT_OCV = 0xc2, 126 + REGL_BAT_OCV = 0xc3, 127 + REGH_BAT_VOL = 0xc4, 128 + REGL_BAT_VOL = 0xc5, 129 + REGH_RELAX_ENTRY_THRES = 0xc6, 130 + REGL_RELAX_ENTRY_THRES = 0xc7, 131 + REGH_RELAX_EXIT_THRES = 0xc8, 132 + REGL_RELAX_EXIT_THRES = 0xc9, 133 + REGH_RELAX_VOL1 = 0xca, 134 + REGL_RELAX_VOL1 = 0xcb, 135 + REGH_RELAX_VOL2 = 0xcc, 136 + REGL_RELAX_VOL2 = 0xcd, 137 + REGH_BAT_CUR_R_CALC = 0xce, 138 + REGL_BAT_CUR_R_CALC = 0xcf, 139 + REGH_BAT_VOL_R_CALC = 0xd0, 140 + REGL_BAT_VOL_R_CALC = 0xd1, 141 + REGH_CAL_OFFSET = 0xd2, 142 + REGL_CAL_OFFSET = 0xd3, 143 + REG_NON_ACT_TIMER_CNT = 0xd4, 144 + REGH_VCALIB0 = 0xd5, 145 + REGL_VCALIB0 = 0xd6, 146 + REGH_VCALIB1 = 0xd7, 147 + REGL_VCALIB1 = 0xd8, 148 + REGH_IOFFSET = 0xdd, 149 + REGL_IOFFSET = 0xde, 150 + REG_SOC = 0xe0, 151 151 REG3_REMAIN_CAP, 152 152 REG2_REMAIN_CAP, 153 153 REG1_REMAIN_CAP,