diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/axp-pmu.c | 43 | ||||
-rw-r--r-- | firmware/export/axp-pmu.h | 2 |
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 | ||
129 | static struct axp_driver { | 129 | static 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 | ||
182 | void axp_supply_set_voltage(int supply, int voltage) | 177 | void 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 | ||
471 | static const int chargecurrent_tblsz = sizeof(chargecurrent_tbl)/sizeof(int); | 466 | void axp_set_charge_current(int current_mA) |
472 | |||
473 | void 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 | ||
497 | int axp_get_charge_current(void) | 478 | int 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 | ||
505 | void axp_power_off(void) | 488 | void 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); | |||
139 | extern bool axp_cc_is_enabled(void); | 139 | extern bool axp_cc_is_enabled(void); |
140 | 140 | ||
141 | /* Set/get maximum charging current in milliamps */ | 141 | /* Set/get maximum charging current in milliamps */ |
142 | extern void axp_set_charge_current(int maxcurrent); | 142 | extern void axp_set_charge_current(int current_mA); |
143 | extern int axp_get_charge_current(void); | 143 | extern int axp_get_charge_current(void); |
144 | 144 | ||
145 | /* Set the shutdown bit */ | 145 | /* Set the shutdown bit */ |