Message ID | 20220225001314.1881549-7-linus.walleij@linaro.org |
---|---|
State | New |
Headers | show |
Series | AB8500 charging, the final steps | expand |
On Fri, Feb 25, 2022 at 01:13:14AM +0100, Linus Walleij wrote: > If we detect a Samsung SDI battery, we return a static > struct power_supply_battery_info and avoid looking further. > > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- I'm afraid this patch breaks my (currently work-in-progress) battery driver for the rk817. I am not sure but I believe it might cause other issues too for other downstream drivers (I don't have a device to test, but I think maybe the ingenic driver looks like it could be affected too). > ChangeLog v2->v3: > - Fix a whole bunch of tables after realizing that completely > different battery data was used if CONFIG_SAMSUNG_BATTERY > was set for Golden, Kyle, Codina and Skomer. > ChangeLog v1->v2: > - Bump tolerance to 40% on all BTI resistances > - Change config option to bool, as we are calling OUT from > the supply core this cannot be compiled into a module > - Augment data to support low/high temperature charge current > and voltages. Sadly the vendor tree just provide one and the > same current and voltage for all of these. > --- > drivers/power/supply/Kconfig | 6 + > drivers/power/supply/Makefile | 1 + > drivers/power/supply/power_supply_core.c | 28 +- > drivers/power/supply/samsung-sdi-battery.c | 919 +++++++++++++++++++++ > drivers/power/supply/samsung-sdi-battery.h | 13 + > 5 files changed, 957 insertions(+), 10 deletions(-) > create mode 100644 drivers/power/supply/samsung-sdi-battery.c > create mode 100644 drivers/power/supply/samsung-sdi-battery.h > > diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig > index 6815e5a4c0bd..e9df4151f2e0 100644 > --- a/drivers/power/supply/Kconfig > +++ b/drivers/power/supply/Kconfig > @@ -181,6 +181,12 @@ config BATTERY_OLPC > help > Say Y to enable support for the battery on the OLPC laptop. > > +config BATTERY_SAMSUNG_SDI > + bool "Samsung SDI batteries" > + help > + Say Y to enable support for Samsung SDI battery data. > + These batteries are used in Samsung mobile phones. > + > config BATTERY_TOSA > tristate "Sharp SL-6000 (tosa) battery" > depends on MACH_TOSA && MFD_TC6393XB && TOUCHSCREEN_WM97XX > diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile > index 2c1b264b2046..ebcd2f5fe26d 100644 > --- a/drivers/power/supply/Makefile > +++ b/drivers/power/supply/Makefile > @@ -34,6 +34,7 @@ obj-$(CONFIG_BATTERY_GOLDFISH) += goldfish_battery.o > obj-$(CONFIG_BATTERY_LEGO_EV3) += lego_ev3_battery.o > obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o > obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o > +obj-$(CONFIG_BATTERY_SAMSUNG_SDI) += samsung-sdi-battery.o > obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o > obj-$(CONFIG_BATTERY_COLLIE) += collie_battery.o > obj-$(CONFIG_BATTERY_INGENIC) += ingenic-battery.o > diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c > index 1c0b1be22067..43c66214bedf 100644 > --- a/drivers/power/supply/power_supply_core.c > +++ b/drivers/power/supply/power_supply_core.c > @@ -23,6 +23,7 @@ > #include <linux/thermal.h> > #include <linux/fixp-arith.h> > #include "power_supply.h" > +#include "samsung-sdi-battery.h" > > /* exported for the APM Power driver, APM emulation */ > struct class *power_supply_class; > @@ -573,6 +574,23 @@ int power_supply_get_battery_info(struct power_supply *psy, > int err, len, index; > const __be32 *list; > > + if (!psy->of_node) { > + dev_warn(&psy->dev, "%s currently only supports devicetree\n", > + __func__); > + return -ENXIO; > + } > + > + battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); > + if (!battery_np) > + return -ENODEV; > + > + /* Try static batteries first */ > + err = samsung_sdi_battery_get_info(&psy->dev, battery_np, &info); If the device isn't a Samsung battery this puts -ENODEV in the err variable. For my case I have a simple-battery that isn't a Samsung battery, and it is causing power_supply_get_battery_info to return an error. > + if (!err) { > + *info_out = info; > + return err; > + } > + > info = devm_kmalloc(&psy->dev, sizeof(*info), GFP_KERNEL); > if (!info) > return -ENOMEM; > @@ -612,16 +630,6 @@ int power_supply_get_battery_info(struct power_supply *psy, > info->ocv_table_size[index] = -EINVAL; > } > > - if (!psy->of_node) { > - dev_warn(&psy->dev, "%s currently only supports devicetree\n", > - __func__); > - return -ENXIO; > - } > - > - battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); > - if (!battery_np) > - return -ENODEV; > - > err = of_property_read_string(battery_np, "compatible", &value); > if (err) > goto out_put_node; > diff --git a/drivers/power/supply/samsung-sdi-battery.c b/drivers/power/supply/samsung-sdi-battery.c > new file mode 100644 > index 000000000000..8e718f0fc2b5 > --- /dev/null > +++ b/drivers/power/supply/samsung-sdi-battery.c > @@ -0,0 +1,919 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +/* > + * Battery data and characteristics for Samsung SDI (Samsung Digital Interface) > + * batteries. The data is retrieved automatically into drivers using > + * the power_supply_get_battery_info() call. > + * > + * The BTI (battery type indicator) resistance in the code drops was very > + * unreliable. The resistance listed here was obtained by simply measuring > + * the BTI resistance with a multimeter on the battery. > + */ > +#include <linux/module.h> > +#include <linux/of.h> > +#include <linux/power_supply.h> > +#include "samsung-sdi-battery.h" > + > +struct samsung_sdi_battery { > + char *compatible; > + char *name; > + struct power_supply_battery_info info; > +}; > + > +/* > + * Voltage to internal resistance tables. The internal resistance varies > + * depending on the VBAT voltage, so look this up from a table. Different > + * tables apply depending on whether we are charging or not. > + */ > + > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb_l1m7flu[] = { > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > + { .vbat_uv = 4076000, .ri_uohm = 220000 }, > + { .vbat_uv = 4030000, .ri_uohm = 227000 }, > + { .vbat_uv = 3986000, .ri_uohm = 215000 }, > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > + { .vbat_uv = 3773000, .ri_uohm = 287000 }, > + { .vbat_uv = 3742000, .ri_uohm = 283000 }, > + { .vbat_uv = 3709000, .ri_uohm = 277000 }, > + { .vbat_uv = 3685000, .ri_uohm = 297000 }, > + { .vbat_uv = 3646000, .ri_uohm = 310000 }, > + { .vbat_uv = 3616000, .ri_uohm = 331000 }, > + { .vbat_uv = 3602000, .ri_uohm = 370000 }, > + { .vbat_uv = 3578000, .ri_uohm = 350000 }, > + { .vbat_uv = 3553000, .ri_uohm = 321000 }, > + { .vbat_uv = 3503000, .ri_uohm = 322000 }, > + { .vbat_uv = 3400000, .ri_uohm = 269000 }, > + { .vbat_uv = 3360000, .ri_uohm = 328000 }, > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb_l1m7flu[] = { > + { .vbat_uv = 4302000, .ri_uohm = 230000 }, > + { .vbat_uv = 4276000, .ri_uohm = 345000 }, > + { .vbat_uv = 4227000, .ri_uohm = 345000 }, > + { .vbat_uv = 4171000, .ri_uohm = 346000 }, > + { .vbat_uv = 4134000, .ri_uohm = 311000 }, > + { .vbat_uv = 4084000, .ri_uohm = 299000 }, > + { .vbat_uv = 4052000, .ri_uohm = 316000 }, > + { .vbat_uv = 4012000, .ri_uohm = 309000 }, > + { .vbat_uv = 3961000, .ri_uohm = 303000 }, > + { .vbat_uv = 3939000, .ri_uohm = 280000 }, > + { .vbat_uv = 3904000, .ri_uohm = 261000 }, > + { .vbat_uv = 3850000, .ri_uohm = 212000 }, > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161la[] = { > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > + { .vbat_uv = 4080000, .ri_uohm = 200000 }, > + { .vbat_uv = 4027000, .ri_uohm = 202000 }, > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > + { .vbat_uv = 3800000, .ri_uohm = 262000 }, > + { .vbat_uv = 3742000, .ri_uohm = 263000 }, > + { .vbat_uv = 3709000, .ri_uohm = 277000 }, > + { .vbat_uv = 3685000, .ri_uohm = 312000 }, > + { .vbat_uv = 3668000, .ri_uohm = 258000 }, > + { .vbat_uv = 3660000, .ri_uohm = 247000 }, > + { .vbat_uv = 3636000, .ri_uohm = 293000 }, > + { .vbat_uv = 3616000, .ri_uohm = 331000 }, > + { .vbat_uv = 3600000, .ri_uohm = 349000 }, > + { .vbat_uv = 3593000, .ri_uohm = 345000 }, > + { .vbat_uv = 3585000, .ri_uohm = 344000 }, > + { .vbat_uv = 3572000, .ri_uohm = 336000 }, > + { .vbat_uv = 3553000, .ri_uohm = 321000 }, > + { .vbat_uv = 3517000, .ri_uohm = 336000 }, > + { .vbat_uv = 3503000, .ri_uohm = 322000 }, > + { .vbat_uv = 3400000, .ri_uohm = 269000 }, > + { .vbat_uv = 3360000, .ri_uohm = 328000 }, > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161la[] = { > + { .vbat_uv = 4345000, .ri_uohm = 230000 }, > + { .vbat_uv = 4329000, .ri_uohm = 238000 }, > + { .vbat_uv = 4314000, .ri_uohm = 225000 }, > + { .vbat_uv = 4311000, .ri_uohm = 239000 }, > + { .vbat_uv = 4294000, .ri_uohm = 235000 }, > + { .vbat_uv = 4264000, .ri_uohm = 229000 }, > + { .vbat_uv = 4262000, .ri_uohm = 228000 }, > + { .vbat_uv = 4252000, .ri_uohm = 236000 }, > + { .vbat_uv = 4244000, .ri_uohm = 234000 }, > + { .vbat_uv = 4235000, .ri_uohm = 234000 }, > + { .vbat_uv = 4227000, .ri_uohm = 238000 }, > + { .vbat_uv = 4219000, .ri_uohm = 242000 }, > + { .vbat_uv = 4212000, .ri_uohm = 239000 }, > + { .vbat_uv = 4206000, .ri_uohm = 231000 }, > + { .vbat_uv = 4201000, .ri_uohm = 231000 }, > + { .vbat_uv = 4192000, .ri_uohm = 224000 }, > + { .vbat_uv = 4184000, .ri_uohm = 238000 }, > + { .vbat_uv = 4173000, .ri_uohm = 245000 }, > + { .vbat_uv = 4161000, .ri_uohm = 244000 }, > + { .vbat_uv = 4146000, .ri_uohm = 244000 }, > + { .vbat_uv = 4127000, .ri_uohm = 228000 }, > + { .vbat_uv = 4119000, .ri_uohm = 218000 }, > + { .vbat_uv = 4112000, .ri_uohm = 215000 }, > + { .vbat_uv = 4108000, .ri_uohm = 209000 }, > + { .vbat_uv = 4102000, .ri_uohm = 214000 }, > + { .vbat_uv = 4096000, .ri_uohm = 215000 }, > + { .vbat_uv = 4090000, .ri_uohm = 215000 }, > + { .vbat_uv = 4083000, .ri_uohm = 219000 }, > + { .vbat_uv = 4078000, .ri_uohm = 208000 }, > + { .vbat_uv = 4071000, .ri_uohm = 205000 }, > + { .vbat_uv = 4066000, .ri_uohm = 208000 }, > + { .vbat_uv = 4061000, .ri_uohm = 210000 }, > + { .vbat_uv = 4055000, .ri_uohm = 212000 }, > + { .vbat_uv = 4049000, .ri_uohm = 215000 }, > + { .vbat_uv = 4042000, .ri_uohm = 212000 }, > + { .vbat_uv = 4032000, .ri_uohm = 217000 }, > + { .vbat_uv = 4027000, .ri_uohm = 220000 }, > + { .vbat_uv = 4020000, .ri_uohm = 210000 }, > + { .vbat_uv = 4013000, .ri_uohm = 214000 }, > + { .vbat_uv = 4007000, .ri_uohm = 219000 }, > + { .vbat_uv = 4003000, .ri_uohm = 229000 }, > + { .vbat_uv = 3996000, .ri_uohm = 246000 }, > + { .vbat_uv = 3990000, .ri_uohm = 245000 }, > + { .vbat_uv = 3984000, .ri_uohm = 242000 }, > + { .vbat_uv = 3977000, .ri_uohm = 236000 }, > + { .vbat_uv = 3971000, .ri_uohm = 231000 }, > + { .vbat_uv = 3966000, .ri_uohm = 229000 }, > + { .vbat_uv = 3952000, .ri_uohm = 226000 }, > + { .vbat_uv = 3946000, .ri_uohm = 222000 }, > + { .vbat_uv = 3941000, .ri_uohm = 222000 }, > + { .vbat_uv = 3936000, .ri_uohm = 217000 }, > + { .vbat_uv = 3932000, .ri_uohm = 217000 }, > + { .vbat_uv = 3928000, .ri_uohm = 212000 }, > + { .vbat_uv = 3926000, .ri_uohm = 214000 }, > + { .vbat_uv = 3922000, .ri_uohm = 209000 }, > + { .vbat_uv = 3917000, .ri_uohm = 215000 }, > + { .vbat_uv = 3914000, .ri_uohm = 212000 }, > + { .vbat_uv = 3912000, .ri_uohm = 220000 }, > + { .vbat_uv = 3910000, .ri_uohm = 226000 }, > + { .vbat_uv = 3903000, .ri_uohm = 226000 }, > + { .vbat_uv = 3891000, .ri_uohm = 222000 }, > + { .vbat_uv = 3871000, .ri_uohm = 221000 }, > + { .vbat_uv = 3857000, .ri_uohm = 219000 }, > + { .vbat_uv = 3850000, .ri_uohm = 216000 }, > + { .vbat_uv = 3843000, .ri_uohm = 212000 }, > + { .vbat_uv = 3835000, .ri_uohm = 206000 }, > + { .vbat_uv = 3825000, .ri_uohm = 217000 }, > + { .vbat_uv = 3824000, .ri_uohm = 220000 }, > + { .vbat_uv = 3820000, .ri_uohm = 237000 }, > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161lu[] = { > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > + { .vbat_uv = 4080000, .ri_uohm = 200000 }, > + { .vbat_uv = 4027000, .ri_uohm = 202000 }, > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > + { .vbat_uv = 3800000, .ri_uohm = 262000 }, > + { .vbat_uv = 3742000, .ri_uohm = 263000 }, > + { .vbat_uv = 3708000, .ri_uohm = 277000 }, > + { .vbat_uv = 3684000, .ri_uohm = 272000 }, > + { .vbat_uv = 3664000, .ri_uohm = 278000 }, > + { .vbat_uv = 3655000, .ri_uohm = 285000 }, > + { .vbat_uv = 3638000, .ri_uohm = 261000 }, > + { .vbat_uv = 3624000, .ri_uohm = 259000 }, > + { .vbat_uv = 3616000, .ri_uohm = 266000 }, > + { .vbat_uv = 3597000, .ri_uohm = 278000 }, > + { .vbat_uv = 3581000, .ri_uohm = 281000 }, > + { .vbat_uv = 3560000, .ri_uohm = 287000 }, > + { .vbat_uv = 3527000, .ri_uohm = 289000 }, > + { .vbat_uv = 3512000, .ri_uohm = 286000 }, > + { .vbat_uv = 3494000, .ri_uohm = 282000 }, > + { .vbat_uv = 3400000, .ri_uohm = 269000 }, > + { .vbat_uv = 3360000, .ri_uohm = 328000 }, > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161lu[] = { > + { .vbat_uv = 4346000, .ri_uohm = 293000 }, > + { .vbat_uv = 4336000, .ri_uohm = 290000 }, > + { .vbat_uv = 4315000, .ri_uohm = 274000 }, > + { .vbat_uv = 4310000, .ri_uohm = 264000 }, > + { .vbat_uv = 4275000, .ri_uohm = 275000 }, > + { .vbat_uv = 4267000, .ri_uohm = 274000 }, > + { .vbat_uv = 4227000, .ri_uohm = 262000 }, > + { .vbat_uv = 4186000, .ri_uohm = 282000 }, > + { .vbat_uv = 4136000, .ri_uohm = 246000 }, > + { .vbat_uv = 4110000, .ri_uohm = 242000 }, > + { .vbat_uv = 4077000, .ri_uohm = 249000 }, > + { .vbat_uv = 4049000, .ri_uohm = 238000 }, > + { .vbat_uv = 4017000, .ri_uohm = 268000 }, > + { .vbat_uv = 3986000, .ri_uohm = 261000 }, > + { .vbat_uv = 3962000, .ri_uohm = 252000 }, > + { .vbat_uv = 3940000, .ri_uohm = 235000 }, > + { .vbat_uv = 3930000, .ri_uohm = 237000 }, > + { .vbat_uv = 3924000, .ri_uohm = 255000 }, > + { .vbat_uv = 3910000, .ri_uohm = 244000 }, > + { .vbat_uv = 3889000, .ri_uohm = 231000 }, > + { .vbat_uv = 3875000, .ri_uohm = 249000 }, > + { .vbat_uv = 3850000, .ri_uohm = 212000 }, > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb485159lu[] = { > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > + { .vbat_uv = 4080000, .ri_uohm = 200000 }, > + { .vbat_uv = 4027000, .ri_uohm = 202000 }, > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > + { .vbat_uv = 3800000, .ri_uohm = 262000 }, > + { .vbat_uv = 3715000, .ri_uohm = 340000 }, > + { .vbat_uv = 3700000, .ri_uohm = 300000 }, > + { .vbat_uv = 3682000, .ri_uohm = 233000 }, > + { .vbat_uv = 3655000, .ri_uohm = 246000 }, > + { .vbat_uv = 3639000, .ri_uohm = 260000 }, > + { .vbat_uv = 3621000, .ri_uohm = 254000 }, > + { .vbat_uv = 3583000, .ri_uohm = 266000 }, > + { .vbat_uv = 3536000, .ri_uohm = 274000 }, > + { .vbat_uv = 3502000, .ri_uohm = 300000 }, > + { .vbat_uv = 3465000, .ri_uohm = 245000 }, > + { .vbat_uv = 3438000, .ri_uohm = 225000 }, > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb485159lu[] = { > + { .vbat_uv = 4302000, .ri_uohm = 200000 }, > + { .vbat_uv = 4258000, .ri_uohm = 206000 }, > + { .vbat_uv = 4200000, .ri_uohm = 231000 }, > + { .vbat_uv = 4150000, .ri_uohm = 198000 }, > + { .vbat_uv = 4134000, .ri_uohm = 268000 }, > + { .vbat_uv = 4058000, .ri_uohm = 172000 }, > + { .vbat_uv = 4003000, .ri_uohm = 227000 }, > + { .vbat_uv = 3972000, .ri_uohm = 241000 }, > + { .vbat_uv = 3953000, .ri_uohm = 244000 }, > + { .vbat_uv = 3950000, .ri_uohm = 213000 }, > + { .vbat_uv = 3900000, .ri_uohm = 225000 }, > + { .vbat_uv = 3850000, .ri_uohm = 212000 }, > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb535151vu[] = { > + { .vbat_uv = 4071000, .ri_uohm = 158000 }, > + { .vbat_uv = 4019000, .ri_uohm = 187000 }, > + { .vbat_uv = 3951000, .ri_uohm = 191000 }, > + { .vbat_uv = 3901000, .ri_uohm = 193000 }, > + { .vbat_uv = 3850000, .ri_uohm = 273000 }, > + { .vbat_uv = 3800000, .ri_uohm = 305000 }, > + { .vbat_uv = 3750000, .ri_uohm = 205000 }, > + { .vbat_uv = 3700000, .ri_uohm = 290000 }, > + { .vbat_uv = 3650000, .ri_uohm = 262000 }, > + { .vbat_uv = 3618000, .ri_uohm = 290000 }, > + { .vbat_uv = 3505000, .ri_uohm = 235000 }, > + { .vbat_uv = 3484000, .ri_uohm = 253000 }, > + { .vbat_uv = 3413000, .ri_uohm = 243000 }, > + { .vbat_uv = 3393000, .ri_uohm = 285000 }, > + { .vbat_uv = 3361000, .ri_uohm = 281000 }, > + { .vbat_uv = 3302000, .ri_uohm = 286000 }, > + { .vbat_uv = 3280000, .ri_uohm = 250000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb535151vu[] = { > + { .vbat_uv = 4190000, .ri_uohm = 214000 }, > + { .vbat_uv = 4159000, .ri_uohm = 252000 }, > + { .vbat_uv = 4121000, .ri_uohm = 245000 }, > + { .vbat_uv = 4069000, .ri_uohm = 228000 }, > + { .vbat_uv = 4046000, .ri_uohm = 229000 }, > + { .vbat_uv = 4026000, .ri_uohm = 233000 }, > + { .vbat_uv = 4007000, .ri_uohm = 240000 }, > + { .vbat_uv = 3982000, .ri_uohm = 291000 }, > + { .vbat_uv = 3945000, .ri_uohm = 276000 }, > + { .vbat_uv = 3924000, .ri_uohm = 266000 }, > + { .vbat_uv = 3910000, .ri_uohm = 258000 }, > + { .vbat_uv = 3900000, .ri_uohm = 271000 }, > + { .vbat_uv = 3844000, .ri_uohm = 279000 }, > + { .vbat_uv = 3772000, .ri_uohm = 217000 }, > + { .vbat_uv = 3673000, .ri_uohm = 208000 }, > + { .vbat_uv = 3571000, .ri_uohm = 208000 }, > + { .vbat_uv = 3510000, .ri_uohm = 228000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb585157lu[] = { > + { .vbat_uv = 4194000, .ri_uohm = 121000 }, > + { .vbat_uv = 4169000, .ri_uohm = 188000 }, > + { .vbat_uv = 4136000, .ri_uohm = 173000 }, > + { .vbat_uv = 4108000, .ri_uohm = 158000 }, > + { .vbat_uv = 4064000, .ri_uohm = 143000 }, > + { .vbat_uv = 3956000, .ri_uohm = 160000 }, > + { .vbat_uv = 3847000, .ri_uohm = 262000 }, > + { .vbat_uv = 3806000, .ri_uohm = 280000 }, > + { .vbat_uv = 3801000, .ri_uohm = 266000 }, > + { .vbat_uv = 3794000, .ri_uohm = 259000 }, > + { .vbat_uv = 3785000, .ri_uohm = 234000 }, > + { .vbat_uv = 3779000, .ri_uohm = 227000 }, > + { .vbat_uv = 3772000, .ri_uohm = 222000 }, > + { .vbat_uv = 3765000, .ri_uohm = 221000 }, > + { .vbat_uv = 3759000, .ri_uohm = 216000 }, > + { .vbat_uv = 3754000, .ri_uohm = 206000 }, > + { .vbat_uv = 3747000, .ri_uohm = 212000 }, > + { .vbat_uv = 3743000, .ri_uohm = 208000 }, > + { .vbat_uv = 3737000, .ri_uohm = 212000 }, > + { .vbat_uv = 3733000, .ri_uohm = 200000 }, > + { .vbat_uv = 3728000, .ri_uohm = 203000 }, > + { .vbat_uv = 3722000, .ri_uohm = 207000 }, > + { .vbat_uv = 3719000, .ri_uohm = 208000 }, > + { .vbat_uv = 3715000, .ri_uohm = 209000 }, > + { .vbat_uv = 3712000, .ri_uohm = 211000 }, > + { .vbat_uv = 3709000, .ri_uohm = 210000 }, > + { .vbat_uv = 3704000, .ri_uohm = 216000 }, > + { .vbat_uv = 3701000, .ri_uohm = 218000 }, > + { .vbat_uv = 3698000, .ri_uohm = 222000 }, > + { .vbat_uv = 3694000, .ri_uohm = 218000 }, > + { .vbat_uv = 3692000, .ri_uohm = 215000 }, > + { .vbat_uv = 3688000, .ri_uohm = 224000 }, > + { .vbat_uv = 3686000, .ri_uohm = 224000 }, > + { .vbat_uv = 3683000, .ri_uohm = 228000 }, > + { .vbat_uv = 3681000, .ri_uohm = 228000 }, > + { .vbat_uv = 3679000, .ri_uohm = 229000 }, > + { .vbat_uv = 3676000, .ri_uohm = 232000 }, > + { .vbat_uv = 3675000, .ri_uohm = 229000 }, > + { .vbat_uv = 3673000, .ri_uohm = 229000 }, > + { .vbat_uv = 3672000, .ri_uohm = 223000 }, > + { .vbat_uv = 3669000, .ri_uohm = 224000 }, > + { .vbat_uv = 3666000, .ri_uohm = 224000 }, > + { .vbat_uv = 3663000, .ri_uohm = 221000 }, > + { .vbat_uv = 3660000, .ri_uohm = 218000 }, > + { .vbat_uv = 3657000, .ri_uohm = 215000 }, > + { .vbat_uv = 3654000, .ri_uohm = 212000 }, > + { .vbat_uv = 3649000, .ri_uohm = 215000 }, > + { .vbat_uv = 3644000, .ri_uohm = 215000 }, > + { .vbat_uv = 3636000, .ri_uohm = 215000 }, > + { .vbat_uv = 3631000, .ri_uohm = 206000 }, > + { .vbat_uv = 3623000, .ri_uohm = 205000 }, > + { .vbat_uv = 3616000, .ri_uohm = 193000 }, > + { .vbat_uv = 3605000, .ri_uohm = 193000 }, > + { .vbat_uv = 3600000, .ri_uohm = 198000 }, > + { .vbat_uv = 3597000, .ri_uohm = 198000 }, > + { .vbat_uv = 3592000, .ri_uohm = 203000 }, > + { .vbat_uv = 3591000, .ri_uohm = 188000 }, > + { .vbat_uv = 3587000, .ri_uohm = 188000 }, > + { .vbat_uv = 3583000, .ri_uohm = 177000 }, > + { .vbat_uv = 3577000, .ri_uohm = 170000 }, > + { .vbat_uv = 3568000, .ri_uohm = 135000 }, > + { .vbat_uv = 3552000, .ri_uohm = 54000 }, > + { .vbat_uv = 3526000, .ri_uohm = 130000 }, > + { .vbat_uv = 3501000, .ri_uohm = 48000 }, > + { .vbat_uv = 3442000, .ri_uohm = 183000 }, > + { .vbat_uv = 3326000, .ri_uohm = 372000 }, > + { .vbat_uv = 3161000, .ri_uohm = 452000 }, > +}; > + > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb585157lu[] = { > + { .vbat_uv = 4360000, .ri_uohm = 128000 }, > + { .vbat_uv = 4325000, .ri_uohm = 130000 }, > + { .vbat_uv = 4316000, .ri_uohm = 148000 }, > + { .vbat_uv = 4308000, .ri_uohm = 162000 }, > + { .vbat_uv = 4301000, .ri_uohm = 162000 }, > + { .vbat_uv = 4250000, .ri_uohm = 162000 }, > + { .vbat_uv = 4230000, .ri_uohm = 164000 }, > + { .vbat_uv = 4030000, .ri_uohm = 164000 }, > + { .vbat_uv = 4000000, .ri_uohm = 193000 }, > + { .vbat_uv = 3950000, .ri_uohm = 204000 }, > + { .vbat_uv = 3850000, .ri_uohm = 210000 }, > + { .vbat_uv = 3800000, .ri_uohm = 230000 }, > + { .vbat_uv = 3790000, .ri_uohm = 240000 }, > + { .vbat_uv = 3780000, .ri_uohm = 311000 }, > + { .vbat_uv = 3760000, .ri_uohm = 420000 }, > + { .vbat_uv = 3700000, .ri_uohm = 504000 }, > + { .vbat_uv = 3600000, .ri_uohm = 565000 }, > +}; > + > +/* > + * Temperature to internal resistance scaling tables. > + * > + * "resistance" is the percentage of the resistance determined from the voltage > + * so this represents the capacity ratio at different temperatures. > + * > + * FIXME: the proper table is missing: Samsung does not provide the necessary > + * temperature compensation tables so we just state 100% for every temperature. > + * If you have the datasheets, please provide these tables. > + */ > +static struct power_supply_resistance_temp_table samsung_temp2res[] = { > + { .temp = 50, .resistance = 100 }, > + { .temp = 40, .resistance = 100 }, > + { .temp = 30, .resistance = 100 }, > + { .temp = 20, .resistance = 100 }, > + { .temp = 10, .resistance = 100 }, > + { .temp = 00, .resistance = 100 }, > + { .temp = -10, .resistance = 100 }, > + { .temp = -20, .resistance = 100 }, > +}; > + > +/* > + * Capacity tables for different Open Circuit Voltages (OCV). > + * These must be sorted by falling OCV value. > + */ > + > +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb485159lu[] = { > + { .ocv = 4330000, .capacity = 100}, > + { .ocv = 4320000, .capacity = 99}, > + { .ocv = 4283000, .capacity = 95}, > + { .ocv = 4246000, .capacity = 92}, > + { .ocv = 4211000, .capacity = 89}, > + { .ocv = 4167000, .capacity = 85}, > + { .ocv = 4146000, .capacity = 83}, > + { .ocv = 4124000, .capacity = 81}, > + { .ocv = 4062000, .capacity = 75}, > + { .ocv = 4013000, .capacity = 70}, > + { .ocv = 3977000, .capacity = 66}, > + { .ocv = 3931000, .capacity = 60}, > + { .ocv = 3914000, .capacity = 58}, > + { .ocv = 3901000, .capacity = 57}, > + { .ocv = 3884000, .capacity = 56}, > + { .ocv = 3870000, .capacity = 55}, > + { .ocv = 3862000, .capacity = 54}, > + { .ocv = 3854000, .capacity = 53}, > + { .ocv = 3838000, .capacity = 50}, > + { .ocv = 3823000, .capacity = 47}, > + { .ocv = 3813000, .capacity = 45}, > + { .ocv = 3807000, .capacity = 43}, > + { .ocv = 3800000, .capacity = 41}, > + { .ocv = 3795000, .capacity = 40}, > + { .ocv = 3786000, .capacity = 37}, > + { .ocv = 3783000, .capacity = 35}, > + { .ocv = 3773000, .capacity = 30}, > + { .ocv = 3758000, .capacity = 25}, > + { .ocv = 3745000, .capacity = 22}, > + { .ocv = 3738000, .capacity = 20}, > + { .ocv = 3733000, .capacity = 19}, > + { .ocv = 3716000, .capacity = 17}, > + { .ocv = 3709000, .capacity = 16}, > + { .ocv = 3698000, .capacity = 15}, > + { .ocv = 3687000, .capacity = 14}, > + { .ocv = 3684000, .capacity = 13}, > + { .ocv = 3684000, .capacity = 12}, > + { .ocv = 3678000, .capacity = 10}, > + { .ocv = 3671000, .capacity = 9}, > + { .ocv = 3665000, .capacity = 8}, > + { .ocv = 3651000, .capacity = 7}, > + { .ocv = 3634000, .capacity = 6}, > + { .ocv = 3601000, .capacity = 5}, > + { .ocv = 3564000, .capacity = 4}, > + { .ocv = 3516000, .capacity = 3}, > + { .ocv = 3456000, .capacity = 2}, > + { .ocv = 3381000, .capacity = 1}, > + { .ocv = 3300000, .capacity = 0}, > +}; > + > +/* Same capacity table is used by eb-l1m7flu, eb425161la, eb425161lu */ > +static struct power_supply_battery_ocv_table samsung_ocv_cap_1500mah[] = { > + { .ocv = 4328000, .capacity = 100}, > + { .ocv = 4299000, .capacity = 99}, > + { .ocv = 4281000, .capacity = 98}, > + { .ocv = 4241000, .capacity = 95}, > + { .ocv = 4183000, .capacity = 90}, > + { .ocv = 4150000, .capacity = 87}, > + { .ocv = 4116000, .capacity = 84}, > + { .ocv = 4077000, .capacity = 80}, > + { .ocv = 4068000, .capacity = 79}, > + { .ocv = 4058000, .capacity = 77}, > + { .ocv = 4026000, .capacity = 75}, > + { .ocv = 3987000, .capacity = 72}, > + { .ocv = 3974000, .capacity = 69}, > + { .ocv = 3953000, .capacity = 66}, > + { .ocv = 3933000, .capacity = 63}, > + { .ocv = 3911000, .capacity = 60}, > + { .ocv = 3900000, .capacity = 58}, > + { .ocv = 3873000, .capacity = 55}, > + { .ocv = 3842000, .capacity = 52}, > + { .ocv = 3829000, .capacity = 50}, > + { .ocv = 3810000, .capacity = 45}, > + { .ocv = 3793000, .capacity = 40}, > + { .ocv = 3783000, .capacity = 35}, > + { .ocv = 3776000, .capacity = 30}, > + { .ocv = 3762000, .capacity = 25}, > + { .ocv = 3746000, .capacity = 20}, > + { .ocv = 3739000, .capacity = 18}, > + { .ocv = 3715000, .capacity = 15}, > + { .ocv = 3700000, .capacity = 12}, > + { .ocv = 3690000, .capacity = 10}, > + { .ocv = 3680000, .capacity = 9}, > + { .ocv = 3670000, .capacity = 7}, > + { .ocv = 3656000, .capacity = 5}, > + { .ocv = 3634000, .capacity = 4}, > + { .ocv = 3614000, .capacity = 3}, > + { .ocv = 3551000, .capacity = 2}, > + { .ocv = 3458000, .capacity = 1}, > + { .ocv = 3300000, .capacity = 0}, > +}; > + > +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb535151vu[] = { > + { .ocv = 4178000, .capacity = 100}, > + { .ocv = 4148000, .capacity = 99}, > + { .ocv = 4105000, .capacity = 95}, > + { .ocv = 4078000, .capacity = 92}, > + { .ocv = 4057000, .capacity = 89}, > + { .ocv = 4013000, .capacity = 85}, > + { .ocv = 3988000, .capacity = 82}, > + { .ocv = 3962000, .capacity = 77}, > + { .ocv = 3920000, .capacity = 70}, > + { .ocv = 3891000, .capacity = 65}, > + { .ocv = 3874000, .capacity = 62}, > + { .ocv = 3839000, .capacity = 59}, > + { .ocv = 3816000, .capacity = 55}, > + { .ocv = 3798000, .capacity = 50}, > + { .ocv = 3778000, .capacity = 40}, > + { .ocv = 3764000, .capacity = 30}, > + { .ocv = 3743000, .capacity = 25}, > + { .ocv = 3711000, .capacity = 20}, > + { .ocv = 3691000, .capacity = 18}, > + { .ocv = 3685000, .capacity = 15}, > + { .ocv = 3680000, .capacity = 12}, > + { .ocv = 3662000, .capacity = 10}, > + { .ocv = 3638000, .capacity = 9}, > + { .ocv = 3593000, .capacity = 7}, > + { .ocv = 3566000, .capacity = 6}, > + { .ocv = 3497000, .capacity = 4}, > + { .ocv = 3405000, .capacity = 2}, > + { .ocv = 3352000, .capacity = 1}, > + { .ocv = 3300000, .capacity = 0}, > +}; > + > +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb585157lu[] = { > + { .ocv = 4320000, .capacity = 100}, > + { .ocv = 4296000, .capacity = 99}, > + { .ocv = 4283000, .capacity = 98}, > + { .ocv = 4245000, .capacity = 95}, > + { .ocv = 4185000, .capacity = 90}, > + { .ocv = 4152000, .capacity = 87}, > + { .ocv = 4119000, .capacity = 84}, > + { .ocv = 4077000, .capacity = 80}, > + { .ocv = 4057000, .capacity = 78}, > + { .ocv = 4048000, .capacity = 77}, > + { .ocv = 4020000, .capacity = 74}, > + { .ocv = 4003000, .capacity = 72}, > + { .ocv = 3978000, .capacity = 69}, > + { .ocv = 3955000, .capacity = 66}, > + { .ocv = 3934000, .capacity = 63}, > + { .ocv = 3912000, .capacity = 60}, > + { .ocv = 3894000, .capacity = 58}, > + { .ocv = 3860000, .capacity = 55}, > + { .ocv = 3837000, .capacity = 52}, > + { .ocv = 3827000, .capacity = 50}, > + { .ocv = 3806000, .capacity = 45}, > + { .ocv = 3791000, .capacity = 40}, > + { .ocv = 3779000, .capacity = 35}, > + { .ocv = 3770000, .capacity = 30}, > + { .ocv = 3758000, .capacity = 25}, > + { .ocv = 3739000, .capacity = 20}, > + { .ocv = 3730000, .capacity = 18}, > + { .ocv = 3706000, .capacity = 15}, > + { .ocv = 3684000, .capacity = 13}, > + { .ocv = 3675000, .capacity = 10}, > + { .ocv = 3673000, .capacity = 9}, > + { .ocv = 3665000, .capacity = 7}, > + { .ocv = 3649000, .capacity = 5}, > + { .ocv = 3628000, .capacity = 4}, > + { .ocv = 3585000, .capacity = 3}, > + { .ocv = 3525000, .capacity = 2}, > + { .ocv = 3441000, .capacity = 1}, > + { .ocv = 3300000, .capacity = 0}, > +}; > + > +struct power_supply_maintenance_charge_table samsung_maint_charge_table[] = { > + { > + /* Maintenance charging phase A, 60 hours */ > + .charge_current_max_ua = 600000, > + .charge_voltage_max_uv = 4150000, > + .charge_safety_timer_minutes = 60*60, > + }, > + { > + /* Maintenance charging phase B, 200 hours */ > + .charge_current_max_ua = 600000, > + .charge_voltage_max_uv = 4100000, > + .charge_safety_timer_minutes = 200*60, > + } > +}; > + > +struct samsung_sdi_battery samsung_sdi_batteries[] = { > + { > + /* > + * Used in Samsung GT-I8190 "Golden" > + * Data from vendor boardfile board-golden-[bm|battery].c > + */ > + .compatible = "samsung,eb-l1m7flu", > + .name = "EB-L1M7FLU", > + .info = { > + .charge_full_design_uah = 1500000, > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > + .factory_internal_resistance_uohm = 100000, > + .factory_internal_resistance_charging_uohm = 200000, > + /* If you have data on this fix the min_design_uv */ > + .voltage_min_design_uv = 3320000, > + .voltage_max_design_uv = 4340000, > + .overvoltage_limit_uv = 4500000, > + .constant_charge_current_max_ua = 900000, > + .constant_charge_voltage_max_uv = 4320000, > + .charge_term_current_ua = 200000, > + .charge_restart_voltage_uv = 4300000, > + .maintenance_charge = samsung_maint_charge_table, > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > + .alert_low_temp_charge_current_ua = 300000, > + .alert_low_temp_charge_voltage_uv = 4000000, > + .alert_high_temp_charge_current_ua = 300000, > + .alert_high_temp_charge_voltage_uv = 4000000, > + .temp_min = -50, > + .temp_alert_min = 0, > + .temp_alert_max = 40, > + .temp_max = 60, > + .resist_table = samsung_temp2res, > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > + /* If you have tables for more temperatures, add them */ > + .ocv_temp[0] = 25, > + .ocv_table[0] = samsung_ocv_cap_1500mah, > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb_l1m7flu, > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb_l1m7flu), > + .vbat2ri_charging = samsung_vbat2res_charging_eb_l1m7flu, > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb_l1m7flu), > + .bti_resistance_ohm = 2400, > + .bti_resistance_tolerance = 40, > + }, > + }, > + { > + /* > + * Used in Samsung SGH-T599 "Codina TMO" and SGH-I407 "Kyle" > + * Data from vendor boardfile board-kyle-[bm|battery].c > + */ > + .compatible = "samsung,eb425161la", > + .name = "EB425161LA", > + .info = { > + .charge_full_design_uah = 1500000, > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > + .factory_internal_resistance_uohm = 136000, > + .factory_internal_resistance_charging_uohm = 200000, > + /* If you have data on this fix the min_design_uv */ > + .voltage_min_design_uv = 3320000, > + .voltage_max_design_uv = 4340000, > + .overvoltage_limit_uv = 4500000, > + .constant_charge_current_max_ua = 900000, > + .constant_charge_voltage_max_uv = 4320000, > + .charge_term_current_ua = 200000, > + .charge_restart_voltage_uv = 4270000, > + .maintenance_charge = samsung_maint_charge_table, > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > + .alert_low_temp_charge_current_ua = 300000, > + .alert_low_temp_charge_voltage_uv = 4000000, > + .alert_high_temp_charge_current_ua = 300000, > + .alert_high_temp_charge_voltage_uv = 4000000, > + .temp_min = -30, > + .temp_alert_min = 0, > + .temp_alert_max = 40, > + .temp_max = 47, > + .resist_table = samsung_temp2res, > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > + /* If you have tables for more temperatures, add them */ > + .ocv_temp[0] = 25, > + .ocv_table[0] = samsung_ocv_cap_1500mah, > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161la, > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161la), > + .vbat2ri_charging = samsung_vbat2res_charging_eb425161la, > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161la), > + .bti_resistance_ohm = 2400, > + .bti_resistance_tolerance = 40, > + }, > + }, > + { > + /* > + * Used in Samsung GT-I8160 "Codina" > + * Data from vendor boardfile board-codina-[bm|battery].c > + */ > + .compatible = "samsung,eb425161lu", > + .name = "EB425161LU", > + .info = { > + .charge_full_design_uah = 1500000, > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > + .factory_internal_resistance_uohm = 100000, > + .factory_internal_resistance_charging_uohm = 200000, > + /* If you have data on this fix the min_design_uv */ > + .voltage_min_design_uv = 3320000, > + .voltage_max_design_uv = 4350000, > + .overvoltage_limit_uv = 4500000, > + .constant_charge_current_max_ua = 900000, > + .constant_charge_voltage_max_uv = 4340000, > + .charge_term_current_ua = 200000, > + .charge_restart_voltage_uv = 4280000, > + .maintenance_charge = samsung_maint_charge_table, > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > + .alert_low_temp_charge_current_ua = 300000, > + .alert_low_temp_charge_voltage_uv = 4000000, > + .alert_high_temp_charge_current_ua = 300000, > + .alert_high_temp_charge_voltage_uv = 4000000, > + .temp_min = -50, > + .temp_alert_min = 0, > + .temp_alert_max = 43, > + .temp_max = 49, > + .resist_table = samsung_temp2res, > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > + /* If you have tables for more temperatures, add them */ > + .ocv_temp[0] = 25, > + .ocv_table[0] = samsung_ocv_cap_1500mah, > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161lu, > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161lu), > + .vbat2ri_charging = samsung_vbat2res_charging_eb425161lu, > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161lu), > + .bti_resistance_ohm = 2400, > + .bti_resistance_tolerance = 40, > + }, > + }, > + { > + /* > + * Used in Samsung GT-S7710 "Skomer" > + * Data from vendor boardfile board-skomer-[bm|battery].c > + */ > + .compatible = "samsung,eb485159lu", > + .name = "EB485159LU", > + .info = { > + .charge_full_design_uah = 1700000, > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > + .factory_internal_resistance_uohm = 100000, > + .factory_internal_resistance_charging_uohm = 200000, > + .voltage_min_design_uv = 3320000, > + .voltage_max_design_uv = 4350000, > + .overvoltage_limit_uv = 4500000, > + .constant_charge_current_max_ua = 900000, > + .constant_charge_voltage_max_uv = 4340000, > + .charge_term_current_ua = 200000, > + .charge_restart_voltage_uv = 4300000, > + .maintenance_charge = samsung_maint_charge_table, > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > + .alert_low_temp_charge_current_ua = 300000, > + .alert_low_temp_charge_voltage_uv = 4000000, > + .alert_high_temp_charge_current_ua = 300000, > + .alert_high_temp_charge_voltage_uv = 4000000, > + .temp_min = -50, > + .temp_alert_min = 0, > + .temp_alert_max = 40, > + .temp_max = 60, > + .resist_table = samsung_temp2res, > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > + /* If you have tables for more temperatures, add them */ > + .ocv_temp[0] = 25, > + .ocv_table[0] = samsung_ocv_cap_eb485159lu, > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb485159lu), > + /* CHECKME: vendor uses the 1500 mAh table, check against datasheet */ > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb485159lu, > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb485159lu), > + .vbat2ri_charging = samsung_vbat2res_charging_eb485159lu, > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb485159lu), > + .bti_resistance_ohm = 2400, > + .bti_resistance_tolerance = 40, > + }, > + }, > + { > + /* > + * Used in Samsung GT-I9070 "Janice" > + * Data from vendor boardfile board-janice-bm.c > + */ > + .compatible = "samsung,eb535151vu", > + .name = "EB535151VU", > + .info = { > + .charge_full_design_uah = 1500000, > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > + .factory_internal_resistance_uohm = 100000, > + .factory_internal_resistance_charging_uohm = 200000, > + /* If you have data on this fix the min_design_uv */ > + .voltage_min_design_uv = 3300000, > + .voltage_max_design_uv = 4180000, > + .overvoltage_limit_uv = 4500000, > + .constant_charge_current_max_ua = 900000, > + .constant_charge_voltage_max_uv = 4200000, > + .charge_term_current_ua = 200000, > + .maintenance_charge = samsung_maint_charge_table, > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > + .alert_low_temp_charge_current_ua = 300000, > + .alert_low_temp_charge_voltage_uv = 4000000, > + .alert_high_temp_charge_current_ua = 300000, > + .alert_high_temp_charge_voltage_uv = 4000000, > + .temp_min = -5, > + .temp_alert_min = 0, > + .temp_alert_max = 40, > + .temp_max = 60, > + .resist_table = samsung_temp2res, > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > + /* If you have tables for more temperatures, add them */ > + .ocv_temp[0] = 25, > + .ocv_table[0] = samsung_ocv_cap_eb585157lu, > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb535151vu), > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb535151vu, > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb535151vu), > + .vbat2ri_charging = samsung_vbat2res_charging_eb535151vu, > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb535151vu), > + .bti_resistance_ohm = 1500, > + .bti_resistance_tolerance = 40, > + }, > + }, > + { > + /* > + * Used in Samsung GT-I8530 "Gavini" > + * Data from vendor boardfile board-gavini-bm.c > + */ > + .compatible = "samsung,eb585157lu", > + .name = "EB585157LU", > + .info = { > + .charge_full_design_uah = 2000000, > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > + .factory_internal_resistance_uohm = 105000, > + .factory_internal_resistance_charging_uohm = 160000, > + /* If you have data on this fix the min_design_uv */ > + .voltage_min_design_uv = 3300000, > + .voltage_max_design_uv = 4320000, > + .overvoltage_limit_uv = 4500000, > + .constant_charge_current_max_ua = 1500000, > + .constant_charge_voltage_max_uv = 4350000, > + .charge_term_current_ua = 120000, > + .maintenance_charge = samsung_maint_charge_table, > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > + .alert_low_temp_charge_current_ua = 300000, > + .alert_low_temp_charge_voltage_uv = 4000000, > + .alert_high_temp_charge_current_ua = 300000, > + .alert_high_temp_charge_voltage_uv = 4000000, > + .temp_min = -5, > + .temp_alert_min = 0, > + .temp_alert_max = 40, > + .temp_max = 60, > + .resist_table = samsung_temp2res, > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > + /* If you have tables for more temperatures, add them */ > + .ocv_temp[0] = 25, > + .ocv_table[0] = samsung_ocv_cap_eb585157lu, > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb585157lu), > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb585157lu, > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb585157lu), > + .vbat2ri_charging = samsung_vbat2res_charging_eb585157lu, > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb585157lu), > + .bti_resistance_ohm = 2400, > + .bti_resistance_tolerance = 40, > + }, > + }, > +}; > + > +int samsung_sdi_battery_get_info(struct device *dev, > + struct device_node *np, > + struct power_supply_battery_info **info) > +{ > + struct samsung_sdi_battery *batt; > + int i; > + > + for (i = 0; i < ARRAY_SIZE(samsung_sdi_batteries); i++) { > + batt = &samsung_sdi_batteries[i]; > + if (of_device_is_compatible(np, batt->compatible)) > + break; > + } > + > + if (i == ARRAY_SIZE(samsung_sdi_batteries)) > + return -ENODEV; > + > + *info = &batt->info; > + dev_info(dev, "Samsung SDI %s battery %d mAh\n", > + batt->name, batt->info.charge_full_design_uah / 1000); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(samsung_sdi_battery_get_info); > diff --git a/drivers/power/supply/samsung-sdi-battery.h b/drivers/power/supply/samsung-sdi-battery.h > new file mode 100644 > index 000000000000..08783847dfcb > --- /dev/null > +++ b/drivers/power/supply/samsung-sdi-battery.h > @@ -0,0 +1,13 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#if IS_ENABLED(CONFIG_BATTERY_SAMSUNG_SDI) > +extern int samsung_sdi_battery_get_info(struct device *dev, > + struct device_node *np, > + struct power_supply_battery_info **info); > +#else > +static inline int samsung_sdi_battery_get_info(struct device *dev, > + struct device_node *np, > + struct power_supply_battery_info **info) > +{ > + return -ENODEV; > +} > +#endif > -- > 2.34.1 >
Hi Chris, On Thu, Mar 31, 2022 at 02:20:45PM -0500, Chris Morgan wrote: > On Fri, Feb 25, 2022 at 01:13:14AM +0100, Linus Walleij wrote: > > If we detect a Samsung SDI battery, we return a static > > struct power_supply_battery_info and avoid looking further. > > > > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > > --- > > I'm afraid this patch breaks my (currently work-in-progress) battery > driver for the rk817. I am not sure but I believe it might cause other > issues too for other downstream drivers (I don't have a device to test, > but I think maybe the ingenic driver looks like it could be affected > too). I assume this fixes the issue for you? https://lore.kernel.org/linux-pm/20220329033226.535475-1-y.oudjana@protonmail.com/ I plan to send it to Linus for rc2. Thanks, -- Sebastian > > > ChangeLog v2->v3: > > - Fix a whole bunch of tables after realizing that completely > > different battery data was used if CONFIG_SAMSUNG_BATTERY > > was set for Golden, Kyle, Codina and Skomer. > > ChangeLog v1->v2: > > - Bump tolerance to 40% on all BTI resistances > > - Change config option to bool, as we are calling OUT from > > the supply core this cannot be compiled into a module > > - Augment data to support low/high temperature charge current > > and voltages. Sadly the vendor tree just provide one and the > > same current and voltage for all of these. > > --- > > drivers/power/supply/Kconfig | 6 + > > drivers/power/supply/Makefile | 1 + > > drivers/power/supply/power_supply_core.c | 28 +- > > drivers/power/supply/samsung-sdi-battery.c | 919 +++++++++++++++++++++ > > drivers/power/supply/samsung-sdi-battery.h | 13 + > > 5 files changed, 957 insertions(+), 10 deletions(-) > > create mode 100644 drivers/power/supply/samsung-sdi-battery.c > > create mode 100644 drivers/power/supply/samsung-sdi-battery.h > > > > diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig > > index 6815e5a4c0bd..e9df4151f2e0 100644 > > --- a/drivers/power/supply/Kconfig > > +++ b/drivers/power/supply/Kconfig > > @@ -181,6 +181,12 @@ config BATTERY_OLPC > > help > > Say Y to enable support for the battery on the OLPC laptop. > > > > +config BATTERY_SAMSUNG_SDI > > + bool "Samsung SDI batteries" > > + help > > + Say Y to enable support for Samsung SDI battery data. > > + These batteries are used in Samsung mobile phones. > > + > > config BATTERY_TOSA > > tristate "Sharp SL-6000 (tosa) battery" > > depends on MACH_TOSA && MFD_TC6393XB && TOUCHSCREEN_WM97XX > > diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile > > index 2c1b264b2046..ebcd2f5fe26d 100644 > > --- a/drivers/power/supply/Makefile > > +++ b/drivers/power/supply/Makefile > > @@ -34,6 +34,7 @@ obj-$(CONFIG_BATTERY_GOLDFISH) += goldfish_battery.o > > obj-$(CONFIG_BATTERY_LEGO_EV3) += lego_ev3_battery.o > > obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o > > obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o > > +obj-$(CONFIG_BATTERY_SAMSUNG_SDI) += samsung-sdi-battery.o > > obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o > > obj-$(CONFIG_BATTERY_COLLIE) += collie_battery.o > > obj-$(CONFIG_BATTERY_INGENIC) += ingenic-battery.o > > diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c > > index 1c0b1be22067..43c66214bedf 100644 > > --- a/drivers/power/supply/power_supply_core.c > > +++ b/drivers/power/supply/power_supply_core.c > > @@ -23,6 +23,7 @@ > > #include <linux/thermal.h> > > #include <linux/fixp-arith.h> > > #include "power_supply.h" > > +#include "samsung-sdi-battery.h" > > > > /* exported for the APM Power driver, APM emulation */ > > struct class *power_supply_class; > > @@ -573,6 +574,23 @@ int power_supply_get_battery_info(struct power_supply *psy, > > int err, len, index; > > const __be32 *list; > > > > + if (!psy->of_node) { > > + dev_warn(&psy->dev, "%s currently only supports devicetree\n", > > + __func__); > > + return -ENXIO; > > + } > > + > > + battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); > > + if (!battery_np) > > + return -ENODEV; > > + > > + /* Try static batteries first */ > > + err = samsung_sdi_battery_get_info(&psy->dev, battery_np, &info); > If the device isn't a Samsung battery this puts -ENODEV in the err variable. > For my case I have a simple-battery that isn't a Samsung battery, and it > is causing power_supply_get_battery_info to return an error. > > > + if (!err) { > > + *info_out = info; > > + return err; > > + } > > + > > info = devm_kmalloc(&psy->dev, sizeof(*info), GFP_KERNEL); > > if (!info) > > return -ENOMEM; > > @@ -612,16 +630,6 @@ int power_supply_get_battery_info(struct power_supply *psy, > > info->ocv_table_size[index] = -EINVAL; > > } > > > > - if (!psy->of_node) { > > - dev_warn(&psy->dev, "%s currently only supports devicetree\n", > > - __func__); > > - return -ENXIO; > > - } > > - > > - battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); > > - if (!battery_np) > > - return -ENODEV; > > - > > err = of_property_read_string(battery_np, "compatible", &value); > > if (err) > > goto out_put_node; > > diff --git a/drivers/power/supply/samsung-sdi-battery.c b/drivers/power/supply/samsung-sdi-battery.c > > new file mode 100644 > > index 000000000000..8e718f0fc2b5 > > --- /dev/null > > +++ b/drivers/power/supply/samsung-sdi-battery.c > > @@ -0,0 +1,919 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > + > > +/* > > + * Battery data and characteristics for Samsung SDI (Samsung Digital Interface) > > + * batteries. The data is retrieved automatically into drivers using > > + * the power_supply_get_battery_info() call. > > + * > > + * The BTI (battery type indicator) resistance in the code drops was very > > + * unreliable. The resistance listed here was obtained by simply measuring > > + * the BTI resistance with a multimeter on the battery. > > + */ > > +#include <linux/module.h> > > +#include <linux/of.h> > > +#include <linux/power_supply.h> > > +#include "samsung-sdi-battery.h" > > + > > +struct samsung_sdi_battery { > > + char *compatible; > > + char *name; > > + struct power_supply_battery_info info; > > +}; > > + > > +/* > > + * Voltage to internal resistance tables. The internal resistance varies > > + * depending on the VBAT voltage, so look this up from a table. Different > > + * tables apply depending on whether we are charging or not. > > + */ > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb_l1m7flu[] = { > > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > > + { .vbat_uv = 4076000, .ri_uohm = 220000 }, > > + { .vbat_uv = 4030000, .ri_uohm = 227000 }, > > + { .vbat_uv = 3986000, .ri_uohm = 215000 }, > > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > > + { .vbat_uv = 3773000, .ri_uohm = 287000 }, > > + { .vbat_uv = 3742000, .ri_uohm = 283000 }, > > + { .vbat_uv = 3709000, .ri_uohm = 277000 }, > > + { .vbat_uv = 3685000, .ri_uohm = 297000 }, > > + { .vbat_uv = 3646000, .ri_uohm = 310000 }, > > + { .vbat_uv = 3616000, .ri_uohm = 331000 }, > > + { .vbat_uv = 3602000, .ri_uohm = 370000 }, > > + { .vbat_uv = 3578000, .ri_uohm = 350000 }, > > + { .vbat_uv = 3553000, .ri_uohm = 321000 }, > > + { .vbat_uv = 3503000, .ri_uohm = 322000 }, > > + { .vbat_uv = 3400000, .ri_uohm = 269000 }, > > + { .vbat_uv = 3360000, .ri_uohm = 328000 }, > > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb_l1m7flu[] = { > > + { .vbat_uv = 4302000, .ri_uohm = 230000 }, > > + { .vbat_uv = 4276000, .ri_uohm = 345000 }, > > + { .vbat_uv = 4227000, .ri_uohm = 345000 }, > > + { .vbat_uv = 4171000, .ri_uohm = 346000 }, > > + { .vbat_uv = 4134000, .ri_uohm = 311000 }, > > + { .vbat_uv = 4084000, .ri_uohm = 299000 }, > > + { .vbat_uv = 4052000, .ri_uohm = 316000 }, > > + { .vbat_uv = 4012000, .ri_uohm = 309000 }, > > + { .vbat_uv = 3961000, .ri_uohm = 303000 }, > > + { .vbat_uv = 3939000, .ri_uohm = 280000 }, > > + { .vbat_uv = 3904000, .ri_uohm = 261000 }, > > + { .vbat_uv = 3850000, .ri_uohm = 212000 }, > > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161la[] = { > > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > > + { .vbat_uv = 4080000, .ri_uohm = 200000 }, > > + { .vbat_uv = 4027000, .ri_uohm = 202000 }, > > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > > + { .vbat_uv = 3800000, .ri_uohm = 262000 }, > > + { .vbat_uv = 3742000, .ri_uohm = 263000 }, > > + { .vbat_uv = 3709000, .ri_uohm = 277000 }, > > + { .vbat_uv = 3685000, .ri_uohm = 312000 }, > > + { .vbat_uv = 3668000, .ri_uohm = 258000 }, > > + { .vbat_uv = 3660000, .ri_uohm = 247000 }, > > + { .vbat_uv = 3636000, .ri_uohm = 293000 }, > > + { .vbat_uv = 3616000, .ri_uohm = 331000 }, > > + { .vbat_uv = 3600000, .ri_uohm = 349000 }, > > + { .vbat_uv = 3593000, .ri_uohm = 345000 }, > > + { .vbat_uv = 3585000, .ri_uohm = 344000 }, > > + { .vbat_uv = 3572000, .ri_uohm = 336000 }, > > + { .vbat_uv = 3553000, .ri_uohm = 321000 }, > > + { .vbat_uv = 3517000, .ri_uohm = 336000 }, > > + { .vbat_uv = 3503000, .ri_uohm = 322000 }, > > + { .vbat_uv = 3400000, .ri_uohm = 269000 }, > > + { .vbat_uv = 3360000, .ri_uohm = 328000 }, > > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161la[] = { > > + { .vbat_uv = 4345000, .ri_uohm = 230000 }, > > + { .vbat_uv = 4329000, .ri_uohm = 238000 }, > > + { .vbat_uv = 4314000, .ri_uohm = 225000 }, > > + { .vbat_uv = 4311000, .ri_uohm = 239000 }, > > + { .vbat_uv = 4294000, .ri_uohm = 235000 }, > > + { .vbat_uv = 4264000, .ri_uohm = 229000 }, > > + { .vbat_uv = 4262000, .ri_uohm = 228000 }, > > + { .vbat_uv = 4252000, .ri_uohm = 236000 }, > > + { .vbat_uv = 4244000, .ri_uohm = 234000 }, > > + { .vbat_uv = 4235000, .ri_uohm = 234000 }, > > + { .vbat_uv = 4227000, .ri_uohm = 238000 }, > > + { .vbat_uv = 4219000, .ri_uohm = 242000 }, > > + { .vbat_uv = 4212000, .ri_uohm = 239000 }, > > + { .vbat_uv = 4206000, .ri_uohm = 231000 }, > > + { .vbat_uv = 4201000, .ri_uohm = 231000 }, > > + { .vbat_uv = 4192000, .ri_uohm = 224000 }, > > + { .vbat_uv = 4184000, .ri_uohm = 238000 }, > > + { .vbat_uv = 4173000, .ri_uohm = 245000 }, > > + { .vbat_uv = 4161000, .ri_uohm = 244000 }, > > + { .vbat_uv = 4146000, .ri_uohm = 244000 }, > > + { .vbat_uv = 4127000, .ri_uohm = 228000 }, > > + { .vbat_uv = 4119000, .ri_uohm = 218000 }, > > + { .vbat_uv = 4112000, .ri_uohm = 215000 }, > > + { .vbat_uv = 4108000, .ri_uohm = 209000 }, > > + { .vbat_uv = 4102000, .ri_uohm = 214000 }, > > + { .vbat_uv = 4096000, .ri_uohm = 215000 }, > > + { .vbat_uv = 4090000, .ri_uohm = 215000 }, > > + { .vbat_uv = 4083000, .ri_uohm = 219000 }, > > + { .vbat_uv = 4078000, .ri_uohm = 208000 }, > > + { .vbat_uv = 4071000, .ri_uohm = 205000 }, > > + { .vbat_uv = 4066000, .ri_uohm = 208000 }, > > + { .vbat_uv = 4061000, .ri_uohm = 210000 }, > > + { .vbat_uv = 4055000, .ri_uohm = 212000 }, > > + { .vbat_uv = 4049000, .ri_uohm = 215000 }, > > + { .vbat_uv = 4042000, .ri_uohm = 212000 }, > > + { .vbat_uv = 4032000, .ri_uohm = 217000 }, > > + { .vbat_uv = 4027000, .ri_uohm = 220000 }, > > + { .vbat_uv = 4020000, .ri_uohm = 210000 }, > > + { .vbat_uv = 4013000, .ri_uohm = 214000 }, > > + { .vbat_uv = 4007000, .ri_uohm = 219000 }, > > + { .vbat_uv = 4003000, .ri_uohm = 229000 }, > > + { .vbat_uv = 3996000, .ri_uohm = 246000 }, > > + { .vbat_uv = 3990000, .ri_uohm = 245000 }, > > + { .vbat_uv = 3984000, .ri_uohm = 242000 }, > > + { .vbat_uv = 3977000, .ri_uohm = 236000 }, > > + { .vbat_uv = 3971000, .ri_uohm = 231000 }, > > + { .vbat_uv = 3966000, .ri_uohm = 229000 }, > > + { .vbat_uv = 3952000, .ri_uohm = 226000 }, > > + { .vbat_uv = 3946000, .ri_uohm = 222000 }, > > + { .vbat_uv = 3941000, .ri_uohm = 222000 }, > > + { .vbat_uv = 3936000, .ri_uohm = 217000 }, > > + { .vbat_uv = 3932000, .ri_uohm = 217000 }, > > + { .vbat_uv = 3928000, .ri_uohm = 212000 }, > > + { .vbat_uv = 3926000, .ri_uohm = 214000 }, > > + { .vbat_uv = 3922000, .ri_uohm = 209000 }, > > + { .vbat_uv = 3917000, .ri_uohm = 215000 }, > > + { .vbat_uv = 3914000, .ri_uohm = 212000 }, > > + { .vbat_uv = 3912000, .ri_uohm = 220000 }, > > + { .vbat_uv = 3910000, .ri_uohm = 226000 }, > > + { .vbat_uv = 3903000, .ri_uohm = 226000 }, > > + { .vbat_uv = 3891000, .ri_uohm = 222000 }, > > + { .vbat_uv = 3871000, .ri_uohm = 221000 }, > > + { .vbat_uv = 3857000, .ri_uohm = 219000 }, > > + { .vbat_uv = 3850000, .ri_uohm = 216000 }, > > + { .vbat_uv = 3843000, .ri_uohm = 212000 }, > > + { .vbat_uv = 3835000, .ri_uohm = 206000 }, > > + { .vbat_uv = 3825000, .ri_uohm = 217000 }, > > + { .vbat_uv = 3824000, .ri_uohm = 220000 }, > > + { .vbat_uv = 3820000, .ri_uohm = 237000 }, > > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161lu[] = { > > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > > + { .vbat_uv = 4080000, .ri_uohm = 200000 }, > > + { .vbat_uv = 4027000, .ri_uohm = 202000 }, > > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > > + { .vbat_uv = 3800000, .ri_uohm = 262000 }, > > + { .vbat_uv = 3742000, .ri_uohm = 263000 }, > > + { .vbat_uv = 3708000, .ri_uohm = 277000 }, > > + { .vbat_uv = 3684000, .ri_uohm = 272000 }, > > + { .vbat_uv = 3664000, .ri_uohm = 278000 }, > > + { .vbat_uv = 3655000, .ri_uohm = 285000 }, > > + { .vbat_uv = 3638000, .ri_uohm = 261000 }, > > + { .vbat_uv = 3624000, .ri_uohm = 259000 }, > > + { .vbat_uv = 3616000, .ri_uohm = 266000 }, > > + { .vbat_uv = 3597000, .ri_uohm = 278000 }, > > + { .vbat_uv = 3581000, .ri_uohm = 281000 }, > > + { .vbat_uv = 3560000, .ri_uohm = 287000 }, > > + { .vbat_uv = 3527000, .ri_uohm = 289000 }, > > + { .vbat_uv = 3512000, .ri_uohm = 286000 }, > > + { .vbat_uv = 3494000, .ri_uohm = 282000 }, > > + { .vbat_uv = 3400000, .ri_uohm = 269000 }, > > + { .vbat_uv = 3360000, .ri_uohm = 328000 }, > > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161lu[] = { > > + { .vbat_uv = 4346000, .ri_uohm = 293000 }, > > + { .vbat_uv = 4336000, .ri_uohm = 290000 }, > > + { .vbat_uv = 4315000, .ri_uohm = 274000 }, > > + { .vbat_uv = 4310000, .ri_uohm = 264000 }, > > + { .vbat_uv = 4275000, .ri_uohm = 275000 }, > > + { .vbat_uv = 4267000, .ri_uohm = 274000 }, > > + { .vbat_uv = 4227000, .ri_uohm = 262000 }, > > + { .vbat_uv = 4186000, .ri_uohm = 282000 }, > > + { .vbat_uv = 4136000, .ri_uohm = 246000 }, > > + { .vbat_uv = 4110000, .ri_uohm = 242000 }, > > + { .vbat_uv = 4077000, .ri_uohm = 249000 }, > > + { .vbat_uv = 4049000, .ri_uohm = 238000 }, > > + { .vbat_uv = 4017000, .ri_uohm = 268000 }, > > + { .vbat_uv = 3986000, .ri_uohm = 261000 }, > > + { .vbat_uv = 3962000, .ri_uohm = 252000 }, > > + { .vbat_uv = 3940000, .ri_uohm = 235000 }, > > + { .vbat_uv = 3930000, .ri_uohm = 237000 }, > > + { .vbat_uv = 3924000, .ri_uohm = 255000 }, > > + { .vbat_uv = 3910000, .ri_uohm = 244000 }, > > + { .vbat_uv = 3889000, .ri_uohm = 231000 }, > > + { .vbat_uv = 3875000, .ri_uohm = 249000 }, > > + { .vbat_uv = 3850000, .ri_uohm = 212000 }, > > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb485159lu[] = { > > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > > + { .vbat_uv = 4080000, .ri_uohm = 200000 }, > > + { .vbat_uv = 4027000, .ri_uohm = 202000 }, > > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > > + { .vbat_uv = 3800000, .ri_uohm = 262000 }, > > + { .vbat_uv = 3715000, .ri_uohm = 340000 }, > > + { .vbat_uv = 3700000, .ri_uohm = 300000 }, > > + { .vbat_uv = 3682000, .ri_uohm = 233000 }, > > + { .vbat_uv = 3655000, .ri_uohm = 246000 }, > > + { .vbat_uv = 3639000, .ri_uohm = 260000 }, > > + { .vbat_uv = 3621000, .ri_uohm = 254000 }, > > + { .vbat_uv = 3583000, .ri_uohm = 266000 }, > > + { .vbat_uv = 3536000, .ri_uohm = 274000 }, > > + { .vbat_uv = 3502000, .ri_uohm = 300000 }, > > + { .vbat_uv = 3465000, .ri_uohm = 245000 }, > > + { .vbat_uv = 3438000, .ri_uohm = 225000 }, > > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb485159lu[] = { > > + { .vbat_uv = 4302000, .ri_uohm = 200000 }, > > + { .vbat_uv = 4258000, .ri_uohm = 206000 }, > > + { .vbat_uv = 4200000, .ri_uohm = 231000 }, > > + { .vbat_uv = 4150000, .ri_uohm = 198000 }, > > + { .vbat_uv = 4134000, .ri_uohm = 268000 }, > > + { .vbat_uv = 4058000, .ri_uohm = 172000 }, > > + { .vbat_uv = 4003000, .ri_uohm = 227000 }, > > + { .vbat_uv = 3972000, .ri_uohm = 241000 }, > > + { .vbat_uv = 3953000, .ri_uohm = 244000 }, > > + { .vbat_uv = 3950000, .ri_uohm = 213000 }, > > + { .vbat_uv = 3900000, .ri_uohm = 225000 }, > > + { .vbat_uv = 3850000, .ri_uohm = 212000 }, > > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb535151vu[] = { > > + { .vbat_uv = 4071000, .ri_uohm = 158000 }, > > + { .vbat_uv = 4019000, .ri_uohm = 187000 }, > > + { .vbat_uv = 3951000, .ri_uohm = 191000 }, > > + { .vbat_uv = 3901000, .ri_uohm = 193000 }, > > + { .vbat_uv = 3850000, .ri_uohm = 273000 }, > > + { .vbat_uv = 3800000, .ri_uohm = 305000 }, > > + { .vbat_uv = 3750000, .ri_uohm = 205000 }, > > + { .vbat_uv = 3700000, .ri_uohm = 290000 }, > > + { .vbat_uv = 3650000, .ri_uohm = 262000 }, > > + { .vbat_uv = 3618000, .ri_uohm = 290000 }, > > + { .vbat_uv = 3505000, .ri_uohm = 235000 }, > > + { .vbat_uv = 3484000, .ri_uohm = 253000 }, > > + { .vbat_uv = 3413000, .ri_uohm = 243000 }, > > + { .vbat_uv = 3393000, .ri_uohm = 285000 }, > > + { .vbat_uv = 3361000, .ri_uohm = 281000 }, > > + { .vbat_uv = 3302000, .ri_uohm = 286000 }, > > + { .vbat_uv = 3280000, .ri_uohm = 250000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb535151vu[] = { > > + { .vbat_uv = 4190000, .ri_uohm = 214000 }, > > + { .vbat_uv = 4159000, .ri_uohm = 252000 }, > > + { .vbat_uv = 4121000, .ri_uohm = 245000 }, > > + { .vbat_uv = 4069000, .ri_uohm = 228000 }, > > + { .vbat_uv = 4046000, .ri_uohm = 229000 }, > > + { .vbat_uv = 4026000, .ri_uohm = 233000 }, > > + { .vbat_uv = 4007000, .ri_uohm = 240000 }, > > + { .vbat_uv = 3982000, .ri_uohm = 291000 }, > > + { .vbat_uv = 3945000, .ri_uohm = 276000 }, > > + { .vbat_uv = 3924000, .ri_uohm = 266000 }, > > + { .vbat_uv = 3910000, .ri_uohm = 258000 }, > > + { .vbat_uv = 3900000, .ri_uohm = 271000 }, > > + { .vbat_uv = 3844000, .ri_uohm = 279000 }, > > + { .vbat_uv = 3772000, .ri_uohm = 217000 }, > > + { .vbat_uv = 3673000, .ri_uohm = 208000 }, > > + { .vbat_uv = 3571000, .ri_uohm = 208000 }, > > + { .vbat_uv = 3510000, .ri_uohm = 228000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb585157lu[] = { > > + { .vbat_uv = 4194000, .ri_uohm = 121000 }, > > + { .vbat_uv = 4169000, .ri_uohm = 188000 }, > > + { .vbat_uv = 4136000, .ri_uohm = 173000 }, > > + { .vbat_uv = 4108000, .ri_uohm = 158000 }, > > + { .vbat_uv = 4064000, .ri_uohm = 143000 }, > > + { .vbat_uv = 3956000, .ri_uohm = 160000 }, > > + { .vbat_uv = 3847000, .ri_uohm = 262000 }, > > + { .vbat_uv = 3806000, .ri_uohm = 280000 }, > > + { .vbat_uv = 3801000, .ri_uohm = 266000 }, > > + { .vbat_uv = 3794000, .ri_uohm = 259000 }, > > + { .vbat_uv = 3785000, .ri_uohm = 234000 }, > > + { .vbat_uv = 3779000, .ri_uohm = 227000 }, > > + { .vbat_uv = 3772000, .ri_uohm = 222000 }, > > + { .vbat_uv = 3765000, .ri_uohm = 221000 }, > > + { .vbat_uv = 3759000, .ri_uohm = 216000 }, > > + { .vbat_uv = 3754000, .ri_uohm = 206000 }, > > + { .vbat_uv = 3747000, .ri_uohm = 212000 }, > > + { .vbat_uv = 3743000, .ri_uohm = 208000 }, > > + { .vbat_uv = 3737000, .ri_uohm = 212000 }, > > + { .vbat_uv = 3733000, .ri_uohm = 200000 }, > > + { .vbat_uv = 3728000, .ri_uohm = 203000 }, > > + { .vbat_uv = 3722000, .ri_uohm = 207000 }, > > + { .vbat_uv = 3719000, .ri_uohm = 208000 }, > > + { .vbat_uv = 3715000, .ri_uohm = 209000 }, > > + { .vbat_uv = 3712000, .ri_uohm = 211000 }, > > + { .vbat_uv = 3709000, .ri_uohm = 210000 }, > > + { .vbat_uv = 3704000, .ri_uohm = 216000 }, > > + { .vbat_uv = 3701000, .ri_uohm = 218000 }, > > + { .vbat_uv = 3698000, .ri_uohm = 222000 }, > > + { .vbat_uv = 3694000, .ri_uohm = 218000 }, > > + { .vbat_uv = 3692000, .ri_uohm = 215000 }, > > + { .vbat_uv = 3688000, .ri_uohm = 224000 }, > > + { .vbat_uv = 3686000, .ri_uohm = 224000 }, > > + { .vbat_uv = 3683000, .ri_uohm = 228000 }, > > + { .vbat_uv = 3681000, .ri_uohm = 228000 }, > > + { .vbat_uv = 3679000, .ri_uohm = 229000 }, > > + { .vbat_uv = 3676000, .ri_uohm = 232000 }, > > + { .vbat_uv = 3675000, .ri_uohm = 229000 }, > > + { .vbat_uv = 3673000, .ri_uohm = 229000 }, > > + { .vbat_uv = 3672000, .ri_uohm = 223000 }, > > + { .vbat_uv = 3669000, .ri_uohm = 224000 }, > > + { .vbat_uv = 3666000, .ri_uohm = 224000 }, > > + { .vbat_uv = 3663000, .ri_uohm = 221000 }, > > + { .vbat_uv = 3660000, .ri_uohm = 218000 }, > > + { .vbat_uv = 3657000, .ri_uohm = 215000 }, > > + { .vbat_uv = 3654000, .ri_uohm = 212000 }, > > + { .vbat_uv = 3649000, .ri_uohm = 215000 }, > > + { .vbat_uv = 3644000, .ri_uohm = 215000 }, > > + { .vbat_uv = 3636000, .ri_uohm = 215000 }, > > + { .vbat_uv = 3631000, .ri_uohm = 206000 }, > > + { .vbat_uv = 3623000, .ri_uohm = 205000 }, > > + { .vbat_uv = 3616000, .ri_uohm = 193000 }, > > + { .vbat_uv = 3605000, .ri_uohm = 193000 }, > > + { .vbat_uv = 3600000, .ri_uohm = 198000 }, > > + { .vbat_uv = 3597000, .ri_uohm = 198000 }, > > + { .vbat_uv = 3592000, .ri_uohm = 203000 }, > > + { .vbat_uv = 3591000, .ri_uohm = 188000 }, > > + { .vbat_uv = 3587000, .ri_uohm = 188000 }, > > + { .vbat_uv = 3583000, .ri_uohm = 177000 }, > > + { .vbat_uv = 3577000, .ri_uohm = 170000 }, > > + { .vbat_uv = 3568000, .ri_uohm = 135000 }, > > + { .vbat_uv = 3552000, .ri_uohm = 54000 }, > > + { .vbat_uv = 3526000, .ri_uohm = 130000 }, > > + { .vbat_uv = 3501000, .ri_uohm = 48000 }, > > + { .vbat_uv = 3442000, .ri_uohm = 183000 }, > > + { .vbat_uv = 3326000, .ri_uohm = 372000 }, > > + { .vbat_uv = 3161000, .ri_uohm = 452000 }, > > +}; > > + > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb585157lu[] = { > > + { .vbat_uv = 4360000, .ri_uohm = 128000 }, > > + { .vbat_uv = 4325000, .ri_uohm = 130000 }, > > + { .vbat_uv = 4316000, .ri_uohm = 148000 }, > > + { .vbat_uv = 4308000, .ri_uohm = 162000 }, > > + { .vbat_uv = 4301000, .ri_uohm = 162000 }, > > + { .vbat_uv = 4250000, .ri_uohm = 162000 }, > > + { .vbat_uv = 4230000, .ri_uohm = 164000 }, > > + { .vbat_uv = 4030000, .ri_uohm = 164000 }, > > + { .vbat_uv = 4000000, .ri_uohm = 193000 }, > > + { .vbat_uv = 3950000, .ri_uohm = 204000 }, > > + { .vbat_uv = 3850000, .ri_uohm = 210000 }, > > + { .vbat_uv = 3800000, .ri_uohm = 230000 }, > > + { .vbat_uv = 3790000, .ri_uohm = 240000 }, > > + { .vbat_uv = 3780000, .ri_uohm = 311000 }, > > + { .vbat_uv = 3760000, .ri_uohm = 420000 }, > > + { .vbat_uv = 3700000, .ri_uohm = 504000 }, > > + { .vbat_uv = 3600000, .ri_uohm = 565000 }, > > +}; > > + > > +/* > > + * Temperature to internal resistance scaling tables. > > + * > > + * "resistance" is the percentage of the resistance determined from the voltage > > + * so this represents the capacity ratio at different temperatures. > > + * > > + * FIXME: the proper table is missing: Samsung does not provide the necessary > > + * temperature compensation tables so we just state 100% for every temperature. > > + * If you have the datasheets, please provide these tables. > > + */ > > +static struct power_supply_resistance_temp_table samsung_temp2res[] = { > > + { .temp = 50, .resistance = 100 }, > > + { .temp = 40, .resistance = 100 }, > > + { .temp = 30, .resistance = 100 }, > > + { .temp = 20, .resistance = 100 }, > > + { .temp = 10, .resistance = 100 }, > > + { .temp = 00, .resistance = 100 }, > > + { .temp = -10, .resistance = 100 }, > > + { .temp = -20, .resistance = 100 }, > > +}; > > + > > +/* > > + * Capacity tables for different Open Circuit Voltages (OCV). > > + * These must be sorted by falling OCV value. > > + */ > > + > > +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb485159lu[] = { > > + { .ocv = 4330000, .capacity = 100}, > > + { .ocv = 4320000, .capacity = 99}, > > + { .ocv = 4283000, .capacity = 95}, > > + { .ocv = 4246000, .capacity = 92}, > > + { .ocv = 4211000, .capacity = 89}, > > + { .ocv = 4167000, .capacity = 85}, > > + { .ocv = 4146000, .capacity = 83}, > > + { .ocv = 4124000, .capacity = 81}, > > + { .ocv = 4062000, .capacity = 75}, > > + { .ocv = 4013000, .capacity = 70}, > > + { .ocv = 3977000, .capacity = 66}, > > + { .ocv = 3931000, .capacity = 60}, > > + { .ocv = 3914000, .capacity = 58}, > > + { .ocv = 3901000, .capacity = 57}, > > + { .ocv = 3884000, .capacity = 56}, > > + { .ocv = 3870000, .capacity = 55}, > > + { .ocv = 3862000, .capacity = 54}, > > + { .ocv = 3854000, .capacity = 53}, > > + { .ocv = 3838000, .capacity = 50}, > > + { .ocv = 3823000, .capacity = 47}, > > + { .ocv = 3813000, .capacity = 45}, > > + { .ocv = 3807000, .capacity = 43}, > > + { .ocv = 3800000, .capacity = 41}, > > + { .ocv = 3795000, .capacity = 40}, > > + { .ocv = 3786000, .capacity = 37}, > > + { .ocv = 3783000, .capacity = 35}, > > + { .ocv = 3773000, .capacity = 30}, > > + { .ocv = 3758000, .capacity = 25}, > > + { .ocv = 3745000, .capacity = 22}, > > + { .ocv = 3738000, .capacity = 20}, > > + { .ocv = 3733000, .capacity = 19}, > > + { .ocv = 3716000, .capacity = 17}, > > + { .ocv = 3709000, .capacity = 16}, > > + { .ocv = 3698000, .capacity = 15}, > > + { .ocv = 3687000, .capacity = 14}, > > + { .ocv = 3684000, .capacity = 13}, > > + { .ocv = 3684000, .capacity = 12}, > > + { .ocv = 3678000, .capacity = 10}, > > + { .ocv = 3671000, .capacity = 9}, > > + { .ocv = 3665000, .capacity = 8}, > > + { .ocv = 3651000, .capacity = 7}, > > + { .ocv = 3634000, .capacity = 6}, > > + { .ocv = 3601000, .capacity = 5}, > > + { .ocv = 3564000, .capacity = 4}, > > + { .ocv = 3516000, .capacity = 3}, > > + { .ocv = 3456000, .capacity = 2}, > > + { .ocv = 3381000, .capacity = 1}, > > + { .ocv = 3300000, .capacity = 0}, > > +}; > > + > > +/* Same capacity table is used by eb-l1m7flu, eb425161la, eb425161lu */ > > +static struct power_supply_battery_ocv_table samsung_ocv_cap_1500mah[] = { > > + { .ocv = 4328000, .capacity = 100}, > > + { .ocv = 4299000, .capacity = 99}, > > + { .ocv = 4281000, .capacity = 98}, > > + { .ocv = 4241000, .capacity = 95}, > > + { .ocv = 4183000, .capacity = 90}, > > + { .ocv = 4150000, .capacity = 87}, > > + { .ocv = 4116000, .capacity = 84}, > > + { .ocv = 4077000, .capacity = 80}, > > + { .ocv = 4068000, .capacity = 79}, > > + { .ocv = 4058000, .capacity = 77}, > > + { .ocv = 4026000, .capacity = 75}, > > + { .ocv = 3987000, .capacity = 72}, > > + { .ocv = 3974000, .capacity = 69}, > > + { .ocv = 3953000, .capacity = 66}, > > + { .ocv = 3933000, .capacity = 63}, > > + { .ocv = 3911000, .capacity = 60}, > > + { .ocv = 3900000, .capacity = 58}, > > + { .ocv = 3873000, .capacity = 55}, > > + { .ocv = 3842000, .capacity = 52}, > > + { .ocv = 3829000, .capacity = 50}, > > + { .ocv = 3810000, .capacity = 45}, > > + { .ocv = 3793000, .capacity = 40}, > > + { .ocv = 3783000, .capacity = 35}, > > + { .ocv = 3776000, .capacity = 30}, > > + { .ocv = 3762000, .capacity = 25}, > > + { .ocv = 3746000, .capacity = 20}, > > + { .ocv = 3739000, .capacity = 18}, > > + { .ocv = 3715000, .capacity = 15}, > > + { .ocv = 3700000, .capacity = 12}, > > + { .ocv = 3690000, .capacity = 10}, > > + { .ocv = 3680000, .capacity = 9}, > > + { .ocv = 3670000, .capacity = 7}, > > + { .ocv = 3656000, .capacity = 5}, > > + { .ocv = 3634000, .capacity = 4}, > > + { .ocv = 3614000, .capacity = 3}, > > + { .ocv = 3551000, .capacity = 2}, > > + { .ocv = 3458000, .capacity = 1}, > > + { .ocv = 3300000, .capacity = 0}, > > +}; > > + > > +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb535151vu[] = { > > + { .ocv = 4178000, .capacity = 100}, > > + { .ocv = 4148000, .capacity = 99}, > > + { .ocv = 4105000, .capacity = 95}, > > + { .ocv = 4078000, .capacity = 92}, > > + { .ocv = 4057000, .capacity = 89}, > > + { .ocv = 4013000, .capacity = 85}, > > + { .ocv = 3988000, .capacity = 82}, > > + { .ocv = 3962000, .capacity = 77}, > > + { .ocv = 3920000, .capacity = 70}, > > + { .ocv = 3891000, .capacity = 65}, > > + { .ocv = 3874000, .capacity = 62}, > > + { .ocv = 3839000, .capacity = 59}, > > + { .ocv = 3816000, .capacity = 55}, > > + { .ocv = 3798000, .capacity = 50}, > > + { .ocv = 3778000, .capacity = 40}, > > + { .ocv = 3764000, .capacity = 30}, > > + { .ocv = 3743000, .capacity = 25}, > > + { .ocv = 3711000, .capacity = 20}, > > + { .ocv = 3691000, .capacity = 18}, > > + { .ocv = 3685000, .capacity = 15}, > > + { .ocv = 3680000, .capacity = 12}, > > + { .ocv = 3662000, .capacity = 10}, > > + { .ocv = 3638000, .capacity = 9}, > > + { .ocv = 3593000, .capacity = 7}, > > + { .ocv = 3566000, .capacity = 6}, > > + { .ocv = 3497000, .capacity = 4}, > > + { .ocv = 3405000, .capacity = 2}, > > + { .ocv = 3352000, .capacity = 1}, > > + { .ocv = 3300000, .capacity = 0}, > > +}; > > + > > +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb585157lu[] = { > > + { .ocv = 4320000, .capacity = 100}, > > + { .ocv = 4296000, .capacity = 99}, > > + { .ocv = 4283000, .capacity = 98}, > > + { .ocv = 4245000, .capacity = 95}, > > + { .ocv = 4185000, .capacity = 90}, > > + { .ocv = 4152000, .capacity = 87}, > > + { .ocv = 4119000, .capacity = 84}, > > + { .ocv = 4077000, .capacity = 80}, > > + { .ocv = 4057000, .capacity = 78}, > > + { .ocv = 4048000, .capacity = 77}, > > + { .ocv = 4020000, .capacity = 74}, > > + { .ocv = 4003000, .capacity = 72}, > > + { .ocv = 3978000, .capacity = 69}, > > + { .ocv = 3955000, .capacity = 66}, > > + { .ocv = 3934000, .capacity = 63}, > > + { .ocv = 3912000, .capacity = 60}, > > + { .ocv = 3894000, .capacity = 58}, > > + { .ocv = 3860000, .capacity = 55}, > > + { .ocv = 3837000, .capacity = 52}, > > + { .ocv = 3827000, .capacity = 50}, > > + { .ocv = 3806000, .capacity = 45}, > > + { .ocv = 3791000, .capacity = 40}, > > + { .ocv = 3779000, .capacity = 35}, > > + { .ocv = 3770000, .capacity = 30}, > > + { .ocv = 3758000, .capacity = 25}, > > + { .ocv = 3739000, .capacity = 20}, > > + { .ocv = 3730000, .capacity = 18}, > > + { .ocv = 3706000, .capacity = 15}, > > + { .ocv = 3684000, .capacity = 13}, > > + { .ocv = 3675000, .capacity = 10}, > > + { .ocv = 3673000, .capacity = 9}, > > + { .ocv = 3665000, .capacity = 7}, > > + { .ocv = 3649000, .capacity = 5}, > > + { .ocv = 3628000, .capacity = 4}, > > + { .ocv = 3585000, .capacity = 3}, > > + { .ocv = 3525000, .capacity = 2}, > > + { .ocv = 3441000, .capacity = 1}, > > + { .ocv = 3300000, .capacity = 0}, > > +}; > > + > > +struct power_supply_maintenance_charge_table samsung_maint_charge_table[] = { > > + { > > + /* Maintenance charging phase A, 60 hours */ > > + .charge_current_max_ua = 600000, > > + .charge_voltage_max_uv = 4150000, > > + .charge_safety_timer_minutes = 60*60, > > + }, > > + { > > + /* Maintenance charging phase B, 200 hours */ > > + .charge_current_max_ua = 600000, > > + .charge_voltage_max_uv = 4100000, > > + .charge_safety_timer_minutes = 200*60, > > + } > > +}; > > + > > +struct samsung_sdi_battery samsung_sdi_batteries[] = { > > + { > > + /* > > + * Used in Samsung GT-I8190 "Golden" > > + * Data from vendor boardfile board-golden-[bm|battery].c > > + */ > > + .compatible = "samsung,eb-l1m7flu", > > + .name = "EB-L1M7FLU", > > + .info = { > > + .charge_full_design_uah = 1500000, > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > + .factory_internal_resistance_uohm = 100000, > > + .factory_internal_resistance_charging_uohm = 200000, > > + /* If you have data on this fix the min_design_uv */ > > + .voltage_min_design_uv = 3320000, > > + .voltage_max_design_uv = 4340000, > > + .overvoltage_limit_uv = 4500000, > > + .constant_charge_current_max_ua = 900000, > > + .constant_charge_voltage_max_uv = 4320000, > > + .charge_term_current_ua = 200000, > > + .charge_restart_voltage_uv = 4300000, > > + .maintenance_charge = samsung_maint_charge_table, > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > + .alert_low_temp_charge_current_ua = 300000, > > + .alert_low_temp_charge_voltage_uv = 4000000, > > + .alert_high_temp_charge_current_ua = 300000, > > + .alert_high_temp_charge_voltage_uv = 4000000, > > + .temp_min = -50, > > + .temp_alert_min = 0, > > + .temp_alert_max = 40, > > + .temp_max = 60, > > + .resist_table = samsung_temp2res, > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > + /* If you have tables for more temperatures, add them */ > > + .ocv_temp[0] = 25, > > + .ocv_table[0] = samsung_ocv_cap_1500mah, > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb_l1m7flu, > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb_l1m7flu), > > + .vbat2ri_charging = samsung_vbat2res_charging_eb_l1m7flu, > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb_l1m7flu), > > + .bti_resistance_ohm = 2400, > > + .bti_resistance_tolerance = 40, > > + }, > > + }, > > + { > > + /* > > + * Used in Samsung SGH-T599 "Codina TMO" and SGH-I407 "Kyle" > > + * Data from vendor boardfile board-kyle-[bm|battery].c > > + */ > > + .compatible = "samsung,eb425161la", > > + .name = "EB425161LA", > > + .info = { > > + .charge_full_design_uah = 1500000, > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > + .factory_internal_resistance_uohm = 136000, > > + .factory_internal_resistance_charging_uohm = 200000, > > + /* If you have data on this fix the min_design_uv */ > > + .voltage_min_design_uv = 3320000, > > + .voltage_max_design_uv = 4340000, > > + .overvoltage_limit_uv = 4500000, > > + .constant_charge_current_max_ua = 900000, > > + .constant_charge_voltage_max_uv = 4320000, > > + .charge_term_current_ua = 200000, > > + .charge_restart_voltage_uv = 4270000, > > + .maintenance_charge = samsung_maint_charge_table, > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > + .alert_low_temp_charge_current_ua = 300000, > > + .alert_low_temp_charge_voltage_uv = 4000000, > > + .alert_high_temp_charge_current_ua = 300000, > > + .alert_high_temp_charge_voltage_uv = 4000000, > > + .temp_min = -30, > > + .temp_alert_min = 0, > > + .temp_alert_max = 40, > > + .temp_max = 47, > > + .resist_table = samsung_temp2res, > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > + /* If you have tables for more temperatures, add them */ > > + .ocv_temp[0] = 25, > > + .ocv_table[0] = samsung_ocv_cap_1500mah, > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161la, > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161la), > > + .vbat2ri_charging = samsung_vbat2res_charging_eb425161la, > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161la), > > + .bti_resistance_ohm = 2400, > > + .bti_resistance_tolerance = 40, > > + }, > > + }, > > + { > > + /* > > + * Used in Samsung GT-I8160 "Codina" > > + * Data from vendor boardfile board-codina-[bm|battery].c > > + */ > > + .compatible = "samsung,eb425161lu", > > + .name = "EB425161LU", > > + .info = { > > + .charge_full_design_uah = 1500000, > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > + .factory_internal_resistance_uohm = 100000, > > + .factory_internal_resistance_charging_uohm = 200000, > > + /* If you have data on this fix the min_design_uv */ > > + .voltage_min_design_uv = 3320000, > > + .voltage_max_design_uv = 4350000, > > + .overvoltage_limit_uv = 4500000, > > + .constant_charge_current_max_ua = 900000, > > + .constant_charge_voltage_max_uv = 4340000, > > + .charge_term_current_ua = 200000, > > + .charge_restart_voltage_uv = 4280000, > > + .maintenance_charge = samsung_maint_charge_table, > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > + .alert_low_temp_charge_current_ua = 300000, > > + .alert_low_temp_charge_voltage_uv = 4000000, > > + .alert_high_temp_charge_current_ua = 300000, > > + .alert_high_temp_charge_voltage_uv = 4000000, > > + .temp_min = -50, > > + .temp_alert_min = 0, > > + .temp_alert_max = 43, > > + .temp_max = 49, > > + .resist_table = samsung_temp2res, > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > + /* If you have tables for more temperatures, add them */ > > + .ocv_temp[0] = 25, > > + .ocv_table[0] = samsung_ocv_cap_1500mah, > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161lu, > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161lu), > > + .vbat2ri_charging = samsung_vbat2res_charging_eb425161lu, > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161lu), > > + .bti_resistance_ohm = 2400, > > + .bti_resistance_tolerance = 40, > > + }, > > + }, > > + { > > + /* > > + * Used in Samsung GT-S7710 "Skomer" > > + * Data from vendor boardfile board-skomer-[bm|battery].c > > + */ > > + .compatible = "samsung,eb485159lu", > > + .name = "EB485159LU", > > + .info = { > > + .charge_full_design_uah = 1700000, > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > + .factory_internal_resistance_uohm = 100000, > > + .factory_internal_resistance_charging_uohm = 200000, > > + .voltage_min_design_uv = 3320000, > > + .voltage_max_design_uv = 4350000, > > + .overvoltage_limit_uv = 4500000, > > + .constant_charge_current_max_ua = 900000, > > + .constant_charge_voltage_max_uv = 4340000, > > + .charge_term_current_ua = 200000, > > + .charge_restart_voltage_uv = 4300000, > > + .maintenance_charge = samsung_maint_charge_table, > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > + .alert_low_temp_charge_current_ua = 300000, > > + .alert_low_temp_charge_voltage_uv = 4000000, > > + .alert_high_temp_charge_current_ua = 300000, > > + .alert_high_temp_charge_voltage_uv = 4000000, > > + .temp_min = -50, > > + .temp_alert_min = 0, > > + .temp_alert_max = 40, > > + .temp_max = 60, > > + .resist_table = samsung_temp2res, > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > + /* If you have tables for more temperatures, add them */ > > + .ocv_temp[0] = 25, > > + .ocv_table[0] = samsung_ocv_cap_eb485159lu, > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb485159lu), > > + /* CHECKME: vendor uses the 1500 mAh table, check against datasheet */ > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb485159lu, > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb485159lu), > > + .vbat2ri_charging = samsung_vbat2res_charging_eb485159lu, > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb485159lu), > > + .bti_resistance_ohm = 2400, > > + .bti_resistance_tolerance = 40, > > + }, > > + }, > > + { > > + /* > > + * Used in Samsung GT-I9070 "Janice" > > + * Data from vendor boardfile board-janice-bm.c > > + */ > > + .compatible = "samsung,eb535151vu", > > + .name = "EB535151VU", > > + .info = { > > + .charge_full_design_uah = 1500000, > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > + .factory_internal_resistance_uohm = 100000, > > + .factory_internal_resistance_charging_uohm = 200000, > > + /* If you have data on this fix the min_design_uv */ > > + .voltage_min_design_uv = 3300000, > > + .voltage_max_design_uv = 4180000, > > + .overvoltage_limit_uv = 4500000, > > + .constant_charge_current_max_ua = 900000, > > + .constant_charge_voltage_max_uv = 4200000, > > + .charge_term_current_ua = 200000, > > + .maintenance_charge = samsung_maint_charge_table, > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > + .alert_low_temp_charge_current_ua = 300000, > > + .alert_low_temp_charge_voltage_uv = 4000000, > > + .alert_high_temp_charge_current_ua = 300000, > > + .alert_high_temp_charge_voltage_uv = 4000000, > > + .temp_min = -5, > > + .temp_alert_min = 0, > > + .temp_alert_max = 40, > > + .temp_max = 60, > > + .resist_table = samsung_temp2res, > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > + /* If you have tables for more temperatures, add them */ > > + .ocv_temp[0] = 25, > > + .ocv_table[0] = samsung_ocv_cap_eb585157lu, > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb535151vu), > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb535151vu, > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb535151vu), > > + .vbat2ri_charging = samsung_vbat2res_charging_eb535151vu, > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb535151vu), > > + .bti_resistance_ohm = 1500, > > + .bti_resistance_tolerance = 40, > > + }, > > + }, > > + { > > + /* > > + * Used in Samsung GT-I8530 "Gavini" > > + * Data from vendor boardfile board-gavini-bm.c > > + */ > > + .compatible = "samsung,eb585157lu", > > + .name = "EB585157LU", > > + .info = { > > + .charge_full_design_uah = 2000000, > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > + .factory_internal_resistance_uohm = 105000, > > + .factory_internal_resistance_charging_uohm = 160000, > > + /* If you have data on this fix the min_design_uv */ > > + .voltage_min_design_uv = 3300000, > > + .voltage_max_design_uv = 4320000, > > + .overvoltage_limit_uv = 4500000, > > + .constant_charge_current_max_ua = 1500000, > > + .constant_charge_voltage_max_uv = 4350000, > > + .charge_term_current_ua = 120000, > > + .maintenance_charge = samsung_maint_charge_table, > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > + .alert_low_temp_charge_current_ua = 300000, > > + .alert_low_temp_charge_voltage_uv = 4000000, > > + .alert_high_temp_charge_current_ua = 300000, > > + .alert_high_temp_charge_voltage_uv = 4000000, > > + .temp_min = -5, > > + .temp_alert_min = 0, > > + .temp_alert_max = 40, > > + .temp_max = 60, > > + .resist_table = samsung_temp2res, > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > + /* If you have tables for more temperatures, add them */ > > + .ocv_temp[0] = 25, > > + .ocv_table[0] = samsung_ocv_cap_eb585157lu, > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb585157lu), > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb585157lu, > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb585157lu), > > + .vbat2ri_charging = samsung_vbat2res_charging_eb585157lu, > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb585157lu), > > + .bti_resistance_ohm = 2400, > > + .bti_resistance_tolerance = 40, > > + }, > > + }, > > +}; > > + > > +int samsung_sdi_battery_get_info(struct device *dev, > > + struct device_node *np, > > + struct power_supply_battery_info **info) > > +{ > > + struct samsung_sdi_battery *batt; > > + int i; > > + > > + for (i = 0; i < ARRAY_SIZE(samsung_sdi_batteries); i++) { > > + batt = &samsung_sdi_batteries[i]; > > + if (of_device_is_compatible(np, batt->compatible)) > > + break; > > + } > > + > > + if (i == ARRAY_SIZE(samsung_sdi_batteries)) > > + return -ENODEV; > > + > > + *info = &batt->info; > > + dev_info(dev, "Samsung SDI %s battery %d mAh\n", > > + batt->name, batt->info.charge_full_design_uah / 1000); > > + > > + return 0; > > +} > > +EXPORT_SYMBOL_GPL(samsung_sdi_battery_get_info); > > diff --git a/drivers/power/supply/samsung-sdi-battery.h b/drivers/power/supply/samsung-sdi-battery.h > > new file mode 100644 > > index 000000000000..08783847dfcb > > --- /dev/null > > +++ b/drivers/power/supply/samsung-sdi-battery.h > > @@ -0,0 +1,13 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +#if IS_ENABLED(CONFIG_BATTERY_SAMSUNG_SDI) > > +extern int samsung_sdi_battery_get_info(struct device *dev, > > + struct device_node *np, > > + struct power_supply_battery_info **info); > > +#else > > +static inline int samsung_sdi_battery_get_info(struct device *dev, > > + struct device_node *np, > > + struct power_supply_battery_info **info) > > +{ > > + return -ENODEV; > > +} > > +#endif > > -- > > 2.34.1 > >
On Fri, Apr 01, 2022 at 05:35:25PM +0200, Sebastian Reichel wrote: > Hi Chris, > > On Thu, Mar 31, 2022 at 02:20:45PM -0500, Chris Morgan wrote: > > On Fri, Feb 25, 2022 at 01:13:14AM +0100, Linus Walleij wrote: > > > If we detect a Samsung SDI battery, we return a static > > > struct power_supply_battery_info and avoid looking further. > > > > > > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > > > --- > > > > I'm afraid this patch breaks my (currently work-in-progress) battery > > driver for the rk817. I am not sure but I believe it might cause other > > issues too for other downstream drivers (I don't have a device to test, > > but I think maybe the ingenic driver looks like it could be affected > > too). > > I assume this fixes the issue for you? I'll test it but I'm almost certain it will. Thank you. > > https://lore.kernel.org/linux-pm/20220329033226.535475-1-y.oudjana@protonmail.com/ > > I plan to send it to Linus for rc2. > > Thanks, > > -- Sebastian > > > > > > ChangeLog v2->v3: > > > - Fix a whole bunch of tables after realizing that completely > > > different battery data was used if CONFIG_SAMSUNG_BATTERY > > > was set for Golden, Kyle, Codina and Skomer. > > > ChangeLog v1->v2: > > > - Bump tolerance to 40% on all BTI resistances > > > - Change config option to bool, as we are calling OUT from > > > the supply core this cannot be compiled into a module > > > - Augment data to support low/high temperature charge current > > > and voltages. Sadly the vendor tree just provide one and the > > > same current and voltage for all of these. > > > --- > > > drivers/power/supply/Kconfig | 6 + > > > drivers/power/supply/Makefile | 1 + > > > drivers/power/supply/power_supply_core.c | 28 +- > > > drivers/power/supply/samsung-sdi-battery.c | 919 +++++++++++++++++++++ > > > drivers/power/supply/samsung-sdi-battery.h | 13 + > > > 5 files changed, 957 insertions(+), 10 deletions(-) > > > create mode 100644 drivers/power/supply/samsung-sdi-battery.c > > > create mode 100644 drivers/power/supply/samsung-sdi-battery.h > > > > > > diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig > > > index 6815e5a4c0bd..e9df4151f2e0 100644 > > > --- a/drivers/power/supply/Kconfig > > > +++ b/drivers/power/supply/Kconfig > > > @@ -181,6 +181,12 @@ config BATTERY_OLPC > > > help > > > Say Y to enable support for the battery on the OLPC laptop. > > > > > > +config BATTERY_SAMSUNG_SDI > > > + bool "Samsung SDI batteries" > > > + help > > > + Say Y to enable support for Samsung SDI battery data. > > > + These batteries are used in Samsung mobile phones. > > > + > > > config BATTERY_TOSA > > > tristate "Sharp SL-6000 (tosa) battery" > > > depends on MACH_TOSA && MFD_TC6393XB && TOUCHSCREEN_WM97XX > > > diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile > > > index 2c1b264b2046..ebcd2f5fe26d 100644 > > > --- a/drivers/power/supply/Makefile > > > +++ b/drivers/power/supply/Makefile > > > @@ -34,6 +34,7 @@ obj-$(CONFIG_BATTERY_GOLDFISH) += goldfish_battery.o > > > obj-$(CONFIG_BATTERY_LEGO_EV3) += lego_ev3_battery.o > > > obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o > > > obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o > > > +obj-$(CONFIG_BATTERY_SAMSUNG_SDI) += samsung-sdi-battery.o > > > obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o > > > obj-$(CONFIG_BATTERY_COLLIE) += collie_battery.o > > > obj-$(CONFIG_BATTERY_INGENIC) += ingenic-battery.o > > > diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c > > > index 1c0b1be22067..43c66214bedf 100644 > > > --- a/drivers/power/supply/power_supply_core.c > > > +++ b/drivers/power/supply/power_supply_core.c > > > @@ -23,6 +23,7 @@ > > > #include <linux/thermal.h> > > > #include <linux/fixp-arith.h> > > > #include "power_supply.h" > > > +#include "samsung-sdi-battery.h" > > > > > > /* exported for the APM Power driver, APM emulation */ > > > struct class *power_supply_class; > > > @@ -573,6 +574,23 @@ int power_supply_get_battery_info(struct power_supply *psy, > > > int err, len, index; > > > const __be32 *list; > > > > > > + if (!psy->of_node) { > > > + dev_warn(&psy->dev, "%s currently only supports devicetree\n", > > > + __func__); > > > + return -ENXIO; > > > + } > > > + > > > + battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); > > > + if (!battery_np) > > > + return -ENODEV; > > > + > > > + /* Try static batteries first */ > > > + err = samsung_sdi_battery_get_info(&psy->dev, battery_np, &info); > > If the device isn't a Samsung battery this puts -ENODEV in the err variable. > > For my case I have a simple-battery that isn't a Samsung battery, and it > > is causing power_supply_get_battery_info to return an error. > > > > > + if (!err) { > > > + *info_out = info; > > > + return err; > > > + } > > > + > > > info = devm_kmalloc(&psy->dev, sizeof(*info), GFP_KERNEL); > > > if (!info) > > > return -ENOMEM; > > > @@ -612,16 +630,6 @@ int power_supply_get_battery_info(struct power_supply *psy, > > > info->ocv_table_size[index] = -EINVAL; > > > } > > > > > > - if (!psy->of_node) { > > > - dev_warn(&psy->dev, "%s currently only supports devicetree\n", > > > - __func__); > > > - return -ENXIO; > > > - } > > > - > > > - battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); > > > - if (!battery_np) > > > - return -ENODEV; > > > - > > > err = of_property_read_string(battery_np, "compatible", &value); > > > if (err) > > > goto out_put_node; > > > diff --git a/drivers/power/supply/samsung-sdi-battery.c b/drivers/power/supply/samsung-sdi-battery.c > > > new file mode 100644 > > > index 000000000000..8e718f0fc2b5 > > > --- /dev/null > > > +++ b/drivers/power/supply/samsung-sdi-battery.c > > > @@ -0,0 +1,919 @@ > > > +// SPDX-License-Identifier: GPL-2.0 > > > + > > > +/* > > > + * Battery data and characteristics for Samsung SDI (Samsung Digital Interface) > > > + * batteries. The data is retrieved automatically into drivers using > > > + * the power_supply_get_battery_info() call. > > > + * > > > + * The BTI (battery type indicator) resistance in the code drops was very > > > + * unreliable. The resistance listed here was obtained by simply measuring > > > + * the BTI resistance with a multimeter on the battery. > > > + */ > > > +#include <linux/module.h> > > > +#include <linux/of.h> > > > +#include <linux/power_supply.h> > > > +#include "samsung-sdi-battery.h" > > > + > > > +struct samsung_sdi_battery { > > > + char *compatible; > > > + char *name; > > > + struct power_supply_battery_info info; > > > +}; > > > + > > > +/* > > > + * Voltage to internal resistance tables. The internal resistance varies > > > + * depending on the VBAT voltage, so look this up from a table. Different > > > + * tables apply depending on whether we are charging or not. > > > + */ > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb_l1m7flu[] = { > > > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > > > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > > > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > > > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > > > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > > > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > > > + { .vbat_uv = 4076000, .ri_uohm = 220000 }, > > > + { .vbat_uv = 4030000, .ri_uohm = 227000 }, > > > + { .vbat_uv = 3986000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > > > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > > > + { .vbat_uv = 3773000, .ri_uohm = 287000 }, > > > + { .vbat_uv = 3742000, .ri_uohm = 283000 }, > > > + { .vbat_uv = 3709000, .ri_uohm = 277000 }, > > > + { .vbat_uv = 3685000, .ri_uohm = 297000 }, > > > + { .vbat_uv = 3646000, .ri_uohm = 310000 }, > > > + { .vbat_uv = 3616000, .ri_uohm = 331000 }, > > > + { .vbat_uv = 3602000, .ri_uohm = 370000 }, > > > + { .vbat_uv = 3578000, .ri_uohm = 350000 }, > > > + { .vbat_uv = 3553000, .ri_uohm = 321000 }, > > > + { .vbat_uv = 3503000, .ri_uohm = 322000 }, > > > + { .vbat_uv = 3400000, .ri_uohm = 269000 }, > > > + { .vbat_uv = 3360000, .ri_uohm = 328000 }, > > > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > > > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb_l1m7flu[] = { > > > + { .vbat_uv = 4302000, .ri_uohm = 230000 }, > > > + { .vbat_uv = 4276000, .ri_uohm = 345000 }, > > > + { .vbat_uv = 4227000, .ri_uohm = 345000 }, > > > + { .vbat_uv = 4171000, .ri_uohm = 346000 }, > > > + { .vbat_uv = 4134000, .ri_uohm = 311000 }, > > > + { .vbat_uv = 4084000, .ri_uohm = 299000 }, > > > + { .vbat_uv = 4052000, .ri_uohm = 316000 }, > > > + { .vbat_uv = 4012000, .ri_uohm = 309000 }, > > > + { .vbat_uv = 3961000, .ri_uohm = 303000 }, > > > + { .vbat_uv = 3939000, .ri_uohm = 280000 }, > > > + { .vbat_uv = 3904000, .ri_uohm = 261000 }, > > > + { .vbat_uv = 3850000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > > > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > > > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > > > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > > > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161la[] = { > > > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > > > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > > > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > > > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > > > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > > > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > > > + { .vbat_uv = 4080000, .ri_uohm = 200000 }, > > > + { .vbat_uv = 4027000, .ri_uohm = 202000 }, > > > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > > > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > > > + { .vbat_uv = 3800000, .ri_uohm = 262000 }, > > > + { .vbat_uv = 3742000, .ri_uohm = 263000 }, > > > + { .vbat_uv = 3709000, .ri_uohm = 277000 }, > > > + { .vbat_uv = 3685000, .ri_uohm = 312000 }, > > > + { .vbat_uv = 3668000, .ri_uohm = 258000 }, > > > + { .vbat_uv = 3660000, .ri_uohm = 247000 }, > > > + { .vbat_uv = 3636000, .ri_uohm = 293000 }, > > > + { .vbat_uv = 3616000, .ri_uohm = 331000 }, > > > + { .vbat_uv = 3600000, .ri_uohm = 349000 }, > > > + { .vbat_uv = 3593000, .ri_uohm = 345000 }, > > > + { .vbat_uv = 3585000, .ri_uohm = 344000 }, > > > + { .vbat_uv = 3572000, .ri_uohm = 336000 }, > > > + { .vbat_uv = 3553000, .ri_uohm = 321000 }, > > > + { .vbat_uv = 3517000, .ri_uohm = 336000 }, > > > + { .vbat_uv = 3503000, .ri_uohm = 322000 }, > > > + { .vbat_uv = 3400000, .ri_uohm = 269000 }, > > > + { .vbat_uv = 3360000, .ri_uohm = 328000 }, > > > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > > > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161la[] = { > > > + { .vbat_uv = 4345000, .ri_uohm = 230000 }, > > > + { .vbat_uv = 4329000, .ri_uohm = 238000 }, > > > + { .vbat_uv = 4314000, .ri_uohm = 225000 }, > > > + { .vbat_uv = 4311000, .ri_uohm = 239000 }, > > > + { .vbat_uv = 4294000, .ri_uohm = 235000 }, > > > + { .vbat_uv = 4264000, .ri_uohm = 229000 }, > > > + { .vbat_uv = 4262000, .ri_uohm = 228000 }, > > > + { .vbat_uv = 4252000, .ri_uohm = 236000 }, > > > + { .vbat_uv = 4244000, .ri_uohm = 234000 }, > > > + { .vbat_uv = 4235000, .ri_uohm = 234000 }, > > > + { .vbat_uv = 4227000, .ri_uohm = 238000 }, > > > + { .vbat_uv = 4219000, .ri_uohm = 242000 }, > > > + { .vbat_uv = 4212000, .ri_uohm = 239000 }, > > > + { .vbat_uv = 4206000, .ri_uohm = 231000 }, > > > + { .vbat_uv = 4201000, .ri_uohm = 231000 }, > > > + { .vbat_uv = 4192000, .ri_uohm = 224000 }, > > > + { .vbat_uv = 4184000, .ri_uohm = 238000 }, > > > + { .vbat_uv = 4173000, .ri_uohm = 245000 }, > > > + { .vbat_uv = 4161000, .ri_uohm = 244000 }, > > > + { .vbat_uv = 4146000, .ri_uohm = 244000 }, > > > + { .vbat_uv = 4127000, .ri_uohm = 228000 }, > > > + { .vbat_uv = 4119000, .ri_uohm = 218000 }, > > > + { .vbat_uv = 4112000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 4108000, .ri_uohm = 209000 }, > > > + { .vbat_uv = 4102000, .ri_uohm = 214000 }, > > > + { .vbat_uv = 4096000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 4090000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 4083000, .ri_uohm = 219000 }, > > > + { .vbat_uv = 4078000, .ri_uohm = 208000 }, > > > + { .vbat_uv = 4071000, .ri_uohm = 205000 }, > > > + { .vbat_uv = 4066000, .ri_uohm = 208000 }, > > > + { .vbat_uv = 4061000, .ri_uohm = 210000 }, > > > + { .vbat_uv = 4055000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 4049000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 4042000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 4032000, .ri_uohm = 217000 }, > > > + { .vbat_uv = 4027000, .ri_uohm = 220000 }, > > > + { .vbat_uv = 4020000, .ri_uohm = 210000 }, > > > + { .vbat_uv = 4013000, .ri_uohm = 214000 }, > > > + { .vbat_uv = 4007000, .ri_uohm = 219000 }, > > > + { .vbat_uv = 4003000, .ri_uohm = 229000 }, > > > + { .vbat_uv = 3996000, .ri_uohm = 246000 }, > > > + { .vbat_uv = 3990000, .ri_uohm = 245000 }, > > > + { .vbat_uv = 3984000, .ri_uohm = 242000 }, > > > + { .vbat_uv = 3977000, .ri_uohm = 236000 }, > > > + { .vbat_uv = 3971000, .ri_uohm = 231000 }, > > > + { .vbat_uv = 3966000, .ri_uohm = 229000 }, > > > + { .vbat_uv = 3952000, .ri_uohm = 226000 }, > > > + { .vbat_uv = 3946000, .ri_uohm = 222000 }, > > > + { .vbat_uv = 3941000, .ri_uohm = 222000 }, > > > + { .vbat_uv = 3936000, .ri_uohm = 217000 }, > > > + { .vbat_uv = 3932000, .ri_uohm = 217000 }, > > > + { .vbat_uv = 3928000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 3926000, .ri_uohm = 214000 }, > > > + { .vbat_uv = 3922000, .ri_uohm = 209000 }, > > > + { .vbat_uv = 3917000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 3914000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 3912000, .ri_uohm = 220000 }, > > > + { .vbat_uv = 3910000, .ri_uohm = 226000 }, > > > + { .vbat_uv = 3903000, .ri_uohm = 226000 }, > > > + { .vbat_uv = 3891000, .ri_uohm = 222000 }, > > > + { .vbat_uv = 3871000, .ri_uohm = 221000 }, > > > + { .vbat_uv = 3857000, .ri_uohm = 219000 }, > > > + { .vbat_uv = 3850000, .ri_uohm = 216000 }, > > > + { .vbat_uv = 3843000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 3835000, .ri_uohm = 206000 }, > > > + { .vbat_uv = 3825000, .ri_uohm = 217000 }, > > > + { .vbat_uv = 3824000, .ri_uohm = 220000 }, > > > + { .vbat_uv = 3820000, .ri_uohm = 237000 }, > > > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > > > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > > > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > > > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > > > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161lu[] = { > > > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > > > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > > > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > > > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > > > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > > > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > > > + { .vbat_uv = 4080000, .ri_uohm = 200000 }, > > > + { .vbat_uv = 4027000, .ri_uohm = 202000 }, > > > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > > > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > > > + { .vbat_uv = 3800000, .ri_uohm = 262000 }, > > > + { .vbat_uv = 3742000, .ri_uohm = 263000 }, > > > + { .vbat_uv = 3708000, .ri_uohm = 277000 }, > > > + { .vbat_uv = 3684000, .ri_uohm = 272000 }, > > > + { .vbat_uv = 3664000, .ri_uohm = 278000 }, > > > + { .vbat_uv = 3655000, .ri_uohm = 285000 }, > > > + { .vbat_uv = 3638000, .ri_uohm = 261000 }, > > > + { .vbat_uv = 3624000, .ri_uohm = 259000 }, > > > + { .vbat_uv = 3616000, .ri_uohm = 266000 }, > > > + { .vbat_uv = 3597000, .ri_uohm = 278000 }, > > > + { .vbat_uv = 3581000, .ri_uohm = 281000 }, > > > + { .vbat_uv = 3560000, .ri_uohm = 287000 }, > > > + { .vbat_uv = 3527000, .ri_uohm = 289000 }, > > > + { .vbat_uv = 3512000, .ri_uohm = 286000 }, > > > + { .vbat_uv = 3494000, .ri_uohm = 282000 }, > > > + { .vbat_uv = 3400000, .ri_uohm = 269000 }, > > > + { .vbat_uv = 3360000, .ri_uohm = 328000 }, > > > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > > > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161lu[] = { > > > + { .vbat_uv = 4346000, .ri_uohm = 293000 }, > > > + { .vbat_uv = 4336000, .ri_uohm = 290000 }, > > > + { .vbat_uv = 4315000, .ri_uohm = 274000 }, > > > + { .vbat_uv = 4310000, .ri_uohm = 264000 }, > > > + { .vbat_uv = 4275000, .ri_uohm = 275000 }, > > > + { .vbat_uv = 4267000, .ri_uohm = 274000 }, > > > + { .vbat_uv = 4227000, .ri_uohm = 262000 }, > > > + { .vbat_uv = 4186000, .ri_uohm = 282000 }, > > > + { .vbat_uv = 4136000, .ri_uohm = 246000 }, > > > + { .vbat_uv = 4110000, .ri_uohm = 242000 }, > > > + { .vbat_uv = 4077000, .ri_uohm = 249000 }, > > > + { .vbat_uv = 4049000, .ri_uohm = 238000 }, > > > + { .vbat_uv = 4017000, .ri_uohm = 268000 }, > > > + { .vbat_uv = 3986000, .ri_uohm = 261000 }, > > > + { .vbat_uv = 3962000, .ri_uohm = 252000 }, > > > + { .vbat_uv = 3940000, .ri_uohm = 235000 }, > > > + { .vbat_uv = 3930000, .ri_uohm = 237000 }, > > > + { .vbat_uv = 3924000, .ri_uohm = 255000 }, > > > + { .vbat_uv = 3910000, .ri_uohm = 244000 }, > > > + { .vbat_uv = 3889000, .ri_uohm = 231000 }, > > > + { .vbat_uv = 3875000, .ri_uohm = 249000 }, > > > + { .vbat_uv = 3850000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > > > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > > > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > > > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > > > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb485159lu[] = { > > > + { .vbat_uv = 4240000, .ri_uohm = 160000 }, > > > + { .vbat_uv = 4210000, .ri_uohm = 179000 }, > > > + { .vbat_uv = 4180000, .ri_uohm = 183000 }, > > > + { .vbat_uv = 4160000, .ri_uohm = 184000 }, > > > + { .vbat_uv = 4140000, .ri_uohm = 191000 }, > > > + { .vbat_uv = 4120000, .ri_uohm = 204000 }, > > > + { .vbat_uv = 4080000, .ri_uohm = 200000 }, > > > + { .vbat_uv = 4027000, .ri_uohm = 202000 }, > > > + { .vbat_uv = 3916000, .ri_uohm = 221000 }, > > > + { .vbat_uv = 3842000, .ri_uohm = 259000 }, > > > + { .vbat_uv = 3800000, .ri_uohm = 262000 }, > > > + { .vbat_uv = 3715000, .ri_uohm = 340000 }, > > > + { .vbat_uv = 3700000, .ri_uohm = 300000 }, > > > + { .vbat_uv = 3682000, .ri_uohm = 233000 }, > > > + { .vbat_uv = 3655000, .ri_uohm = 246000 }, > > > + { .vbat_uv = 3639000, .ri_uohm = 260000 }, > > > + { .vbat_uv = 3621000, .ri_uohm = 254000 }, > > > + { .vbat_uv = 3583000, .ri_uohm = 266000 }, > > > + { .vbat_uv = 3536000, .ri_uohm = 274000 }, > > > + { .vbat_uv = 3502000, .ri_uohm = 300000 }, > > > + { .vbat_uv = 3465000, .ri_uohm = 245000 }, > > > + { .vbat_uv = 3438000, .ri_uohm = 225000 }, > > > + { .vbat_uv = 3330000, .ri_uohm = 305000 }, > > > + { .vbat_uv = 3300000, .ri_uohm = 339000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb485159lu[] = { > > > + { .vbat_uv = 4302000, .ri_uohm = 200000 }, > > > + { .vbat_uv = 4258000, .ri_uohm = 206000 }, > > > + { .vbat_uv = 4200000, .ri_uohm = 231000 }, > > > + { .vbat_uv = 4150000, .ri_uohm = 198000 }, > > > + { .vbat_uv = 4134000, .ri_uohm = 268000 }, > > > + { .vbat_uv = 4058000, .ri_uohm = 172000 }, > > > + { .vbat_uv = 4003000, .ri_uohm = 227000 }, > > > + { .vbat_uv = 3972000, .ri_uohm = 241000 }, > > > + { .vbat_uv = 3953000, .ri_uohm = 244000 }, > > > + { .vbat_uv = 3950000, .ri_uohm = 213000 }, > > > + { .vbat_uv = 3900000, .ri_uohm = 225000 }, > > > + { .vbat_uv = 3850000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 3800000, .ri_uohm = 232000 }, > > > + { .vbat_uv = 3750000, .ri_uohm = 177000 }, > > > + { .vbat_uv = 3712000, .ri_uohm = 164000 }, > > > + { .vbat_uv = 3674000, .ri_uohm = 161000 }, > > > + { .vbat_uv = 3590000, .ri_uohm = 164000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb535151vu[] = { > > > + { .vbat_uv = 4071000, .ri_uohm = 158000 }, > > > + { .vbat_uv = 4019000, .ri_uohm = 187000 }, > > > + { .vbat_uv = 3951000, .ri_uohm = 191000 }, > > > + { .vbat_uv = 3901000, .ri_uohm = 193000 }, > > > + { .vbat_uv = 3850000, .ri_uohm = 273000 }, > > > + { .vbat_uv = 3800000, .ri_uohm = 305000 }, > > > + { .vbat_uv = 3750000, .ri_uohm = 205000 }, > > > + { .vbat_uv = 3700000, .ri_uohm = 290000 }, > > > + { .vbat_uv = 3650000, .ri_uohm = 262000 }, > > > + { .vbat_uv = 3618000, .ri_uohm = 290000 }, > > > + { .vbat_uv = 3505000, .ri_uohm = 235000 }, > > > + { .vbat_uv = 3484000, .ri_uohm = 253000 }, > > > + { .vbat_uv = 3413000, .ri_uohm = 243000 }, > > > + { .vbat_uv = 3393000, .ri_uohm = 285000 }, > > > + { .vbat_uv = 3361000, .ri_uohm = 281000 }, > > > + { .vbat_uv = 3302000, .ri_uohm = 286000 }, > > > + { .vbat_uv = 3280000, .ri_uohm = 250000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb535151vu[] = { > > > + { .vbat_uv = 4190000, .ri_uohm = 214000 }, > > > + { .vbat_uv = 4159000, .ri_uohm = 252000 }, > > > + { .vbat_uv = 4121000, .ri_uohm = 245000 }, > > > + { .vbat_uv = 4069000, .ri_uohm = 228000 }, > > > + { .vbat_uv = 4046000, .ri_uohm = 229000 }, > > > + { .vbat_uv = 4026000, .ri_uohm = 233000 }, > > > + { .vbat_uv = 4007000, .ri_uohm = 240000 }, > > > + { .vbat_uv = 3982000, .ri_uohm = 291000 }, > > > + { .vbat_uv = 3945000, .ri_uohm = 276000 }, > > > + { .vbat_uv = 3924000, .ri_uohm = 266000 }, > > > + { .vbat_uv = 3910000, .ri_uohm = 258000 }, > > > + { .vbat_uv = 3900000, .ri_uohm = 271000 }, > > > + { .vbat_uv = 3844000, .ri_uohm = 279000 }, > > > + { .vbat_uv = 3772000, .ri_uohm = 217000 }, > > > + { .vbat_uv = 3673000, .ri_uohm = 208000 }, > > > + { .vbat_uv = 3571000, .ri_uohm = 208000 }, > > > + { .vbat_uv = 3510000, .ri_uohm = 228000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb585157lu[] = { > > > + { .vbat_uv = 4194000, .ri_uohm = 121000 }, > > > + { .vbat_uv = 4169000, .ri_uohm = 188000 }, > > > + { .vbat_uv = 4136000, .ri_uohm = 173000 }, > > > + { .vbat_uv = 4108000, .ri_uohm = 158000 }, > > > + { .vbat_uv = 4064000, .ri_uohm = 143000 }, > > > + { .vbat_uv = 3956000, .ri_uohm = 160000 }, > > > + { .vbat_uv = 3847000, .ri_uohm = 262000 }, > > > + { .vbat_uv = 3806000, .ri_uohm = 280000 }, > > > + { .vbat_uv = 3801000, .ri_uohm = 266000 }, > > > + { .vbat_uv = 3794000, .ri_uohm = 259000 }, > > > + { .vbat_uv = 3785000, .ri_uohm = 234000 }, > > > + { .vbat_uv = 3779000, .ri_uohm = 227000 }, > > > + { .vbat_uv = 3772000, .ri_uohm = 222000 }, > > > + { .vbat_uv = 3765000, .ri_uohm = 221000 }, > > > + { .vbat_uv = 3759000, .ri_uohm = 216000 }, > > > + { .vbat_uv = 3754000, .ri_uohm = 206000 }, > > > + { .vbat_uv = 3747000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 3743000, .ri_uohm = 208000 }, > > > + { .vbat_uv = 3737000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 3733000, .ri_uohm = 200000 }, > > > + { .vbat_uv = 3728000, .ri_uohm = 203000 }, > > > + { .vbat_uv = 3722000, .ri_uohm = 207000 }, > > > + { .vbat_uv = 3719000, .ri_uohm = 208000 }, > > > + { .vbat_uv = 3715000, .ri_uohm = 209000 }, > > > + { .vbat_uv = 3712000, .ri_uohm = 211000 }, > > > + { .vbat_uv = 3709000, .ri_uohm = 210000 }, > > > + { .vbat_uv = 3704000, .ri_uohm = 216000 }, > > > + { .vbat_uv = 3701000, .ri_uohm = 218000 }, > > > + { .vbat_uv = 3698000, .ri_uohm = 222000 }, > > > + { .vbat_uv = 3694000, .ri_uohm = 218000 }, > > > + { .vbat_uv = 3692000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 3688000, .ri_uohm = 224000 }, > > > + { .vbat_uv = 3686000, .ri_uohm = 224000 }, > > > + { .vbat_uv = 3683000, .ri_uohm = 228000 }, > > > + { .vbat_uv = 3681000, .ri_uohm = 228000 }, > > > + { .vbat_uv = 3679000, .ri_uohm = 229000 }, > > > + { .vbat_uv = 3676000, .ri_uohm = 232000 }, > > > + { .vbat_uv = 3675000, .ri_uohm = 229000 }, > > > + { .vbat_uv = 3673000, .ri_uohm = 229000 }, > > > + { .vbat_uv = 3672000, .ri_uohm = 223000 }, > > > + { .vbat_uv = 3669000, .ri_uohm = 224000 }, > > > + { .vbat_uv = 3666000, .ri_uohm = 224000 }, > > > + { .vbat_uv = 3663000, .ri_uohm = 221000 }, > > > + { .vbat_uv = 3660000, .ri_uohm = 218000 }, > > > + { .vbat_uv = 3657000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 3654000, .ri_uohm = 212000 }, > > > + { .vbat_uv = 3649000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 3644000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 3636000, .ri_uohm = 215000 }, > > > + { .vbat_uv = 3631000, .ri_uohm = 206000 }, > > > + { .vbat_uv = 3623000, .ri_uohm = 205000 }, > > > + { .vbat_uv = 3616000, .ri_uohm = 193000 }, > > > + { .vbat_uv = 3605000, .ri_uohm = 193000 }, > > > + { .vbat_uv = 3600000, .ri_uohm = 198000 }, > > > + { .vbat_uv = 3597000, .ri_uohm = 198000 }, > > > + { .vbat_uv = 3592000, .ri_uohm = 203000 }, > > > + { .vbat_uv = 3591000, .ri_uohm = 188000 }, > > > + { .vbat_uv = 3587000, .ri_uohm = 188000 }, > > > + { .vbat_uv = 3583000, .ri_uohm = 177000 }, > > > + { .vbat_uv = 3577000, .ri_uohm = 170000 }, > > > + { .vbat_uv = 3568000, .ri_uohm = 135000 }, > > > + { .vbat_uv = 3552000, .ri_uohm = 54000 }, > > > + { .vbat_uv = 3526000, .ri_uohm = 130000 }, > > > + { .vbat_uv = 3501000, .ri_uohm = 48000 }, > > > + { .vbat_uv = 3442000, .ri_uohm = 183000 }, > > > + { .vbat_uv = 3326000, .ri_uohm = 372000 }, > > > + { .vbat_uv = 3161000, .ri_uohm = 452000 }, > > > +}; > > > + > > > +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb585157lu[] = { > > > + { .vbat_uv = 4360000, .ri_uohm = 128000 }, > > > + { .vbat_uv = 4325000, .ri_uohm = 130000 }, > > > + { .vbat_uv = 4316000, .ri_uohm = 148000 }, > > > + { .vbat_uv = 4308000, .ri_uohm = 162000 }, > > > + { .vbat_uv = 4301000, .ri_uohm = 162000 }, > > > + { .vbat_uv = 4250000, .ri_uohm = 162000 }, > > > + { .vbat_uv = 4230000, .ri_uohm = 164000 }, > > > + { .vbat_uv = 4030000, .ri_uohm = 164000 }, > > > + { .vbat_uv = 4000000, .ri_uohm = 193000 }, > > > + { .vbat_uv = 3950000, .ri_uohm = 204000 }, > > > + { .vbat_uv = 3850000, .ri_uohm = 210000 }, > > > + { .vbat_uv = 3800000, .ri_uohm = 230000 }, > > > + { .vbat_uv = 3790000, .ri_uohm = 240000 }, > > > + { .vbat_uv = 3780000, .ri_uohm = 311000 }, > > > + { .vbat_uv = 3760000, .ri_uohm = 420000 }, > > > + { .vbat_uv = 3700000, .ri_uohm = 504000 }, > > > + { .vbat_uv = 3600000, .ri_uohm = 565000 }, > > > +}; > > > + > > > +/* > > > + * Temperature to internal resistance scaling tables. > > > + * > > > + * "resistance" is the percentage of the resistance determined from the voltage > > > + * so this represents the capacity ratio at different temperatures. > > > + * > > > + * FIXME: the proper table is missing: Samsung does not provide the necessary > > > + * temperature compensation tables so we just state 100% for every temperature. > > > + * If you have the datasheets, please provide these tables. > > > + */ > > > +static struct power_supply_resistance_temp_table samsung_temp2res[] = { > > > + { .temp = 50, .resistance = 100 }, > > > + { .temp = 40, .resistance = 100 }, > > > + { .temp = 30, .resistance = 100 }, > > > + { .temp = 20, .resistance = 100 }, > > > + { .temp = 10, .resistance = 100 }, > > > + { .temp = 00, .resistance = 100 }, > > > + { .temp = -10, .resistance = 100 }, > > > + { .temp = -20, .resistance = 100 }, > > > +}; > > > + > > > +/* > > > + * Capacity tables for different Open Circuit Voltages (OCV). > > > + * These must be sorted by falling OCV value. > > > + */ > > > + > > > +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb485159lu[] = { > > > + { .ocv = 4330000, .capacity = 100}, > > > + { .ocv = 4320000, .capacity = 99}, > > > + { .ocv = 4283000, .capacity = 95}, > > > + { .ocv = 4246000, .capacity = 92}, > > > + { .ocv = 4211000, .capacity = 89}, > > > + { .ocv = 4167000, .capacity = 85}, > > > + { .ocv = 4146000, .capacity = 83}, > > > + { .ocv = 4124000, .capacity = 81}, > > > + { .ocv = 4062000, .capacity = 75}, > > > + { .ocv = 4013000, .capacity = 70}, > > > + { .ocv = 3977000, .capacity = 66}, > > > + { .ocv = 3931000, .capacity = 60}, > > > + { .ocv = 3914000, .capacity = 58}, > > > + { .ocv = 3901000, .capacity = 57}, > > > + { .ocv = 3884000, .capacity = 56}, > > > + { .ocv = 3870000, .capacity = 55}, > > > + { .ocv = 3862000, .capacity = 54}, > > > + { .ocv = 3854000, .capacity = 53}, > > > + { .ocv = 3838000, .capacity = 50}, > > > + { .ocv = 3823000, .capacity = 47}, > > > + { .ocv = 3813000, .capacity = 45}, > > > + { .ocv = 3807000, .capacity = 43}, > > > + { .ocv = 3800000, .capacity = 41}, > > > + { .ocv = 3795000, .capacity = 40}, > > > + { .ocv = 3786000, .capacity = 37}, > > > + { .ocv = 3783000, .capacity = 35}, > > > + { .ocv = 3773000, .capacity = 30}, > > > + { .ocv = 3758000, .capacity = 25}, > > > + { .ocv = 3745000, .capacity = 22}, > > > + { .ocv = 3738000, .capacity = 20}, > > > + { .ocv = 3733000, .capacity = 19}, > > > + { .ocv = 3716000, .capacity = 17}, > > > + { .ocv = 3709000, .capacity = 16}, > > > + { .ocv = 3698000, .capacity = 15}, > > > + { .ocv = 3687000, .capacity = 14}, > > > + { .ocv = 3684000, .capacity = 13}, > > > + { .ocv = 3684000, .capacity = 12}, > > > + { .ocv = 3678000, .capacity = 10}, > > > + { .ocv = 3671000, .capacity = 9}, > > > + { .ocv = 3665000, .capacity = 8}, > > > + { .ocv = 3651000, .capacity = 7}, > > > + { .ocv = 3634000, .capacity = 6}, > > > + { .ocv = 3601000, .capacity = 5}, > > > + { .ocv = 3564000, .capacity = 4}, > > > + { .ocv = 3516000, .capacity = 3}, > > > + { .ocv = 3456000, .capacity = 2}, > > > + { .ocv = 3381000, .capacity = 1}, > > > + { .ocv = 3300000, .capacity = 0}, > > > +}; > > > + > > > +/* Same capacity table is used by eb-l1m7flu, eb425161la, eb425161lu */ > > > +static struct power_supply_battery_ocv_table samsung_ocv_cap_1500mah[] = { > > > + { .ocv = 4328000, .capacity = 100}, > > > + { .ocv = 4299000, .capacity = 99}, > > > + { .ocv = 4281000, .capacity = 98}, > > > + { .ocv = 4241000, .capacity = 95}, > > > + { .ocv = 4183000, .capacity = 90}, > > > + { .ocv = 4150000, .capacity = 87}, > > > + { .ocv = 4116000, .capacity = 84}, > > > + { .ocv = 4077000, .capacity = 80}, > > > + { .ocv = 4068000, .capacity = 79}, > > > + { .ocv = 4058000, .capacity = 77}, > > > + { .ocv = 4026000, .capacity = 75}, > > > + { .ocv = 3987000, .capacity = 72}, > > > + { .ocv = 3974000, .capacity = 69}, > > > + { .ocv = 3953000, .capacity = 66}, > > > + { .ocv = 3933000, .capacity = 63}, > > > + { .ocv = 3911000, .capacity = 60}, > > > + { .ocv = 3900000, .capacity = 58}, > > > + { .ocv = 3873000, .capacity = 55}, > > > + { .ocv = 3842000, .capacity = 52}, > > > + { .ocv = 3829000, .capacity = 50}, > > > + { .ocv = 3810000, .capacity = 45}, > > > + { .ocv = 3793000, .capacity = 40}, > > > + { .ocv = 3783000, .capacity = 35}, > > > + { .ocv = 3776000, .capacity = 30}, > > > + { .ocv = 3762000, .capacity = 25}, > > > + { .ocv = 3746000, .capacity = 20}, > > > + { .ocv = 3739000, .capacity = 18}, > > > + { .ocv = 3715000, .capacity = 15}, > > > + { .ocv = 3700000, .capacity = 12}, > > > + { .ocv = 3690000, .capacity = 10}, > > > + { .ocv = 3680000, .capacity = 9}, > > > + { .ocv = 3670000, .capacity = 7}, > > > + { .ocv = 3656000, .capacity = 5}, > > > + { .ocv = 3634000, .capacity = 4}, > > > + { .ocv = 3614000, .capacity = 3}, > > > + { .ocv = 3551000, .capacity = 2}, > > > + { .ocv = 3458000, .capacity = 1}, > > > + { .ocv = 3300000, .capacity = 0}, > > > +}; > > > + > > > +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb535151vu[] = { > > > + { .ocv = 4178000, .capacity = 100}, > > > + { .ocv = 4148000, .capacity = 99}, > > > + { .ocv = 4105000, .capacity = 95}, > > > + { .ocv = 4078000, .capacity = 92}, > > > + { .ocv = 4057000, .capacity = 89}, > > > + { .ocv = 4013000, .capacity = 85}, > > > + { .ocv = 3988000, .capacity = 82}, > > > + { .ocv = 3962000, .capacity = 77}, > > > + { .ocv = 3920000, .capacity = 70}, > > > + { .ocv = 3891000, .capacity = 65}, > > > + { .ocv = 3874000, .capacity = 62}, > > > + { .ocv = 3839000, .capacity = 59}, > > > + { .ocv = 3816000, .capacity = 55}, > > > + { .ocv = 3798000, .capacity = 50}, > > > + { .ocv = 3778000, .capacity = 40}, > > > + { .ocv = 3764000, .capacity = 30}, > > > + { .ocv = 3743000, .capacity = 25}, > > > + { .ocv = 3711000, .capacity = 20}, > > > + { .ocv = 3691000, .capacity = 18}, > > > + { .ocv = 3685000, .capacity = 15}, > > > + { .ocv = 3680000, .capacity = 12}, > > > + { .ocv = 3662000, .capacity = 10}, > > > + { .ocv = 3638000, .capacity = 9}, > > > + { .ocv = 3593000, .capacity = 7}, > > > + { .ocv = 3566000, .capacity = 6}, > > > + { .ocv = 3497000, .capacity = 4}, > > > + { .ocv = 3405000, .capacity = 2}, > > > + { .ocv = 3352000, .capacity = 1}, > > > + { .ocv = 3300000, .capacity = 0}, > > > +}; > > > + > > > +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb585157lu[] = { > > > + { .ocv = 4320000, .capacity = 100}, > > > + { .ocv = 4296000, .capacity = 99}, > > > + { .ocv = 4283000, .capacity = 98}, > > > + { .ocv = 4245000, .capacity = 95}, > > > + { .ocv = 4185000, .capacity = 90}, > > > + { .ocv = 4152000, .capacity = 87}, > > > + { .ocv = 4119000, .capacity = 84}, > > > + { .ocv = 4077000, .capacity = 80}, > > > + { .ocv = 4057000, .capacity = 78}, > > > + { .ocv = 4048000, .capacity = 77}, > > > + { .ocv = 4020000, .capacity = 74}, > > > + { .ocv = 4003000, .capacity = 72}, > > > + { .ocv = 3978000, .capacity = 69}, > > > + { .ocv = 3955000, .capacity = 66}, > > > + { .ocv = 3934000, .capacity = 63}, > > > + { .ocv = 3912000, .capacity = 60}, > > > + { .ocv = 3894000, .capacity = 58}, > > > + { .ocv = 3860000, .capacity = 55}, > > > + { .ocv = 3837000, .capacity = 52}, > > > + { .ocv = 3827000, .capacity = 50}, > > > + { .ocv = 3806000, .capacity = 45}, > > > + { .ocv = 3791000, .capacity = 40}, > > > + { .ocv = 3779000, .capacity = 35}, > > > + { .ocv = 3770000, .capacity = 30}, > > > + { .ocv = 3758000, .capacity = 25}, > > > + { .ocv = 3739000, .capacity = 20}, > > > + { .ocv = 3730000, .capacity = 18}, > > > + { .ocv = 3706000, .capacity = 15}, > > > + { .ocv = 3684000, .capacity = 13}, > > > + { .ocv = 3675000, .capacity = 10}, > > > + { .ocv = 3673000, .capacity = 9}, > > > + { .ocv = 3665000, .capacity = 7}, > > > + { .ocv = 3649000, .capacity = 5}, > > > + { .ocv = 3628000, .capacity = 4}, > > > + { .ocv = 3585000, .capacity = 3}, > > > + { .ocv = 3525000, .capacity = 2}, > > > + { .ocv = 3441000, .capacity = 1}, > > > + { .ocv = 3300000, .capacity = 0}, > > > +}; > > > + > > > +struct power_supply_maintenance_charge_table samsung_maint_charge_table[] = { > > > + { > > > + /* Maintenance charging phase A, 60 hours */ > > > + .charge_current_max_ua = 600000, > > > + .charge_voltage_max_uv = 4150000, > > > + .charge_safety_timer_minutes = 60*60, > > > + }, > > > + { > > > + /* Maintenance charging phase B, 200 hours */ > > > + .charge_current_max_ua = 600000, > > > + .charge_voltage_max_uv = 4100000, > > > + .charge_safety_timer_minutes = 200*60, > > > + } > > > +}; > > > + > > > +struct samsung_sdi_battery samsung_sdi_batteries[] = { > > > + { > > > + /* > > > + * Used in Samsung GT-I8190 "Golden" > > > + * Data from vendor boardfile board-golden-[bm|battery].c > > > + */ > > > + .compatible = "samsung,eb-l1m7flu", > > > + .name = "EB-L1M7FLU", > > > + .info = { > > > + .charge_full_design_uah = 1500000, > > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > > + .factory_internal_resistance_uohm = 100000, > > > + .factory_internal_resistance_charging_uohm = 200000, > > > + /* If you have data on this fix the min_design_uv */ > > > + .voltage_min_design_uv = 3320000, > > > + .voltage_max_design_uv = 4340000, > > > + .overvoltage_limit_uv = 4500000, > > > + .constant_charge_current_max_ua = 900000, > > > + .constant_charge_voltage_max_uv = 4320000, > > > + .charge_term_current_ua = 200000, > > > + .charge_restart_voltage_uv = 4300000, > > > + .maintenance_charge = samsung_maint_charge_table, > > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > > + .alert_low_temp_charge_current_ua = 300000, > > > + .alert_low_temp_charge_voltage_uv = 4000000, > > > + .alert_high_temp_charge_current_ua = 300000, > > > + .alert_high_temp_charge_voltage_uv = 4000000, > > > + .temp_min = -50, > > > + .temp_alert_min = 0, > > > + .temp_alert_max = 40, > > > + .temp_max = 60, > > > + .resist_table = samsung_temp2res, > > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > > + /* If you have tables for more temperatures, add them */ > > > + .ocv_temp[0] = 25, > > > + .ocv_table[0] = samsung_ocv_cap_1500mah, > > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), > > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb_l1m7flu, > > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb_l1m7flu), > > > + .vbat2ri_charging = samsung_vbat2res_charging_eb_l1m7flu, > > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb_l1m7flu), > > > + .bti_resistance_ohm = 2400, > > > + .bti_resistance_tolerance = 40, > > > + }, > > > + }, > > > + { > > > + /* > > > + * Used in Samsung SGH-T599 "Codina TMO" and SGH-I407 "Kyle" > > > + * Data from vendor boardfile board-kyle-[bm|battery].c > > > + */ > > > + .compatible = "samsung,eb425161la", > > > + .name = "EB425161LA", > > > + .info = { > > > + .charge_full_design_uah = 1500000, > > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > > + .factory_internal_resistance_uohm = 136000, > > > + .factory_internal_resistance_charging_uohm = 200000, > > > + /* If you have data on this fix the min_design_uv */ > > > + .voltage_min_design_uv = 3320000, > > > + .voltage_max_design_uv = 4340000, > > > + .overvoltage_limit_uv = 4500000, > > > + .constant_charge_current_max_ua = 900000, > > > + .constant_charge_voltage_max_uv = 4320000, > > > + .charge_term_current_ua = 200000, > > > + .charge_restart_voltage_uv = 4270000, > > > + .maintenance_charge = samsung_maint_charge_table, > > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > > + .alert_low_temp_charge_current_ua = 300000, > > > + .alert_low_temp_charge_voltage_uv = 4000000, > > > + .alert_high_temp_charge_current_ua = 300000, > > > + .alert_high_temp_charge_voltage_uv = 4000000, > > > + .temp_min = -30, > > > + .temp_alert_min = 0, > > > + .temp_alert_max = 40, > > > + .temp_max = 47, > > > + .resist_table = samsung_temp2res, > > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > > + /* If you have tables for more temperatures, add them */ > > > + .ocv_temp[0] = 25, > > > + .ocv_table[0] = samsung_ocv_cap_1500mah, > > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), > > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161la, > > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161la), > > > + .vbat2ri_charging = samsung_vbat2res_charging_eb425161la, > > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161la), > > > + .bti_resistance_ohm = 2400, > > > + .bti_resistance_tolerance = 40, > > > + }, > > > + }, > > > + { > > > + /* > > > + * Used in Samsung GT-I8160 "Codina" > > > + * Data from vendor boardfile board-codina-[bm|battery].c > > > + */ > > > + .compatible = "samsung,eb425161lu", > > > + .name = "EB425161LU", > > > + .info = { > > > + .charge_full_design_uah = 1500000, > > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > > + .factory_internal_resistance_uohm = 100000, > > > + .factory_internal_resistance_charging_uohm = 200000, > > > + /* If you have data on this fix the min_design_uv */ > > > + .voltage_min_design_uv = 3320000, > > > + .voltage_max_design_uv = 4350000, > > > + .overvoltage_limit_uv = 4500000, > > > + .constant_charge_current_max_ua = 900000, > > > + .constant_charge_voltage_max_uv = 4340000, > > > + .charge_term_current_ua = 200000, > > > + .charge_restart_voltage_uv = 4280000, > > > + .maintenance_charge = samsung_maint_charge_table, > > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > > + .alert_low_temp_charge_current_ua = 300000, > > > + .alert_low_temp_charge_voltage_uv = 4000000, > > > + .alert_high_temp_charge_current_ua = 300000, > > > + .alert_high_temp_charge_voltage_uv = 4000000, > > > + .temp_min = -50, > > > + .temp_alert_min = 0, > > > + .temp_alert_max = 43, > > > + .temp_max = 49, > > > + .resist_table = samsung_temp2res, > > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > > + /* If you have tables for more temperatures, add them */ > > > + .ocv_temp[0] = 25, > > > + .ocv_table[0] = samsung_ocv_cap_1500mah, > > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), > > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161lu, > > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161lu), > > > + .vbat2ri_charging = samsung_vbat2res_charging_eb425161lu, > > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161lu), > > > + .bti_resistance_ohm = 2400, > > > + .bti_resistance_tolerance = 40, > > > + }, > > > + }, > > > + { > > > + /* > > > + * Used in Samsung GT-S7710 "Skomer" > > > + * Data from vendor boardfile board-skomer-[bm|battery].c > > > + */ > > > + .compatible = "samsung,eb485159lu", > > > + .name = "EB485159LU", > > > + .info = { > > > + .charge_full_design_uah = 1700000, > > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > > + .factory_internal_resistance_uohm = 100000, > > > + .factory_internal_resistance_charging_uohm = 200000, > > > + .voltage_min_design_uv = 3320000, > > > + .voltage_max_design_uv = 4350000, > > > + .overvoltage_limit_uv = 4500000, > > > + .constant_charge_current_max_ua = 900000, > > > + .constant_charge_voltage_max_uv = 4340000, > > > + .charge_term_current_ua = 200000, > > > + .charge_restart_voltage_uv = 4300000, > > > + .maintenance_charge = samsung_maint_charge_table, > > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > > + .alert_low_temp_charge_current_ua = 300000, > > > + .alert_low_temp_charge_voltage_uv = 4000000, > > > + .alert_high_temp_charge_current_ua = 300000, > > > + .alert_high_temp_charge_voltage_uv = 4000000, > > > + .temp_min = -50, > > > + .temp_alert_min = 0, > > > + .temp_alert_max = 40, > > > + .temp_max = 60, > > > + .resist_table = samsung_temp2res, > > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > > + /* If you have tables for more temperatures, add them */ > > > + .ocv_temp[0] = 25, > > > + .ocv_table[0] = samsung_ocv_cap_eb485159lu, > > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb485159lu), > > > + /* CHECKME: vendor uses the 1500 mAh table, check against datasheet */ > > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb485159lu, > > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb485159lu), > > > + .vbat2ri_charging = samsung_vbat2res_charging_eb485159lu, > > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb485159lu), > > > + .bti_resistance_ohm = 2400, > > > + .bti_resistance_tolerance = 40, > > > + }, > > > + }, > > > + { > > > + /* > > > + * Used in Samsung GT-I9070 "Janice" > > > + * Data from vendor boardfile board-janice-bm.c > > > + */ > > > + .compatible = "samsung,eb535151vu", > > > + .name = "EB535151VU", > > > + .info = { > > > + .charge_full_design_uah = 1500000, > > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > > + .factory_internal_resistance_uohm = 100000, > > > + .factory_internal_resistance_charging_uohm = 200000, > > > + /* If you have data on this fix the min_design_uv */ > > > + .voltage_min_design_uv = 3300000, > > > + .voltage_max_design_uv = 4180000, > > > + .overvoltage_limit_uv = 4500000, > > > + .constant_charge_current_max_ua = 900000, > > > + .constant_charge_voltage_max_uv = 4200000, > > > + .charge_term_current_ua = 200000, > > > + .maintenance_charge = samsung_maint_charge_table, > > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > > + .alert_low_temp_charge_current_ua = 300000, > > > + .alert_low_temp_charge_voltage_uv = 4000000, > > > + .alert_high_temp_charge_current_ua = 300000, > > > + .alert_high_temp_charge_voltage_uv = 4000000, > > > + .temp_min = -5, > > > + .temp_alert_min = 0, > > > + .temp_alert_max = 40, > > > + .temp_max = 60, > > > + .resist_table = samsung_temp2res, > > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > > + /* If you have tables for more temperatures, add them */ > > > + .ocv_temp[0] = 25, > > > + .ocv_table[0] = samsung_ocv_cap_eb585157lu, > > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb535151vu), > > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb535151vu, > > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb535151vu), > > > + .vbat2ri_charging = samsung_vbat2res_charging_eb535151vu, > > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb535151vu), > > > + .bti_resistance_ohm = 1500, > > > + .bti_resistance_tolerance = 40, > > > + }, > > > + }, > > > + { > > > + /* > > > + * Used in Samsung GT-I8530 "Gavini" > > > + * Data from vendor boardfile board-gavini-bm.c > > > + */ > > > + .compatible = "samsung,eb585157lu", > > > + .name = "EB585157LU", > > > + .info = { > > > + .charge_full_design_uah = 2000000, > > > + .technology = POWER_SUPPLY_TECHNOLOGY_LION, > > > + .factory_internal_resistance_uohm = 105000, > > > + .factory_internal_resistance_charging_uohm = 160000, > > > + /* If you have data on this fix the min_design_uv */ > > > + .voltage_min_design_uv = 3300000, > > > + .voltage_max_design_uv = 4320000, > > > + .overvoltage_limit_uv = 4500000, > > > + .constant_charge_current_max_ua = 1500000, > > > + .constant_charge_voltage_max_uv = 4350000, > > > + .charge_term_current_ua = 120000, > > > + .maintenance_charge = samsung_maint_charge_table, > > > + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), > > > + .alert_low_temp_charge_current_ua = 300000, > > > + .alert_low_temp_charge_voltage_uv = 4000000, > > > + .alert_high_temp_charge_current_ua = 300000, > > > + .alert_high_temp_charge_voltage_uv = 4000000, > > > + .temp_min = -5, > > > + .temp_alert_min = 0, > > > + .temp_alert_max = 40, > > > + .temp_max = 60, > > > + .resist_table = samsung_temp2res, > > > + .resist_table_size = ARRAY_SIZE(samsung_temp2res), > > > + /* If you have tables for more temperatures, add them */ > > > + .ocv_temp[0] = 25, > > > + .ocv_table[0] = samsung_ocv_cap_eb585157lu, > > > + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb585157lu), > > > + .vbat2ri_discharging = samsung_vbat2res_discharging_eb585157lu, > > > + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb585157lu), > > > + .vbat2ri_charging = samsung_vbat2res_charging_eb585157lu, > > > + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb585157lu), > > > + .bti_resistance_ohm = 2400, > > > + .bti_resistance_tolerance = 40, > > > + }, > > > + }, > > > +}; > > > + > > > +int samsung_sdi_battery_get_info(struct device *dev, > > > + struct device_node *np, > > > + struct power_supply_battery_info **info) > > > +{ > > > + struct samsung_sdi_battery *batt; > > > + int i; > > > + > > > + for (i = 0; i < ARRAY_SIZE(samsung_sdi_batteries); i++) { > > > + batt = &samsung_sdi_batteries[i]; > > > + if (of_device_is_compatible(np, batt->compatible)) > > > + break; > > > + } > > > + > > > + if (i == ARRAY_SIZE(samsung_sdi_batteries)) > > > + return -ENODEV; > > > + > > > + *info = &batt->info; > > > + dev_info(dev, "Samsung SDI %s battery %d mAh\n", > > > + batt->name, batt->info.charge_full_design_uah / 1000); > > > + > > > + return 0; > > > +} > > > +EXPORT_SYMBOL_GPL(samsung_sdi_battery_get_info); > > > diff --git a/drivers/power/supply/samsung-sdi-battery.h b/drivers/power/supply/samsung-sdi-battery.h > > > new file mode 100644 > > > index 000000000000..08783847dfcb > > > --- /dev/null > > > +++ b/drivers/power/supply/samsung-sdi-battery.h > > > @@ -0,0 +1,13 @@ > > > +/* SPDX-License-Identifier: GPL-2.0 */ > > > +#if IS_ENABLED(CONFIG_BATTERY_SAMSUNG_SDI) > > > +extern int samsung_sdi_battery_get_info(struct device *dev, > > > + struct device_node *np, > > > + struct power_supply_battery_info **info); > > > +#else > > > +static inline int samsung_sdi_battery_get_info(struct device *dev, > > > + struct device_node *np, > > > + struct power_supply_battery_info **info) > > > +{ > > > + return -ENODEV; > > > +} > > > +#endif > > > -- > > > 2.34.1 > > >
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig index 6815e5a4c0bd..e9df4151f2e0 100644 --- a/drivers/power/supply/Kconfig +++ b/drivers/power/supply/Kconfig @@ -181,6 +181,12 @@ config BATTERY_OLPC help Say Y to enable support for the battery on the OLPC laptop. +config BATTERY_SAMSUNG_SDI + bool "Samsung SDI batteries" + help + Say Y to enable support for Samsung SDI battery data. + These batteries are used in Samsung mobile phones. + config BATTERY_TOSA tristate "Sharp SL-6000 (tosa) battery" depends on MACH_TOSA && MFD_TC6393XB && TOUCHSCREEN_WM97XX diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile index 2c1b264b2046..ebcd2f5fe26d 100644 --- a/drivers/power/supply/Makefile +++ b/drivers/power/supply/Makefile @@ -34,6 +34,7 @@ obj-$(CONFIG_BATTERY_GOLDFISH) += goldfish_battery.o obj-$(CONFIG_BATTERY_LEGO_EV3) += lego_ev3_battery.o obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o +obj-$(CONFIG_BATTERY_SAMSUNG_SDI) += samsung-sdi-battery.o obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o obj-$(CONFIG_BATTERY_COLLIE) += collie_battery.o obj-$(CONFIG_BATTERY_INGENIC) += ingenic-battery.o diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c index 1c0b1be22067..43c66214bedf 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -23,6 +23,7 @@ #include <linux/thermal.h> #include <linux/fixp-arith.h> #include "power_supply.h" +#include "samsung-sdi-battery.h" /* exported for the APM Power driver, APM emulation */ struct class *power_supply_class; @@ -573,6 +574,23 @@ int power_supply_get_battery_info(struct power_supply *psy, int err, len, index; const __be32 *list; + if (!psy->of_node) { + dev_warn(&psy->dev, "%s currently only supports devicetree\n", + __func__); + return -ENXIO; + } + + battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); + if (!battery_np) + return -ENODEV; + + /* Try static batteries first */ + err = samsung_sdi_battery_get_info(&psy->dev, battery_np, &info); + if (!err) { + *info_out = info; + return err; + } + info = devm_kmalloc(&psy->dev, sizeof(*info), GFP_KERNEL); if (!info) return -ENOMEM; @@ -612,16 +630,6 @@ int power_supply_get_battery_info(struct power_supply *psy, info->ocv_table_size[index] = -EINVAL; } - if (!psy->of_node) { - dev_warn(&psy->dev, "%s currently only supports devicetree\n", - __func__); - return -ENXIO; - } - - battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); - if (!battery_np) - return -ENODEV; - err = of_property_read_string(battery_np, "compatible", &value); if (err) goto out_put_node; diff --git a/drivers/power/supply/samsung-sdi-battery.c b/drivers/power/supply/samsung-sdi-battery.c new file mode 100644 index 000000000000..8e718f0fc2b5 --- /dev/null +++ b/drivers/power/supply/samsung-sdi-battery.c @@ -0,0 +1,919 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Battery data and characteristics for Samsung SDI (Samsung Digital Interface) + * batteries. The data is retrieved automatically into drivers using + * the power_supply_get_battery_info() call. + * + * The BTI (battery type indicator) resistance in the code drops was very + * unreliable. The resistance listed here was obtained by simply measuring + * the BTI resistance with a multimeter on the battery. + */ +#include <linux/module.h> +#include <linux/of.h> +#include <linux/power_supply.h> +#include "samsung-sdi-battery.h" + +struct samsung_sdi_battery { + char *compatible; + char *name; + struct power_supply_battery_info info; +}; + +/* + * Voltage to internal resistance tables. The internal resistance varies + * depending on the VBAT voltage, so look this up from a table. Different + * tables apply depending on whether we are charging or not. + */ + +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb_l1m7flu[] = { + { .vbat_uv = 4240000, .ri_uohm = 160000 }, + { .vbat_uv = 4210000, .ri_uohm = 179000 }, + { .vbat_uv = 4180000, .ri_uohm = 183000 }, + { .vbat_uv = 4160000, .ri_uohm = 184000 }, + { .vbat_uv = 4140000, .ri_uohm = 191000 }, + { .vbat_uv = 4120000, .ri_uohm = 204000 }, + { .vbat_uv = 4076000, .ri_uohm = 220000 }, + { .vbat_uv = 4030000, .ri_uohm = 227000 }, + { .vbat_uv = 3986000, .ri_uohm = 215000 }, + { .vbat_uv = 3916000, .ri_uohm = 221000 }, + { .vbat_uv = 3842000, .ri_uohm = 259000 }, + { .vbat_uv = 3773000, .ri_uohm = 287000 }, + { .vbat_uv = 3742000, .ri_uohm = 283000 }, + { .vbat_uv = 3709000, .ri_uohm = 277000 }, + { .vbat_uv = 3685000, .ri_uohm = 297000 }, + { .vbat_uv = 3646000, .ri_uohm = 310000 }, + { .vbat_uv = 3616000, .ri_uohm = 331000 }, + { .vbat_uv = 3602000, .ri_uohm = 370000 }, + { .vbat_uv = 3578000, .ri_uohm = 350000 }, + { .vbat_uv = 3553000, .ri_uohm = 321000 }, + { .vbat_uv = 3503000, .ri_uohm = 322000 }, + { .vbat_uv = 3400000, .ri_uohm = 269000 }, + { .vbat_uv = 3360000, .ri_uohm = 328000 }, + { .vbat_uv = 3330000, .ri_uohm = 305000 }, + { .vbat_uv = 3300000, .ri_uohm = 339000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb_l1m7flu[] = { + { .vbat_uv = 4302000, .ri_uohm = 230000 }, + { .vbat_uv = 4276000, .ri_uohm = 345000 }, + { .vbat_uv = 4227000, .ri_uohm = 345000 }, + { .vbat_uv = 4171000, .ri_uohm = 346000 }, + { .vbat_uv = 4134000, .ri_uohm = 311000 }, + { .vbat_uv = 4084000, .ri_uohm = 299000 }, + { .vbat_uv = 4052000, .ri_uohm = 316000 }, + { .vbat_uv = 4012000, .ri_uohm = 309000 }, + { .vbat_uv = 3961000, .ri_uohm = 303000 }, + { .vbat_uv = 3939000, .ri_uohm = 280000 }, + { .vbat_uv = 3904000, .ri_uohm = 261000 }, + { .vbat_uv = 3850000, .ri_uohm = 212000 }, + { .vbat_uv = 3800000, .ri_uohm = 232000 }, + { .vbat_uv = 3750000, .ri_uohm = 177000 }, + { .vbat_uv = 3712000, .ri_uohm = 164000 }, + { .vbat_uv = 3674000, .ri_uohm = 161000 }, + { .vbat_uv = 3590000, .ri_uohm = 164000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161la[] = { + { .vbat_uv = 4240000, .ri_uohm = 160000 }, + { .vbat_uv = 4210000, .ri_uohm = 179000 }, + { .vbat_uv = 4180000, .ri_uohm = 183000 }, + { .vbat_uv = 4160000, .ri_uohm = 184000 }, + { .vbat_uv = 4140000, .ri_uohm = 191000 }, + { .vbat_uv = 4120000, .ri_uohm = 204000 }, + { .vbat_uv = 4080000, .ri_uohm = 200000 }, + { .vbat_uv = 4027000, .ri_uohm = 202000 }, + { .vbat_uv = 3916000, .ri_uohm = 221000 }, + { .vbat_uv = 3842000, .ri_uohm = 259000 }, + { .vbat_uv = 3800000, .ri_uohm = 262000 }, + { .vbat_uv = 3742000, .ri_uohm = 263000 }, + { .vbat_uv = 3709000, .ri_uohm = 277000 }, + { .vbat_uv = 3685000, .ri_uohm = 312000 }, + { .vbat_uv = 3668000, .ri_uohm = 258000 }, + { .vbat_uv = 3660000, .ri_uohm = 247000 }, + { .vbat_uv = 3636000, .ri_uohm = 293000 }, + { .vbat_uv = 3616000, .ri_uohm = 331000 }, + { .vbat_uv = 3600000, .ri_uohm = 349000 }, + { .vbat_uv = 3593000, .ri_uohm = 345000 }, + { .vbat_uv = 3585000, .ri_uohm = 344000 }, + { .vbat_uv = 3572000, .ri_uohm = 336000 }, + { .vbat_uv = 3553000, .ri_uohm = 321000 }, + { .vbat_uv = 3517000, .ri_uohm = 336000 }, + { .vbat_uv = 3503000, .ri_uohm = 322000 }, + { .vbat_uv = 3400000, .ri_uohm = 269000 }, + { .vbat_uv = 3360000, .ri_uohm = 328000 }, + { .vbat_uv = 3330000, .ri_uohm = 305000 }, + { .vbat_uv = 3300000, .ri_uohm = 339000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161la[] = { + { .vbat_uv = 4345000, .ri_uohm = 230000 }, + { .vbat_uv = 4329000, .ri_uohm = 238000 }, + { .vbat_uv = 4314000, .ri_uohm = 225000 }, + { .vbat_uv = 4311000, .ri_uohm = 239000 }, + { .vbat_uv = 4294000, .ri_uohm = 235000 }, + { .vbat_uv = 4264000, .ri_uohm = 229000 }, + { .vbat_uv = 4262000, .ri_uohm = 228000 }, + { .vbat_uv = 4252000, .ri_uohm = 236000 }, + { .vbat_uv = 4244000, .ri_uohm = 234000 }, + { .vbat_uv = 4235000, .ri_uohm = 234000 }, + { .vbat_uv = 4227000, .ri_uohm = 238000 }, + { .vbat_uv = 4219000, .ri_uohm = 242000 }, + { .vbat_uv = 4212000, .ri_uohm = 239000 }, + { .vbat_uv = 4206000, .ri_uohm = 231000 }, + { .vbat_uv = 4201000, .ri_uohm = 231000 }, + { .vbat_uv = 4192000, .ri_uohm = 224000 }, + { .vbat_uv = 4184000, .ri_uohm = 238000 }, + { .vbat_uv = 4173000, .ri_uohm = 245000 }, + { .vbat_uv = 4161000, .ri_uohm = 244000 }, + { .vbat_uv = 4146000, .ri_uohm = 244000 }, + { .vbat_uv = 4127000, .ri_uohm = 228000 }, + { .vbat_uv = 4119000, .ri_uohm = 218000 }, + { .vbat_uv = 4112000, .ri_uohm = 215000 }, + { .vbat_uv = 4108000, .ri_uohm = 209000 }, + { .vbat_uv = 4102000, .ri_uohm = 214000 }, + { .vbat_uv = 4096000, .ri_uohm = 215000 }, + { .vbat_uv = 4090000, .ri_uohm = 215000 }, + { .vbat_uv = 4083000, .ri_uohm = 219000 }, + { .vbat_uv = 4078000, .ri_uohm = 208000 }, + { .vbat_uv = 4071000, .ri_uohm = 205000 }, + { .vbat_uv = 4066000, .ri_uohm = 208000 }, + { .vbat_uv = 4061000, .ri_uohm = 210000 }, + { .vbat_uv = 4055000, .ri_uohm = 212000 }, + { .vbat_uv = 4049000, .ri_uohm = 215000 }, + { .vbat_uv = 4042000, .ri_uohm = 212000 }, + { .vbat_uv = 4032000, .ri_uohm = 217000 }, + { .vbat_uv = 4027000, .ri_uohm = 220000 }, + { .vbat_uv = 4020000, .ri_uohm = 210000 }, + { .vbat_uv = 4013000, .ri_uohm = 214000 }, + { .vbat_uv = 4007000, .ri_uohm = 219000 }, + { .vbat_uv = 4003000, .ri_uohm = 229000 }, + { .vbat_uv = 3996000, .ri_uohm = 246000 }, + { .vbat_uv = 3990000, .ri_uohm = 245000 }, + { .vbat_uv = 3984000, .ri_uohm = 242000 }, + { .vbat_uv = 3977000, .ri_uohm = 236000 }, + { .vbat_uv = 3971000, .ri_uohm = 231000 }, + { .vbat_uv = 3966000, .ri_uohm = 229000 }, + { .vbat_uv = 3952000, .ri_uohm = 226000 }, + { .vbat_uv = 3946000, .ri_uohm = 222000 }, + { .vbat_uv = 3941000, .ri_uohm = 222000 }, + { .vbat_uv = 3936000, .ri_uohm = 217000 }, + { .vbat_uv = 3932000, .ri_uohm = 217000 }, + { .vbat_uv = 3928000, .ri_uohm = 212000 }, + { .vbat_uv = 3926000, .ri_uohm = 214000 }, + { .vbat_uv = 3922000, .ri_uohm = 209000 }, + { .vbat_uv = 3917000, .ri_uohm = 215000 }, + { .vbat_uv = 3914000, .ri_uohm = 212000 }, + { .vbat_uv = 3912000, .ri_uohm = 220000 }, + { .vbat_uv = 3910000, .ri_uohm = 226000 }, + { .vbat_uv = 3903000, .ri_uohm = 226000 }, + { .vbat_uv = 3891000, .ri_uohm = 222000 }, + { .vbat_uv = 3871000, .ri_uohm = 221000 }, + { .vbat_uv = 3857000, .ri_uohm = 219000 }, + { .vbat_uv = 3850000, .ri_uohm = 216000 }, + { .vbat_uv = 3843000, .ri_uohm = 212000 }, + { .vbat_uv = 3835000, .ri_uohm = 206000 }, + { .vbat_uv = 3825000, .ri_uohm = 217000 }, + { .vbat_uv = 3824000, .ri_uohm = 220000 }, + { .vbat_uv = 3820000, .ri_uohm = 237000 }, + { .vbat_uv = 3800000, .ri_uohm = 232000 }, + { .vbat_uv = 3750000, .ri_uohm = 177000 }, + { .vbat_uv = 3712000, .ri_uohm = 164000 }, + { .vbat_uv = 3674000, .ri_uohm = 161000 }, + { .vbat_uv = 3590000, .ri_uohm = 164000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161lu[] = { + { .vbat_uv = 4240000, .ri_uohm = 160000 }, + { .vbat_uv = 4210000, .ri_uohm = 179000 }, + { .vbat_uv = 4180000, .ri_uohm = 183000 }, + { .vbat_uv = 4160000, .ri_uohm = 184000 }, + { .vbat_uv = 4140000, .ri_uohm = 191000 }, + { .vbat_uv = 4120000, .ri_uohm = 204000 }, + { .vbat_uv = 4080000, .ri_uohm = 200000 }, + { .vbat_uv = 4027000, .ri_uohm = 202000 }, + { .vbat_uv = 3916000, .ri_uohm = 221000 }, + { .vbat_uv = 3842000, .ri_uohm = 259000 }, + { .vbat_uv = 3800000, .ri_uohm = 262000 }, + { .vbat_uv = 3742000, .ri_uohm = 263000 }, + { .vbat_uv = 3708000, .ri_uohm = 277000 }, + { .vbat_uv = 3684000, .ri_uohm = 272000 }, + { .vbat_uv = 3664000, .ri_uohm = 278000 }, + { .vbat_uv = 3655000, .ri_uohm = 285000 }, + { .vbat_uv = 3638000, .ri_uohm = 261000 }, + { .vbat_uv = 3624000, .ri_uohm = 259000 }, + { .vbat_uv = 3616000, .ri_uohm = 266000 }, + { .vbat_uv = 3597000, .ri_uohm = 278000 }, + { .vbat_uv = 3581000, .ri_uohm = 281000 }, + { .vbat_uv = 3560000, .ri_uohm = 287000 }, + { .vbat_uv = 3527000, .ri_uohm = 289000 }, + { .vbat_uv = 3512000, .ri_uohm = 286000 }, + { .vbat_uv = 3494000, .ri_uohm = 282000 }, + { .vbat_uv = 3400000, .ri_uohm = 269000 }, + { .vbat_uv = 3360000, .ri_uohm = 328000 }, + { .vbat_uv = 3330000, .ri_uohm = 305000 }, + { .vbat_uv = 3300000, .ri_uohm = 339000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161lu[] = { + { .vbat_uv = 4346000, .ri_uohm = 293000 }, + { .vbat_uv = 4336000, .ri_uohm = 290000 }, + { .vbat_uv = 4315000, .ri_uohm = 274000 }, + { .vbat_uv = 4310000, .ri_uohm = 264000 }, + { .vbat_uv = 4275000, .ri_uohm = 275000 }, + { .vbat_uv = 4267000, .ri_uohm = 274000 }, + { .vbat_uv = 4227000, .ri_uohm = 262000 }, + { .vbat_uv = 4186000, .ri_uohm = 282000 }, + { .vbat_uv = 4136000, .ri_uohm = 246000 }, + { .vbat_uv = 4110000, .ri_uohm = 242000 }, + { .vbat_uv = 4077000, .ri_uohm = 249000 }, + { .vbat_uv = 4049000, .ri_uohm = 238000 }, + { .vbat_uv = 4017000, .ri_uohm = 268000 }, + { .vbat_uv = 3986000, .ri_uohm = 261000 }, + { .vbat_uv = 3962000, .ri_uohm = 252000 }, + { .vbat_uv = 3940000, .ri_uohm = 235000 }, + { .vbat_uv = 3930000, .ri_uohm = 237000 }, + { .vbat_uv = 3924000, .ri_uohm = 255000 }, + { .vbat_uv = 3910000, .ri_uohm = 244000 }, + { .vbat_uv = 3889000, .ri_uohm = 231000 }, + { .vbat_uv = 3875000, .ri_uohm = 249000 }, + { .vbat_uv = 3850000, .ri_uohm = 212000 }, + { .vbat_uv = 3800000, .ri_uohm = 232000 }, + { .vbat_uv = 3750000, .ri_uohm = 177000 }, + { .vbat_uv = 3712000, .ri_uohm = 164000 }, + { .vbat_uv = 3674000, .ri_uohm = 161000 }, + { .vbat_uv = 3590000, .ri_uohm = 164000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb485159lu[] = { + { .vbat_uv = 4240000, .ri_uohm = 160000 }, + { .vbat_uv = 4210000, .ri_uohm = 179000 }, + { .vbat_uv = 4180000, .ri_uohm = 183000 }, + { .vbat_uv = 4160000, .ri_uohm = 184000 }, + { .vbat_uv = 4140000, .ri_uohm = 191000 }, + { .vbat_uv = 4120000, .ri_uohm = 204000 }, + { .vbat_uv = 4080000, .ri_uohm = 200000 }, + { .vbat_uv = 4027000, .ri_uohm = 202000 }, + { .vbat_uv = 3916000, .ri_uohm = 221000 }, + { .vbat_uv = 3842000, .ri_uohm = 259000 }, + { .vbat_uv = 3800000, .ri_uohm = 262000 }, + { .vbat_uv = 3715000, .ri_uohm = 340000 }, + { .vbat_uv = 3700000, .ri_uohm = 300000 }, + { .vbat_uv = 3682000, .ri_uohm = 233000 }, + { .vbat_uv = 3655000, .ri_uohm = 246000 }, + { .vbat_uv = 3639000, .ri_uohm = 260000 }, + { .vbat_uv = 3621000, .ri_uohm = 254000 }, + { .vbat_uv = 3583000, .ri_uohm = 266000 }, + { .vbat_uv = 3536000, .ri_uohm = 274000 }, + { .vbat_uv = 3502000, .ri_uohm = 300000 }, + { .vbat_uv = 3465000, .ri_uohm = 245000 }, + { .vbat_uv = 3438000, .ri_uohm = 225000 }, + { .vbat_uv = 3330000, .ri_uohm = 305000 }, + { .vbat_uv = 3300000, .ri_uohm = 339000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb485159lu[] = { + { .vbat_uv = 4302000, .ri_uohm = 200000 }, + { .vbat_uv = 4258000, .ri_uohm = 206000 }, + { .vbat_uv = 4200000, .ri_uohm = 231000 }, + { .vbat_uv = 4150000, .ri_uohm = 198000 }, + { .vbat_uv = 4134000, .ri_uohm = 268000 }, + { .vbat_uv = 4058000, .ri_uohm = 172000 }, + { .vbat_uv = 4003000, .ri_uohm = 227000 }, + { .vbat_uv = 3972000, .ri_uohm = 241000 }, + { .vbat_uv = 3953000, .ri_uohm = 244000 }, + { .vbat_uv = 3950000, .ri_uohm = 213000 }, + { .vbat_uv = 3900000, .ri_uohm = 225000 }, + { .vbat_uv = 3850000, .ri_uohm = 212000 }, + { .vbat_uv = 3800000, .ri_uohm = 232000 }, + { .vbat_uv = 3750000, .ri_uohm = 177000 }, + { .vbat_uv = 3712000, .ri_uohm = 164000 }, + { .vbat_uv = 3674000, .ri_uohm = 161000 }, + { .vbat_uv = 3590000, .ri_uohm = 164000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb535151vu[] = { + { .vbat_uv = 4071000, .ri_uohm = 158000 }, + { .vbat_uv = 4019000, .ri_uohm = 187000 }, + { .vbat_uv = 3951000, .ri_uohm = 191000 }, + { .vbat_uv = 3901000, .ri_uohm = 193000 }, + { .vbat_uv = 3850000, .ri_uohm = 273000 }, + { .vbat_uv = 3800000, .ri_uohm = 305000 }, + { .vbat_uv = 3750000, .ri_uohm = 205000 }, + { .vbat_uv = 3700000, .ri_uohm = 290000 }, + { .vbat_uv = 3650000, .ri_uohm = 262000 }, + { .vbat_uv = 3618000, .ri_uohm = 290000 }, + { .vbat_uv = 3505000, .ri_uohm = 235000 }, + { .vbat_uv = 3484000, .ri_uohm = 253000 }, + { .vbat_uv = 3413000, .ri_uohm = 243000 }, + { .vbat_uv = 3393000, .ri_uohm = 285000 }, + { .vbat_uv = 3361000, .ri_uohm = 281000 }, + { .vbat_uv = 3302000, .ri_uohm = 286000 }, + { .vbat_uv = 3280000, .ri_uohm = 250000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb535151vu[] = { + { .vbat_uv = 4190000, .ri_uohm = 214000 }, + { .vbat_uv = 4159000, .ri_uohm = 252000 }, + { .vbat_uv = 4121000, .ri_uohm = 245000 }, + { .vbat_uv = 4069000, .ri_uohm = 228000 }, + { .vbat_uv = 4046000, .ri_uohm = 229000 }, + { .vbat_uv = 4026000, .ri_uohm = 233000 }, + { .vbat_uv = 4007000, .ri_uohm = 240000 }, + { .vbat_uv = 3982000, .ri_uohm = 291000 }, + { .vbat_uv = 3945000, .ri_uohm = 276000 }, + { .vbat_uv = 3924000, .ri_uohm = 266000 }, + { .vbat_uv = 3910000, .ri_uohm = 258000 }, + { .vbat_uv = 3900000, .ri_uohm = 271000 }, + { .vbat_uv = 3844000, .ri_uohm = 279000 }, + { .vbat_uv = 3772000, .ri_uohm = 217000 }, + { .vbat_uv = 3673000, .ri_uohm = 208000 }, + { .vbat_uv = 3571000, .ri_uohm = 208000 }, + { .vbat_uv = 3510000, .ri_uohm = 228000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb585157lu[] = { + { .vbat_uv = 4194000, .ri_uohm = 121000 }, + { .vbat_uv = 4169000, .ri_uohm = 188000 }, + { .vbat_uv = 4136000, .ri_uohm = 173000 }, + { .vbat_uv = 4108000, .ri_uohm = 158000 }, + { .vbat_uv = 4064000, .ri_uohm = 143000 }, + { .vbat_uv = 3956000, .ri_uohm = 160000 }, + { .vbat_uv = 3847000, .ri_uohm = 262000 }, + { .vbat_uv = 3806000, .ri_uohm = 280000 }, + { .vbat_uv = 3801000, .ri_uohm = 266000 }, + { .vbat_uv = 3794000, .ri_uohm = 259000 }, + { .vbat_uv = 3785000, .ri_uohm = 234000 }, + { .vbat_uv = 3779000, .ri_uohm = 227000 }, + { .vbat_uv = 3772000, .ri_uohm = 222000 }, + { .vbat_uv = 3765000, .ri_uohm = 221000 }, + { .vbat_uv = 3759000, .ri_uohm = 216000 }, + { .vbat_uv = 3754000, .ri_uohm = 206000 }, + { .vbat_uv = 3747000, .ri_uohm = 212000 }, + { .vbat_uv = 3743000, .ri_uohm = 208000 }, + { .vbat_uv = 3737000, .ri_uohm = 212000 }, + { .vbat_uv = 3733000, .ri_uohm = 200000 }, + { .vbat_uv = 3728000, .ri_uohm = 203000 }, + { .vbat_uv = 3722000, .ri_uohm = 207000 }, + { .vbat_uv = 3719000, .ri_uohm = 208000 }, + { .vbat_uv = 3715000, .ri_uohm = 209000 }, + { .vbat_uv = 3712000, .ri_uohm = 211000 }, + { .vbat_uv = 3709000, .ri_uohm = 210000 }, + { .vbat_uv = 3704000, .ri_uohm = 216000 }, + { .vbat_uv = 3701000, .ri_uohm = 218000 }, + { .vbat_uv = 3698000, .ri_uohm = 222000 }, + { .vbat_uv = 3694000, .ri_uohm = 218000 }, + { .vbat_uv = 3692000, .ri_uohm = 215000 }, + { .vbat_uv = 3688000, .ri_uohm = 224000 }, + { .vbat_uv = 3686000, .ri_uohm = 224000 }, + { .vbat_uv = 3683000, .ri_uohm = 228000 }, + { .vbat_uv = 3681000, .ri_uohm = 228000 }, + { .vbat_uv = 3679000, .ri_uohm = 229000 }, + { .vbat_uv = 3676000, .ri_uohm = 232000 }, + { .vbat_uv = 3675000, .ri_uohm = 229000 }, + { .vbat_uv = 3673000, .ri_uohm = 229000 }, + { .vbat_uv = 3672000, .ri_uohm = 223000 }, + { .vbat_uv = 3669000, .ri_uohm = 224000 }, + { .vbat_uv = 3666000, .ri_uohm = 224000 }, + { .vbat_uv = 3663000, .ri_uohm = 221000 }, + { .vbat_uv = 3660000, .ri_uohm = 218000 }, + { .vbat_uv = 3657000, .ri_uohm = 215000 }, + { .vbat_uv = 3654000, .ri_uohm = 212000 }, + { .vbat_uv = 3649000, .ri_uohm = 215000 }, + { .vbat_uv = 3644000, .ri_uohm = 215000 }, + { .vbat_uv = 3636000, .ri_uohm = 215000 }, + { .vbat_uv = 3631000, .ri_uohm = 206000 }, + { .vbat_uv = 3623000, .ri_uohm = 205000 }, + { .vbat_uv = 3616000, .ri_uohm = 193000 }, + { .vbat_uv = 3605000, .ri_uohm = 193000 }, + { .vbat_uv = 3600000, .ri_uohm = 198000 }, + { .vbat_uv = 3597000, .ri_uohm = 198000 }, + { .vbat_uv = 3592000, .ri_uohm = 203000 }, + { .vbat_uv = 3591000, .ri_uohm = 188000 }, + { .vbat_uv = 3587000, .ri_uohm = 188000 }, + { .vbat_uv = 3583000, .ri_uohm = 177000 }, + { .vbat_uv = 3577000, .ri_uohm = 170000 }, + { .vbat_uv = 3568000, .ri_uohm = 135000 }, + { .vbat_uv = 3552000, .ri_uohm = 54000 }, + { .vbat_uv = 3526000, .ri_uohm = 130000 }, + { .vbat_uv = 3501000, .ri_uohm = 48000 }, + { .vbat_uv = 3442000, .ri_uohm = 183000 }, + { .vbat_uv = 3326000, .ri_uohm = 372000 }, + { .vbat_uv = 3161000, .ri_uohm = 452000 }, +}; + +struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb585157lu[] = { + { .vbat_uv = 4360000, .ri_uohm = 128000 }, + { .vbat_uv = 4325000, .ri_uohm = 130000 }, + { .vbat_uv = 4316000, .ri_uohm = 148000 }, + { .vbat_uv = 4308000, .ri_uohm = 162000 }, + { .vbat_uv = 4301000, .ri_uohm = 162000 }, + { .vbat_uv = 4250000, .ri_uohm = 162000 }, + { .vbat_uv = 4230000, .ri_uohm = 164000 }, + { .vbat_uv = 4030000, .ri_uohm = 164000 }, + { .vbat_uv = 4000000, .ri_uohm = 193000 }, + { .vbat_uv = 3950000, .ri_uohm = 204000 }, + { .vbat_uv = 3850000, .ri_uohm = 210000 }, + { .vbat_uv = 3800000, .ri_uohm = 230000 }, + { .vbat_uv = 3790000, .ri_uohm = 240000 }, + { .vbat_uv = 3780000, .ri_uohm = 311000 }, + { .vbat_uv = 3760000, .ri_uohm = 420000 }, + { .vbat_uv = 3700000, .ri_uohm = 504000 }, + { .vbat_uv = 3600000, .ri_uohm = 565000 }, +}; + +/* + * Temperature to internal resistance scaling tables. + * + * "resistance" is the percentage of the resistance determined from the voltage + * so this represents the capacity ratio at different temperatures. + * + * FIXME: the proper table is missing: Samsung does not provide the necessary + * temperature compensation tables so we just state 100% for every temperature. + * If you have the datasheets, please provide these tables. + */ +static struct power_supply_resistance_temp_table samsung_temp2res[] = { + { .temp = 50, .resistance = 100 }, + { .temp = 40, .resistance = 100 }, + { .temp = 30, .resistance = 100 }, + { .temp = 20, .resistance = 100 }, + { .temp = 10, .resistance = 100 }, + { .temp = 00, .resistance = 100 }, + { .temp = -10, .resistance = 100 }, + { .temp = -20, .resistance = 100 }, +}; + +/* + * Capacity tables for different Open Circuit Voltages (OCV). + * These must be sorted by falling OCV value. + */ + +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb485159lu[] = { + { .ocv = 4330000, .capacity = 100}, + { .ocv = 4320000, .capacity = 99}, + { .ocv = 4283000, .capacity = 95}, + { .ocv = 4246000, .capacity = 92}, + { .ocv = 4211000, .capacity = 89}, + { .ocv = 4167000, .capacity = 85}, + { .ocv = 4146000, .capacity = 83}, + { .ocv = 4124000, .capacity = 81}, + { .ocv = 4062000, .capacity = 75}, + { .ocv = 4013000, .capacity = 70}, + { .ocv = 3977000, .capacity = 66}, + { .ocv = 3931000, .capacity = 60}, + { .ocv = 3914000, .capacity = 58}, + { .ocv = 3901000, .capacity = 57}, + { .ocv = 3884000, .capacity = 56}, + { .ocv = 3870000, .capacity = 55}, + { .ocv = 3862000, .capacity = 54}, + { .ocv = 3854000, .capacity = 53}, + { .ocv = 3838000, .capacity = 50}, + { .ocv = 3823000, .capacity = 47}, + { .ocv = 3813000, .capacity = 45}, + { .ocv = 3807000, .capacity = 43}, + { .ocv = 3800000, .capacity = 41}, + { .ocv = 3795000, .capacity = 40}, + { .ocv = 3786000, .capacity = 37}, + { .ocv = 3783000, .capacity = 35}, + { .ocv = 3773000, .capacity = 30}, + { .ocv = 3758000, .capacity = 25}, + { .ocv = 3745000, .capacity = 22}, + { .ocv = 3738000, .capacity = 20}, + { .ocv = 3733000, .capacity = 19}, + { .ocv = 3716000, .capacity = 17}, + { .ocv = 3709000, .capacity = 16}, + { .ocv = 3698000, .capacity = 15}, + { .ocv = 3687000, .capacity = 14}, + { .ocv = 3684000, .capacity = 13}, + { .ocv = 3684000, .capacity = 12}, + { .ocv = 3678000, .capacity = 10}, + { .ocv = 3671000, .capacity = 9}, + { .ocv = 3665000, .capacity = 8}, + { .ocv = 3651000, .capacity = 7}, + { .ocv = 3634000, .capacity = 6}, + { .ocv = 3601000, .capacity = 5}, + { .ocv = 3564000, .capacity = 4}, + { .ocv = 3516000, .capacity = 3}, + { .ocv = 3456000, .capacity = 2}, + { .ocv = 3381000, .capacity = 1}, + { .ocv = 3300000, .capacity = 0}, +}; + +/* Same capacity table is used by eb-l1m7flu, eb425161la, eb425161lu */ +static struct power_supply_battery_ocv_table samsung_ocv_cap_1500mah[] = { + { .ocv = 4328000, .capacity = 100}, + { .ocv = 4299000, .capacity = 99}, + { .ocv = 4281000, .capacity = 98}, + { .ocv = 4241000, .capacity = 95}, + { .ocv = 4183000, .capacity = 90}, + { .ocv = 4150000, .capacity = 87}, + { .ocv = 4116000, .capacity = 84}, + { .ocv = 4077000, .capacity = 80}, + { .ocv = 4068000, .capacity = 79}, + { .ocv = 4058000, .capacity = 77}, + { .ocv = 4026000, .capacity = 75}, + { .ocv = 3987000, .capacity = 72}, + { .ocv = 3974000, .capacity = 69}, + { .ocv = 3953000, .capacity = 66}, + { .ocv = 3933000, .capacity = 63}, + { .ocv = 3911000, .capacity = 60}, + { .ocv = 3900000, .capacity = 58}, + { .ocv = 3873000, .capacity = 55}, + { .ocv = 3842000, .capacity = 52}, + { .ocv = 3829000, .capacity = 50}, + { .ocv = 3810000, .capacity = 45}, + { .ocv = 3793000, .capacity = 40}, + { .ocv = 3783000, .capacity = 35}, + { .ocv = 3776000, .capacity = 30}, + { .ocv = 3762000, .capacity = 25}, + { .ocv = 3746000, .capacity = 20}, + { .ocv = 3739000, .capacity = 18}, + { .ocv = 3715000, .capacity = 15}, + { .ocv = 3700000, .capacity = 12}, + { .ocv = 3690000, .capacity = 10}, + { .ocv = 3680000, .capacity = 9}, + { .ocv = 3670000, .capacity = 7}, + { .ocv = 3656000, .capacity = 5}, + { .ocv = 3634000, .capacity = 4}, + { .ocv = 3614000, .capacity = 3}, + { .ocv = 3551000, .capacity = 2}, + { .ocv = 3458000, .capacity = 1}, + { .ocv = 3300000, .capacity = 0}, +}; + +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb535151vu[] = { + { .ocv = 4178000, .capacity = 100}, + { .ocv = 4148000, .capacity = 99}, + { .ocv = 4105000, .capacity = 95}, + { .ocv = 4078000, .capacity = 92}, + { .ocv = 4057000, .capacity = 89}, + { .ocv = 4013000, .capacity = 85}, + { .ocv = 3988000, .capacity = 82}, + { .ocv = 3962000, .capacity = 77}, + { .ocv = 3920000, .capacity = 70}, + { .ocv = 3891000, .capacity = 65}, + { .ocv = 3874000, .capacity = 62}, + { .ocv = 3839000, .capacity = 59}, + { .ocv = 3816000, .capacity = 55}, + { .ocv = 3798000, .capacity = 50}, + { .ocv = 3778000, .capacity = 40}, + { .ocv = 3764000, .capacity = 30}, + { .ocv = 3743000, .capacity = 25}, + { .ocv = 3711000, .capacity = 20}, + { .ocv = 3691000, .capacity = 18}, + { .ocv = 3685000, .capacity = 15}, + { .ocv = 3680000, .capacity = 12}, + { .ocv = 3662000, .capacity = 10}, + { .ocv = 3638000, .capacity = 9}, + { .ocv = 3593000, .capacity = 7}, + { .ocv = 3566000, .capacity = 6}, + { .ocv = 3497000, .capacity = 4}, + { .ocv = 3405000, .capacity = 2}, + { .ocv = 3352000, .capacity = 1}, + { .ocv = 3300000, .capacity = 0}, +}; + +static struct power_supply_battery_ocv_table samsung_ocv_cap_eb585157lu[] = { + { .ocv = 4320000, .capacity = 100}, + { .ocv = 4296000, .capacity = 99}, + { .ocv = 4283000, .capacity = 98}, + { .ocv = 4245000, .capacity = 95}, + { .ocv = 4185000, .capacity = 90}, + { .ocv = 4152000, .capacity = 87}, + { .ocv = 4119000, .capacity = 84}, + { .ocv = 4077000, .capacity = 80}, + { .ocv = 4057000, .capacity = 78}, + { .ocv = 4048000, .capacity = 77}, + { .ocv = 4020000, .capacity = 74}, + { .ocv = 4003000, .capacity = 72}, + { .ocv = 3978000, .capacity = 69}, + { .ocv = 3955000, .capacity = 66}, + { .ocv = 3934000, .capacity = 63}, + { .ocv = 3912000, .capacity = 60}, + { .ocv = 3894000, .capacity = 58}, + { .ocv = 3860000, .capacity = 55}, + { .ocv = 3837000, .capacity = 52}, + { .ocv = 3827000, .capacity = 50}, + { .ocv = 3806000, .capacity = 45}, + { .ocv = 3791000, .capacity = 40}, + { .ocv = 3779000, .capacity = 35}, + { .ocv = 3770000, .capacity = 30}, + { .ocv = 3758000, .capacity = 25}, + { .ocv = 3739000, .capacity = 20}, + { .ocv = 3730000, .capacity = 18}, + { .ocv = 3706000, .capacity = 15}, + { .ocv = 3684000, .capacity = 13}, + { .ocv = 3675000, .capacity = 10}, + { .ocv = 3673000, .capacity = 9}, + { .ocv = 3665000, .capacity = 7}, + { .ocv = 3649000, .capacity = 5}, + { .ocv = 3628000, .capacity = 4}, + { .ocv = 3585000, .capacity = 3}, + { .ocv = 3525000, .capacity = 2}, + { .ocv = 3441000, .capacity = 1}, + { .ocv = 3300000, .capacity = 0}, +}; + +struct power_supply_maintenance_charge_table samsung_maint_charge_table[] = { + { + /* Maintenance charging phase A, 60 hours */ + .charge_current_max_ua = 600000, + .charge_voltage_max_uv = 4150000, + .charge_safety_timer_minutes = 60*60, + }, + { + /* Maintenance charging phase B, 200 hours */ + .charge_current_max_ua = 600000, + .charge_voltage_max_uv = 4100000, + .charge_safety_timer_minutes = 200*60, + } +}; + +struct samsung_sdi_battery samsung_sdi_batteries[] = { + { + /* + * Used in Samsung GT-I8190 "Golden" + * Data from vendor boardfile board-golden-[bm|battery].c + */ + .compatible = "samsung,eb-l1m7flu", + .name = "EB-L1M7FLU", + .info = { + .charge_full_design_uah = 1500000, + .technology = POWER_SUPPLY_TECHNOLOGY_LION, + .factory_internal_resistance_uohm = 100000, + .factory_internal_resistance_charging_uohm = 200000, + /* If you have data on this fix the min_design_uv */ + .voltage_min_design_uv = 3320000, + .voltage_max_design_uv = 4340000, + .overvoltage_limit_uv = 4500000, + .constant_charge_current_max_ua = 900000, + .constant_charge_voltage_max_uv = 4320000, + .charge_term_current_ua = 200000, + .charge_restart_voltage_uv = 4300000, + .maintenance_charge = samsung_maint_charge_table, + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), + .alert_low_temp_charge_current_ua = 300000, + .alert_low_temp_charge_voltage_uv = 4000000, + .alert_high_temp_charge_current_ua = 300000, + .alert_high_temp_charge_voltage_uv = 4000000, + .temp_min = -50, + .temp_alert_min = 0, + .temp_alert_max = 40, + .temp_max = 60, + .resist_table = samsung_temp2res, + .resist_table_size = ARRAY_SIZE(samsung_temp2res), + /* If you have tables for more temperatures, add them */ + .ocv_temp[0] = 25, + .ocv_table[0] = samsung_ocv_cap_1500mah, + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), + .vbat2ri_discharging = samsung_vbat2res_discharging_eb_l1m7flu, + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb_l1m7flu), + .vbat2ri_charging = samsung_vbat2res_charging_eb_l1m7flu, + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb_l1m7flu), + .bti_resistance_ohm = 2400, + .bti_resistance_tolerance = 40, + }, + }, + { + /* + * Used in Samsung SGH-T599 "Codina TMO" and SGH-I407 "Kyle" + * Data from vendor boardfile board-kyle-[bm|battery].c + */ + .compatible = "samsung,eb425161la", + .name = "EB425161LA", + .info = { + .charge_full_design_uah = 1500000, + .technology = POWER_SUPPLY_TECHNOLOGY_LION, + .factory_internal_resistance_uohm = 136000, + .factory_internal_resistance_charging_uohm = 200000, + /* If you have data on this fix the min_design_uv */ + .voltage_min_design_uv = 3320000, + .voltage_max_design_uv = 4340000, + .overvoltage_limit_uv = 4500000, + .constant_charge_current_max_ua = 900000, + .constant_charge_voltage_max_uv = 4320000, + .charge_term_current_ua = 200000, + .charge_restart_voltage_uv = 4270000, + .maintenance_charge = samsung_maint_charge_table, + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), + .alert_low_temp_charge_current_ua = 300000, + .alert_low_temp_charge_voltage_uv = 4000000, + .alert_high_temp_charge_current_ua = 300000, + .alert_high_temp_charge_voltage_uv = 4000000, + .temp_min = -30, + .temp_alert_min = 0, + .temp_alert_max = 40, + .temp_max = 47, + .resist_table = samsung_temp2res, + .resist_table_size = ARRAY_SIZE(samsung_temp2res), + /* If you have tables for more temperatures, add them */ + .ocv_temp[0] = 25, + .ocv_table[0] = samsung_ocv_cap_1500mah, + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161la, + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161la), + .vbat2ri_charging = samsung_vbat2res_charging_eb425161la, + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161la), + .bti_resistance_ohm = 2400, + .bti_resistance_tolerance = 40, + }, + }, + { + /* + * Used in Samsung GT-I8160 "Codina" + * Data from vendor boardfile board-codina-[bm|battery].c + */ + .compatible = "samsung,eb425161lu", + .name = "EB425161LU", + .info = { + .charge_full_design_uah = 1500000, + .technology = POWER_SUPPLY_TECHNOLOGY_LION, + .factory_internal_resistance_uohm = 100000, + .factory_internal_resistance_charging_uohm = 200000, + /* If you have data on this fix the min_design_uv */ + .voltage_min_design_uv = 3320000, + .voltage_max_design_uv = 4350000, + .overvoltage_limit_uv = 4500000, + .constant_charge_current_max_ua = 900000, + .constant_charge_voltage_max_uv = 4340000, + .charge_term_current_ua = 200000, + .charge_restart_voltage_uv = 4280000, + .maintenance_charge = samsung_maint_charge_table, + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), + .alert_low_temp_charge_current_ua = 300000, + .alert_low_temp_charge_voltage_uv = 4000000, + .alert_high_temp_charge_current_ua = 300000, + .alert_high_temp_charge_voltage_uv = 4000000, + .temp_min = -50, + .temp_alert_min = 0, + .temp_alert_max = 43, + .temp_max = 49, + .resist_table = samsung_temp2res, + .resist_table_size = ARRAY_SIZE(samsung_temp2res), + /* If you have tables for more temperatures, add them */ + .ocv_temp[0] = 25, + .ocv_table[0] = samsung_ocv_cap_1500mah, + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161lu, + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161lu), + .vbat2ri_charging = samsung_vbat2res_charging_eb425161lu, + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161lu), + .bti_resistance_ohm = 2400, + .bti_resistance_tolerance = 40, + }, + }, + { + /* + * Used in Samsung GT-S7710 "Skomer" + * Data from vendor boardfile board-skomer-[bm|battery].c + */ + .compatible = "samsung,eb485159lu", + .name = "EB485159LU", + .info = { + .charge_full_design_uah = 1700000, + .technology = POWER_SUPPLY_TECHNOLOGY_LION, + .factory_internal_resistance_uohm = 100000, + .factory_internal_resistance_charging_uohm = 200000, + .voltage_min_design_uv = 3320000, + .voltage_max_design_uv = 4350000, + .overvoltage_limit_uv = 4500000, + .constant_charge_current_max_ua = 900000, + .constant_charge_voltage_max_uv = 4340000, + .charge_term_current_ua = 200000, + .charge_restart_voltage_uv = 4300000, + .maintenance_charge = samsung_maint_charge_table, + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), + .alert_low_temp_charge_current_ua = 300000, + .alert_low_temp_charge_voltage_uv = 4000000, + .alert_high_temp_charge_current_ua = 300000, + .alert_high_temp_charge_voltage_uv = 4000000, + .temp_min = -50, + .temp_alert_min = 0, + .temp_alert_max = 40, + .temp_max = 60, + .resist_table = samsung_temp2res, + .resist_table_size = ARRAY_SIZE(samsung_temp2res), + /* If you have tables for more temperatures, add them */ + .ocv_temp[0] = 25, + .ocv_table[0] = samsung_ocv_cap_eb485159lu, + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb485159lu), + /* CHECKME: vendor uses the 1500 mAh table, check against datasheet */ + .vbat2ri_discharging = samsung_vbat2res_discharging_eb485159lu, + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb485159lu), + .vbat2ri_charging = samsung_vbat2res_charging_eb485159lu, + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb485159lu), + .bti_resistance_ohm = 2400, + .bti_resistance_tolerance = 40, + }, + }, + { + /* + * Used in Samsung GT-I9070 "Janice" + * Data from vendor boardfile board-janice-bm.c + */ + .compatible = "samsung,eb535151vu", + .name = "EB535151VU", + .info = { + .charge_full_design_uah = 1500000, + .technology = POWER_SUPPLY_TECHNOLOGY_LION, + .factory_internal_resistance_uohm = 100000, + .factory_internal_resistance_charging_uohm = 200000, + /* If you have data on this fix the min_design_uv */ + .voltage_min_design_uv = 3300000, + .voltage_max_design_uv = 4180000, + .overvoltage_limit_uv = 4500000, + .constant_charge_current_max_ua = 900000, + .constant_charge_voltage_max_uv = 4200000, + .charge_term_current_ua = 200000, + .maintenance_charge = samsung_maint_charge_table, + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), + .alert_low_temp_charge_current_ua = 300000, + .alert_low_temp_charge_voltage_uv = 4000000, + .alert_high_temp_charge_current_ua = 300000, + .alert_high_temp_charge_voltage_uv = 4000000, + .temp_min = -5, + .temp_alert_min = 0, + .temp_alert_max = 40, + .temp_max = 60, + .resist_table = samsung_temp2res, + .resist_table_size = ARRAY_SIZE(samsung_temp2res), + /* If you have tables for more temperatures, add them */ + .ocv_temp[0] = 25, + .ocv_table[0] = samsung_ocv_cap_eb585157lu, + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb535151vu), + .vbat2ri_discharging = samsung_vbat2res_discharging_eb535151vu, + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb535151vu), + .vbat2ri_charging = samsung_vbat2res_charging_eb535151vu, + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb535151vu), + .bti_resistance_ohm = 1500, + .bti_resistance_tolerance = 40, + }, + }, + { + /* + * Used in Samsung GT-I8530 "Gavini" + * Data from vendor boardfile board-gavini-bm.c + */ + .compatible = "samsung,eb585157lu", + .name = "EB585157LU", + .info = { + .charge_full_design_uah = 2000000, + .technology = POWER_SUPPLY_TECHNOLOGY_LION, + .factory_internal_resistance_uohm = 105000, + .factory_internal_resistance_charging_uohm = 160000, + /* If you have data on this fix the min_design_uv */ + .voltage_min_design_uv = 3300000, + .voltage_max_design_uv = 4320000, + .overvoltage_limit_uv = 4500000, + .constant_charge_current_max_ua = 1500000, + .constant_charge_voltage_max_uv = 4350000, + .charge_term_current_ua = 120000, + .maintenance_charge = samsung_maint_charge_table, + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), + .alert_low_temp_charge_current_ua = 300000, + .alert_low_temp_charge_voltage_uv = 4000000, + .alert_high_temp_charge_current_ua = 300000, + .alert_high_temp_charge_voltage_uv = 4000000, + .temp_min = -5, + .temp_alert_min = 0, + .temp_alert_max = 40, + .temp_max = 60, + .resist_table = samsung_temp2res, + .resist_table_size = ARRAY_SIZE(samsung_temp2res), + /* If you have tables for more temperatures, add them */ + .ocv_temp[0] = 25, + .ocv_table[0] = samsung_ocv_cap_eb585157lu, + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb585157lu), + .vbat2ri_discharging = samsung_vbat2res_discharging_eb585157lu, + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb585157lu), + .vbat2ri_charging = samsung_vbat2res_charging_eb585157lu, + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb585157lu), + .bti_resistance_ohm = 2400, + .bti_resistance_tolerance = 40, + }, + }, +}; + +int samsung_sdi_battery_get_info(struct device *dev, + struct device_node *np, + struct power_supply_battery_info **info) +{ + struct samsung_sdi_battery *batt; + int i; + + for (i = 0; i < ARRAY_SIZE(samsung_sdi_batteries); i++) { + batt = &samsung_sdi_batteries[i]; + if (of_device_is_compatible(np, batt->compatible)) + break; + } + + if (i == ARRAY_SIZE(samsung_sdi_batteries)) + return -ENODEV; + + *info = &batt->info; + dev_info(dev, "Samsung SDI %s battery %d mAh\n", + batt->name, batt->info.charge_full_design_uah / 1000); + + return 0; +} +EXPORT_SYMBOL_GPL(samsung_sdi_battery_get_info); diff --git a/drivers/power/supply/samsung-sdi-battery.h b/drivers/power/supply/samsung-sdi-battery.h new file mode 100644 index 000000000000..08783847dfcb --- /dev/null +++ b/drivers/power/supply/samsung-sdi-battery.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#if IS_ENABLED(CONFIG_BATTERY_SAMSUNG_SDI) +extern int samsung_sdi_battery_get_info(struct device *dev, + struct device_node *np, + struct power_supply_battery_info **info); +#else +static inline int samsung_sdi_battery_get_info(struct device *dev, + struct device_node *np, + struct power_supply_battery_info **info) +{ + return -ENODEV; +} +#endif
If we detect a Samsung SDI battery, we return a static struct power_supply_battery_info and avoid looking further. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- ChangeLog v2->v3: - Fix a whole bunch of tables after realizing that completely different battery data was used if CONFIG_SAMSUNG_BATTERY was set for Golden, Kyle, Codina and Skomer. ChangeLog v1->v2: - Bump tolerance to 40% on all BTI resistances - Change config option to bool, as we are calling OUT from the supply core this cannot be compiled into a module - Augment data to support low/high temperature charge current and voltages. Sadly the vendor tree just provide one and the same current and voltage for all of these. --- drivers/power/supply/Kconfig | 6 + drivers/power/supply/Makefile | 1 + drivers/power/supply/power_supply_core.c | 28 +- drivers/power/supply/samsung-sdi-battery.c | 919 +++++++++++++++++++++ drivers/power/supply/samsung-sdi-battery.h | 13 + 5 files changed, 957 insertions(+), 10 deletions(-) create mode 100644 drivers/power/supply/samsung-sdi-battery.c create mode 100644 drivers/power/supply/samsung-sdi-battery.h