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);
        }
 
        /* 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) {