Message ID | 20230514123130.41172-9-jahau@rocketmail.com (mailing list archive) |
---|---|
State | Handled Elsewhere, archived |
Headers | show |
Series | Add RT5033 charger device driver | expand |
Hi, On Sun, May 14, 2023 at 02:31:28PM +0200, Jakob Hauser wrote: > The rt5033-battery fuelgauge can't get a status by itself. The rt5033-charger > can, let's get this value. > > To get the charger as a "supplier" from the devicetree, the "of_node" needs > to be initiated. > > Additionally, in the probe function replace dev_err() with dev_err_probe(), > this will avoid printing an error for -EPROBE_DEFER when the battery driver > probes before the charger driver. > > Signed-off-by: Jakob Hauser <jahau@rocketmail.com> > --- Acked-by: Sebastian Reichel <sebastian.reichel@collabora.com> -- Sebastian > drivers/power/supply/rt5033_battery.c | 29 +++++++++++++++++++++------ > 1 file changed, 23 insertions(+), 6 deletions(-) > > diff --git a/drivers/power/supply/rt5033_battery.c b/drivers/power/supply/rt5033_battery.c > index 91e1efd81f69..94d2dea7ef5e 100644 > --- a/drivers/power/supply/rt5033_battery.c > +++ b/drivers/power/supply/rt5033_battery.c > @@ -19,6 +19,21 @@ struct rt5033_battery { > struct power_supply *psy; > }; > > +static int rt5033_battery_get_status(struct i2c_client *client) > +{ > + struct rt5033_battery *battery = i2c_get_clientdata(client); > + union power_supply_propval val; > + int ret; > + > + ret = power_supply_get_property_from_supplier(battery->psy, > + POWER_SUPPLY_PROP_STATUS, > + &val); > + if (ret) > + val.intval = POWER_SUPPLY_STATUS_UNKNOWN; > + > + return val.intval; > +} > + > static int rt5033_battery_get_capacity(struct i2c_client *client) > { > struct rt5033_battery *battery = i2c_get_clientdata(client); > @@ -91,6 +106,9 @@ static int rt5033_battery_get_property(struct power_supply *psy, > case POWER_SUPPLY_PROP_CAPACITY: > val->intval = rt5033_battery_get_capacity(battery->client); > break; > + case POWER_SUPPLY_PROP_STATUS: > + val->intval = rt5033_battery_get_status(battery->client); > + break; > default: > return -EINVAL; > } > @@ -103,6 +121,7 @@ static enum power_supply_property rt5033_battery_props[] = { > POWER_SUPPLY_PROP_VOLTAGE_OCV, > POWER_SUPPLY_PROP_PRESENT, > POWER_SUPPLY_PROP_CAPACITY, > + POWER_SUPPLY_PROP_STATUS, > }; > > static const struct regmap_config rt5033_battery_regmap_config = { > @@ -124,7 +143,6 @@ static int rt5033_battery_probe(struct i2c_client *client) > struct i2c_adapter *adapter = client->adapter; > struct power_supply_config psy_cfg = {}; > struct rt5033_battery *battery; > - u32 ret; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE)) > return -EIO; > @@ -142,15 +160,14 @@ static int rt5033_battery_probe(struct i2c_client *client) > } > > i2c_set_clientdata(client, battery); > + psy_cfg.of_node = client->dev.of_node; > psy_cfg.drv_data = battery; > > battery->psy = power_supply_register(&client->dev, > &rt5033_battery_desc, &psy_cfg); > - if (IS_ERR(battery->psy)) { > - dev_err(&client->dev, "Failed to register power supply\n"); > - ret = PTR_ERR(battery->psy); > - return ret; > - } > + if (IS_ERR(battery->psy)) > + return dev_err_probe(&client->dev, PTR_ERR(battery->psy), > + "Failed to register power supply\n"); > > return 0; > } > -- > 2.39.2 >
diff --git a/drivers/power/supply/rt5033_battery.c b/drivers/power/supply/rt5033_battery.c index 91e1efd81f69..94d2dea7ef5e 100644 --- a/drivers/power/supply/rt5033_battery.c +++ b/drivers/power/supply/rt5033_battery.c @@ -19,6 +19,21 @@ struct rt5033_battery { struct power_supply *psy; }; +static int rt5033_battery_get_status(struct i2c_client *client) +{ + struct rt5033_battery *battery = i2c_get_clientdata(client); + union power_supply_propval val; + int ret; + + ret = power_supply_get_property_from_supplier(battery->psy, + POWER_SUPPLY_PROP_STATUS, + &val); + if (ret) + val.intval = POWER_SUPPLY_STATUS_UNKNOWN; + + return val.intval; +} + static int rt5033_battery_get_capacity(struct i2c_client *client) { struct rt5033_battery *battery = i2c_get_clientdata(client); @@ -91,6 +106,9 @@ static int rt5033_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_CAPACITY: val->intval = rt5033_battery_get_capacity(battery->client); break; + case POWER_SUPPLY_PROP_STATUS: + val->intval = rt5033_battery_get_status(battery->client); + break; default: return -EINVAL; } @@ -103,6 +121,7 @@ static enum power_supply_property rt5033_battery_props[] = { POWER_SUPPLY_PROP_VOLTAGE_OCV, POWER_SUPPLY_PROP_PRESENT, POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_STATUS, }; static const struct regmap_config rt5033_battery_regmap_config = { @@ -124,7 +143,6 @@ static int rt5033_battery_probe(struct i2c_client *client) struct i2c_adapter *adapter = client->adapter; struct power_supply_config psy_cfg = {}; struct rt5033_battery *battery; - u32 ret; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE)) return -EIO; @@ -142,15 +160,14 @@ static int rt5033_battery_probe(struct i2c_client *client) } i2c_set_clientdata(client, battery); + psy_cfg.of_node = client->dev.of_node; psy_cfg.drv_data = battery; battery->psy = power_supply_register(&client->dev, &rt5033_battery_desc, &psy_cfg); - if (IS_ERR(battery->psy)) { - dev_err(&client->dev, "Failed to register power supply\n"); - ret = PTR_ERR(battery->psy); - return ret; - } + if (IS_ERR(battery->psy)) + return dev_err_probe(&client->dev, PTR_ERR(battery->psy), + "Failed to register power supply\n"); return 0; }
The rt5033-battery fuelgauge can't get a status by itself. The rt5033-charger can, let's get this value. To get the charger as a "supplier" from the devicetree, the "of_node" needs to be initiated. Additionally, in the probe function replace dev_err() with dev_err_probe(), this will avoid printing an error for -EPROBE_DEFER when the battery driver probes before the charger driver. Signed-off-by: Jakob Hauser <jahau@rocketmail.com> --- drivers/power/supply/rt5033_battery.c | 29 +++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-)