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
16struct 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
28static 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
56static 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
76static 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
108static 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
185static 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
217static 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
247static 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
274static 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
294static 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
314static 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
334static 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
404static 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 */
434static 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
450static 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 */
502static 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
543static 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
575static 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
616static 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
631static 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			.charge_restart_voltage_uv = 4170000,
828			.maintenance_charge = samsung_maint_charge_table,
829			.maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table),
830			.alert_low_temp_charge_current_ua = 300000,
831			.alert_low_temp_charge_voltage_uv = 4000000,
832			.alert_high_temp_charge_current_ua = 300000,
833			.alert_high_temp_charge_voltage_uv = 4000000,
834			.temp_min = -5,
835			.temp_alert_min = 0,
836			.temp_alert_max = 40,
837			.temp_max = 60,
838			.resist_table = samsung_temp2res,
839			.resist_table_size = ARRAY_SIZE(samsung_temp2res),
840			/* If you have tables for more temperatures, add them */
841			.ocv_temp[0] = 25,
842			.ocv_table[0] = samsung_ocv_cap_eb535151vu,
843			.ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb535151vu),
844			.vbat2ri_discharging = samsung_vbat2res_discharging_eb535151vu,
845			.vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb535151vu),
846			.vbat2ri_charging = samsung_vbat2res_charging_eb535151vu,
847			.vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb535151vu),
848			.bti_resistance_ohm = 1500,
849			.bti_resistance_tolerance = 40,
850		},
851	},
852	{
853		/*
854		 * Used in Samsung GT-I8530 "Gavini"
855		 * Data from vendor boardfile board-gavini-bm.c
856		 */
857		.compatible = "samsung,eb585157lu",
858		.name = "EB585157LU",
859		.info = {
860			.charge_full_design_uah = 2000000,
861			.technology = POWER_SUPPLY_TECHNOLOGY_LION,
862			.factory_internal_resistance_uohm = 105000,
863			.factory_internal_resistance_charging_uohm = 160000,
864			/* If you have data on this fix the min_design_uv */
865			.voltage_min_design_uv = 3300000,
866			.voltage_max_design_uv = 4320000,
867			.overvoltage_limit_uv = 4500000,
868			.constant_charge_current_max_ua = 1500000,
869			.constant_charge_voltage_max_uv = 4350000,
870			.charge_term_current_ua = 120000,
871			.charge_restart_voltage_uv = 4300000,
872			.maintenance_charge = samsung_maint_charge_table,
873			.maintenance_charge_size = ARRAY_SIZE(samsung_maint_charge_table),
874			.alert_low_temp_charge_current_ua = 300000,
875			.alert_low_temp_charge_voltage_uv = 4000000,
876			.alert_high_temp_charge_current_ua = 300000,
877			.alert_high_temp_charge_voltage_uv = 4000000,
878			.temp_min = -5,
879			.temp_alert_min = 0,
880			.temp_alert_max = 40,
881			.temp_max = 60,
882			.resist_table = samsung_temp2res,
883			.resist_table_size = ARRAY_SIZE(samsung_temp2res),
884			/* If you have tables for more temperatures, add them */
885			.ocv_temp[0] = 25,
886			.ocv_table[0] = samsung_ocv_cap_eb585157lu,
887			.ocv_table_size[0] = ARRAY_SIZE(samsung_ocv_cap_eb585157lu),
888			.vbat2ri_discharging = samsung_vbat2res_discharging_eb585157lu,
889			.vbat2ri_discharging_size = ARRAY_SIZE(samsung_vbat2res_discharging_eb585157lu),
890			.vbat2ri_charging = samsung_vbat2res_charging_eb585157lu,
891			.vbat2ri_charging_size = ARRAY_SIZE(samsung_vbat2res_charging_eb585157lu),
892			.bti_resistance_ohm = 2400,
893			.bti_resistance_tolerance = 40,
894		},
895	},
896};
897
898int samsung_sdi_battery_get_info(struct device *dev,
899				 const char *compatible,
900				 struct power_supply_battery_info **info)
901{
902	struct samsung_sdi_battery *batt;
903	int i;
904
905	for (i = 0; i < ARRAY_SIZE(samsung_sdi_batteries); i++) {
906		batt = &samsung_sdi_batteries[i];
907		if (!strcmp(compatible, batt->compatible))
908			break;
909	}
910
911	if (i == ARRAY_SIZE(samsung_sdi_batteries))
912		return -ENODEV;
913
914	*info = &batt->info;
915	dev_info(dev, "Samsung SDI %s battery %d mAh\n",
916		 batt->name, batt->info.charge_full_design_uah / 1000);
917
918	return 0;
919}
920EXPORT_SYMBOL_GPL(samsung_sdi_battery_get_info);
921