Lines Matching +full:current +full:- +full:boost +full:- +full:limit

1 // SPDX-License-Identifier: GPL-2.0
31 /* Constant current value */
39 /* Overvoltage limit */
43 /* Boost converter enable */
48 /* Light load shutdown current limit */
53 /* Automatic powerup on VIN pull-out */
55 /* Undervoltage limit */
59 } boost; member
86 /* Button long-pressed */
88 /* Button short-pressed */
103 /* Scaling constants for regs.boost.undervolt_limit */
162 * generally only awake when VIN is powered or when its boost converter is
174 return -EOPNOTSUPP; in ip5xxx_read()
178 ip5xxx->initialized = false; in ip5xxx_read()
189 return -EOPNOTSUPP; in ip5xxx_write()
193 ip5xxx->initialized = false; in ip5xxx_write()
203 if (ip5xxx->initialized) in ip5xxx_initialize()
210 if (ip5xxx->regs.boost.light_load_shutdown.enable) { in ip5xxx_initialize()
211 ret = ip5xxx_write(ip5xxx, ip5xxx->regs.boost.light_load_shutdown.enable, 0); in ip5xxx_initialize()
215 ret = ip5xxx_write(ip5xxx, ip5xxx->regs.boost.load_powerup_en, 1); in ip5xxx_initialize()
222 ret = ip5xxx_write(ip5xxx, ip5xxx->regs.btn.shdn_enable, 1); in ip5xxx_initialize()
229 ret = ip5xxx_write(ip5xxx, ip5xxx->regs.boost.vin_pullout_en, 1); in ip5xxx_initialize()
237 if (ip5xxx->regs.battery.ntc_dis) { in ip5xxx_initialize()
238 ret = ip5xxx_write(ip5xxx, ip5xxx->regs.battery.ntc_dis, 0); in ip5xxx_initialize()
242 ret = ip5xxx_write(ip5xxx, ip5xxx->regs.btn.wled_mode, 1); in ip5xxx_initialize()
245 ret = ip5xxx_write(ip5xxx, ip5xxx->regs.btn.shdn_mode, 1); in ip5xxx_initialize()
249 ip5xxx->initialized = true; in ip5xxx_initialize()
250 dev_dbg(psy->dev.parent, "Initialized after power on\n"); in ip5xxx_initialize()
274 if (!ip5xxx->regs.charger.status) { in ip5xxx_battery_get_status()
275 // Fall-back to Charging Ended bit in ip5xxx_battery_get_status()
276 ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.chg_end, &rval); in ip5xxx_battery_get_status()
280 if (rval == ip5xxx->chg_end_inverted) in ip5xxx_battery_get_status()
287 ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.status, &rval); in ip5xxx_battery_get_status()
308 return -EINVAL; in ip5xxx_battery_get_status()
319 ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.status, &rval); in ip5xxx_battery_get_charge_type()
338 return -EINVAL; in ip5xxx_battery_get_charge_type()
349 ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.timeout, &rval); in ip5xxx_battery_get_health()
366 ret = ip5xxx_read(ip5xxx, ip5xxx->regs.battery.type, &rval); in ip5xxx_battery_get_voltage_max()
388 return -EINVAL; in ip5xxx_battery_get_voltage_max()
400 ret = ip5xxx_read(ip5xxx, regs->low, &lo); in ip5xxx_battery_read_adc()
404 ret = ip5xxx_read(ip5xxx, regs->high, &hi); in ip5xxx_battery_read_adc()
427 return ip5xxx_battery_get_status(ip5xxx, &val->intval); in ip5xxx_battery_get_property()
430 return ip5xxx_battery_get_charge_type(ip5xxx, &val->intval); in ip5xxx_battery_get_property()
433 return ip5xxx_battery_get_health(ip5xxx, &val->intval); in ip5xxx_battery_get_property()
436 return ip5xxx_battery_get_voltage_max(ip5xxx, &val->intval); in ip5xxx_battery_get_property()
439 ret = ip5xxx_battery_read_adc(ip5xxx, &ip5xxx->regs.battery.adc.volt, &raw); in ip5xxx_battery_get_property()
443 val->intval = 2600000 + DIV_ROUND_CLOSEST(raw * 26855, 100); in ip5xxx_battery_get_property()
447 ret = ip5xxx_battery_read_adc(ip5xxx, &ip5xxx->regs.battery.adc.open_volt, &raw); in ip5xxx_battery_get_property()
451 val->intval = 2600000 + DIV_ROUND_CLOSEST(raw * 26855, 100); in ip5xxx_battery_get_property()
455 ret = ip5xxx_battery_read_adc(ip5xxx, &ip5xxx->regs.battery.adc.curr, &raw); in ip5xxx_battery_get_property()
459 val->intval = DIV_ROUND_CLOSEST(raw * 149197, 200); in ip5xxx_battery_get_property()
463 ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.const_curr_sel, &rval); in ip5xxx_battery_get_property()
467 val->intval = ip5xxx->const_curr.setpoint + 100000 * rval; in ip5xxx_battery_get_property()
471 val->intval = 100000 * 0x1f; in ip5xxx_battery_get_property()
479 ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.const_volt_sel, &rval); in ip5xxx_battery_get_property()
483 val->intval = vmax + 14000 * rval; in ip5xxx_battery_get_property()
491 val->intval = vmax + 14000 * 3; in ip5xxx_battery_get_property()
495 return -EINVAL; in ip5xxx_battery_get_property()
504 if (val > ip5xxx->vbat_max) in ip5xxx_battery_set_voltage_max()
505 return -EINVAL; in ip5xxx_battery_set_voltage_max()
521 return -EINVAL; in ip5xxx_battery_set_voltage_max()
524 ret = ip5xxx_write(ip5xxx, ip5xxx->regs.battery.type, rval); in ip5xxx_battery_set_voltage_max()
528 /* Don't try to auto-detect battery type, even if the IC could */ in ip5xxx_battery_set_voltage_max()
529 if (ip5xxx->regs.battery.vset_en) { in ip5xxx_battery_set_voltage_max()
530 ret = ip5xxx_write(ip5xxx, ip5xxx->regs.battery.vset_en, 1); in ip5xxx_battery_set_voltage_max()
552 switch (val->intval) { in ip5xxx_battery_set_property()
561 return -EINVAL; in ip5xxx_battery_set_property()
563 return ip5xxx_write(ip5xxx, ip5xxx->regs.charger.enable, rval); in ip5xxx_battery_set_property()
566 return ip5xxx_battery_set_voltage_max(ip5xxx, val->intval); in ip5xxx_battery_set_property()
569 rval = (val->intval - ip5xxx->const_curr.setpoint) / 100000; in ip5xxx_battery_set_property()
570 return ip5xxx_write(ip5xxx, ip5xxx->regs.charger.const_curr_sel, rval); in ip5xxx_battery_set_property()
577 rval = (val->intval - vmax) / 14000; in ip5xxx_battery_set_property()
578 return ip5xxx_write(ip5xxx, ip5xxx->regs.charger.const_volt_sel, rval); in ip5xxx_battery_set_property()
581 return -EINVAL; in ip5xxx_battery_set_property()
595 .name = "ip5xxx-battery",
623 ret = ip5xxx_read(ip5xxx, ip5xxx->regs.boost.enable, &rval); in ip5xxx_boost_get_property()
627 val->intval = !!rval; in ip5xxx_boost_get_property()
631 ret = ip5xxx_read(ip5xxx, ip5xxx->regs.boost.undervolt_limit, &rval); in ip5xxx_boost_get_property()
635 val->intval = ip5xxx->boost_undervolt.setpoint + in ip5xxx_boost_get_property()
636 ip5xxx->boost_undervolt.microvolts_per_bit * rval; in ip5xxx_boost_get_property()
640 return -EINVAL; in ip5xxx_boost_get_property()
658 return ip5xxx_write(ip5xxx, ip5xxx->regs.boost.enable, !!val->intval); in ip5xxx_boost_set_property()
661 rval = (val->intval - ip5xxx->boost_undervolt.setpoint) / in ip5xxx_boost_set_property()
662 ip5xxx->boost_undervolt.microvolts_per_bit; in ip5xxx_boost_set_property()
663 return ip5xxx_write(ip5xxx, ip5xxx->regs.boost.undervolt_limit, rval); in ip5xxx_boost_set_property()
666 return -EINVAL; in ip5xxx_boost_set_property()
677 .name = "ip5xxx-boost",
777 if (likely(cfg->_field.lsb <= cfg->_field.msb)) { \
779 ip5xxx->regmap, cfg->_field); \
781 ip5xxx->regs._reg = _tmp; \
795 ip5xxx_setup_reg(boost_enable, boost.enable); in ip5xxx_setup_regs()
796 ip5xxx_setup_reg(boost_llshdn_enable, boost.light_load_shutdown.enable); in ip5xxx_setup_regs()
797 ip5xxx_setup_reg(boost_llshdn_i_limit, boost.light_load_shutdown.i_limit); in ip5xxx_setup_regs()
798 ip5xxx_setup_reg(boost_load_powerup_en, boost.load_powerup_en); in ip5xxx_setup_regs()
799 ip5xxx_setup_reg(boost_vin_pullout_en, boost.vin_pullout_en); in ip5xxx_setup_regs()
800 ip5xxx_setup_reg(boost_undervolt_limit, boost.undervolt_limit); in ip5xxx_setup_regs()
801 ip5xxx_setup_reg(boost_light_load_status, boost.light_load_status); in ip5xxx_setup_regs()
822 ip5xxx->vbat_max = cfg->vbat_max; in ip5xxx_setup_regs()
823 ip5xxx->boost_undervolt.setpoint = cfg->boost_undervolt_setpoint; in ip5xxx_setup_regs()
824 ip5xxx->boost_undervolt.microvolts_per_bit = cfg->boost_undervolt_uv_per_bit; in ip5xxx_setup_regs()
825 ip5xxx->const_curr.setpoint = cfg->const_curr_setpoint; in ip5xxx_setup_regs()
826 ip5xxx->chg_end_inverted = cfg->chg_end_inverted; in ip5xxx_setup_regs()
833 struct device *dev = &client->dev; in ip5xxx_power_probe()
840 return -ENOMEM; in ip5xxx_power_probe()
842 ip5xxx->regmap = devm_regmap_init_i2c(client, &ip5xxx_regmap_config); in ip5xxx_power_probe()
843 if (IS_ERR(ip5xxx->regmap)) in ip5xxx_power_probe()
844 return PTR_ERR(ip5xxx->regmap); in ip5xxx_power_probe()
846 of_id = i2c_of_match_device(dev->driver->of_match_table, client); in ip5xxx_power_probe()
848 fields = (const struct ip5xxx_regfield_config *)of_id->data; in ip5xxx_power_probe()
851 psy_cfg.of_node = dev->of_node; in ip5xxx_power_probe()
878 .name = "ip5xxx-power",