power: supply: smb347-charger: Remove virtual smb347-battery

SMB347 is a charger and not a battery driver. Secondly, power-supply core
now supports monitored-battery. So the 'fake' battery doesn't do anything
useful for us, and thus, it should be removed.

Transfer smb347-battery functionality into smb347-mains and smb347-usb.

Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: David Heidelberg <david@ixit.cz>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
This commit is contained in:
David Heidelberg 2020-08-14 00:34:06 +03:00 committed by Sebastian Reichel
parent de76fd29a7
commit db14d3b45b
1 changed files with 60 additions and 146 deletions

View File

@ -127,7 +127,6 @@
* @regmap: pointer to driver regmap
* @mains: power_supply instance for AC/DC power
* @usb: power_supply instance for USB power
* @battery: power_supply instance for battery
* @id: SMB charger ID
* @mains_online: is AC/DC input connected
* @usb_online: is USB input connected
@ -140,7 +139,6 @@ struct smb347_charger {
struct regmap *regmap;
struct power_supply *mains;
struct power_supply *usb;
struct power_supply *battery;
unsigned int id;
bool mains_online;
bool usb_online;
@ -743,7 +741,10 @@ static irqreturn_t smb347_interrupt(int irq, void *data)
*/
if (stat_c & STAT_C_CHARGER_ERROR) {
dev_err(smb->dev, "charging stopped due to charger error\n");
power_supply_changed(smb->battery);
if (smb->pdata->use_mains)
power_supply_changed(smb->mains);
if (smb->pdata->use_usb)
power_supply_changed(smb->usb);
handled = true;
}
@ -753,8 +754,12 @@ static irqreturn_t smb347_interrupt(int irq, void *data)
* disabled by the hardware.
*/
if (irqstat_c & (IRQSTAT_C_TERMINATION_IRQ | IRQSTAT_C_TAPER_IRQ)) {
if (irqstat_c & IRQSTAT_C_TERMINATION_STAT)
power_supply_changed(smb->battery);
if (irqstat_c & IRQSTAT_C_TERMINATION_STAT) {
if (smb->pdata->use_mains)
power_supply_changed(smb->mains);
if (smb->pdata->use_usb)
power_supply_changed(smb->usb);
}
dev_dbg(smb->dev, "going to HW maintenance mode\n");
handled = true;
}
@ -768,7 +773,10 @@ static irqreturn_t smb347_interrupt(int irq, void *data)
if (irqstat_d & IRQSTAT_D_CHARGE_TIMEOUT_STAT)
dev_warn(smb->dev, "charging stopped due to timeout\n");
power_supply_changed(smb->battery);
if (smb->pdata->use_mains)
power_supply_changed(smb->mains);
if (smb->pdata->use_usb)
power_supply_changed(smb->usb);
handled = true;
}
@ -936,95 +944,19 @@ static int get_const_charge_voltage(struct smb347_charger *smb)
return intval;
}
static int smb347_mains_get_property(struct power_supply *psy,
enum power_supply_property prop,
union power_supply_propval *val)
{
struct smb347_charger *smb = power_supply_get_drvdata(psy);
int ret;
switch (prop) {
case POWER_SUPPLY_PROP_ONLINE:
val->intval = smb->mains_online;
break;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
ret = get_const_charge_voltage(smb);
if (ret < 0)
return ret;
else
val->intval = ret;
break;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
ret = get_const_charge_current(smb);
if (ret < 0)
return ret;
else
val->intval = ret;
break;
default:
return -EINVAL;
}
return 0;
}
static enum power_supply_property smb347_mains_properties[] = {
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
};
static int smb347_usb_get_property(struct power_supply *psy,
enum power_supply_property prop,
union power_supply_propval *val)
{
struct smb347_charger *smb = power_supply_get_drvdata(psy);
int ret;
switch (prop) {
case POWER_SUPPLY_PROP_ONLINE:
val->intval = smb->usb_online;
break;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
ret = get_const_charge_voltage(smb);
if (ret < 0)
return ret;
else
val->intval = ret;
break;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
ret = get_const_charge_current(smb);
if (ret < 0)
return ret;
else
val->intval = ret;
break;
default:
return -EINVAL;
}
return 0;
}
static enum power_supply_property smb347_usb_properties[] = {
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
};
static int smb347_get_charging_status(struct smb347_charger *smb)
static int smb347_get_charging_status(struct smb347_charger *smb,
struct power_supply *psy)
{
int ret, status;
unsigned int val;
if (!smb347_is_ps_online(smb))
return POWER_SUPPLY_STATUS_DISCHARGING;
if (psy->desc->type == POWER_SUPPLY_TYPE_USB) {
if (!smb->usb_online)
return POWER_SUPPLY_STATUS_DISCHARGING;
} else {
if (!smb->mains_online)
return POWER_SUPPLY_STATUS_DISCHARGING;
}
ret = regmap_read(smb->regmap, STAT_C, &val);
if (ret < 0)
@ -1063,29 +995,29 @@ static int smb347_get_charging_status(struct smb347_charger *smb)
return status;
}
static int smb347_battery_get_property(struct power_supply *psy,
enum power_supply_property prop,
union power_supply_propval *val)
static int smb347_get_property(struct power_supply *psy,
enum power_supply_property prop,
union power_supply_propval *val)
{
struct smb347_charger *smb = power_supply_get_drvdata(psy);
const struct smb347_charger_platform_data *pdata = smb->pdata;
int ret;
ret = smb347_update_ps_status(smb);
if (ret < 0)
return ret;
switch (prop) {
case POWER_SUPPLY_PROP_STATUS:
ret = smb347_get_charging_status(smb);
ret = smb347_get_charging_status(smb, psy);
if (ret < 0)
return ret;
val->intval = ret;
break;
case POWER_SUPPLY_PROP_CHARGE_TYPE:
if (!smb347_is_ps_online(smb))
return -ENODATA;
if (psy->desc->type == POWER_SUPPLY_TYPE_USB) {
if (!smb->usb_online)
return -ENODATA;
} else {
if (!smb->mains_online)
return -ENODATA;
}
/*
* We handle trickle and pre-charging the same, and taper
@ -1104,24 +1036,25 @@ static int smb347_battery_get_property(struct power_supply *psy,
}
break;
case POWER_SUPPLY_PROP_TECHNOLOGY:
val->intval = pdata->battery_info.technology;
case POWER_SUPPLY_PROP_ONLINE:
if (psy->desc->type == POWER_SUPPLY_TYPE_USB)
val->intval = smb->usb_online;
else
val->intval = smb->mains_online;
break;
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
val->intval = pdata->battery_info.voltage_min_design;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
ret = get_const_charge_voltage(smb);
if (ret < 0)
return ret;
val->intval = ret;
break;
case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
val->intval = pdata->battery_info.voltage_max_design;
break;
case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
val->intval = pdata->battery_info.charge_full_design;
break;
case POWER_SUPPLY_PROP_MODEL_NAME:
val->strval = pdata->battery_info.name;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
ret = get_const_charge_current(smb);
if (ret < 0)
return ret;
val->intval = ret;
break;
default:
@ -1131,14 +1064,12 @@ static int smb347_battery_get_property(struct power_supply *psy,
return 0;
}
static enum power_supply_property smb347_battery_properties[] = {
static enum power_supply_property smb347_properties[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_CHARGE_TYPE,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
};
static bool smb347_volatile_reg(struct device *dev, unsigned int reg)
@ -1308,32 +1239,23 @@ static const struct regmap_config smb347_regmap = {
static const struct power_supply_desc smb347_mains_desc = {
.name = "smb347-mains",
.type = POWER_SUPPLY_TYPE_MAINS,
.get_property = smb347_mains_get_property,
.properties = smb347_mains_properties,
.num_properties = ARRAY_SIZE(smb347_mains_properties),
.get_property = smb347_get_property,
.properties = smb347_properties,
.num_properties = ARRAY_SIZE(smb347_properties),
};
static const struct power_supply_desc smb347_usb_desc = {
.name = "smb347-usb",
.type = POWER_SUPPLY_TYPE_USB,
.get_property = smb347_usb_get_property,
.properties = smb347_usb_properties,
.num_properties = ARRAY_SIZE(smb347_usb_properties),
};
static const struct power_supply_desc smb347_battery_desc = {
.name = "smb347-battery",
.type = POWER_SUPPLY_TYPE_BATTERY,
.get_property = smb347_battery_get_property,
.properties = smb347_battery_properties,
.num_properties = ARRAY_SIZE(smb347_battery_properties),
.get_property = smb347_get_property,
.properties = smb347_properties,
.num_properties = ARRAY_SIZE(smb347_properties),
};
static int smb347_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
static char *battery[] = { "smb347-battery" };
struct power_supply_config mains_usb_cfg = {}, battery_cfg = {};
struct power_supply_config mains_usb_cfg = {};
struct device *dev = &client->dev;
struct smb347_charger *smb;
int ret;
@ -1359,8 +1281,6 @@ static int smb347_probe(struct i2c_client *client,
if (IS_ERR(smb->regmap))
return PTR_ERR(smb->regmap);
mains_usb_cfg.supplied_to = battery;
mains_usb_cfg.num_supplicants = ARRAY_SIZE(battery);
mains_usb_cfg.drv_data = smb;
mains_usb_cfg.of_node = dev->of_node;
if (smb->pdata->use_mains) {
@ -1377,12 +1297,6 @@ static int smb347_probe(struct i2c_client *client,
return PTR_ERR(smb->usb);
}
battery_cfg.drv_data = smb;
smb->battery = devm_power_supply_register(dev, &smb347_battery_desc,
&battery_cfg);
if (IS_ERR(smb->battery))
return PTR_ERR(smb->battery);
ret = smb347_get_battery_info(smb);
if (ret)
return ret;