Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

power: supply: Static data for Samsung batteries

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>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>

authored by

Linus Walleij and committed by
Sebastian Reichel
c8aee3f4 bc5d4a24

+974 -27
+6
drivers/power/supply/Kconfig
··· 181 181 help 182 182 Say Y to enable support for the battery on the OLPC laptop. 183 183 184 + config BATTERY_SAMSUNG_SDI 185 + bool "Samsung SDI batteries" 186 + help 187 + Say Y to enable support for Samsung SDI battery data. 188 + These batteries are used in Samsung mobile phones. 189 + 184 190 config BATTERY_TOSA 185 191 tristate "Sharp SL-6000 (tosa) battery" 186 192 depends on MACH_TOSA && MFD_TC6393XB && TOUCHSCREEN_WM97XX
+1
drivers/power/supply/Makefile
··· 34 34 obj-$(CONFIG_BATTERY_LEGO_EV3) += lego_ev3_battery.o 35 35 obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o 36 36 obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o 37 + obj-$(CONFIG_BATTERY_SAMSUNG_SDI) += samsung-sdi-battery.o 37 38 obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o 38 39 obj-$(CONFIG_BATTERY_COLLIE) += collie_battery.o 39 40 obj-$(CONFIG_BATTERY_INGENIC) += ingenic-battery.o
+36 -27
drivers/power/supply/power_supply_core.c
··· 23 23 #include <linux/thermal.h> 24 24 #include <linux/fixp-arith.h> 25 25 #include "power_supply.h" 26 + #include "samsung-sdi-battery.h" 26 27 27 28 /* exported for the APM Power driver, APM emulation */ 28 29 struct class *power_supply_class; ··· 579 578 const __be32 *list; 580 579 u32 min_max[2]; 581 580 581 + if (psy->of_node) { 582 + battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); 583 + if (!battery_np) 584 + return -ENODEV; 585 + 586 + fwnode = fwnode_handle_get(of_fwnode_handle(battery_np)); 587 + } else { 588 + err = fwnode_property_get_reference_args( 589 + dev_fwnode(psy->dev.parent), 590 + "monitored-battery", NULL, 0, 0, &args); 591 + if (err) 592 + return err; 593 + 594 + fwnode = args.fwnode; 595 + } 596 + 597 + err = fwnode_property_read_string(fwnode, "compatible", &value); 598 + if (err) 599 + goto out_put_node; 600 + 601 + 602 + /* Try static batteries first */ 603 + err = samsung_sdi_battery_get_info(&psy->dev, value, &info); 604 + if (!err) 605 + goto out_ret_pointer; 606 + 607 + if (strcmp("simple-battery", value)) { 608 + err = -ENODEV; 609 + goto out_put_node; 610 + } 611 + 582 612 info = devm_kmalloc(&psy->dev, sizeof(*info), GFP_KERNEL); 583 - if (!info) 584 - return -ENOMEM; 613 + if (!info) { 614 + err = -ENOMEM; 615 + goto out_put_node; 616 + } 585 617 586 618 info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; 587 619 info->energy_full_design_uwh = -EINVAL; ··· 649 615 info->ocv_table[index] = NULL; 650 616 info->ocv_temp[index] = -EINVAL; 651 617 info->ocv_table_size[index] = -EINVAL; 652 - } 653 - 654 - if (psy->of_node) { 655 - battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); 656 - if (!battery_np) 657 - return -ENODEV; 658 - 659 - fwnode = fwnode_handle_get(of_fwnode_handle(battery_np)); 660 - } else { 661 - err = fwnode_property_get_reference_args( 662 - dev_fwnode(psy->dev.parent), 663 - "monitored-battery", NULL, 0, 0, &args); 664 - if (err) 665 - return err; 666 - 667 - fwnode = args.fwnode; 668 - } 669 - 670 - err = fwnode_property_read_string(fwnode, "compatible", &value); 671 - if (err) 672 - goto out_put_node; 673 - 674 - if (strcmp("simple-battery", value)) { 675 - err = -ENODEV; 676 - goto out_put_node; 677 618 } 678 619 679 620 /* The property and field names below must correspond to elements
+918
drivers/power/supply/samsung-sdi-battery.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + /* 4 + * Battery data and characteristics for Samsung SDI (Samsung Digital Interface) 5 + * batteries. The data is retrieved automatically into drivers using 6 + * the power_supply_get_battery_info() call. 7 + * 8 + * The BTI (battery type indicator) resistance in the code drops was very 9 + * unreliable. The resistance listed here was obtained by simply measuring 10 + * the BTI resistance with a multimeter on the battery. 11 + */ 12 + #include <linux/module.h> 13 + #include <linux/power_supply.h> 14 + #include "samsung-sdi-battery.h" 15 + 16 + struct samsung_sdi_battery { 17 + char *compatible; 18 + char *name; 19 + struct power_supply_battery_info info; 20 + }; 21 + 22 + /* 23 + * Voltage to internal resistance tables. The internal resistance varies 24 + * depending on the VBAT voltage, so look this up from a table. Different 25 + * tables apply depending on whether we are charging or not. 26 + */ 27 + 28 + static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb_l1m7flu[] = { 29 + { .vbat_uv = 4240000, .ri_uohm = 160000 }, 30 + { .vbat_uv = 4210000, .ri_uohm = 179000 }, 31 + { .vbat_uv = 4180000, .ri_uohm = 183000 }, 32 + { .vbat_uv = 4160000, .ri_uohm = 184000 }, 33 + { .vbat_uv = 4140000, .ri_uohm = 191000 }, 34 + { .vbat_uv = 4120000, .ri_uohm = 204000 }, 35 + { .vbat_uv = 4076000, .ri_uohm = 220000 }, 36 + { .vbat_uv = 4030000, .ri_uohm = 227000 }, 37 + { .vbat_uv = 3986000, .ri_uohm = 215000 }, 38 + { .vbat_uv = 3916000, .ri_uohm = 221000 }, 39 + { .vbat_uv = 3842000, .ri_uohm = 259000 }, 40 + { .vbat_uv = 3773000, .ri_uohm = 287000 }, 41 + { .vbat_uv = 3742000, .ri_uohm = 283000 }, 42 + { .vbat_uv = 3709000, .ri_uohm = 277000 }, 43 + { .vbat_uv = 3685000, .ri_uohm = 297000 }, 44 + { .vbat_uv = 3646000, .ri_uohm = 310000 }, 45 + { .vbat_uv = 3616000, .ri_uohm = 331000 }, 46 + { .vbat_uv = 3602000, .ri_uohm = 370000 }, 47 + { .vbat_uv = 3578000, .ri_uohm = 350000 }, 48 + { .vbat_uv = 3553000, .ri_uohm = 321000 }, 49 + { .vbat_uv = 3503000, .ri_uohm = 322000 }, 50 + { .vbat_uv = 3400000, .ri_uohm = 269000 }, 51 + { .vbat_uv = 3360000, .ri_uohm = 328000 }, 52 + { .vbat_uv = 3330000, .ri_uohm = 305000 }, 53 + { .vbat_uv = 3300000, .ri_uohm = 339000 }, 54 + }; 55 + 56 + static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb_l1m7flu[] = { 57 + { .vbat_uv = 4302000, .ri_uohm = 230000 }, 58 + { .vbat_uv = 4276000, .ri_uohm = 345000 }, 59 + { .vbat_uv = 4227000, .ri_uohm = 345000 }, 60 + { .vbat_uv = 4171000, .ri_uohm = 346000 }, 61 + { .vbat_uv = 4134000, .ri_uohm = 311000 }, 62 + { .vbat_uv = 4084000, .ri_uohm = 299000 }, 63 + { .vbat_uv = 4052000, .ri_uohm = 316000 }, 64 + { .vbat_uv = 4012000, .ri_uohm = 309000 }, 65 + { .vbat_uv = 3961000, .ri_uohm = 303000 }, 66 + { .vbat_uv = 3939000, .ri_uohm = 280000 }, 67 + { .vbat_uv = 3904000, .ri_uohm = 261000 }, 68 + { .vbat_uv = 3850000, .ri_uohm = 212000 }, 69 + { .vbat_uv = 3800000, .ri_uohm = 232000 }, 70 + { .vbat_uv = 3750000, .ri_uohm = 177000 }, 71 + { .vbat_uv = 3712000, .ri_uohm = 164000 }, 72 + { .vbat_uv = 3674000, .ri_uohm = 161000 }, 73 + { .vbat_uv = 3590000, .ri_uohm = 164000 }, 74 + }; 75 + 76 + static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161la[] = { 77 + { .vbat_uv = 4240000, .ri_uohm = 160000 }, 78 + { .vbat_uv = 4210000, .ri_uohm = 179000 }, 79 + { .vbat_uv = 4180000, .ri_uohm = 183000 }, 80 + { .vbat_uv = 4160000, .ri_uohm = 184000 }, 81 + { .vbat_uv = 4140000, .ri_uohm = 191000 }, 82 + { .vbat_uv = 4120000, .ri_uohm = 204000 }, 83 + { .vbat_uv = 4080000, .ri_uohm = 200000 }, 84 + { .vbat_uv = 4027000, .ri_uohm = 202000 }, 85 + { .vbat_uv = 3916000, .ri_uohm = 221000 }, 86 + { .vbat_uv = 3842000, .ri_uohm = 259000 }, 87 + { .vbat_uv = 3800000, .ri_uohm = 262000 }, 88 + { .vbat_uv = 3742000, .ri_uohm = 263000 }, 89 + { .vbat_uv = 3709000, .ri_uohm = 277000 }, 90 + { .vbat_uv = 3685000, .ri_uohm = 312000 }, 91 + { .vbat_uv = 3668000, .ri_uohm = 258000 }, 92 + { .vbat_uv = 3660000, .ri_uohm = 247000 }, 93 + { .vbat_uv = 3636000, .ri_uohm = 293000 }, 94 + { .vbat_uv = 3616000, .ri_uohm = 331000 }, 95 + { .vbat_uv = 3600000, .ri_uohm = 349000 }, 96 + { .vbat_uv = 3593000, .ri_uohm = 345000 }, 97 + { .vbat_uv = 3585000, .ri_uohm = 344000 }, 98 + { .vbat_uv = 3572000, .ri_uohm = 336000 }, 99 + { .vbat_uv = 3553000, .ri_uohm = 321000 }, 100 + { .vbat_uv = 3517000, .ri_uohm = 336000 }, 101 + { .vbat_uv = 3503000, .ri_uohm = 322000 }, 102 + { .vbat_uv = 3400000, .ri_uohm = 269000 }, 103 + { .vbat_uv = 3360000, .ri_uohm = 328000 }, 104 + { .vbat_uv = 3330000, .ri_uohm = 305000 }, 105 + { .vbat_uv = 3300000, .ri_uohm = 339000 }, 106 + }; 107 + 108 + static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161la[] = { 109 + { .vbat_uv = 4345000, .ri_uohm = 230000 }, 110 + { .vbat_uv = 4329000, .ri_uohm = 238000 }, 111 + { .vbat_uv = 4314000, .ri_uohm = 225000 }, 112 + { .vbat_uv = 4311000, .ri_uohm = 239000 }, 113 + { .vbat_uv = 4294000, .ri_uohm = 235000 }, 114 + { .vbat_uv = 4264000, .ri_uohm = 229000 }, 115 + { .vbat_uv = 4262000, .ri_uohm = 228000 }, 116 + { .vbat_uv = 4252000, .ri_uohm = 236000 }, 117 + { .vbat_uv = 4244000, .ri_uohm = 234000 }, 118 + { .vbat_uv = 4235000, .ri_uohm = 234000 }, 119 + { .vbat_uv = 4227000, .ri_uohm = 238000 }, 120 + { .vbat_uv = 4219000, .ri_uohm = 242000 }, 121 + { .vbat_uv = 4212000, .ri_uohm = 239000 }, 122 + { .vbat_uv = 4206000, .ri_uohm = 231000 }, 123 + { .vbat_uv = 4201000, .ri_uohm = 231000 }, 124 + { .vbat_uv = 4192000, .ri_uohm = 224000 }, 125 + { .vbat_uv = 4184000, .ri_uohm = 238000 }, 126 + { .vbat_uv = 4173000, .ri_uohm = 245000 }, 127 + { .vbat_uv = 4161000, .ri_uohm = 244000 }, 128 + { .vbat_uv = 4146000, .ri_uohm = 244000 }, 129 + { .vbat_uv = 4127000, .ri_uohm = 228000 }, 130 + { .vbat_uv = 4119000, .ri_uohm = 218000 }, 131 + { .vbat_uv = 4112000, .ri_uohm = 215000 }, 132 + { .vbat_uv = 4108000, .ri_uohm = 209000 }, 133 + { .vbat_uv = 4102000, .ri_uohm = 214000 }, 134 + { .vbat_uv = 4096000, .ri_uohm = 215000 }, 135 + { .vbat_uv = 4090000, .ri_uohm = 215000 }, 136 + { .vbat_uv = 4083000, .ri_uohm = 219000 }, 137 + { .vbat_uv = 4078000, .ri_uohm = 208000 }, 138 + { .vbat_uv = 4071000, .ri_uohm = 205000 }, 139 + { .vbat_uv = 4066000, .ri_uohm = 208000 }, 140 + { .vbat_uv = 4061000, .ri_uohm = 210000 }, 141 + { .vbat_uv = 4055000, .ri_uohm = 212000 }, 142 + { .vbat_uv = 4049000, .ri_uohm = 215000 }, 143 + { .vbat_uv = 4042000, .ri_uohm = 212000 }, 144 + { .vbat_uv = 4032000, .ri_uohm = 217000 }, 145 + { .vbat_uv = 4027000, .ri_uohm = 220000 }, 146 + { .vbat_uv = 4020000, .ri_uohm = 210000 }, 147 + { .vbat_uv = 4013000, .ri_uohm = 214000 }, 148 + { .vbat_uv = 4007000, .ri_uohm = 219000 }, 149 + { .vbat_uv = 4003000, .ri_uohm = 229000 }, 150 + { .vbat_uv = 3996000, .ri_uohm = 246000 }, 151 + { .vbat_uv = 3990000, .ri_uohm = 245000 }, 152 + { .vbat_uv = 3984000, .ri_uohm = 242000 }, 153 + { .vbat_uv = 3977000, .ri_uohm = 236000 }, 154 + { .vbat_uv = 3971000, .ri_uohm = 231000 }, 155 + { .vbat_uv = 3966000, .ri_uohm = 229000 }, 156 + { .vbat_uv = 3952000, .ri_uohm = 226000 }, 157 + { .vbat_uv = 3946000, .ri_uohm = 222000 }, 158 + { .vbat_uv = 3941000, .ri_uohm = 222000 }, 159 + { .vbat_uv = 3936000, .ri_uohm = 217000 }, 160 + { .vbat_uv = 3932000, .ri_uohm = 217000 }, 161 + { .vbat_uv = 3928000, .ri_uohm = 212000 }, 162 + { .vbat_uv = 3926000, .ri_uohm = 214000 }, 163 + { .vbat_uv = 3922000, .ri_uohm = 209000 }, 164 + { .vbat_uv = 3917000, .ri_uohm = 215000 }, 165 + { .vbat_uv = 3914000, .ri_uohm = 212000 }, 166 + { .vbat_uv = 3912000, .ri_uohm = 220000 }, 167 + { .vbat_uv = 3910000, .ri_uohm = 226000 }, 168 + { .vbat_uv = 3903000, .ri_uohm = 226000 }, 169 + { .vbat_uv = 3891000, .ri_uohm = 222000 }, 170 + { .vbat_uv = 3871000, .ri_uohm = 221000 }, 171 + { .vbat_uv = 3857000, .ri_uohm = 219000 }, 172 + { .vbat_uv = 3850000, .ri_uohm = 216000 }, 173 + { .vbat_uv = 3843000, .ri_uohm = 212000 }, 174 + { .vbat_uv = 3835000, .ri_uohm = 206000 }, 175 + { .vbat_uv = 3825000, .ri_uohm = 217000 }, 176 + { .vbat_uv = 3824000, .ri_uohm = 220000 }, 177 + { .vbat_uv = 3820000, .ri_uohm = 237000 }, 178 + { .vbat_uv = 3800000, .ri_uohm = 232000 }, 179 + { .vbat_uv = 3750000, .ri_uohm = 177000 }, 180 + { .vbat_uv = 3712000, .ri_uohm = 164000 }, 181 + { .vbat_uv = 3674000, .ri_uohm = 161000 }, 182 + { .vbat_uv = 3590000, .ri_uohm = 164000 }, 183 + }; 184 + 185 + static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161lu[] = { 186 + { .vbat_uv = 4240000, .ri_uohm = 160000 }, 187 + { .vbat_uv = 4210000, .ri_uohm = 179000 }, 188 + { .vbat_uv = 4180000, .ri_uohm = 183000 }, 189 + { .vbat_uv = 4160000, .ri_uohm = 184000 }, 190 + { .vbat_uv = 4140000, .ri_uohm = 191000 }, 191 + { .vbat_uv = 4120000, .ri_uohm = 204000 }, 192 + { .vbat_uv = 4080000, .ri_uohm = 200000 }, 193 + { .vbat_uv = 4027000, .ri_uohm = 202000 }, 194 + { .vbat_uv = 3916000, .ri_uohm = 221000 }, 195 + { .vbat_uv = 3842000, .ri_uohm = 259000 }, 196 + { .vbat_uv = 3800000, .ri_uohm = 262000 }, 197 + { .vbat_uv = 3742000, .ri_uohm = 263000 }, 198 + { .vbat_uv = 3708000, .ri_uohm = 277000 }, 199 + { .vbat_uv = 3684000, .ri_uohm = 272000 }, 200 + { .vbat_uv = 3664000, .ri_uohm = 278000 }, 201 + { .vbat_uv = 3655000, .ri_uohm = 285000 }, 202 + { .vbat_uv = 3638000, .ri_uohm = 261000 }, 203 + { .vbat_uv = 3624000, .ri_uohm = 259000 }, 204 + { .vbat_uv = 3616000, .ri_uohm = 266000 }, 205 + { .vbat_uv = 3597000, .ri_uohm = 278000 }, 206 + { .vbat_uv = 3581000, .ri_uohm = 281000 }, 207 + { .vbat_uv = 3560000, .ri_uohm = 287000 }, 208 + { .vbat_uv = 3527000, .ri_uohm = 289000 }, 209 + { .vbat_uv = 3512000, .ri_uohm = 286000 }, 210 + { .vbat_uv = 3494000, .ri_uohm = 282000 }, 211 + { .vbat_uv = 3400000, .ri_uohm = 269000 }, 212 + { .vbat_uv = 3360000, .ri_uohm = 328000 }, 213 + { .vbat_uv = 3330000, .ri_uohm = 305000 }, 214 + { .vbat_uv = 3300000, .ri_uohm = 339000 }, 215 + }; 216 + 217 + static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161lu[] = { 218 + { .vbat_uv = 4346000, .ri_uohm = 293000 }, 219 + { .vbat_uv = 4336000, .ri_uohm = 290000 }, 220 + { .vbat_uv = 4315000, .ri_uohm = 274000 }, 221 + { .vbat_uv = 4310000, .ri_uohm = 264000 }, 222 + { .vbat_uv = 4275000, .ri_uohm = 275000 }, 223 + { .vbat_uv = 4267000, .ri_uohm = 274000 }, 224 + { .vbat_uv = 4227000, .ri_uohm = 262000 }, 225 + { .vbat_uv = 4186000, .ri_uohm = 282000 }, 226 + { .vbat_uv = 4136000, .ri_uohm = 246000 }, 227 + { .vbat_uv = 4110000, .ri_uohm = 242000 }, 228 + { .vbat_uv = 4077000, .ri_uohm = 249000 }, 229 + { .vbat_uv = 4049000, .ri_uohm = 238000 }, 230 + { .vbat_uv = 4017000, .ri_uohm = 268000 }, 231 + { .vbat_uv = 3986000, .ri_uohm = 261000 }, 232 + { .vbat_uv = 3962000, .ri_uohm = 252000 }, 233 + { .vbat_uv = 3940000, .ri_uohm = 235000 }, 234 + { .vbat_uv = 3930000, .ri_uohm = 237000 }, 235 + { .vbat_uv = 3924000, .ri_uohm = 255000 }, 236 + { .vbat_uv = 3910000, .ri_uohm = 244000 }, 237 + { .vbat_uv = 3889000, .ri_uohm = 231000 }, 238 + { .vbat_uv = 3875000, .ri_uohm = 249000 }, 239 + { .vbat_uv = 3850000, .ri_uohm = 212000 }, 240 + { .vbat_uv = 3800000, .ri_uohm = 232000 }, 241 + { .vbat_uv = 3750000, .ri_uohm = 177000 }, 242 + { .vbat_uv = 3712000, .ri_uohm = 164000 }, 243 + { .vbat_uv = 3674000, .ri_uohm = 161000 }, 244 + { .vbat_uv = 3590000, .ri_uohm = 164000 }, 245 + }; 246 + 247 + static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb485159lu[] = { 248 + { .vbat_uv = 4240000, .ri_uohm = 160000 }, 249 + { .vbat_uv = 4210000, .ri_uohm = 179000 }, 250 + { .vbat_uv = 4180000, .ri_uohm = 183000 }, 251 + { .vbat_uv = 4160000, .ri_uohm = 184000 }, 252 + { .vbat_uv = 4140000, .ri_uohm = 191000 }, 253 + { .vbat_uv = 4120000, .ri_uohm = 204000 }, 254 + { .vbat_uv = 4080000, .ri_uohm = 200000 }, 255 + { .vbat_uv = 4027000, .ri_uohm = 202000 }, 256 + { .vbat_uv = 3916000, .ri_uohm = 221000 }, 257 + { .vbat_uv = 3842000, .ri_uohm = 259000 }, 258 + { .vbat_uv = 3800000, .ri_uohm = 262000 }, 259 + { .vbat_uv = 3715000, .ri_uohm = 340000 }, 260 + { .vbat_uv = 3700000, .ri_uohm = 300000 }, 261 + { .vbat_uv = 3682000, .ri_uohm = 233000 }, 262 + { .vbat_uv = 3655000, .ri_uohm = 246000 }, 263 + { .vbat_uv = 3639000, .ri_uohm = 260000 }, 264 + { .vbat_uv = 3621000, .ri_uohm = 254000 }, 265 + { .vbat_uv = 3583000, .ri_uohm = 266000 }, 266 + { .vbat_uv = 3536000, .ri_uohm = 274000 }, 267 + { .vbat_uv = 3502000, .ri_uohm = 300000 }, 268 + { .vbat_uv = 3465000, .ri_uohm = 245000 }, 269 + { .vbat_uv = 3438000, .ri_uohm = 225000 }, 270 + { .vbat_uv = 3330000, .ri_uohm = 305000 }, 271 + { .vbat_uv = 3300000, .ri_uohm = 339000 }, 272 + }; 273 + 274 + static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb485159lu[] = { 275 + { .vbat_uv = 4302000, .ri_uohm = 200000 }, 276 + { .vbat_uv = 4258000, .ri_uohm = 206000 }, 277 + { .vbat_uv = 4200000, .ri_uohm = 231000 }, 278 + { .vbat_uv = 4150000, .ri_uohm = 198000 }, 279 + { .vbat_uv = 4134000, .ri_uohm = 268000 }, 280 + { .vbat_uv = 4058000, .ri_uohm = 172000 }, 281 + { .vbat_uv = 4003000, .ri_uohm = 227000 }, 282 + { .vbat_uv = 3972000, .ri_uohm = 241000 }, 283 + { .vbat_uv = 3953000, .ri_uohm = 244000 }, 284 + { .vbat_uv = 3950000, .ri_uohm = 213000 }, 285 + { .vbat_uv = 3900000, .ri_uohm = 225000 }, 286 + { .vbat_uv = 3850000, .ri_uohm = 212000 }, 287 + { .vbat_uv = 3800000, .ri_uohm = 232000 }, 288 + { .vbat_uv = 3750000, .ri_uohm = 177000 }, 289 + { .vbat_uv = 3712000, .ri_uohm = 164000 }, 290 + { .vbat_uv = 3674000, .ri_uohm = 161000 }, 291 + { .vbat_uv = 3590000, .ri_uohm = 164000 }, 292 + }; 293 + 294 + static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb535151vu[] = { 295 + { .vbat_uv = 4071000, .ri_uohm = 158000 }, 296 + { .vbat_uv = 4019000, .ri_uohm = 187000 }, 297 + { .vbat_uv = 3951000, .ri_uohm = 191000 }, 298 + { .vbat_uv = 3901000, .ri_uohm = 193000 }, 299 + { .vbat_uv = 3850000, .ri_uohm = 273000 }, 300 + { .vbat_uv = 3800000, .ri_uohm = 305000 }, 301 + { .vbat_uv = 3750000, .ri_uohm = 205000 }, 302 + { .vbat_uv = 3700000, .ri_uohm = 290000 }, 303 + { .vbat_uv = 3650000, .ri_uohm = 262000 }, 304 + { .vbat_uv = 3618000, .ri_uohm = 290000 }, 305 + { .vbat_uv = 3505000, .ri_uohm = 235000 }, 306 + { .vbat_uv = 3484000, .ri_uohm = 253000 }, 307 + { .vbat_uv = 3413000, .ri_uohm = 243000 }, 308 + { .vbat_uv = 3393000, .ri_uohm = 285000 }, 309 + { .vbat_uv = 3361000, .ri_uohm = 281000 }, 310 + { .vbat_uv = 3302000, .ri_uohm = 286000 }, 311 + { .vbat_uv = 3280000, .ri_uohm = 250000 }, 312 + }; 313 + 314 + static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb535151vu[] = { 315 + { .vbat_uv = 4190000, .ri_uohm = 214000 }, 316 + { .vbat_uv = 4159000, .ri_uohm = 252000 }, 317 + { .vbat_uv = 4121000, .ri_uohm = 245000 }, 318 + { .vbat_uv = 4069000, .ri_uohm = 228000 }, 319 + { .vbat_uv = 4046000, .ri_uohm = 229000 }, 320 + { .vbat_uv = 4026000, .ri_uohm = 233000 }, 321 + { .vbat_uv = 4007000, .ri_uohm = 240000 }, 322 + { .vbat_uv = 3982000, .ri_uohm = 291000 }, 323 + { .vbat_uv = 3945000, .ri_uohm = 276000 }, 324 + { .vbat_uv = 3924000, .ri_uohm = 266000 }, 325 + { .vbat_uv = 3910000, .ri_uohm = 258000 }, 326 + { .vbat_uv = 3900000, .ri_uohm = 271000 }, 327 + { .vbat_uv = 3844000, .ri_uohm = 279000 }, 328 + { .vbat_uv = 3772000, .ri_uohm = 217000 }, 329 + { .vbat_uv = 3673000, .ri_uohm = 208000 }, 330 + { .vbat_uv = 3571000, .ri_uohm = 208000 }, 331 + { .vbat_uv = 3510000, .ri_uohm = 228000 }, 332 + }; 333 + 334 + static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb585157lu[] = { 335 + { .vbat_uv = 4194000, .ri_uohm = 121000 }, 336 + { .vbat_uv = 4169000, .ri_uohm = 188000 }, 337 + { .vbat_uv = 4136000, .ri_uohm = 173000 }, 338 + { .vbat_uv = 4108000, .ri_uohm = 158000 }, 339 + { .vbat_uv = 4064000, .ri_uohm = 143000 }, 340 + { .vbat_uv = 3956000, .ri_uohm = 160000 }, 341 + { .vbat_uv = 3847000, .ri_uohm = 262000 }, 342 + { .vbat_uv = 3806000, .ri_uohm = 280000 }, 343 + { .vbat_uv = 3801000, .ri_uohm = 266000 }, 344 + { .vbat_uv = 3794000, .ri_uohm = 259000 }, 345 + { .vbat_uv = 3785000, .ri_uohm = 234000 }, 346 + { .vbat_uv = 3779000, .ri_uohm = 227000 }, 347 + { .vbat_uv = 3772000, .ri_uohm = 222000 }, 348 + { .vbat_uv = 3765000, .ri_uohm = 221000 }, 349 + { .vbat_uv = 3759000, .ri_uohm = 216000 }, 350 + { .vbat_uv = 3754000, .ri_uohm = 206000 }, 351 + { .vbat_uv = 3747000, .ri_uohm = 212000 }, 352 + { .vbat_uv = 3743000, .ri_uohm = 208000 }, 353 + { .vbat_uv = 3737000, .ri_uohm = 212000 }, 354 + { .vbat_uv = 3733000, .ri_uohm = 200000 }, 355 + { .vbat_uv = 3728000, .ri_uohm = 203000 }, 356 + { .vbat_uv = 3722000, .ri_uohm = 207000 }, 357 + { .vbat_uv = 3719000, .ri_uohm = 208000 }, 358 + { .vbat_uv = 3715000, .ri_uohm = 209000 }, 359 + { .vbat_uv = 3712000, .ri_uohm = 211000 }, 360 + { .vbat_uv = 3709000, .ri_uohm = 210000 }, 361 + { .vbat_uv = 3704000, .ri_uohm = 216000 }, 362 + { .vbat_uv = 3701000, .ri_uohm = 218000 }, 363 + { .vbat_uv = 3698000, .ri_uohm = 222000 }, 364 + { .vbat_uv = 3694000, .ri_uohm = 218000 }, 365 + { .vbat_uv = 3692000, .ri_uohm = 215000 }, 366 + { .vbat_uv = 3688000, .ri_uohm = 224000 }, 367 + { .vbat_uv = 3686000, .ri_uohm = 224000 }, 368 + { .vbat_uv = 3683000, .ri_uohm = 228000 }, 369 + { .vbat_uv = 3681000, .ri_uohm = 228000 }, 370 + { .vbat_uv = 3679000, .ri_uohm = 229000 }, 371 + { .vbat_uv = 3676000, .ri_uohm = 232000 }, 372 + { .vbat_uv = 3675000, .ri_uohm = 229000 }, 373 + { .vbat_uv = 3673000, .ri_uohm = 229000 }, 374 + { .vbat_uv = 3672000, .ri_uohm = 223000 }, 375 + { .vbat_uv = 3669000, .ri_uohm = 224000 }, 376 + { .vbat_uv = 3666000, .ri_uohm = 224000 }, 377 + { .vbat_uv = 3663000, .ri_uohm = 221000 }, 378 + { .vbat_uv = 3660000, .ri_uohm = 218000 }, 379 + { .vbat_uv = 3657000, .ri_uohm = 215000 }, 380 + { .vbat_uv = 3654000, .ri_uohm = 212000 }, 381 + { .vbat_uv = 3649000, .ri_uohm = 215000 }, 382 + { .vbat_uv = 3644000, .ri_uohm = 215000 }, 383 + { .vbat_uv = 3636000, .ri_uohm = 215000 }, 384 + { .vbat_uv = 3631000, .ri_uohm = 206000 }, 385 + { .vbat_uv = 3623000, .ri_uohm = 205000 }, 386 + { .vbat_uv = 3616000, .ri_uohm = 193000 }, 387 + { .vbat_uv = 3605000, .ri_uohm = 193000 }, 388 + { .vbat_uv = 3600000, .ri_uohm = 198000 }, 389 + { .vbat_uv = 3597000, .ri_uohm = 198000 }, 390 + { .vbat_uv = 3592000, .ri_uohm = 203000 }, 391 + { .vbat_uv = 3591000, .ri_uohm = 188000 }, 392 + { .vbat_uv = 3587000, .ri_uohm = 188000 }, 393 + { .vbat_uv = 3583000, .ri_uohm = 177000 }, 394 + { .vbat_uv = 3577000, .ri_uohm = 170000 }, 395 + { .vbat_uv = 3568000, .ri_uohm = 135000 }, 396 + { .vbat_uv = 3552000, .ri_uohm = 54000 }, 397 + { .vbat_uv = 3526000, .ri_uohm = 130000 }, 398 + { .vbat_uv = 3501000, .ri_uohm = 48000 }, 399 + { .vbat_uv = 3442000, .ri_uohm = 183000 }, 400 + { .vbat_uv = 3326000, .ri_uohm = 372000 }, 401 + { .vbat_uv = 3161000, .ri_uohm = 452000 }, 402 + }; 403 + 404 + static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb585157lu[] = { 405 + { .vbat_uv = 4360000, .ri_uohm = 128000 }, 406 + { .vbat_uv = 4325000, .ri_uohm = 130000 }, 407 + { .vbat_uv = 4316000, .ri_uohm = 148000 }, 408 + { .vbat_uv = 4308000, .ri_uohm = 162000 }, 409 + { .vbat_uv = 4301000, .ri_uohm = 162000 }, 410 + { .vbat_uv = 4250000, .ri_uohm = 162000 }, 411 + { .vbat_uv = 4230000, .ri_uohm = 164000 }, 412 + { .vbat_uv = 4030000, .ri_uohm = 164000 }, 413 + { .vbat_uv = 4000000, .ri_uohm = 193000 }, 414 + { .vbat_uv = 3950000, .ri_uohm = 204000 }, 415 + { .vbat_uv = 3850000, .ri_uohm = 210000 }, 416 + { .vbat_uv = 3800000, .ri_uohm = 230000 }, 417 + { .vbat_uv = 3790000, .ri_uohm = 240000 }, 418 + { .vbat_uv = 3780000, .ri_uohm = 311000 }, 419 + { .vbat_uv = 3760000, .ri_uohm = 420000 }, 420 + { .vbat_uv = 3700000, .ri_uohm = 504000 }, 421 + { .vbat_uv = 3600000, .ri_uohm = 565000 }, 422 + }; 423 + 424 + /* 425 + * Temperature to internal resistance scaling tables. 426 + * 427 + * "resistance" is the percentage of the resistance determined from the voltage 428 + * so this represents the capacity ratio at different temperatures. 429 + * 430 + * FIXME: the proper table is missing: Samsung does not provide the necessary 431 + * temperature compensation tables so we just state 100% for every temperature. 432 + * If you have the datasheets, please provide these tables. 433 + */ 434 + static struct power_supply_resistance_temp_table samsung_temp2res[] = { 435 + { .temp = 50, .resistance = 100 }, 436 + { .temp = 40, .resistance = 100 }, 437 + { .temp = 30, .resistance = 100 }, 438 + { .temp = 20, .resistance = 100 }, 439 + { .temp = 10, .resistance = 100 }, 440 + { .temp = 00, .resistance = 100 }, 441 + { .temp = -10, .resistance = 100 }, 442 + { .temp = -20, .resistance = 100 }, 443 + }; 444 + 445 + /* 446 + * Capacity tables for different Open Circuit Voltages (OCV). 447 + * These must be sorted by falling OCV value. 448 + */ 449 + 450 + static struct power_supply_battery_ocv_table samsung_ocv_cap_eb485159lu[] = { 451 + { .ocv = 4330000, .capacity = 100}, 452 + { .ocv = 4320000, .capacity = 99}, 453 + { .ocv = 4283000, .capacity = 95}, 454 + { .ocv = 4246000, .capacity = 92}, 455 + { .ocv = 4211000, .capacity = 89}, 456 + { .ocv = 4167000, .capacity = 85}, 457 + { .ocv = 4146000, .capacity = 83}, 458 + { .ocv = 4124000, .capacity = 81}, 459 + { .ocv = 4062000, .capacity = 75}, 460 + { .ocv = 4013000, .capacity = 70}, 461 + { .ocv = 3977000, .capacity = 66}, 462 + { .ocv = 3931000, .capacity = 60}, 463 + { .ocv = 3914000, .capacity = 58}, 464 + { .ocv = 3901000, .capacity = 57}, 465 + { .ocv = 3884000, .capacity = 56}, 466 + { .ocv = 3870000, .capacity = 55}, 467 + { .ocv = 3862000, .capacity = 54}, 468 + { .ocv = 3854000, .capacity = 53}, 469 + { .ocv = 3838000, .capacity = 50}, 470 + { .ocv = 3823000, .capacity = 47}, 471 + { .ocv = 3813000, .capacity = 45}, 472 + { .ocv = 3807000, .capacity = 43}, 473 + { .ocv = 3800000, .capacity = 41}, 474 + { .ocv = 3795000, .capacity = 40}, 475 + { .ocv = 3786000, .capacity = 37}, 476 + { .ocv = 3783000, .capacity = 35}, 477 + { .ocv = 3773000, .capacity = 30}, 478 + { .ocv = 3758000, .capacity = 25}, 479 + { .ocv = 3745000, .capacity = 22}, 480 + { .ocv = 3738000, .capacity = 20}, 481 + { .ocv = 3733000, .capacity = 19}, 482 + { .ocv = 3716000, .capacity = 17}, 483 + { .ocv = 3709000, .capacity = 16}, 484 + { .ocv = 3698000, .capacity = 15}, 485 + { .ocv = 3687000, .capacity = 14}, 486 + { .ocv = 3684000, .capacity = 13}, 487 + { .ocv = 3684000, .capacity = 12}, 488 + { .ocv = 3678000, .capacity = 10}, 489 + { .ocv = 3671000, .capacity = 9}, 490 + { .ocv = 3665000, .capacity = 8}, 491 + { .ocv = 3651000, .capacity = 7}, 492 + { .ocv = 3634000, .capacity = 6}, 493 + { .ocv = 3601000, .capacity = 5}, 494 + { .ocv = 3564000, .capacity = 4}, 495 + { .ocv = 3516000, .capacity = 3}, 496 + { .ocv = 3456000, .capacity = 2}, 497 + { .ocv = 3381000, .capacity = 1}, 498 + { .ocv = 3300000, .capacity = 0}, 499 + }; 500 + 501 + /* Same capacity table is used by eb-l1m7flu, eb425161la, eb425161lu */ 502 + static struct power_supply_battery_ocv_table samsung_ocv_cap_1500mah[] = { 503 + { .ocv = 4328000, .capacity = 100}, 504 + { .ocv = 4299000, .capacity = 99}, 505 + { .ocv = 4281000, .capacity = 98}, 506 + { .ocv = 4241000, .capacity = 95}, 507 + { .ocv = 4183000, .capacity = 90}, 508 + { .ocv = 4150000, .capacity = 87}, 509 + { .ocv = 4116000, .capacity = 84}, 510 + { .ocv = 4077000, .capacity = 80}, 511 + { .ocv = 4068000, .capacity = 79}, 512 + { .ocv = 4058000, .capacity = 77}, 513 + { .ocv = 4026000, .capacity = 75}, 514 + { .ocv = 3987000, .capacity = 72}, 515 + { .ocv = 3974000, .capacity = 69}, 516 + { .ocv = 3953000, .capacity = 66}, 517 + { .ocv = 3933000, .capacity = 63}, 518 + { .ocv = 3911000, .capacity = 60}, 519 + { .ocv = 3900000, .capacity = 58}, 520 + { .ocv = 3873000, .capacity = 55}, 521 + { .ocv = 3842000, .capacity = 52}, 522 + { .ocv = 3829000, .capacity = 50}, 523 + { .ocv = 3810000, .capacity = 45}, 524 + { .ocv = 3793000, .capacity = 40}, 525 + { .ocv = 3783000, .capacity = 35}, 526 + { .ocv = 3776000, .capacity = 30}, 527 + { .ocv = 3762000, .capacity = 25}, 528 + { .ocv = 3746000, .capacity = 20}, 529 + { .ocv = 3739000, .capacity = 18}, 530 + { .ocv = 3715000, .capacity = 15}, 531 + { .ocv = 3700000, .capacity = 12}, 532 + { .ocv = 3690000, .capacity = 10}, 533 + { .ocv = 3680000, .capacity = 9}, 534 + { .ocv = 3670000, .capacity = 7}, 535 + { .ocv = 3656000, .capacity = 5}, 536 + { .ocv = 3634000, .capacity = 4}, 537 + { .ocv = 3614000, .capacity = 3}, 538 + { .ocv = 3551000, .capacity = 2}, 539 + { .ocv = 3458000, .capacity = 1}, 540 + { .ocv = 3300000, .capacity = 0}, 541 + }; 542 + 543 + static struct power_supply_battery_ocv_table samsung_ocv_cap_eb535151vu[] = { 544 + { .ocv = 4178000, .capacity = 100}, 545 + { .ocv = 4148000, .capacity = 99}, 546 + { .ocv = 4105000, .capacity = 95}, 547 + { .ocv = 4078000, .capacity = 92}, 548 + { .ocv = 4057000, .capacity = 89}, 549 + { .ocv = 4013000, .capacity = 85}, 550 + { .ocv = 3988000, .capacity = 82}, 551 + { .ocv = 3962000, .capacity = 77}, 552 + { .ocv = 3920000, .capacity = 70}, 553 + { .ocv = 3891000, .capacity = 65}, 554 + { .ocv = 3874000, .capacity = 62}, 555 + { .ocv = 3839000, .capacity = 59}, 556 + { .ocv = 3816000, .capacity = 55}, 557 + { .ocv = 3798000, .capacity = 50}, 558 + { .ocv = 3778000, .capacity = 40}, 559 + { .ocv = 3764000, .capacity = 30}, 560 + { .ocv = 3743000, .capacity = 25}, 561 + { .ocv = 3711000, .capacity = 20}, 562 + { .ocv = 3691000, .capacity = 18}, 563 + { .ocv = 3685000, .capacity = 15}, 564 + { .ocv = 3680000, .capacity = 12}, 565 + { .ocv = 3662000, .capacity = 10}, 566 + { .ocv = 3638000, .capacity = 9}, 567 + { .ocv = 3593000, .capacity = 7}, 568 + { .ocv = 3566000, .capacity = 6}, 569 + { .ocv = 3497000, .capacity = 4}, 570 + { .ocv = 3405000, .capacity = 2}, 571 + { .ocv = 3352000, .capacity = 1}, 572 + { .ocv = 3300000, .capacity = 0}, 573 + }; 574 + 575 + static struct power_supply_battery_ocv_table samsung_ocv_cap_eb585157lu[] = { 576 + { .ocv = 4320000, .capacity = 100}, 577 + { .ocv = 4296000, .capacity = 99}, 578 + { .ocv = 4283000, .capacity = 98}, 579 + { .ocv = 4245000, .capacity = 95}, 580 + { .ocv = 4185000, .capacity = 90}, 581 + { .ocv = 4152000, .capacity = 87}, 582 + { .ocv = 4119000, .capacity = 84}, 583 + { .ocv = 4077000, .capacity = 80}, 584 + { .ocv = 4057000, .capacity = 78}, 585 + { .ocv = 4048000, .capacity = 77}, 586 + { .ocv = 4020000, .capacity = 74}, 587 + { .ocv = 4003000, .capacity = 72}, 588 + { .ocv = 3978000, .capacity = 69}, 589 + { .ocv = 3955000, .capacity = 66}, 590 + { .ocv = 3934000, .capacity = 63}, 591 + { .ocv = 3912000, .capacity = 60}, 592 + { .ocv = 3894000, .capacity = 58}, 593 + { .ocv = 3860000, .capacity = 55}, 594 + { .ocv = 3837000, .capacity = 52}, 595 + { .ocv = 3827000, .capacity = 50}, 596 + { .ocv = 3806000, .capacity = 45}, 597 + { .ocv = 3791000, .capacity = 40}, 598 + { .ocv = 3779000, .capacity = 35}, 599 + { .ocv = 3770000, .capacity = 30}, 600 + { .ocv = 3758000, .capacity = 25}, 601 + { .ocv = 3739000, .capacity = 20}, 602 + { .ocv = 3730000, .capacity = 18}, 603 + { .ocv = 3706000, .capacity = 15}, 604 + { .ocv = 3684000, .capacity = 13}, 605 + { .ocv = 3675000, .capacity = 10}, 606 + { .ocv = 3673000, .capacity = 9}, 607 + { .ocv = 3665000, .capacity = 7}, 608 + { .ocv = 3649000, .capacity = 5}, 609 + { .ocv = 3628000, .capacity = 4}, 610 + { .ocv = 3585000, .capacity = 3}, 611 + { .ocv = 3525000, .capacity = 2}, 612 + { .ocv = 3441000, .capacity = 1}, 613 + { .ocv = 3300000, .capacity = 0}, 614 + }; 615 + 616 + static struct power_supply_maintenance_charge_table samsung_maint_charge_table[] = { 617 + { 618 + /* Maintenance charging phase A, 60 hours */ 619 + .charge_current_max_ua = 600000, 620 + .charge_voltage_max_uv = 4150000, 621 + .charge_safety_timer_minutes = 60*60, 622 + }, 623 + { 624 + /* Maintenance charging phase B, 200 hours */ 625 + .charge_current_max_ua = 600000, 626 + .charge_voltage_max_uv = 4100000, 627 + .charge_safety_timer_minutes = 200*60, 628 + } 629 + }; 630 + 631 + static struct samsung_sdi_battery samsung_sdi_batteries[] = { 632 + { 633 + /* 634 + * Used in Samsung GT-I8190 "Golden" 635 + * Data from vendor boardfile board-golden-[bm|battery].c 636 + */ 637 + .compatible = "samsung,eb-l1m7flu", 638 + .name = "EB-L1M7FLU", 639 + .info = { 640 + .charge_full_design_uah = 1500000, 641 + .technology = POWER_SUPPLY_TECHNOLOGY_LION, 642 + .factory_internal_resistance_uohm = 100000, 643 + .factory_internal_resistance_charging_uohm = 200000, 644 + /* If you have data on this fix the min_design_uv */ 645 + .voltage_min_design_uv = 3320000, 646 + .voltage_max_design_uv = 4340000, 647 + .overvoltage_limit_uv = 4500000, 648 + .constant_charge_current_max_ua = 900000, 649 + .constant_charge_voltage_max_uv = 4320000, 650 + .charge_term_current_ua = 200000, 651 + .charge_restart_voltage_uv = 4300000, 652 + .maintenance_charge = samsung_maint_charge_table, 653 + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), 654 + .alert_low_temp_charge_current_ua = 300000, 655 + .alert_low_temp_charge_voltage_uv = 4000000, 656 + .alert_high_temp_charge_current_ua = 300000, 657 + .alert_high_temp_charge_voltage_uv = 4000000, 658 + .temp_min = -50, 659 + .temp_alert_min = 0, 660 + .temp_alert_max = 40, 661 + .temp_max = 60, 662 + .resist_table = samsung_temp2res, 663 + .resist_table_size = ARRAY_SIZE(samsung_temp2res), 664 + /* If you have tables for more temperatures, add them */ 665 + .ocv_temp[0] = 25, 666 + .ocv_table[0] = samsung_ocv_cap_1500mah, 667 + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), 668 + .vbat2ri_discharging = samsung_vbat2res_discharging_eb_l1m7flu, 669 + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb_l1m7flu), 670 + .vbat2ri_charging = samsung_vbat2res_charging_eb_l1m7flu, 671 + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb_l1m7flu), 672 + .bti_resistance_ohm = 2400, 673 + .bti_resistance_tolerance = 40, 674 + }, 675 + }, 676 + { 677 + /* 678 + * Used in Samsung SGH-T599 "Codina TMO" and SGH-I407 "Kyle" 679 + * Data from vendor boardfile board-kyle-[bm|battery].c 680 + */ 681 + .compatible = "samsung,eb425161la", 682 + .name = "EB425161LA", 683 + .info = { 684 + .charge_full_design_uah = 1500000, 685 + .technology = POWER_SUPPLY_TECHNOLOGY_LION, 686 + .factory_internal_resistance_uohm = 136000, 687 + .factory_internal_resistance_charging_uohm = 200000, 688 + /* If you have data on this fix the min_design_uv */ 689 + .voltage_min_design_uv = 3320000, 690 + .voltage_max_design_uv = 4340000, 691 + .overvoltage_limit_uv = 4500000, 692 + .constant_charge_current_max_ua = 900000, 693 + .constant_charge_voltage_max_uv = 4320000, 694 + .charge_term_current_ua = 200000, 695 + .charge_restart_voltage_uv = 4270000, 696 + .maintenance_charge = samsung_maint_charge_table, 697 + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), 698 + .alert_low_temp_charge_current_ua = 300000, 699 + .alert_low_temp_charge_voltage_uv = 4000000, 700 + .alert_high_temp_charge_current_ua = 300000, 701 + .alert_high_temp_charge_voltage_uv = 4000000, 702 + .temp_min = -30, 703 + .temp_alert_min = 0, 704 + .temp_alert_max = 40, 705 + .temp_max = 47, 706 + .resist_table = samsung_temp2res, 707 + .resist_table_size = ARRAY_SIZE(samsung_temp2res), 708 + /* If you have tables for more temperatures, add them */ 709 + .ocv_temp[0] = 25, 710 + .ocv_table[0] = samsung_ocv_cap_1500mah, 711 + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), 712 + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161la, 713 + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161la), 714 + .vbat2ri_charging = samsung_vbat2res_charging_eb425161la, 715 + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161la), 716 + .bti_resistance_ohm = 2400, 717 + .bti_resistance_tolerance = 40, 718 + }, 719 + }, 720 + { 721 + /* 722 + * Used in Samsung GT-I8160 "Codina" 723 + * Data from vendor boardfile board-codina-[bm|battery].c 724 + */ 725 + .compatible = "samsung,eb425161lu", 726 + .name = "EB425161LU", 727 + .info = { 728 + .charge_full_design_uah = 1500000, 729 + .technology = POWER_SUPPLY_TECHNOLOGY_LION, 730 + .factory_internal_resistance_uohm = 100000, 731 + .factory_internal_resistance_charging_uohm = 200000, 732 + /* If you have data on this fix the min_design_uv */ 733 + .voltage_min_design_uv = 3320000, 734 + .voltage_max_design_uv = 4350000, 735 + .overvoltage_limit_uv = 4500000, 736 + .constant_charge_current_max_ua = 900000, 737 + .constant_charge_voltage_max_uv = 4340000, 738 + .charge_term_current_ua = 200000, 739 + .charge_restart_voltage_uv = 4280000, 740 + .maintenance_charge = samsung_maint_charge_table, 741 + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), 742 + .alert_low_temp_charge_current_ua = 300000, 743 + .alert_low_temp_charge_voltage_uv = 4000000, 744 + .alert_high_temp_charge_current_ua = 300000, 745 + .alert_high_temp_charge_voltage_uv = 4000000, 746 + .temp_min = -50, 747 + .temp_alert_min = 0, 748 + .temp_alert_max = 43, 749 + .temp_max = 49, 750 + .resist_table = samsung_temp2res, 751 + .resist_table_size = ARRAY_SIZE(samsung_temp2res), 752 + /* If you have tables for more temperatures, add them */ 753 + .ocv_temp[0] = 25, 754 + .ocv_table[0] = samsung_ocv_cap_1500mah, 755 + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_1500mah), 756 + .vbat2ri_discharging = samsung_vbat2res_discharging_eb425161lu, 757 + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb425161lu), 758 + .vbat2ri_charging = samsung_vbat2res_charging_eb425161lu, 759 + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb425161lu), 760 + .bti_resistance_ohm = 2400, 761 + .bti_resistance_tolerance = 40, 762 + }, 763 + }, 764 + { 765 + /* 766 + * Used in Samsung GT-S7710 "Skomer" 767 + * Data from vendor boardfile board-skomer-[bm|battery].c 768 + */ 769 + .compatible = "samsung,eb485159lu", 770 + .name = "EB485159LU", 771 + .info = { 772 + .charge_full_design_uah = 1700000, 773 + .technology = POWER_SUPPLY_TECHNOLOGY_LION, 774 + .factory_internal_resistance_uohm = 100000, 775 + .factory_internal_resistance_charging_uohm = 200000, 776 + .voltage_min_design_uv = 3320000, 777 + .voltage_max_design_uv = 4350000, 778 + .overvoltage_limit_uv = 4500000, 779 + .constant_charge_current_max_ua = 900000, 780 + .constant_charge_voltage_max_uv = 4340000, 781 + .charge_term_current_ua = 200000, 782 + .charge_restart_voltage_uv = 4300000, 783 + .maintenance_charge = samsung_maint_charge_table, 784 + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), 785 + .alert_low_temp_charge_current_ua = 300000, 786 + .alert_low_temp_charge_voltage_uv = 4000000, 787 + .alert_high_temp_charge_current_ua = 300000, 788 + .alert_high_temp_charge_voltage_uv = 4000000, 789 + .temp_min = -50, 790 + .temp_alert_min = 0, 791 + .temp_alert_max = 40, 792 + .temp_max = 60, 793 + .resist_table = samsung_temp2res, 794 + .resist_table_size = ARRAY_SIZE(samsung_temp2res), 795 + /* If you have tables for more temperatures, add them */ 796 + .ocv_temp[0] = 25, 797 + .ocv_table[0] = samsung_ocv_cap_eb485159lu, 798 + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb485159lu), 799 + /* CHECKME: vendor uses the 1500 mAh table, check against datasheet */ 800 + .vbat2ri_discharging = samsung_vbat2res_discharging_eb485159lu, 801 + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb485159lu), 802 + .vbat2ri_charging = samsung_vbat2res_charging_eb485159lu, 803 + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb485159lu), 804 + .bti_resistance_ohm = 2400, 805 + .bti_resistance_tolerance = 40, 806 + }, 807 + }, 808 + { 809 + /* 810 + * Used in Samsung GT-I9070 "Janice" 811 + * Data from vendor boardfile board-janice-bm.c 812 + */ 813 + .compatible = "samsung,eb535151vu", 814 + .name = "EB535151VU", 815 + .info = { 816 + .charge_full_design_uah = 1500000, 817 + .technology = POWER_SUPPLY_TECHNOLOGY_LION, 818 + .factory_internal_resistance_uohm = 100000, 819 + .factory_internal_resistance_charging_uohm = 200000, 820 + /* If you have data on this fix the min_design_uv */ 821 + .voltage_min_design_uv = 3300000, 822 + .voltage_max_design_uv = 4180000, 823 + .overvoltage_limit_uv = 4500000, 824 + .constant_charge_current_max_ua = 900000, 825 + .constant_charge_voltage_max_uv = 4200000, 826 + .charge_term_current_ua = 200000, 827 + .maintenance_charge = samsung_maint_charge_table, 828 + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), 829 + .alert_low_temp_charge_current_ua = 300000, 830 + .alert_low_temp_charge_voltage_uv = 4000000, 831 + .alert_high_temp_charge_current_ua = 300000, 832 + .alert_high_temp_charge_voltage_uv = 4000000, 833 + .temp_min = -5, 834 + .temp_alert_min = 0, 835 + .temp_alert_max = 40, 836 + .temp_max = 60, 837 + .resist_table = samsung_temp2res, 838 + .resist_table_size = ARRAY_SIZE(samsung_temp2res), 839 + /* If you have tables for more temperatures, add them */ 840 + .ocv_temp[0] = 25, 841 + .ocv_table[0] = samsung_ocv_cap_eb535151vu, 842 + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb535151vu), 843 + .vbat2ri_discharging = samsung_vbat2res_discharging_eb535151vu, 844 + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb535151vu), 845 + .vbat2ri_charging = samsung_vbat2res_charging_eb535151vu, 846 + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb535151vu), 847 + .bti_resistance_ohm = 1500, 848 + .bti_resistance_tolerance = 40, 849 + }, 850 + }, 851 + { 852 + /* 853 + * Used in Samsung GT-I8530 "Gavini" 854 + * Data from vendor boardfile board-gavini-bm.c 855 + */ 856 + .compatible = "samsung,eb585157lu", 857 + .name = "EB585157LU", 858 + .info = { 859 + .charge_full_design_uah = 2000000, 860 + .technology = POWER_SUPPLY_TECHNOLOGY_LION, 861 + .factory_internal_resistance_uohm = 105000, 862 + .factory_internal_resistance_charging_uohm = 160000, 863 + /* If you have data on this fix the min_design_uv */ 864 + .voltage_min_design_uv = 3300000, 865 + .voltage_max_design_uv = 4320000, 866 + .overvoltage_limit_uv = 4500000, 867 + .constant_charge_current_max_ua = 1500000, 868 + .constant_charge_voltage_max_uv = 4350000, 869 + .charge_term_current_ua = 120000, 870 + .maintenance_charge = samsung_maint_charge_table, 871 + .maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table), 872 + .alert_low_temp_charge_current_ua = 300000, 873 + .alert_low_temp_charge_voltage_uv = 4000000, 874 + .alert_high_temp_charge_current_ua = 300000, 875 + .alert_high_temp_charge_voltage_uv = 4000000, 876 + .temp_min = -5, 877 + .temp_alert_min = 0, 878 + .temp_alert_max = 40, 879 + .temp_max = 60, 880 + .resist_table = samsung_temp2res, 881 + .resist_table_size = ARRAY_SIZE(samsung_temp2res), 882 + /* If you have tables for more temperatures, add them */ 883 + .ocv_temp[0] = 25, 884 + .ocv_table[0] = samsung_ocv_cap_eb585157lu, 885 + .ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb585157lu), 886 + .vbat2ri_discharging = samsung_vbat2res_discharging_eb585157lu, 887 + .vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb585157lu), 888 + .vbat2ri_charging = samsung_vbat2res_charging_eb585157lu, 889 + .vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb585157lu), 890 + .bti_resistance_ohm = 2400, 891 + .bti_resistance_tolerance = 40, 892 + }, 893 + }, 894 + }; 895 + 896 + int samsung_sdi_battery_get_info(struct device *dev, 897 + const char *compatible, 898 + struct power_supply_battery_info **info) 899 + { 900 + struct samsung_sdi_battery *batt; 901 + int i; 902 + 903 + for (i = 0; i < ARRAY_SIZE(samsung_sdi_batteries); i++) { 904 + batt = &samsung_sdi_batteries[i]; 905 + if (!strcmp(compatible, batt->compatible)) 906 + break; 907 + } 908 + 909 + if (i == ARRAY_SIZE(samsung_sdi_batteries)) 910 + return -ENODEV; 911 + 912 + *info = &batt->info; 913 + dev_info(dev, "Samsung SDI %s battery %d mAh\n", 914 + batt->name, batt->info.charge_full_design_uah / 1000); 915 + 916 + return 0; 917 + } 918 + EXPORT_SYMBOL_GPL(samsung_sdi_battery_get_info);
+13
drivers/power/supply/samsung-sdi-battery.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #if IS_ENABLED(CONFIG_BATTERY_SAMSUNG_SDI) 3 + extern int samsung_sdi_battery_get_info(struct device *dev, 4 + const char *compatible, 5 + struct power_supply_battery_info **info); 6 + #else 7 + static inline int samsung_sdi_battery_get_info(struct device *dev, 8 + const char *compatible, 9 + struct power_supply_battery_info **info) 10 + { 11 + return -ENODEV; 12 + } 13 + #endif