Lines Matching +full:axp209 +full:- +full:battery +full:- +full:power +full:- +full:supply
2 * Battery power supply driver for X-Powers AXP20X and AXP22X PMICs
5 * Quentin Schulz <quentin.schulz@free-electrons.com>
8 * Bruno Prémont <bonbons@linux-vserver.org>
85 ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, ®); in axp20x_battery_get_max_voltage()
103 return -EINVAL; in axp20x_battery_get_max_voltage()
114 ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, ®); in axp22x_battery_get_max_voltage()
132 return -EINVAL; in axp22x_battery_get_max_voltage()
143 ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, ®); in axp813_battery_get_max_voltage()
161 return -EINVAL; in axp813_battery_get_max_voltage()
172 ret = regmap_read(axp->regmap, AXP20X_CHRG_CTRL1, val); in axp20x_get_constant_charge_current()
178 *val = *val * axp->data->ccc_scale + axp->data->ccc_offset; in axp20x_get_constant_charge_current()
193 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_OP_MODE, in axp20x_battery_get_prop()
198 val->intval = !!(reg & AXP20X_PWR_OP_BATT_PRESENT); in axp20x_battery_get_prop()
202 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_INPUT_STATUS, in axp20x_battery_get_prop()
208 val->intval = POWER_SUPPLY_STATUS_CHARGING; in axp20x_battery_get_prop()
212 ret = iio_read_channel_processed(axp20x_batt->batt_dischrg_i, in axp20x_battery_get_prop()
218 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in axp20x_battery_get_prop()
222 ret = regmap_read(axp20x_batt->regmap, AXP20X_FG_RES, &val1); in axp20x_battery_get_prop()
231 val->intval = POWER_SUPPLY_STATUS_FULL; in axp20x_battery_get_prop()
233 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; in axp20x_battery_get_prop()
237 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_OP_MODE, in axp20x_battery_get_prop()
243 val->intval = POWER_SUPPLY_HEALTH_DEAD; in axp20x_battery_get_prop()
247 val->intval = POWER_SUPPLY_HEALTH_GOOD; in axp20x_battery_get_prop()
252 &val->intval); in axp20x_battery_get_prop()
258 val->intval = axp20x_batt->max_ccc; in axp20x_battery_get_prop()
262 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_INPUT_STATUS, in axp20x_battery_get_prop()
268 ret = iio_read_channel_processed(axp20x_batt->batt_chrg_i, &val->intval); in axp20x_battery_get_prop()
270 ret = iio_read_channel_processed(axp20x_batt->batt_dischrg_i, &val1); in axp20x_battery_get_prop()
271 val->intval = -val1; in axp20x_battery_get_prop()
276 /* IIO framework gives mA but Power Supply framework gives uA */ in axp20x_battery_get_prop()
277 val->intval *= 1000; in axp20x_battery_get_prop()
281 /* When no battery is present, return capacity is 100% */ in axp20x_battery_get_prop()
282 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_OP_MODE, in axp20x_battery_get_prop()
288 val->intval = 100; in axp20x_battery_get_prop()
292 ret = regmap_read(axp20x_batt->regmap, AXP20X_FG_RES, ®); in axp20x_battery_get_prop()
296 if (axp20x_batt->data->has_fg_valid && !(reg & AXP22X_FG_VALID)) in axp20x_battery_get_prop()
297 return -EINVAL; in axp20x_battery_get_prop()
303 val->intval = reg & AXP209_FG_PERCENT; in axp20x_battery_get_prop()
307 return axp20x_batt->data->get_max_voltage(axp20x_batt, in axp20x_battery_get_prop()
308 &val->intval); in axp20x_battery_get_prop()
311 ret = regmap_read(axp20x_batt->regmap, AXP20X_V_OFF, ®); in axp20x_battery_get_prop()
315 val->intval = 2600000 + 100000 * (reg & AXP20X_V_OFF_MASK); in axp20x_battery_get_prop()
319 ret = iio_read_channel_processed(axp20x_batt->batt_v, in axp20x_battery_get_prop()
320 &val->intval); in axp20x_battery_get_prop()
324 /* IIO framework gives mV but Power Supply framework gives uV */ in axp20x_battery_get_prop()
325 val->intval *= 1000; in axp20x_battery_get_prop()
329 return -EINVAL; in axp20x_battery_get_prop()
352 * be used with these kinds of battery). in axp22x_battery_set_max_voltage()
354 return -EINVAL; in axp22x_battery_set_max_voltage()
357 return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, in axp22x_battery_set_max_voltage()
382 * be used with these kinds of battery). in axp20x_battery_set_max_voltage()
384 return -EINVAL; in axp20x_battery_set_max_voltage()
387 return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, in axp20x_battery_set_max_voltage()
394 if (charge_current > axp_batt->max_ccc) in axp20x_set_constant_charge_current()
395 return -EINVAL; in axp20x_set_constant_charge_current()
397 charge_current = (charge_current - axp_batt->data->ccc_offset) / in axp20x_set_constant_charge_current()
398 axp_batt->data->ccc_scale; in axp20x_set_constant_charge_current()
401 return -EINVAL; in axp20x_set_constant_charge_current()
403 return regmap_update_bits(axp_batt->regmap, AXP20X_CHRG_CTRL1, in axp20x_set_constant_charge_current()
412 charge_current = (charge_current - axp->data->ccc_offset) / in axp20x_set_max_constant_charge_current()
413 axp->data->ccc_scale; in axp20x_set_max_constant_charge_current()
416 return -EINVAL; in axp20x_set_max_constant_charge_current()
418 charge_current = charge_current * axp->data->ccc_scale + in axp20x_set_max_constant_charge_current()
419 axp->data->ccc_offset; in axp20x_set_max_constant_charge_current()
421 if (charge_current > axp->max_ccc) in axp20x_set_max_constant_charge_current()
422 dev_warn(axp->dev, in axp20x_set_max_constant_charge_current()
423 … previously defined. Note that increasing the constant charge current may damage your battery.\n"); in axp20x_set_max_constant_charge_current()
427 axp->max_ccc = charge_current; in axp20x_set_max_constant_charge_current()
442 int val1 = (min_voltage - 2600000) / 100000; in axp20x_set_voltage_min_design()
445 return -EINVAL; in axp20x_set_voltage_min_design()
447 return regmap_update_bits(axp_batt->regmap, AXP20X_V_OFF, in axp20x_set_voltage_min_design()
459 return axp20x_set_voltage_min_design(axp20x_batt, val->intval); in axp20x_battery_set_prop()
462 return axp20x_batt->data->set_max_voltage(axp20x_batt, val->intval); in axp20x_battery_set_prop()
466 val->intval); in axp20x_battery_set_prop()
469 val->intval); in axp20x_battery_set_prop()
471 switch (val->intval) { in axp20x_battery_set_prop()
473 return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, in axp20x_battery_set_prop()
478 return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, in axp20x_battery_set_prop()
483 return -EINVAL; in axp20x_battery_set_prop()
512 .name = "axp20x-battery",
546 .compatible = "x-powers,axp209-battery-power-supply",
549 .compatible = "x-powers,axp221-battery-power-supply",
552 .compatible = "x-powers,axp813-battery-power-supply",
563 struct device *dev = &pdev->dev; in axp20x_power_probe()
565 if (!of_device_is_available(pdev->dev.of_node)) in axp20x_power_probe()
566 return -ENODEV; in axp20x_power_probe()
568 axp20x_batt = devm_kzalloc(&pdev->dev, sizeof(*axp20x_batt), in axp20x_power_probe()
571 return -ENOMEM; in axp20x_power_probe()
573 axp20x_batt->dev = &pdev->dev; in axp20x_power_probe()
575 axp20x_batt->batt_v = devm_iio_channel_get(&pdev->dev, "batt_v"); in axp20x_power_probe()
576 if (IS_ERR(axp20x_batt->batt_v)) { in axp20x_power_probe()
577 if (PTR_ERR(axp20x_batt->batt_v) == -ENODEV) in axp20x_power_probe()
578 return -EPROBE_DEFER; in axp20x_power_probe()
579 return PTR_ERR(axp20x_batt->batt_v); in axp20x_power_probe()
582 axp20x_batt->batt_chrg_i = devm_iio_channel_get(&pdev->dev, in axp20x_power_probe()
584 if (IS_ERR(axp20x_batt->batt_chrg_i)) { in axp20x_power_probe()
585 if (PTR_ERR(axp20x_batt->batt_chrg_i) == -ENODEV) in axp20x_power_probe()
586 return -EPROBE_DEFER; in axp20x_power_probe()
587 return PTR_ERR(axp20x_batt->batt_chrg_i); in axp20x_power_probe()
590 axp20x_batt->batt_dischrg_i = devm_iio_channel_get(&pdev->dev, in axp20x_power_probe()
592 if (IS_ERR(axp20x_batt->batt_dischrg_i)) { in axp20x_power_probe()
593 if (PTR_ERR(axp20x_batt->batt_dischrg_i) == -ENODEV) in axp20x_power_probe()
594 return -EPROBE_DEFER; in axp20x_power_probe()
595 return PTR_ERR(axp20x_batt->batt_dischrg_i); in axp20x_power_probe()
598 axp20x_batt->regmap = dev_get_regmap(pdev->dev.parent, NULL); in axp20x_power_probe()
602 psy_cfg.of_node = pdev->dev.of_node; in axp20x_power_probe()
604 axp20x_batt->data = (struct axp_data *)of_device_get_match_data(dev); in axp20x_power_probe()
606 axp20x_batt->batt = devm_power_supply_register(&pdev->dev, in axp20x_power_probe()
609 if (IS_ERR(axp20x_batt->batt)) { in axp20x_power_probe()
610 dev_err(&pdev->dev, "failed to register power supply: %ld\n", in axp20x_power_probe()
611 PTR_ERR(axp20x_batt->batt)); in axp20x_power_probe()
612 return PTR_ERR(axp20x_batt->batt); in axp20x_power_probe()
615 if (!power_supply_get_battery_info(axp20x_batt->batt, &info)) { in axp20x_power_probe()
616 int vmin = info->voltage_min_design_uv; in axp20x_power_probe()
617 int ccc = info->constant_charge_current_max_ua; in axp20x_power_probe()
621 dev_err(&pdev->dev, in axp20x_power_probe()
625 axp20x_batt->max_ccc = ccc; in axp20x_power_probe()
629 dev_err(&pdev->dev, in axp20x_power_probe()
632 axp20x_batt->max_ccc = ccc; in axp20x_power_probe()
638 * Update max CCC to a valid value if battery info is present or set it in axp20x_power_probe()
642 &axp20x_batt->max_ccc); in axp20x_power_probe()
650 .name = "axp20x-battery-power-supply",
657 MODULE_DESCRIPTION("Battery power supply driver for AXP20X and AXP22X PMICs");
658 MODULE_AUTHOR("Quentin Schulz <quentin.schulz@free-electrons.com>");