mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 23:14:31 +08:00
power: supply: bq25890: Add a bq25890_rw_init_data() helper
On most x86/ACPI devices there is no devicetree to supply the necessary init-data. Instead the firmware already fully initializes the bq25890 charger at boot. Factor out the current code to write all the init_data from devicetree into a new bq25890_rw_init_data() helper which can both write the data to the charger (the current behavior) as well as read it back from the charger into the init_data struct. This is a preparation patch for adding support for x86/ACPI device's where the init_data must be read back from the bq25890 charger. Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
This commit is contained in:
parent
c562a43a46
commit
7b22a97464
@ -693,29 +693,52 @@ static int bq25890_chip_reset(struct bq25890_device *bq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bq25890_hw_init(struct bq25890_device *bq)
|
||||
static int bq25890_rw_init_data(struct bq25890_device *bq)
|
||||
{
|
||||
bool write = true;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
const struct {
|
||||
enum bq25890_fields id;
|
||||
u32 value;
|
||||
u8 *value;
|
||||
} init_data[] = {
|
||||
{F_ICHG, bq->init_data.ichg},
|
||||
{F_VREG, bq->init_data.vreg},
|
||||
{F_ITERM, bq->init_data.iterm},
|
||||
{F_IPRECHG, bq->init_data.iprechg},
|
||||
{F_SYSVMIN, bq->init_data.sysvmin},
|
||||
{F_BOOSTV, bq->init_data.boostv},
|
||||
{F_BOOSTI, bq->init_data.boosti},
|
||||
{F_BOOSTF, bq->init_data.boostf},
|
||||
{F_EN_ILIM, bq->init_data.ilim_en},
|
||||
{F_TREG, bq->init_data.treg},
|
||||
{F_BATCMP, bq->init_data.rbatcomp},
|
||||
{F_VCLAMP, bq->init_data.vclamp},
|
||||
{F_ICHG, &bq->init_data.ichg},
|
||||
{F_VREG, &bq->init_data.vreg},
|
||||
{F_ITERM, &bq->init_data.iterm},
|
||||
{F_IPRECHG, &bq->init_data.iprechg},
|
||||
{F_SYSVMIN, &bq->init_data.sysvmin},
|
||||
{F_BOOSTV, &bq->init_data.boostv},
|
||||
{F_BOOSTI, &bq->init_data.boosti},
|
||||
{F_BOOSTF, &bq->init_data.boostf},
|
||||
{F_EN_ILIM, &bq->init_data.ilim_en},
|
||||
{F_TREG, &bq->init_data.treg},
|
||||
{F_BATCMP, &bq->init_data.rbatcomp},
|
||||
{F_VCLAMP, &bq->init_data.vclamp},
|
||||
};
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(init_data); i++) {
|
||||
if (write) {
|
||||
ret = bq25890_field_write(bq, init_data[i].id,
|
||||
*init_data[i].value);
|
||||
} else {
|
||||
ret = bq25890_field_read(bq, init_data[i].id);
|
||||
if (ret >= 0)
|
||||
*init_data[i].value = ret;
|
||||
}
|
||||
if (ret < 0) {
|
||||
dev_dbg(bq->dev, "Accessing init data failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bq25890_hw_init(struct bq25890_device *bq)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = bq25890_chip_reset(bq);
|
||||
if (ret < 0) {
|
||||
dev_dbg(bq->dev, "Reset failed %d\n", ret);
|
||||
@ -730,14 +753,9 @@ static int bq25890_hw_init(struct bq25890_device *bq)
|
||||
}
|
||||
|
||||
/* initialize currents/voltages and other parameters */
|
||||
for (i = 0; i < ARRAY_SIZE(init_data); i++) {
|
||||
ret = bq25890_field_write(bq, init_data[i].id,
|
||||
init_data[i].value);
|
||||
if (ret < 0) {
|
||||
dev_dbg(bq->dev, "Writing init data failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
ret = bq25890_rw_init_data(bq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = bq25890_get_chip_state(bq, &bq->state);
|
||||
if (ret < 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user