Lines Matching refs:info
157 static int fuel_gauge_reg_readb(struct axp288_fg_info *info, int reg)
162 ret = regmap_read(info->regmap, reg, &val);
164 dev_err(info->dev, "Error reading reg 0x%02x err: %d\n", reg, ret);
171 static int fuel_gauge_reg_writeb(struct axp288_fg_info *info, int reg, u8 val)
175 ret = regmap_write(info->regmap, reg, (unsigned int)val);
178 dev_err(info->dev, "Error writing reg 0x%02x err: %d\n", reg, ret);
183 static int fuel_gauge_read_15bit_word(struct axp288_fg_info *info, int reg)
188 ret = regmap_bulk_read(info->regmap, reg, buf, 2);
190 dev_err(info->dev, "Error reading reg 0x%02x err: %d\n", reg, ret);
196 dev_err(info->dev, "Error reg 0x%02x contents not valid\n", reg);
203 static int fuel_gauge_read_12bit_word(struct axp288_fg_info *info, int reg)
208 ret = regmap_bulk_read(info->regmap, reg, buf, 2);
210 dev_err(info->dev, "Error reading reg 0x%02x err: %d\n", reg, ret);
218 static int fuel_gauge_update_registers(struct axp288_fg_info *info)
222 if (info->valid && time_before(jiffies, info->last_updated + AXP288_REG_UPDATE_INTERVAL))
225 dev_dbg(info->dev, "Fuel Gauge updating register values...\n");
231 ret = fuel_gauge_reg_readb(info, AXP20X_PWR_INPUT_STATUS);
234 info->pwr_stat = ret;
237 ret = fuel_gauge_reg_readb(info, AXP288_FG_OCV_CAP_REG);
239 ret = fuel_gauge_reg_readb(info, AXP20X_FG_RES);
242 info->fg_res = ret;
244 ret = iio_read_channel_raw(info->iio_channel[BAT_VOLT], &info->bat_volt);
248 ret = fuel_gauge_read_12bit_word(info, AXP288_FG_OCVH_REG);
251 info->ocv = ret;
256 if (info->pwr_stat & PS_STAT_BAT_CHRG_DIR) {
257 info->d_curr = 0;
258 ret = iio_read_channel_raw(info->iio_channel[BAT_CHRG_CURR], &info->c_curr);
262 info->c_curr = 0;
263 ret = iio_read_channel_raw(info->iio_channel[BAT_D_CURR], &info->d_curr);
268 ret = fuel_gauge_read_15bit_word(info, AXP288_FG_CC_MTR1_REG);
271 info->fg_cc_mtr1 = ret;
273 ret = fuel_gauge_read_15bit_word(info, AXP288_FG_DES_CAP1_REG);
276 info->fg_des_cap1 = ret;
279 info->last_updated = jiffies;
280 info->valid = 1;
287 static void fuel_gauge_get_status(struct axp288_fg_info *info)
289 int pwr_stat = info->pwr_stat;
290 int fg_res = info->fg_res;
291 int curr = info->d_curr;
302 info->status = POWER_SUPPLY_STATUS_FULL;
315 info->status = POWER_SUPPLY_STATUS_FULL;
321 info->status = POWER_SUPPLY_STATUS_CHARGING;
323 info->status = POWER_SUPPLY_STATUS_DISCHARGING;
326 static int fuel_gauge_battery_health(struct axp288_fg_info *info)
328 int vocv = VOLTAGE_FROM_ADC(info->ocv);
331 if (vocv > info->max_volt)
343 struct axp288_fg_info *info = power_supply_get_drvdata(ps);
346 mutex_lock(&info->lock);
348 ret = fuel_gauge_update_registers(info);
354 fuel_gauge_get_status(info);
355 val->intval = info->status;
358 val->intval = fuel_gauge_battery_health(info);
361 value = VOLTAGE_FROM_ADC(info->bat_volt);
365 value = VOLTAGE_FROM_ADC(info->ocv);
369 if (info->d_curr > 0)
370 value = -1 * info->d_curr;
372 value = info->c_curr;
377 if (info->pwr_op & CHRG_STAT_BAT_PRESENT)
383 if (!(info->fg_res & FG_REP_CAP_VALID))
384 dev_err(info->dev, "capacity measurement not valid\n");
385 val->intval = (info->fg_res & FG_REP_CAP_VAL_MASK);
388 val->intval = (info->low_cap & 0x0f);
394 val->intval = info->fg_cc_mtr1 * FG_DES_CAP_RES_LSB;
397 val->intval = info->fg_des_cap1 * FG_DES_CAP_RES_LSB;
400 val->intval = PROP_VOLT(info->max_volt);
407 mutex_unlock(&info->lock);
415 struct axp288_fg_info *info = power_supply_get_drvdata(ps);
418 mutex_lock(&info->lock);
425 new_low_cap = info->low_cap;
428 ret = fuel_gauge_reg_writeb(info, AXP288_FG_LOW_CAP_REG, new_low_cap);
430 info->low_cap = new_low_cap;
437 mutex_unlock(&info->lock);
459 struct axp288_fg_info *info = dev;
463 if (info->irq[i] == irq)
468 dev_warn(info->dev, "spurious interrupt!!\n");
474 dev_info(info->dev, "Quit Battery under temperature in work mode IRQ (QWBTU)\n");
477 dev_info(info->dev, "Battery under temperature in work mode IRQ (WBTU)\n");
480 dev_info(info->dev, "Quit Battery over temperature in work mode IRQ (QWBTO)\n");
483 dev_info(info->dev, "Battery over temperature in work mode IRQ (WBTO)\n");
486 dev_info(info->dev, "Low Batt Warning(2) INTR\n");
489 dev_info(info->dev, "Low Batt Warning(1) INTR\n");
492 dev_warn(info->dev, "Spurious Interrupt!!!\n");
495 mutex_lock(&info->lock);
496 info->valid = 0; /* Force updating of the cached registers */
497 mutex_unlock(&info->lock);
499 power_supply_changed(info->bat);
505 struct axp288_fg_info *info = power_supply_get_drvdata(psy);
507 mutex_lock(&info->lock);
508 info->valid = 0; /* Force updating of the cached registers */
509 mutex_unlock(&info->lock);
618 static int axp288_fuel_gauge_read_initial_regs(struct axp288_fg_info *info)
627 ret = regmap_read(info->regmap, AXP20X_CC_CTRL, &val);
633 ret = fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP1_REG);
638 dev_err(info->dev, "axp288 not configured by firmware\n");
642 ret = fuel_gauge_reg_readb(info, AXP20X_CHRG_CTRL1);
647 info->max_volt = 4100;
650 info->max_volt = 4150;
653 info->max_volt = 4200;
656 info->max_volt = 4350;
660 ret = fuel_gauge_reg_readb(info, AXP20X_PWR_OP_MODE);
663 info->pwr_op = ret;
665 ret = fuel_gauge_reg_readb(info, AXP288_FG_LOW_CAP_REG);
668 info->low_cap = ret;
675 struct axp288_fg_info *info = data;
679 if (!IS_ERR_OR_NULL(info->iio_channel[i]))
680 iio_channel_release(info->iio_channel[i]);
685 struct axp288_fg_info *info;
712 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
713 if (!info)
716 info->dev = dev;
717 info->regmap = axp20x->regmap;
718 info->status = POWER_SUPPLY_STATUS_UNKNOWN;
719 info->valid = 0;
721 platform_set_drvdata(pdev, info);
723 mutex_init(&info->lock);
733 info->irq[i] = ret;
742 info->iio_channel[i] =
744 if (IS_ERR(info->iio_channel[i])) {
745 ret = PTR_ERR(info->iio_channel[i]);
751 axp288_fuel_gauge_release_iio_chans(info);
756 ret = devm_add_action_or_reset(dev, axp288_fuel_gauge_release_iio_chans, info);
764 ret = axp288_fuel_gauge_read_initial_regs(info);
769 psy_cfg.drv_data = info;
772 info->bat = devm_power_supply_register(dev, &fuel_gauge_desc, &psy_cfg);
773 if (IS_ERR(info->bat)) {
774 ret = PTR_ERR(info->bat);
780 ret = devm_request_threaded_irq(dev, info->irq[i], NULL,
782 IRQF_ONESHOT, DEV_NAME, info);
784 return dev_err_probe(dev, ret, "requesting IRQ %d\n", info->irq[i]);