samsung-sdi-battery.c 35 KB

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