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>
127 ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, &reg); in axp20x_battery_get_max_voltage()
145 return -EINVAL; in axp20x_battery_get_max_voltage()
156 ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, &reg); in axp22x_battery_get_max_voltage()
174 return -EINVAL; in axp22x_battery_get_max_voltage()
185 ret = regmap_read(axp20x_batt->regmap, AXP717_CV_CHG_SET, &reg); in axp717_battery_get_max_voltage()
209 return -EINVAL; in axp717_battery_get_max_voltage()
218 ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, &reg); in axp813_battery_get_max_voltage()
236 return -EINVAL; in axp813_battery_get_max_voltage()
247 ret = regmap_read(axp->regmap, AXP20X_CHRG_CTRL1, val); in axp20x_get_constant_charge_current()
253 *val = *val * axp->data->ccc_scale + axp->data->ccc_offset; in axp20x_get_constant_charge_current()
263 ret = regmap_read(axp->regmap, AXP717_ICC_CHG_SET, val); in axp717_get_constant_charge_current()
268 axp->data->ccc_scale; in axp717_get_constant_charge_current()
283 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_OP_MODE, in axp20x_battery_get_prop()
288 val->intval = !!(reg & AXP20X_PWR_OP_BATT_PRESENT); in axp20x_battery_get_prop()
292 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_INPUT_STATUS, in axp20x_battery_get_prop()
298 val->intval = POWER_SUPPLY_STATUS_CHARGING; in axp20x_battery_get_prop()
302 ret = iio_read_channel_processed(axp20x_batt->batt_dischrg_i, in axp20x_battery_get_prop()
308 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in axp20x_battery_get_prop()
312 ret = regmap_read(axp20x_batt->regmap, AXP20X_FG_RES, &val1); in axp20x_battery_get_prop()
321 val->intval = POWER_SUPPLY_STATUS_FULL; in axp20x_battery_get_prop()
323 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; in axp20x_battery_get_prop()
327 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_OP_MODE, in axp20x_battery_get_prop()
333 val->intval = POWER_SUPPLY_HEALTH_DEAD; in axp20x_battery_get_prop()
337 val->intval = POWER_SUPPLY_HEALTH_GOOD; in axp20x_battery_get_prop()
342 &val->intval); in axp20x_battery_get_prop()
348 val->intval = axp20x_batt->max_ccc; in axp20x_battery_get_prop()
352 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_INPUT_STATUS, in axp20x_battery_get_prop()
357 /* IIO framework gives mA but Power Supply framework gives uA */ in axp20x_battery_get_prop()
359 ret = iio_read_channel_processed_scale(axp20x_batt->batt_chrg_i, in axp20x_battery_get_prop()
360 &val->intval, 1000); in axp20x_battery_get_prop()
362 ret = iio_read_channel_processed_scale(axp20x_batt->batt_dischrg_i, in axp20x_battery_get_prop()
364 val->intval = -val1; in axp20x_battery_get_prop()
372 /* When no battery is present, return capacity is 100% */ in axp20x_battery_get_prop()
373 ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_OP_MODE, in axp20x_battery_get_prop()
379 val->intval = 100; in axp20x_battery_get_prop()
383 ret = regmap_read(axp20x_batt->regmap, AXP20X_FG_RES, &reg); in axp20x_battery_get_prop()
387 if (axp20x_batt->data->has_fg_valid && !(reg & AXP22X_FG_VALID)) in axp20x_battery_get_prop()
388 return -EINVAL; in axp20x_battery_get_prop()
394 val->intval = reg & AXP209_FG_PERCENT; in axp20x_battery_get_prop()
398 return axp20x_batt->data->get_max_voltage(axp20x_batt, in axp20x_battery_get_prop()
399 &val->intval); in axp20x_battery_get_prop()
402 ret = regmap_read(axp20x_batt->regmap, AXP20X_V_OFF, &reg); in axp20x_battery_get_prop()
406 val->intval = 2600000 + 100000 * (reg & AXP20X_V_OFF_MASK); in axp20x_battery_get_prop()
410 /* IIO framework gives mV but Power Supply framework gives uV */ in axp20x_battery_get_prop()
411 ret = iio_read_channel_processed_scale(axp20x_batt->batt_v, in axp20x_battery_get_prop()
412 &val->intval, 1000); in axp20x_battery_get_prop()
419 return -EINVAL; in axp20x_battery_get_prop()
435 ret = regmap_read(axp20x_batt->regmap, AXP717_ON_INDICATE, in axp717_battery_get_prop()
440 val->intval = FIELD_GET(AXP717_PWR_OP_BATT_PRESENT, reg); in axp717_battery_get_prop()
444 ret = regmap_read(axp20x_batt->regmap, AXP717_PMU_STATUS_2, in axp717_battery_get_prop()
451 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; in axp717_battery_get_prop()
455 val->intval = POWER_SUPPLY_STATUS_CHARGING; in axp717_battery_get_prop()
459 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in axp717_battery_get_prop()
463 val->intval = POWER_SUPPLY_STATUS_UNKNOWN; in axp717_battery_get_prop()
474 ret = regmap_read(axp20x_batt->regmap, AXP717_PMU_FAULT, in axp717_battery_get_prop()
481 val->intval = POWER_SUPPLY_HEALTH_DEAD; in axp717_battery_get_prop()
482 regmap_write_bits(axp20x_batt->regmap, in axp717_battery_get_prop()
489 val->intval = POWER_SUPPLY_HEALTH_HOT; in axp717_battery_get_prop()
490 regmap_write_bits(axp20x_batt->regmap, in axp717_battery_get_prop()
497 val->intval = POWER_SUPPLY_HEALTH_COLD; in axp717_battery_get_prop()
498 regmap_write_bits(axp20x_batt->regmap, in axp717_battery_get_prop()
505 val->intval = POWER_SUPPLY_HEALTH_GOOD; in axp717_battery_get_prop()
511 &val->intval); in axp717_battery_get_prop()
522 * IIO framework gives mA but Power Supply framework in axp717_battery_get_prop()
525 ret = iio_read_channel_processed_scale(axp20x_batt->batt_chrg_i, in axp717_battery_get_prop()
526 &val->intval, 1000); in axp717_battery_get_prop()
533 ret = regmap_read(axp20x_batt->regmap, AXP717_ON_INDICATE, in axp717_battery_get_prop()
539 return -ENODEV; in axp717_battery_get_prop()
541 ret = regmap_read(axp20x_batt->regmap, in axp717_battery_get_prop()
550 val->intval = reg & AXP209_FG_PERCENT; in axp717_battery_get_prop()
554 return axp20x_batt->data->get_max_voltage(axp20x_batt, in axp717_battery_get_prop()
555 &val->intval); in axp717_battery_get_prop()
558 ret = regmap_read(axp20x_batt->regmap, in axp717_battery_get_prop()
563 val->intval = AXP717_BAT_VMIN_MIN_UV + AXP717_BAT_VMIN_STEP * in axp717_battery_get_prop()
568 /* IIO framework gives mV but Power Supply framework gives uV */ in axp717_battery_get_prop()
569 ret = iio_read_channel_processed_scale(axp20x_batt->batt_v, in axp717_battery_get_prop()
570 &val->intval, 1000); in axp717_battery_get_prop()
577 ret = regmap_read(axp20x_batt->regmap, in axp717_battery_get_prop()
582 val->intval = (reg & AXP717_ITERM_CHG_LIM_MASK) * AXP717_ITERM_CC_STEP; in axp717_battery_get_prop()
586 return -EINVAL; in axp717_battery_get_prop()
607 * be used with these kinds of battery). in axp22x_battery_set_max_voltage()
609 return -EINVAL; in axp22x_battery_set_max_voltage()
612 return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, in axp22x_battery_set_max_voltage()
637 * be used with these kinds of battery). in axp20x_battery_set_max_voltage()
639 return -EINVAL; in axp20x_battery_set_max_voltage()
642 return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, in axp20x_battery_set_max_voltage()
667 return -EINVAL; in axp717_battery_set_max_voltage()
670 return regmap_update_bits(axp20x_batt->regmap, in axp717_battery_set_max_voltage()
678 if (charge_current > axp_batt->max_ccc) in axp20x_set_constant_charge_current()
679 return -EINVAL; in axp20x_set_constant_charge_current()
681 charge_current = (charge_current - axp_batt->data->ccc_offset) / in axp20x_set_constant_charge_current()
682 axp_batt->data->ccc_scale; in axp20x_set_constant_charge_current()
685 return -EINVAL; in axp20x_set_constant_charge_current()
687 return regmap_update_bits(axp_batt->regmap, AXP20X_CHRG_CTRL1, in axp20x_set_constant_charge_current()
696 if (charge_current > axp->max_ccc) in axp717_set_constant_charge_current()
697 return -EINVAL; in axp717_set_constant_charge_current()
700 return -EINVAL; in axp717_set_constant_charge_current()
702 val = (charge_current - axp->data->ccc_offset) / in axp717_set_constant_charge_current()
703 axp->data->ccc_scale; in axp717_set_constant_charge_current()
705 return regmap_update_bits(axp->regmap, AXP717_ICC_CHG_SET, in axp717_set_constant_charge_current()
714 charge_current = (charge_current - axp->data->ccc_offset) / in axp20x_set_max_constant_charge_current()
715 axp->data->ccc_scale; in axp20x_set_max_constant_charge_current()
718 return -EINVAL; in axp20x_set_max_constant_charge_current()
720 charge_current = charge_current * axp->data->ccc_scale + in axp20x_set_max_constant_charge_current()
721 axp->data->ccc_offset; in axp20x_set_max_constant_charge_current()
723 if (charge_current > axp->max_ccc) in axp20x_set_max_constant_charge_current()
724 dev_warn(axp->dev, in axp20x_set_max_constant_charge_current()
725 … previously defined. Note that increasing the constant charge current may damage your battery.\n"); in axp20x_set_max_constant_charge_current()
729 axp->max_ccc = charge_current; in axp20x_set_max_constant_charge_current()
744 int val1 = (min_voltage - 2600000) / 100000; in axp20x_set_voltage_min_design()
747 return -EINVAL; in axp20x_set_voltage_min_design()
749 return regmap_update_bits(axp_batt->regmap, AXP20X_V_OFF, in axp20x_set_voltage_min_design()
756 int val1 = (min_voltage - AXP717_BAT_VMIN_MIN_UV) / AXP717_BAT_VMIN_STEP; in axp717_set_voltage_min_design()
759 return -EINVAL; in axp717_set_voltage_min_design()
761 return regmap_update_bits(axp_batt->regmap, in axp717_set_voltage_min_design()
774 return axp20x_set_voltage_min_design(axp20x_batt, val->intval); in axp20x_battery_set_prop()
777 return axp20x_batt->data->set_max_voltage(axp20x_batt, val->intval); in axp20x_battery_set_prop()
781 val->intval); in axp20x_battery_set_prop()
784 val->intval); in axp20x_battery_set_prop()
786 switch (val->intval) { in axp20x_battery_set_prop()
788 return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, in axp20x_battery_set_prop()
793 return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, in axp20x_battery_set_prop()
798 return -EINVAL; in axp20x_battery_set_prop()
810 return axp717_set_voltage_min_design(axp20x_batt, val->intval); in axp717_battery_set_prop()
813 return axp20x_batt->data->set_max_voltage(axp20x_batt, val->intval); in axp717_battery_set_prop()
817 val->intval); in axp717_battery_set_prop()
819 switch (val->intval) { in axp717_battery_set_prop()
821 return regmap_update_bits(axp20x_batt->regmap, in axp717_battery_set_prop()
828 return regmap_update_bits(axp20x_batt->regmap, in axp717_battery_set_prop()
832 return -EINVAL; in axp717_battery_set_prop()
834 return -EINVAL; in axp717_battery_set_prop()
886 .name = "axp20x-battery",
896 .name = "axp20x-battery",
908 axp_batt->batt_v = devm_iio_channel_get(&pdev->dev, "batt_v"); in axp209_bat_cfg_iio_channels()
909 if (IS_ERR(axp_batt->batt_v)) { in axp209_bat_cfg_iio_channels()
910 if (PTR_ERR(axp_batt->batt_v) == -ENODEV) in axp209_bat_cfg_iio_channels()
911 return -EPROBE_DEFER; in axp209_bat_cfg_iio_channels()
912 return PTR_ERR(axp_batt->batt_v); in axp209_bat_cfg_iio_channels()
915 axp_batt->batt_chrg_i = devm_iio_channel_get(&pdev->dev, in axp209_bat_cfg_iio_channels()
917 if (IS_ERR(axp_batt->batt_chrg_i)) { in axp209_bat_cfg_iio_channels()
918 if (PTR_ERR(axp_batt->batt_chrg_i) == -ENODEV) in axp209_bat_cfg_iio_channels()
919 return -EPROBE_DEFER; in axp209_bat_cfg_iio_channels()
920 return PTR_ERR(axp_batt->batt_chrg_i); in axp209_bat_cfg_iio_channels()
923 axp_batt->batt_dischrg_i = devm_iio_channel_get(&pdev->dev, in axp209_bat_cfg_iio_channels()
925 if (IS_ERR(axp_batt->batt_dischrg_i)) { in axp209_bat_cfg_iio_channels()
926 if (PTR_ERR(axp_batt->batt_dischrg_i) == -ENODEV) in axp209_bat_cfg_iio_channels()
927 return -EPROBE_DEFER; in axp209_bat_cfg_iio_channels()
928 return PTR_ERR(axp_batt->batt_dischrg_i); in axp209_bat_cfg_iio_channels()
937 axp_batt->batt_v = devm_iio_channel_get(&pdev->dev, "batt_v"); in axp717_bat_cfg_iio_channels()
938 if (IS_ERR(axp_batt->batt_v)) { in axp717_bat_cfg_iio_channels()
939 if (PTR_ERR(axp_batt->batt_v) == -ENODEV) in axp717_bat_cfg_iio_channels()
940 return -EPROBE_DEFER; in axp717_bat_cfg_iio_channels()
941 return PTR_ERR(axp_batt->batt_v); in axp717_bat_cfg_iio_channels()
944 axp_batt->batt_chrg_i = devm_iio_channel_get(&pdev->dev, in axp717_bat_cfg_iio_channels()
946 if (IS_ERR(axp_batt->batt_chrg_i)) { in axp717_bat_cfg_iio_channels()
947 if (PTR_ERR(axp_batt->batt_chrg_i) == -ENODEV) in axp717_bat_cfg_iio_channels()
948 return -EPROBE_DEFER; in axp717_bat_cfg_iio_channels()
949 return PTR_ERR(axp_batt->batt_chrg_i); in axp717_bat_cfg_iio_channels()
959 int vmin = info->voltage_min_design_uv; in axp209_set_battery_info()
960 int ccc = info->constant_charge_current_max_ua; in axp209_set_battery_info()
963 dev_err(&pdev->dev, in axp209_set_battery_info()
967 axp_batt->max_ccc = ccc; in axp209_set_battery_info()
970 dev_err(&pdev->dev, in axp209_set_battery_info()
973 axp_batt->max_ccc = ccc; in axp209_set_battery_info()
982 int vmin = info->voltage_min_design_uv; in axp717_set_battery_info()
983 int vmax = info->voltage_max_design_uv; in axp717_set_battery_info()
984 int ccc = info->constant_charge_current_max_ua; in axp717_set_battery_info()
988 dev_err(&pdev->dev, in axp717_set_battery_info()
992 dev_err(&pdev->dev, in axp717_set_battery_info()
996 axp_batt->max_ccc = ccc; in axp717_set_battery_info()
998 dev_err(&pdev->dev, in axp717_set_battery_info()
1056 .compatible = "x-powers,axp209-battery-power-supply",
1059 .compatible = "x-powers,axp221-battery-power-supply",
1062 .compatible = "x-powers,axp717-battery-power-supply",
1065 .compatible = "x-powers,axp813-battery-power-supply",
1076 struct device *dev = &pdev->dev; in axp20x_power_probe()
1079 if (!of_device_is_available(pdev->dev.of_node)) in axp20x_power_probe()
1080 return -ENODEV; in axp20x_power_probe()
1082 axp20x_batt = devm_kzalloc(&pdev->dev, sizeof(*axp20x_batt), in axp20x_power_probe()
1085 return -ENOMEM; in axp20x_power_probe()
1087 axp20x_batt->dev = &pdev->dev; in axp20x_power_probe()
1089 axp20x_batt->regmap = dev_get_regmap(pdev->dev.parent, NULL); in axp20x_power_probe()
1093 psy_cfg.of_node = pdev->dev.of_node; in axp20x_power_probe()
1095 axp20x_batt->data = (struct axp_data *)of_device_get_match_data(dev); in axp20x_power_probe()
1097 ret = axp20x_batt->data->cfg_iio_chan(pdev, axp20x_batt); in axp20x_power_probe()
1101 axp20x_batt->batt = devm_power_supply_register(&pdev->dev, in axp20x_power_probe()
1102 axp20x_batt->data->bat_ps_desc, in axp20x_power_probe()
1104 if (IS_ERR(axp20x_batt->batt)) { in axp20x_power_probe()
1105 dev_err(&pdev->dev, "failed to register power supply: %ld\n", in axp20x_power_probe()
1106 PTR_ERR(axp20x_batt->batt)); in axp20x_power_probe()
1107 return PTR_ERR(axp20x_batt->batt); in axp20x_power_probe()
1110 if (!power_supply_get_battery_info(axp20x_batt->batt, &info)) { in axp20x_power_probe()
1111 axp20x_batt->data->set_bat_info(pdev, axp20x_batt, info); in axp20x_power_probe()
1112 power_supply_put_battery_info(axp20x_batt->batt, info); in axp20x_power_probe()
1116 * Update max CCC to a valid value if battery info is present or set it in axp20x_power_probe()
1119 axp20x_get_constant_charge_current(axp20x_batt, &axp20x_batt->max_ccc); in axp20x_power_probe()
1127 .name = "axp20x-battery-power-supply",
1134 MODULE_DESCRIPTION("Battery power supply driver for AXP20X and AXP22X PMICs");
1135 MODULE_AUTHOR("Quentin Schulz <quentin.schulz@free-electrons.com>");