summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/drivers/axp-pmu.c43
-rw-r--r--firmware/export/axp-pmu.h2
2 files changed, 14 insertions, 31 deletions
diff --git a/firmware/drivers/axp-pmu.c b/firmware/drivers/axp-pmu.c
index fd1126dbbf..e9af3c0b05 100644
--- a/firmware/drivers/axp-pmu.c
+++ b/firmware/drivers/axp-pmu.c
@@ -128,7 +128,6 @@ static const struct axp_supply_info axp_supply_info[AXP_NUM_SUPPLIES] = {
128 128
129static struct axp_driver { 129static struct axp_driver {
130 int adc_enable; 130 int adc_enable;
131 int chargecurrent_setting;
132 int chip_id; 131 int chip_id;
133} axp; 132} axp;
134 133
@@ -173,10 +172,6 @@ void axp_init(void)
173 int bits = axp.adc_enable; 172 int bits = axp.adc_enable;
174 bits |= (1 << ADC_DISCHARGE_CURRENT); 173 bits |= (1 << ADC_DISCHARGE_CURRENT);
175 axp_adc_set_enabled(bits); 174 axp_adc_set_enabled(bits);
176
177 /* Read the maximum charging current */
178 int value = i2c_reg_read1(AXP_PMU_BUS, AXP_PMU_ADDR, AXP_REG_CHARGECONTROL1);
179 axp.chargecurrent_setting = (value < 0) ? -1 : (value & 0xf);
180} 175}
181 176
182void axp_supply_set_voltage(int supply, int voltage) 177void axp_supply_set_voltage(int supply, int voltage)
@@ -468,38 +463,26 @@ static const int chargecurrent_tbl[] = {
468 1080, 1160, 1240, 1320, 463 1080, 1160, 1240, 1320,
469}; 464};
470 465
471static const int chargecurrent_tblsz = sizeof(chargecurrent_tbl)/sizeof(int); 466void axp_set_charge_current(int current_mA)
472
473void axp_set_charge_current(int maxcurrent)
474{ 467{
475 /* Find the charge current just higher than maxcurrent */ 468 /* find greatest charging current not exceeding requested current */
476 int value = 0; 469 unsigned int index = 0;
477 while(value < chargecurrent_tblsz && 470 while(index < ARRAYLEN(chargecurrent_tbl)-1 &&
478 chargecurrent_tbl[value] <= maxcurrent) 471 chargecurrent_tbl[index+1] <= current_mA)
479 ++value; 472 ++index;
480
481 /* Select the next lower current, the greatest current <= maxcurrent */
482 if(value >= chargecurrent_tblsz)
483 value = chargecurrent_tblsz - 1;
484 else if(value > 0)
485 --value;
486
487 /* Don't issue i2c write if desired setting is already in use */
488 if(value == axp.chargecurrent_setting)
489 return;
490 473
491 /* Update register */
492 i2c_reg_modify1(AXP_PMU_BUS, AXP_PMU_ADDR, 474 i2c_reg_modify1(AXP_PMU_BUS, AXP_PMU_ADDR,
493 AXP_REG_CHARGECONTROL1, 0x0f, value, NULL); 475 AXP_REG_CHARGECONTROL1, 0x0f, index, NULL);
494 axp.chargecurrent_setting = value;
495} 476}
496 477
497int axp_get_charge_current(void) 478int axp_get_charge_current(void)
498{ 479{
499 if(axp.chargecurrent_setting < 0) 480 int ret = i2c_reg_read1(AXP_PMU_BUS, AXP_PMU_ADDR,
500 return chargecurrent_tbl[0]; 481 AXP_REG_CHARGECONTROL1);
501 else 482 if(ret < 0)
502 return chargecurrent_tbl[axp.chargecurrent_setting]; 483 ret = 0;
484
485 return chargecurrent_tbl[ret & 0x0f];
503} 486}
504 487
505void axp_power_off(void) 488void axp_power_off(void)
diff --git a/firmware/export/axp-pmu.h b/firmware/export/axp-pmu.h
index 457f746e8c..553410ced8 100644
--- a/firmware/export/axp-pmu.h
+++ b/firmware/export/axp-pmu.h
@@ -139,7 +139,7 @@ extern void axp_cc_enable(bool en);
139extern bool axp_cc_is_enabled(void); 139extern bool axp_cc_is_enabled(void);
140 140
141/* Set/get maximum charging current in milliamps */ 141/* Set/get maximum charging current in milliamps */
142extern void axp_set_charge_current(int maxcurrent); 142extern void axp_set_charge_current(int current_mA);
143extern int axp_get_charge_current(void); 143extern int axp_get_charge_current(void);
144 144
145/* Set the shutdown bit */ 145/* Set the shutdown bit */