Message ID | 20210805085828.3451909-2-linus.walleij@linaro.org |
---|---|
State | Accepted |
Commit | 4eef766b7d4d88f0b984781bc1bcb574a6eafdc7 |
Headers | show |
Series | [1/2,v2] dt-bindings: power: Extend battery bindings with type | expand |
Hi, On Thu, Aug 05, 2021 at 10:58:28AM +0200, Linus Walleij wrote: > This extends the struct power_supply_battery_info with a > "technology" field makes the core DT parser optionally obtain > this from the device tree. > > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com> -- Sebastian > ChangeLog v1->v2: > - Drop the accidental double assignment of err as reported > by the kernel test robot et al. > - Switch to "device-chemistry" instead of "battery-type" > to indicate the type. > This is needed to migrate the STE AB8500 custom battery bindings > and parser to the generic parser. > --- > drivers/power/supply/power_supply_core.c | 20 ++++++++++++++++++++ > include/linux/power_supply.h | 1 + > 2 files changed, 21 insertions(+) > > diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c > index d99e2f11c183..dd62c871b2b5 100644 > --- a/drivers/power/supply/power_supply_core.c > +++ b/drivers/power/supply/power_supply_core.c > @@ -571,6 +571,7 @@ int power_supply_get_battery_info(struct power_supply *psy, > int err, len, index; > const __be32 *list; > > + info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; > info->energy_full_design_uwh = -EINVAL; > info->charge_full_design_uah = -EINVAL; > info->voltage_min_design_uv = -EINVAL; > @@ -618,6 +619,25 @@ int power_supply_get_battery_info(struct power_supply *psy, > * Documentation/power/power_supply_class.rst. > */ > > + err = of_property_read_string(battery_np, "device-chemistry", &value); > + if (!err) { > + if (!strcmp("nickel-cadmium", value)) > + info->technology = POWER_SUPPLY_TECHNOLOGY_NiCd; > + else if (!strcmp("nickel-metal-hydride", value)) > + info->technology = POWER_SUPPLY_TECHNOLOGY_NiMH; > + else if (!strcmp("lithium-ion", value)) > + /* Imprecise lithium-ion type */ > + info->technology = POWER_SUPPLY_TECHNOLOGY_LION; > + else if (!strcmp("lithium-ion-polymer", value)) > + info->technology = POWER_SUPPLY_TECHNOLOGY_LIPO; > + else if (!strcmp("lithium-ion-iron-phosphate", value)) > + info->technology = POWER_SUPPLY_TECHNOLOGY_LiFe; > + else if (!strcmp("lithium-ion-manganese-oxide", value)) > + info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn; > + else > + dev_warn(&psy->dev, "%s unknown battery type\n", value); > + } > + > of_property_read_u32(battery_np, "energy-full-design-microwatt-hours", > &info->energy_full_design_uwh); > of_property_read_u32(battery_np, "charge-full-design-microamp-hours", > diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h > index be203985ecdd..9ca1f120a211 100644 > --- a/include/linux/power_supply.h > +++ b/include/linux/power_supply.h > @@ -352,6 +352,7 @@ struct power_supply_resistance_temp_table { > */ > > struct power_supply_battery_info { > + unsigned int technology; /* from the enum above */ > int energy_full_design_uwh; /* microWatt-hours */ > int charge_full_design_uah; /* microAmp-hours */ > int voltage_min_design_uv; /* microVolts */ > -- > 2.31.1 >
diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c index d99e2f11c183..dd62c871b2b5 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -571,6 +571,7 @@ int power_supply_get_battery_info(struct power_supply *psy, int err, len, index; const __be32 *list; + info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; info->energy_full_design_uwh = -EINVAL; info->charge_full_design_uah = -EINVAL; info->voltage_min_design_uv = -EINVAL; @@ -618,6 +619,25 @@ int power_supply_get_battery_info(struct power_supply *psy, * Documentation/power/power_supply_class.rst. */ + err = of_property_read_string(battery_np, "device-chemistry", &value); + if (!err) { + if (!strcmp("nickel-cadmium", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_NiCd; + else if (!strcmp("nickel-metal-hydride", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_NiMH; + else if (!strcmp("lithium-ion", value)) + /* Imprecise lithium-ion type */ + info->technology = POWER_SUPPLY_TECHNOLOGY_LION; + else if (!strcmp("lithium-ion-polymer", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_LIPO; + else if (!strcmp("lithium-ion-iron-phosphate", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_LiFe; + else if (!strcmp("lithium-ion-manganese-oxide", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn; + else + dev_warn(&psy->dev, "%s unknown battery type\n", value); + } + of_property_read_u32(battery_np, "energy-full-design-microwatt-hours", &info->energy_full_design_uwh); of_property_read_u32(battery_np, "charge-full-design-microamp-hours", diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index be203985ecdd..9ca1f120a211 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -352,6 +352,7 @@ struct power_supply_resistance_temp_table { */ struct power_supply_battery_info { + unsigned int technology; /* from the enum above */ int energy_full_design_uwh; /* microWatt-hours */ int charge_full_design_uah; /* microAmp-hours */ int voltage_min_design_uv; /* microVolts */
This extends the struct power_supply_battery_info with a "technology" field makes the core DT parser optionally obtain this from the device tree. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- ChangeLog v1->v2: - Drop the accidental double assignment of err as reported by the kernel test robot et al. - Switch to "device-chemistry" instead of "battery-type" to indicate the type. This is needed to migrate the STE AB8500 custom battery bindings and parser to the generic parser. --- drivers/power/supply/power_supply_core.c | 20 ++++++++++++++++++++ include/linux/power_supply.h | 1 + 2 files changed, 21 insertions(+) -- 2.31.1