ip5xxx
static int ip5xxx_read(struct ip5xxx *ip5xxx, struct regmap_field *field,
ip5xxx->initialized = false;
static int ip5xxx_write(struct ip5xxx *ip5xxx, struct regmap_field *field,
ip5xxx->initialized = false;
struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
if (ip5xxx->initialized)
if (ip5xxx->regs.boost.light_load_shutdown.enable) {
ret = ip5xxx_write(ip5xxx, ip5xxx->regs.boost.light_load_shutdown.enable, 0);
ret = ip5xxx_write(ip5xxx, ip5xxx->regs.boost.load_powerup_en, 1);
ret = ip5xxx_write(ip5xxx, ip5xxx->regs.btn.shdn_enable, 1);
ret = ip5xxx_write(ip5xxx, ip5xxx->regs.boost.vin_pullout_en, 1);
if (ip5xxx->regs.battery.ntc_dis) {
ret = ip5xxx_write(ip5xxx, ip5xxx->regs.battery.ntc_dis, 0);
ret = ip5xxx_write(ip5xxx, ip5xxx->regs.btn.wled_mode, 1);
ret = ip5xxx_write(ip5xxx, ip5xxx->regs.btn.shdn_mode, 1);
ip5xxx->initialized = true;
static int ip5xxx_battery_get_status(struct ip5xxx *ip5xxx, int *val)
if (!ip5xxx->regs.charger.status) {
ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.chg_end, &rval);
if (rval == ip5xxx->chg_end_inverted)
ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.status, &rval);
static int ip5xxx_battery_get_charge_type(struct ip5xxx *ip5xxx, int *val)
ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.status, &rval);
static int ip5xxx_battery_get_health(struct ip5xxx *ip5xxx, int *val)
ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.timeout, &rval);
static int ip5xxx_battery_get_voltage_max(struct ip5xxx *ip5xxx, int *val)
ret = ip5xxx_read(ip5xxx, ip5xxx->regs.battery.type, &rval);
static int ip5xxx_battery_read_adc(struct ip5xxx *ip5xxx,
ret = ip5xxx_read(ip5xxx, regs->low, &lo);
ret = ip5xxx_read(ip5xxx, regs->high, &hi);
struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
return ip5xxx_battery_get_status(ip5xxx, &val->intval);
return ip5xxx_battery_get_charge_type(ip5xxx, &val->intval);
return ip5xxx_battery_get_health(ip5xxx, &val->intval);
return ip5xxx_battery_get_voltage_max(ip5xxx, &val->intval);
ret = ip5xxx_battery_read_adc(ip5xxx, &ip5xxx->regs.battery.adc.volt, &raw);
ret = ip5xxx_battery_read_adc(ip5xxx, &ip5xxx->regs.battery.adc.open_volt, &raw);
ret = ip5xxx_battery_read_adc(ip5xxx, &ip5xxx->regs.battery.adc.curr, &raw);
ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.const_curr_sel, &rval);
val->intval = ip5xxx->const_curr.setpoint + 100000 * rval;
ret = ip5xxx_battery_get_voltage_max(ip5xxx, &vmax);
ret = ip5xxx_read(ip5xxx, ip5xxx->regs.charger.const_volt_sel, &rval);
ret = ip5xxx_battery_get_voltage_max(ip5xxx, &vmax);
static int ip5xxx_battery_set_voltage_max(struct ip5xxx *ip5xxx, int val)
if (val > ip5xxx->vbat_max)
ret = ip5xxx_write(ip5xxx, ip5xxx->regs.battery.type, rval);
if (ip5xxx->regs.battery.vset_en) {
ret = ip5xxx_write(ip5xxx, ip5xxx->regs.battery.vset_en, 1);
struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
return ip5xxx_write(ip5xxx, ip5xxx->regs.charger.enable, rval);
return ip5xxx_battery_set_voltage_max(ip5xxx, val->intval);
rval = (val->intval - ip5xxx->const_curr.setpoint) / 100000;
return ip5xxx_write(ip5xxx, ip5xxx->regs.charger.const_curr_sel, rval);
ret = ip5xxx_battery_get_voltage_max(ip5xxx, &vmax);
return ip5xxx_write(ip5xxx, ip5xxx->regs.charger.const_volt_sel, rval);
struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
ret = ip5xxx_read(ip5xxx, ip5xxx->regs.boost.enable, &rval);
ret = ip5xxx_read(ip5xxx, ip5xxx->regs.boost.undervolt_limit, &rval);
val->intval = ip5xxx->boost_undervolt.setpoint +
ip5xxx->boost_undervolt.microvolts_per_bit * rval;
struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
return ip5xxx_write(ip5xxx, ip5xxx->regs.boost.enable, !!val->intval);
rval = (val->intval - ip5xxx->boost_undervolt.setpoint) /
ip5xxx->boost_undervolt.microvolts_per_bit;
return ip5xxx_write(ip5xxx, ip5xxx->regs.boost.undervolt_limit, rval);
ip5xxx->regmap, cfg->_field); \
ip5xxx->regs._reg = _tmp; \
static void ip5xxx_setup_regs(struct device *dev, struct ip5xxx *ip5xxx,
ip5xxx->vbat_max = cfg->vbat_max;
ip5xxx->boost_undervolt.setpoint = cfg->boost_undervolt_setpoint;
ip5xxx->boost_undervolt.microvolts_per_bit = cfg->boost_undervolt_uv_per_bit;
ip5xxx->const_curr.setpoint = cfg->const_curr_setpoint;
ip5xxx->chg_end_inverted = cfg->chg_end_inverted;
struct ip5xxx *ip5xxx;
ip5xxx = devm_kzalloc(dev, sizeof(*ip5xxx), GFP_KERNEL);
if (!ip5xxx)
ip5xxx->regmap = devm_regmap_init_i2c(client, &ip5xxx_regmap_config);
if (IS_ERR(ip5xxx->regmap))
return PTR_ERR(ip5xxx->regmap);
ip5xxx_setup_regs(dev, ip5xxx, fields);
psy_cfg.drv_data = ip5xxx;