bq2415x_charger.c 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744
  1. /*
  2. * bq2415x charger driver
  3. *
  4. * Copyright (C) 2011-2013 Pali Rohár <pali.rohar@gmail.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program; if not, write to the Free Software Foundation, Inc.,
  18. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  19. */
  20. /*
  21. * Datasheets:
  22. * http://www.ti.com/product/bq24150
  23. * http://www.ti.com/product/bq24150a
  24. * http://www.ti.com/product/bq24152
  25. * http://www.ti.com/product/bq24153
  26. * http://www.ti.com/product/bq24153a
  27. * http://www.ti.com/product/bq24155
  28. */
  29. #include <linux/kernel.h>
  30. #include <linux/module.h>
  31. #include <linux/param.h>
  32. #include <linux/err.h>
  33. #include <linux/workqueue.h>
  34. #include <linux/sysfs.h>
  35. #include <linux/platform_device.h>
  36. #include <linux/power_supply.h>
  37. #include <linux/idr.h>
  38. #include <linux/i2c.h>
  39. #include <linux/slab.h>
  40. #include <linux/power/bq2415x_charger.h>
  41. /* timeout for resetting chip timer */
  42. #define BQ2415X_TIMER_TIMEOUT 10
  43. #define BQ2415X_REG_STATUS 0x00
  44. #define BQ2415X_REG_CONTROL 0x01
  45. #define BQ2415X_REG_VOLTAGE 0x02
  46. #define BQ2415X_REG_VENDER 0x03
  47. #define BQ2415X_REG_CURRENT 0x04
  48. /* reset state for all registers */
  49. #define BQ2415X_RESET_STATUS BIT(6)
  50. #define BQ2415X_RESET_CONTROL (BIT(4)|BIT(5))
  51. #define BQ2415X_RESET_VOLTAGE (BIT(1)|BIT(3))
  52. #define BQ2415X_RESET_CURRENT (BIT(0)|BIT(3)|BIT(7))
  53. /* status register */
  54. #define BQ2415X_BIT_TMR_RST 7
  55. #define BQ2415X_BIT_OTG 7
  56. #define BQ2415X_BIT_EN_STAT 6
  57. #define BQ2415X_MASK_STAT (BIT(4)|BIT(5))
  58. #define BQ2415X_SHIFT_STAT 4
  59. #define BQ2415X_BIT_BOOST 3
  60. #define BQ2415X_MASK_FAULT (BIT(0)|BIT(1)|BIT(2))
  61. #define BQ2415X_SHIFT_FAULT 0
  62. /* control register */
  63. #define BQ2415X_MASK_LIMIT (BIT(6)|BIT(7))
  64. #define BQ2415X_SHIFT_LIMIT 6
  65. #define BQ2415X_MASK_VLOWV (BIT(4)|BIT(5))
  66. #define BQ2415X_SHIFT_VLOWV 4
  67. #define BQ2415X_BIT_TE 3
  68. #define BQ2415X_BIT_CE 2
  69. #define BQ2415X_BIT_HZ_MODE 1
  70. #define BQ2415X_BIT_OPA_MODE 0
  71. /* voltage register */
  72. #define BQ2415X_MASK_VO (BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6)|BIT(7))
  73. #define BQ2415X_SHIFT_VO 2
  74. #define BQ2415X_BIT_OTG_PL 1
  75. #define BQ2415X_BIT_OTG_EN 0
  76. /* vender register */
  77. #define BQ2415X_MASK_VENDER (BIT(5)|BIT(6)|BIT(7))
  78. #define BQ2415X_SHIFT_VENDER 5
  79. #define BQ2415X_MASK_PN (BIT(3)|BIT(4))
  80. #define BQ2415X_SHIFT_PN 3
  81. #define BQ2415X_MASK_REVISION (BIT(0)|BIT(1)|BIT(2))
  82. #define BQ2415X_SHIFT_REVISION 0
  83. /* current register */
  84. #define BQ2415X_MASK_RESET BIT(7)
  85. #define BQ2415X_MASK_VI_CHRG (BIT(4)|BIT(5)|BIT(6))
  86. #define BQ2415X_SHIFT_VI_CHRG 4
  87. /* N/A BIT(3) */
  88. #define BQ2415X_MASK_VI_TERM (BIT(0)|BIT(1)|BIT(2))
  89. #define BQ2415X_SHIFT_VI_TERM 0
  90. enum bq2415x_command {
  91. BQ2415X_TIMER_RESET,
  92. BQ2415X_OTG_STATUS,
  93. BQ2415X_STAT_PIN_STATUS,
  94. BQ2415X_STAT_PIN_ENABLE,
  95. BQ2415X_STAT_PIN_DISABLE,
  96. BQ2415X_CHARGE_STATUS,
  97. BQ2415X_BOOST_STATUS,
  98. BQ2415X_FAULT_STATUS,
  99. BQ2415X_CHARGE_TERMINATION_STATUS,
  100. BQ2415X_CHARGE_TERMINATION_ENABLE,
  101. BQ2415X_CHARGE_TERMINATION_DISABLE,
  102. BQ2415X_CHARGER_STATUS,
  103. BQ2415X_CHARGER_ENABLE,
  104. BQ2415X_CHARGER_DISABLE,
  105. BQ2415X_HIGH_IMPEDANCE_STATUS,
  106. BQ2415X_HIGH_IMPEDANCE_ENABLE,
  107. BQ2415X_HIGH_IMPEDANCE_DISABLE,
  108. BQ2415X_BOOST_MODE_STATUS,
  109. BQ2415X_BOOST_MODE_ENABLE,
  110. BQ2415X_BOOST_MODE_DISABLE,
  111. BQ2415X_OTG_LEVEL,
  112. BQ2415X_OTG_ACTIVATE_HIGH,
  113. BQ2415X_OTG_ACTIVATE_LOW,
  114. BQ2415X_OTG_PIN_STATUS,
  115. BQ2415X_OTG_PIN_ENABLE,
  116. BQ2415X_OTG_PIN_DISABLE,
  117. BQ2415X_VENDER_CODE,
  118. BQ2415X_PART_NUMBER,
  119. BQ2415X_REVISION,
  120. };
  121. enum bq2415x_chip {
  122. BQUNKNOWN,
  123. BQ24150,
  124. BQ24150A,
  125. BQ24151,
  126. BQ24151A,
  127. BQ24152,
  128. BQ24153,
  129. BQ24153A,
  130. BQ24155,
  131. BQ24156,
  132. BQ24156A,
  133. BQ24158,
  134. };
  135. static char *bq2415x_chip_name[] = {
  136. "unknown",
  137. "bq24150",
  138. "bq24150a",
  139. "bq24151",
  140. "bq24151a",
  141. "bq24152",
  142. "bq24153",
  143. "bq24153a",
  144. "bq24155",
  145. "bq24156",
  146. "bq24156a",
  147. "bq24158",
  148. };
  149. struct bq2415x_device {
  150. struct device *dev;
  151. struct bq2415x_platform_data init_data;
  152. struct power_supply charger;
  153. struct delayed_work work;
  154. struct power_supply *notify_psy;
  155. struct notifier_block nb;
  156. enum bq2415x_mode reported_mode;/* mode reported by hook function */
  157. enum bq2415x_mode mode; /* current configured mode */
  158. enum bq2415x_chip chip;
  159. const char *timer_error;
  160. char *model;
  161. char *name;
  162. int autotimer; /* 1 - if driver automatically reset timer, 0 - not */
  163. int automode; /* 1 - enabled, 0 - disabled; -1 - not supported */
  164. int id;
  165. };
  166. /* each registered chip must have unique id */
  167. static DEFINE_IDR(bq2415x_id);
  168. static DEFINE_MUTEX(bq2415x_id_mutex);
  169. static DEFINE_MUTEX(bq2415x_timer_mutex);
  170. static DEFINE_MUTEX(bq2415x_i2c_mutex);
  171. /**** i2c read functions ****/
  172. /* read value from register */
  173. static int bq2415x_i2c_read(struct bq2415x_device *bq, u8 reg)
  174. {
  175. struct i2c_client *client = to_i2c_client(bq->dev);
  176. struct i2c_msg msg[2];
  177. u8 val;
  178. int ret;
  179. if (!client->adapter)
  180. return -ENODEV;
  181. msg[0].addr = client->addr;
  182. msg[0].flags = 0;
  183. msg[0].buf = &reg;
  184. msg[0].len = sizeof(reg);
  185. msg[1].addr = client->addr;
  186. msg[1].flags = I2C_M_RD;
  187. msg[1].buf = &val;
  188. msg[1].len = sizeof(val);
  189. mutex_lock(&bq2415x_i2c_mutex);
  190. ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
  191. mutex_unlock(&bq2415x_i2c_mutex);
  192. if (ret < 0)
  193. return ret;
  194. return val;
  195. }
  196. /* read value from register, apply mask and right shift it */
  197. static int bq2415x_i2c_read_mask(struct bq2415x_device *bq, u8 reg,
  198. u8 mask, u8 shift)
  199. {
  200. int ret;
  201. if (shift > 8)
  202. return -EINVAL;
  203. ret = bq2415x_i2c_read(bq, reg);
  204. if (ret < 0)
  205. return ret;
  206. return (ret & mask) >> shift;
  207. }
  208. /* read value from register and return one specified bit */
  209. static int bq2415x_i2c_read_bit(struct bq2415x_device *bq, u8 reg, u8 bit)
  210. {
  211. if (bit > 8)
  212. return -EINVAL;
  213. return bq2415x_i2c_read_mask(bq, reg, BIT(bit), bit);
  214. }
  215. /**** i2c write functions ****/
  216. /* write value to register */
  217. static int bq2415x_i2c_write(struct bq2415x_device *bq, u8 reg, u8 val)
  218. {
  219. struct i2c_client *client = to_i2c_client(bq->dev);
  220. struct i2c_msg msg[1];
  221. u8 data[2];
  222. int ret;
  223. data[0] = reg;
  224. data[1] = val;
  225. msg[0].addr = client->addr;
  226. msg[0].flags = 0;
  227. msg[0].buf = data;
  228. msg[0].len = ARRAY_SIZE(data);
  229. mutex_lock(&bq2415x_i2c_mutex);
  230. ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
  231. mutex_unlock(&bq2415x_i2c_mutex);
  232. /* i2c_transfer returns number of messages transferred */
  233. if (ret < 0)
  234. return ret;
  235. else if (ret != 1)
  236. return -EIO;
  237. return 0;
  238. }
  239. /* read value from register, change it with mask left shifted and write back */
  240. static int bq2415x_i2c_write_mask(struct bq2415x_device *bq, u8 reg, u8 val,
  241. u8 mask, u8 shift)
  242. {
  243. int ret;
  244. if (shift > 8)
  245. return -EINVAL;
  246. ret = bq2415x_i2c_read(bq, reg);
  247. if (ret < 0)
  248. return ret;
  249. ret &= ~mask;
  250. ret |= val << shift;
  251. return bq2415x_i2c_write(bq, reg, ret);
  252. }
  253. /* change only one bit in register */
  254. static int bq2415x_i2c_write_bit(struct bq2415x_device *bq, u8 reg,
  255. bool val, u8 bit)
  256. {
  257. if (bit > 8)
  258. return -EINVAL;
  259. return bq2415x_i2c_write_mask(bq, reg, val, BIT(bit), bit);
  260. }
  261. /**** global functions ****/
  262. /* exec command function */
  263. static int bq2415x_exec_command(struct bq2415x_device *bq,
  264. enum bq2415x_command command)
  265. {
  266. int ret;
  267. switch (command) {
  268. case BQ2415X_TIMER_RESET:
  269. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_STATUS,
  270. 1, BQ2415X_BIT_TMR_RST);
  271. case BQ2415X_OTG_STATUS:
  272. return bq2415x_i2c_read_bit(bq, BQ2415X_REG_STATUS,
  273. BQ2415X_BIT_OTG);
  274. case BQ2415X_STAT_PIN_STATUS:
  275. return bq2415x_i2c_read_bit(bq, BQ2415X_REG_STATUS,
  276. BQ2415X_BIT_EN_STAT);
  277. case BQ2415X_STAT_PIN_ENABLE:
  278. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_STATUS, 1,
  279. BQ2415X_BIT_EN_STAT);
  280. case BQ2415X_STAT_PIN_DISABLE:
  281. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_STATUS, 0,
  282. BQ2415X_BIT_EN_STAT);
  283. case BQ2415X_CHARGE_STATUS:
  284. return bq2415x_i2c_read_mask(bq, BQ2415X_REG_STATUS,
  285. BQ2415X_MASK_STAT, BQ2415X_SHIFT_STAT);
  286. case BQ2415X_BOOST_STATUS:
  287. return bq2415x_i2c_read_bit(bq, BQ2415X_REG_STATUS,
  288. BQ2415X_BIT_BOOST);
  289. case BQ2415X_FAULT_STATUS:
  290. return bq2415x_i2c_read_mask(bq, BQ2415X_REG_STATUS,
  291. BQ2415X_MASK_FAULT, BQ2415X_SHIFT_FAULT);
  292. case BQ2415X_CHARGE_TERMINATION_STATUS:
  293. return bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL,
  294. BQ2415X_BIT_TE);
  295. case BQ2415X_CHARGE_TERMINATION_ENABLE:
  296. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
  297. 1, BQ2415X_BIT_TE);
  298. case BQ2415X_CHARGE_TERMINATION_DISABLE:
  299. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
  300. 0, BQ2415X_BIT_TE);
  301. case BQ2415X_CHARGER_STATUS:
  302. ret = bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL,
  303. BQ2415X_BIT_CE);
  304. if (ret < 0)
  305. return ret;
  306. else
  307. return ret > 0 ? 0 : 1;
  308. case BQ2415X_CHARGER_ENABLE:
  309. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
  310. 0, BQ2415X_BIT_CE);
  311. case BQ2415X_CHARGER_DISABLE:
  312. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
  313. 1, BQ2415X_BIT_CE);
  314. case BQ2415X_HIGH_IMPEDANCE_STATUS:
  315. return bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL,
  316. BQ2415X_BIT_HZ_MODE);
  317. case BQ2415X_HIGH_IMPEDANCE_ENABLE:
  318. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
  319. 1, BQ2415X_BIT_HZ_MODE);
  320. case BQ2415X_HIGH_IMPEDANCE_DISABLE:
  321. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
  322. 0, BQ2415X_BIT_HZ_MODE);
  323. case BQ2415X_BOOST_MODE_STATUS:
  324. return bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL,
  325. BQ2415X_BIT_OPA_MODE);
  326. case BQ2415X_BOOST_MODE_ENABLE:
  327. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
  328. 1, BQ2415X_BIT_OPA_MODE);
  329. case BQ2415X_BOOST_MODE_DISABLE:
  330. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
  331. 0, BQ2415X_BIT_OPA_MODE);
  332. case BQ2415X_OTG_LEVEL:
  333. return bq2415x_i2c_read_bit(bq, BQ2415X_REG_VOLTAGE,
  334. BQ2415X_BIT_OTG_PL);
  335. case BQ2415X_OTG_ACTIVATE_HIGH:
  336. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE,
  337. 1, BQ2415X_BIT_OTG_PL);
  338. case BQ2415X_OTG_ACTIVATE_LOW:
  339. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE,
  340. 0, BQ2415X_BIT_OTG_PL);
  341. case BQ2415X_OTG_PIN_STATUS:
  342. return bq2415x_i2c_read_bit(bq, BQ2415X_REG_VOLTAGE,
  343. BQ2415X_BIT_OTG_EN);
  344. case BQ2415X_OTG_PIN_ENABLE:
  345. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE,
  346. 1, BQ2415X_BIT_OTG_EN);
  347. case BQ2415X_OTG_PIN_DISABLE:
  348. return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE,
  349. 0, BQ2415X_BIT_OTG_EN);
  350. case BQ2415X_VENDER_CODE:
  351. return bq2415x_i2c_read_mask(bq, BQ2415X_REG_VENDER,
  352. BQ2415X_MASK_VENDER, BQ2415X_SHIFT_VENDER);
  353. case BQ2415X_PART_NUMBER:
  354. return bq2415x_i2c_read_mask(bq, BQ2415X_REG_VENDER,
  355. BQ2415X_MASK_PN, BQ2415X_SHIFT_PN);
  356. case BQ2415X_REVISION:
  357. return bq2415x_i2c_read_mask(bq, BQ2415X_REG_VENDER,
  358. BQ2415X_MASK_REVISION, BQ2415X_SHIFT_REVISION);
  359. }
  360. return -EINVAL;
  361. }
  362. /* detect chip type */
  363. static enum bq2415x_chip bq2415x_detect_chip(struct bq2415x_device *bq)
  364. {
  365. struct i2c_client *client = to_i2c_client(bq->dev);
  366. int ret = bq2415x_exec_command(bq, BQ2415X_PART_NUMBER);
  367. if (ret < 0)
  368. return ret;
  369. switch (client->addr) {
  370. case 0x6b:
  371. switch (ret) {
  372. case 0:
  373. if (bq->chip == BQ24151A)
  374. return bq->chip;
  375. else
  376. return BQ24151;
  377. case 1:
  378. if (bq->chip == BQ24150A ||
  379. bq->chip == BQ24152 ||
  380. bq->chip == BQ24155)
  381. return bq->chip;
  382. else
  383. return BQ24150;
  384. case 2:
  385. if (bq->chip == BQ24153A)
  386. return bq->chip;
  387. else
  388. return BQ24153;
  389. default:
  390. return BQUNKNOWN;
  391. }
  392. break;
  393. case 0x6a:
  394. switch (ret) {
  395. case 0:
  396. if (bq->chip == BQ24156A)
  397. return bq->chip;
  398. else
  399. return BQ24156;
  400. case 2:
  401. return BQ24158;
  402. default:
  403. return BQUNKNOWN;
  404. }
  405. break;
  406. }
  407. return BQUNKNOWN;
  408. }
  409. /* detect chip revision */
  410. static int bq2415x_detect_revision(struct bq2415x_device *bq)
  411. {
  412. int ret = bq2415x_exec_command(bq, BQ2415X_REVISION);
  413. int chip = bq2415x_detect_chip(bq);
  414. if (ret < 0 || chip < 0)
  415. return -1;
  416. switch (chip) {
  417. case BQ24150:
  418. case BQ24150A:
  419. case BQ24151:
  420. case BQ24151A:
  421. case BQ24152:
  422. if (ret >= 0 && ret <= 3)
  423. return ret;
  424. else
  425. return -1;
  426. case BQ24153:
  427. case BQ24153A:
  428. case BQ24156:
  429. case BQ24156A:
  430. case BQ24158:
  431. if (ret == 3)
  432. return 0;
  433. else if (ret == 1)
  434. return 1;
  435. else
  436. return -1;
  437. case BQ24155:
  438. if (ret == 3)
  439. return 3;
  440. else
  441. return -1;
  442. case BQUNKNOWN:
  443. return -1;
  444. }
  445. return -1;
  446. }
  447. /* return chip vender code */
  448. static int bq2415x_get_vender_code(struct bq2415x_device *bq)
  449. {
  450. int ret;
  451. ret = bq2415x_exec_command(bq, BQ2415X_VENDER_CODE);
  452. if (ret < 0)
  453. return 0;
  454. /* convert to binary */
  455. return (ret & 0x1) +
  456. ((ret >> 1) & 0x1) * 10 +
  457. ((ret >> 2) & 0x1) * 100;
  458. }
  459. /* reset all chip registers to default state */
  460. static void bq2415x_reset_chip(struct bq2415x_device *bq)
  461. {
  462. bq2415x_i2c_write(bq, BQ2415X_REG_CURRENT, BQ2415X_RESET_CURRENT);
  463. bq2415x_i2c_write(bq, BQ2415X_REG_VOLTAGE, BQ2415X_RESET_VOLTAGE);
  464. bq2415x_i2c_write(bq, BQ2415X_REG_CONTROL, BQ2415X_RESET_CONTROL);
  465. bq2415x_i2c_write(bq, BQ2415X_REG_STATUS, BQ2415X_RESET_STATUS);
  466. bq->timer_error = NULL;
  467. }
  468. /**** properties functions ****/
  469. /* set current limit in mA */
  470. static int bq2415x_set_current_limit(struct bq2415x_device *bq, int mA)
  471. {
  472. int val;
  473. if (mA <= 100)
  474. val = 0;
  475. else if (mA <= 500)
  476. val = 1;
  477. else if (mA <= 800)
  478. val = 2;
  479. else
  480. val = 3;
  481. return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CONTROL, val,
  482. BQ2415X_MASK_LIMIT, BQ2415X_SHIFT_LIMIT);
  483. }
  484. /* get current limit in mA */
  485. static int bq2415x_get_current_limit(struct bq2415x_device *bq)
  486. {
  487. int ret;
  488. ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CONTROL,
  489. BQ2415X_MASK_LIMIT, BQ2415X_SHIFT_LIMIT);
  490. if (ret < 0)
  491. return ret;
  492. else if (ret == 0)
  493. return 100;
  494. else if (ret == 1)
  495. return 500;
  496. else if (ret == 2)
  497. return 800;
  498. else if (ret == 3)
  499. return 1800;
  500. return -EINVAL;
  501. }
  502. /* set weak battery voltage in mV */
  503. static int bq2415x_set_weak_battery_voltage(struct bq2415x_device *bq, int mV)
  504. {
  505. int val;
  506. /* round to 100mV */
  507. if (mV <= 3400 + 50)
  508. val = 0;
  509. else if (mV <= 3500 + 50)
  510. val = 1;
  511. else if (mV <= 3600 + 50)
  512. val = 2;
  513. else
  514. val = 3;
  515. return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CONTROL, val,
  516. BQ2415X_MASK_VLOWV, BQ2415X_SHIFT_VLOWV);
  517. }
  518. /* get weak battery voltage in mV */
  519. static int bq2415x_get_weak_battery_voltage(struct bq2415x_device *bq)
  520. {
  521. int ret;
  522. ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CONTROL,
  523. BQ2415X_MASK_VLOWV, BQ2415X_SHIFT_VLOWV);
  524. if (ret < 0)
  525. return ret;
  526. return 100 * (34 + ret);
  527. }
  528. /* set battery regulation voltage in mV */
  529. static int bq2415x_set_battery_regulation_voltage(struct bq2415x_device *bq,
  530. int mV)
  531. {
  532. int val = (mV/10 - 350) / 2;
  533. /*
  534. * According to datasheet, maximum battery regulation voltage is
  535. * 4440mV which is b101111 = 47.
  536. */
  537. if (val < 0)
  538. val = 0;
  539. else if (val > 47)
  540. return -EINVAL;
  541. return bq2415x_i2c_write_mask(bq, BQ2415X_REG_VOLTAGE, val,
  542. BQ2415X_MASK_VO, BQ2415X_SHIFT_VO);
  543. }
  544. /* get battery regulation voltage in mV */
  545. static int bq2415x_get_battery_regulation_voltage(struct bq2415x_device *bq)
  546. {
  547. int ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_VOLTAGE,
  548. BQ2415X_MASK_VO, BQ2415X_SHIFT_VO);
  549. if (ret < 0)
  550. return ret;
  551. return 10 * (350 + 2*ret);
  552. }
  553. /* set charge current in mA (platform data must provide resistor sense) */
  554. static int bq2415x_set_charge_current(struct bq2415x_device *bq, int mA)
  555. {
  556. int val;
  557. if (bq->init_data.resistor_sense <= 0)
  558. return -ENOSYS;
  559. val = (mA * bq->init_data.resistor_sense - 37400) / 6800;
  560. if (val < 0)
  561. val = 0;
  562. else if (val > 7)
  563. val = 7;
  564. return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CURRENT, val,
  565. BQ2415X_MASK_VI_CHRG | BQ2415X_MASK_RESET,
  566. BQ2415X_SHIFT_VI_CHRG);
  567. }
  568. /* get charge current in mA (platform data must provide resistor sense) */
  569. static int bq2415x_get_charge_current(struct bq2415x_device *bq)
  570. {
  571. int ret;
  572. if (bq->init_data.resistor_sense <= 0)
  573. return -ENOSYS;
  574. ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CURRENT,
  575. BQ2415X_MASK_VI_CHRG, BQ2415X_SHIFT_VI_CHRG);
  576. if (ret < 0)
  577. return ret;
  578. return (37400 + 6800*ret) / bq->init_data.resistor_sense;
  579. }
  580. /* set termination current in mA (platform data must provide resistor sense) */
  581. static int bq2415x_set_termination_current(struct bq2415x_device *bq, int mA)
  582. {
  583. int val;
  584. if (bq->init_data.resistor_sense <= 0)
  585. return -ENOSYS;
  586. val = (mA * bq->init_data.resistor_sense - 3400) / 3400;
  587. if (val < 0)
  588. val = 0;
  589. else if (val > 7)
  590. val = 7;
  591. return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CURRENT, val,
  592. BQ2415X_MASK_VI_TERM | BQ2415X_MASK_RESET,
  593. BQ2415X_SHIFT_VI_TERM);
  594. }
  595. /* get termination current in mA (platform data must provide resistor sense) */
  596. static int bq2415x_get_termination_current(struct bq2415x_device *bq)
  597. {
  598. int ret;
  599. if (bq->init_data.resistor_sense <= 0)
  600. return -ENOSYS;
  601. ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CURRENT,
  602. BQ2415X_MASK_VI_TERM, BQ2415X_SHIFT_VI_TERM);
  603. if (ret < 0)
  604. return ret;
  605. return (3400 + 3400*ret) / bq->init_data.resistor_sense;
  606. }
  607. /* set default value of property */
  608. #define bq2415x_set_default_value(bq, prop) \
  609. do { \
  610. int ret = 0; \
  611. if (bq->init_data.prop != -1) \
  612. ret = bq2415x_set_##prop(bq, bq->init_data.prop); \
  613. if (ret < 0) \
  614. return ret; \
  615. } while (0)
  616. /* set default values of all properties */
  617. static int bq2415x_set_defaults(struct bq2415x_device *bq)
  618. {
  619. bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_DISABLE);
  620. bq2415x_exec_command(bq, BQ2415X_CHARGER_DISABLE);
  621. bq2415x_exec_command(bq, BQ2415X_CHARGE_TERMINATION_DISABLE);
  622. bq2415x_set_default_value(bq, current_limit);
  623. bq2415x_set_default_value(bq, weak_battery_voltage);
  624. bq2415x_set_default_value(bq, battery_regulation_voltage);
  625. if (bq->init_data.resistor_sense > 0) {
  626. bq2415x_set_default_value(bq, charge_current);
  627. bq2415x_set_default_value(bq, termination_current);
  628. bq2415x_exec_command(bq, BQ2415X_CHARGE_TERMINATION_ENABLE);
  629. }
  630. bq2415x_exec_command(bq, BQ2415X_CHARGER_ENABLE);
  631. return 0;
  632. }
  633. /**** charger mode functions ****/
  634. /* set charger mode */
  635. static int bq2415x_set_mode(struct bq2415x_device *bq, enum bq2415x_mode mode)
  636. {
  637. int ret = 0;
  638. int charger = 0;
  639. int boost = 0;
  640. if (mode == BQ2415X_MODE_BOOST)
  641. boost = 1;
  642. else if (mode != BQ2415X_MODE_OFF)
  643. charger = 1;
  644. if (!charger)
  645. ret = bq2415x_exec_command(bq, BQ2415X_CHARGER_DISABLE);
  646. if (!boost)
  647. ret = bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_DISABLE);
  648. if (ret < 0)
  649. return ret;
  650. switch (mode) {
  651. case BQ2415X_MODE_OFF:
  652. dev_dbg(bq->dev, "changing mode to: Offline\n");
  653. ret = bq2415x_set_current_limit(bq, 100);
  654. break;
  655. case BQ2415X_MODE_NONE:
  656. dev_dbg(bq->dev, "changing mode to: N/A\n");
  657. ret = bq2415x_set_current_limit(bq, 100);
  658. break;
  659. case BQ2415X_MODE_HOST_CHARGER:
  660. dev_dbg(bq->dev, "changing mode to: Host/HUB charger\n");
  661. ret = bq2415x_set_current_limit(bq, 500);
  662. break;
  663. case BQ2415X_MODE_DEDICATED_CHARGER:
  664. dev_dbg(bq->dev, "changing mode to: Dedicated charger\n");
  665. ret = bq2415x_set_current_limit(bq, 1800);
  666. break;
  667. case BQ2415X_MODE_BOOST: /* Boost mode */
  668. dev_dbg(bq->dev, "changing mode to: Boost\n");
  669. ret = bq2415x_set_current_limit(bq, 100);
  670. break;
  671. }
  672. if (ret < 0)
  673. return ret;
  674. if (charger)
  675. ret = bq2415x_exec_command(bq, BQ2415X_CHARGER_ENABLE);
  676. else if (boost)
  677. ret = bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_ENABLE);
  678. if (ret < 0)
  679. return ret;
  680. bq2415x_set_default_value(bq, weak_battery_voltage);
  681. bq2415x_set_default_value(bq, battery_regulation_voltage);
  682. bq->mode = mode;
  683. sysfs_notify(&bq->charger.dev->kobj, NULL, "mode");
  684. return 0;
  685. }
  686. static int bq2415x_notifier_call(struct notifier_block *nb,
  687. unsigned long val, void *v)
  688. {
  689. struct bq2415x_device *bq =
  690. container_of(nb, struct bq2415x_device, nb);
  691. struct power_supply *psy = v;
  692. enum bq2415x_mode mode;
  693. union power_supply_propval prop;
  694. int ret;
  695. int mA;
  696. if (val != PSY_EVENT_PROP_CHANGED)
  697. return NOTIFY_OK;
  698. if (psy != bq->notify_psy)
  699. return NOTIFY_OK;
  700. dev_dbg(bq->dev, "notifier call was called\n");
  701. ret = psy->get_property(psy, POWER_SUPPLY_PROP_CURRENT_MAX, &prop);
  702. if (ret != 0)
  703. return NOTIFY_OK;
  704. mA = prop.intval;
  705. if (mA == 0)
  706. mode = BQ2415X_MODE_OFF;
  707. else if (mA < 500)
  708. mode = BQ2415X_MODE_NONE;
  709. else if (mA < 1800)
  710. mode = BQ2415X_MODE_HOST_CHARGER;
  711. else
  712. mode = BQ2415X_MODE_DEDICATED_CHARGER;
  713. if (bq->reported_mode == mode)
  714. return NOTIFY_OK;
  715. bq->reported_mode = mode;
  716. /* if automode is not enabled do not tell about reported_mode */
  717. if (bq->automode < 1)
  718. return NOTIFY_OK;
  719. schedule_delayed_work(&bq->work, 0);
  720. return NOTIFY_OK;
  721. }
  722. /**** timer functions ****/
  723. /* enable/disable auto resetting chip timer */
  724. static void bq2415x_set_autotimer(struct bq2415x_device *bq, int state)
  725. {
  726. mutex_lock(&bq2415x_timer_mutex);
  727. if (bq->autotimer == state) {
  728. mutex_unlock(&bq2415x_timer_mutex);
  729. return;
  730. }
  731. bq->autotimer = state;
  732. if (state) {
  733. schedule_delayed_work(&bq->work, BQ2415X_TIMER_TIMEOUT * HZ);
  734. bq2415x_exec_command(bq, BQ2415X_TIMER_RESET);
  735. bq->timer_error = NULL;
  736. } else {
  737. cancel_delayed_work_sync(&bq->work);
  738. }
  739. mutex_unlock(&bq2415x_timer_mutex);
  740. }
  741. /* called by bq2415x_timer_work on timer error */
  742. static void bq2415x_timer_error(struct bq2415x_device *bq, const char *msg)
  743. {
  744. bq->timer_error = msg;
  745. sysfs_notify(&bq->charger.dev->kobj, NULL, "timer");
  746. dev_err(bq->dev, "%s\n", msg);
  747. if (bq->automode > 0)
  748. bq->automode = 0;
  749. bq2415x_set_mode(bq, BQ2415X_MODE_OFF);
  750. bq2415x_set_autotimer(bq, 0);
  751. }
  752. /* delayed work function for auto resetting chip timer */
  753. static void bq2415x_timer_work(struct work_struct *work)
  754. {
  755. struct bq2415x_device *bq = container_of(work, struct bq2415x_device,
  756. work.work);
  757. int ret;
  758. int error;
  759. int boost;
  760. if (bq->automode > 0 && (bq->reported_mode != bq->mode)) {
  761. sysfs_notify(&bq->charger.dev->kobj, NULL, "reported_mode");
  762. bq2415x_set_mode(bq, bq->reported_mode);
  763. }
  764. if (!bq->autotimer)
  765. return;
  766. ret = bq2415x_exec_command(bq, BQ2415X_TIMER_RESET);
  767. if (ret < 0) {
  768. bq2415x_timer_error(bq, "Resetting timer failed");
  769. return;
  770. }
  771. boost = bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_STATUS);
  772. if (boost < 0) {
  773. bq2415x_timer_error(bq, "Unknown error");
  774. return;
  775. }
  776. error = bq2415x_exec_command(bq, BQ2415X_FAULT_STATUS);
  777. if (error < 0) {
  778. bq2415x_timer_error(bq, "Unknown error");
  779. return;
  780. }
  781. if (boost) {
  782. switch (error) {
  783. /* Non fatal errors, chip is OK */
  784. case 0: /* No error */
  785. break;
  786. case 6: /* Timer expired */
  787. dev_err(bq->dev, "Timer expired\n");
  788. break;
  789. case 3: /* Battery voltage too low */
  790. dev_err(bq->dev, "Battery voltage to low\n");
  791. break;
  792. /* Fatal errors, disable and reset chip */
  793. case 1: /* Overvoltage protection (chip fried) */
  794. bq2415x_timer_error(bq,
  795. "Overvoltage protection (chip fried)");
  796. return;
  797. case 2: /* Overload */
  798. bq2415x_timer_error(bq, "Overload");
  799. return;
  800. case 4: /* Battery overvoltage protection */
  801. bq2415x_timer_error(bq,
  802. "Battery overvoltage protection");
  803. return;
  804. case 5: /* Thermal shutdown (too hot) */
  805. bq2415x_timer_error(bq,
  806. "Thermal shutdown (too hot)");
  807. return;
  808. case 7: /* N/A */
  809. bq2415x_timer_error(bq, "Unknown error");
  810. return;
  811. }
  812. } else {
  813. switch (error) {
  814. /* Non fatal errors, chip is OK */
  815. case 0: /* No error */
  816. break;
  817. case 2: /* Sleep mode */
  818. dev_err(bq->dev, "Sleep mode\n");
  819. break;
  820. case 3: /* Poor input source */
  821. dev_err(bq->dev, "Poor input source\n");
  822. break;
  823. case 6: /* Timer expired */
  824. dev_err(bq->dev, "Timer expired\n");
  825. break;
  826. case 7: /* No battery */
  827. dev_err(bq->dev, "No battery\n");
  828. break;
  829. /* Fatal errors, disable and reset chip */
  830. case 1: /* Overvoltage protection (chip fried) */
  831. bq2415x_timer_error(bq,
  832. "Overvoltage protection (chip fried)");
  833. return;
  834. case 4: /* Battery overvoltage protection */
  835. bq2415x_timer_error(bq,
  836. "Battery overvoltage protection");
  837. return;
  838. case 5: /* Thermal shutdown (too hot) */
  839. bq2415x_timer_error(bq,
  840. "Thermal shutdown (too hot)");
  841. return;
  842. }
  843. }
  844. schedule_delayed_work(&bq->work, BQ2415X_TIMER_TIMEOUT * HZ);
  845. }
  846. /**** power supply interface code ****/
  847. static enum power_supply_property bq2415x_power_supply_props[] = {
  848. /* TODO: maybe add more power supply properties */
  849. POWER_SUPPLY_PROP_STATUS,
  850. POWER_SUPPLY_PROP_MODEL_NAME,
  851. };
  852. static int bq2415x_power_supply_get_property(struct power_supply *psy,
  853. enum power_supply_property psp,
  854. union power_supply_propval *val)
  855. {
  856. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  857. charger);
  858. int ret;
  859. switch (psp) {
  860. case POWER_SUPPLY_PROP_STATUS:
  861. ret = bq2415x_exec_command(bq, BQ2415X_CHARGE_STATUS);
  862. if (ret < 0)
  863. return ret;
  864. else if (ret == 0) /* Ready */
  865. val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
  866. else if (ret == 1) /* Charge in progress */
  867. val->intval = POWER_SUPPLY_STATUS_CHARGING;
  868. else if (ret == 2) /* Charge done */
  869. val->intval = POWER_SUPPLY_STATUS_FULL;
  870. else
  871. val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
  872. break;
  873. case POWER_SUPPLY_PROP_MODEL_NAME:
  874. val->strval = bq->model;
  875. break;
  876. default:
  877. return -EINVAL;
  878. }
  879. return 0;
  880. }
  881. static int bq2415x_power_supply_init(struct bq2415x_device *bq)
  882. {
  883. int ret;
  884. int chip;
  885. char revstr[8];
  886. bq->charger.name = bq->name;
  887. bq->charger.type = POWER_SUPPLY_TYPE_USB;
  888. bq->charger.properties = bq2415x_power_supply_props;
  889. bq->charger.num_properties = ARRAY_SIZE(bq2415x_power_supply_props);
  890. bq->charger.get_property = bq2415x_power_supply_get_property;
  891. ret = bq2415x_detect_chip(bq);
  892. if (ret < 0)
  893. chip = BQUNKNOWN;
  894. else
  895. chip = ret;
  896. ret = bq2415x_detect_revision(bq);
  897. if (ret < 0)
  898. strcpy(revstr, "unknown");
  899. else
  900. sprintf(revstr, "1.%d", ret);
  901. bq->model = kasprintf(GFP_KERNEL,
  902. "chip %s, revision %s, vender code %.3d",
  903. bq2415x_chip_name[chip], revstr,
  904. bq2415x_get_vender_code(bq));
  905. if (!bq->model) {
  906. dev_err(bq->dev, "failed to allocate model name\n");
  907. return -ENOMEM;
  908. }
  909. ret = power_supply_register(bq->dev, &bq->charger);
  910. if (ret) {
  911. kfree(bq->model);
  912. return ret;
  913. }
  914. return 0;
  915. }
  916. static void bq2415x_power_supply_exit(struct bq2415x_device *bq)
  917. {
  918. bq->autotimer = 0;
  919. if (bq->automode > 0)
  920. bq->automode = 0;
  921. cancel_delayed_work_sync(&bq->work);
  922. power_supply_unregister(&bq->charger);
  923. kfree(bq->model);
  924. }
  925. /**** additional sysfs entries for power supply interface ****/
  926. /* show *_status entries */
  927. static ssize_t bq2415x_sysfs_show_status(struct device *dev,
  928. struct device_attribute *attr,
  929. char *buf)
  930. {
  931. struct power_supply *psy = dev_get_drvdata(dev);
  932. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  933. charger);
  934. enum bq2415x_command command;
  935. int ret;
  936. if (strcmp(attr->attr.name, "otg_status") == 0)
  937. command = BQ2415X_OTG_STATUS;
  938. else if (strcmp(attr->attr.name, "charge_status") == 0)
  939. command = BQ2415X_CHARGE_STATUS;
  940. else if (strcmp(attr->attr.name, "boost_status") == 0)
  941. command = BQ2415X_BOOST_STATUS;
  942. else if (strcmp(attr->attr.name, "fault_status") == 0)
  943. command = BQ2415X_FAULT_STATUS;
  944. else
  945. return -EINVAL;
  946. ret = bq2415x_exec_command(bq, command);
  947. if (ret < 0)
  948. return ret;
  949. return sprintf(buf, "%d\n", ret);
  950. }
  951. /*
  952. * set timer entry:
  953. * auto - enable auto mode
  954. * off - disable auto mode
  955. * (other values) - reset chip timer
  956. */
  957. static ssize_t bq2415x_sysfs_set_timer(struct device *dev,
  958. struct device_attribute *attr,
  959. const char *buf,
  960. size_t count)
  961. {
  962. struct power_supply *psy = dev_get_drvdata(dev);
  963. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  964. charger);
  965. int ret = 0;
  966. if (strncmp(buf, "auto", 4) == 0)
  967. bq2415x_set_autotimer(bq, 1);
  968. else if (strncmp(buf, "off", 3) == 0)
  969. bq2415x_set_autotimer(bq, 0);
  970. else
  971. ret = bq2415x_exec_command(bq, BQ2415X_TIMER_RESET);
  972. if (ret < 0)
  973. return ret;
  974. return count;
  975. }
  976. /* show timer entry (auto or off) */
  977. static ssize_t bq2415x_sysfs_show_timer(struct device *dev,
  978. struct device_attribute *attr,
  979. char *buf)
  980. {
  981. struct power_supply *psy = dev_get_drvdata(dev);
  982. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  983. charger);
  984. if (bq->timer_error)
  985. return sprintf(buf, "%s\n", bq->timer_error);
  986. if (bq->autotimer)
  987. return sprintf(buf, "auto\n");
  988. return sprintf(buf, "off\n");
  989. }
  990. /*
  991. * set mode entry:
  992. * auto - if automode is supported, enable it and set mode to reported
  993. * none - disable charger and boost mode
  994. * host - charging mode for host/hub chargers (current limit 500mA)
  995. * dedicated - charging mode for dedicated chargers (unlimited current limit)
  996. * boost - disable charger and enable boost mode
  997. */
  998. static ssize_t bq2415x_sysfs_set_mode(struct device *dev,
  999. struct device_attribute *attr,
  1000. const char *buf,
  1001. size_t count)
  1002. {
  1003. struct power_supply *psy = dev_get_drvdata(dev);
  1004. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  1005. charger);
  1006. enum bq2415x_mode mode;
  1007. int ret = 0;
  1008. if (strncmp(buf, "auto", 4) == 0) {
  1009. if (bq->automode < 0)
  1010. return -ENOSYS;
  1011. bq->automode = 1;
  1012. mode = bq->reported_mode;
  1013. } else if (strncmp(buf, "off", 3) == 0) {
  1014. if (bq->automode > 0)
  1015. bq->automode = 0;
  1016. mode = BQ2415X_MODE_OFF;
  1017. } else if (strncmp(buf, "none", 4) == 0) {
  1018. if (bq->automode > 0)
  1019. bq->automode = 0;
  1020. mode = BQ2415X_MODE_NONE;
  1021. } else if (strncmp(buf, "host", 4) == 0) {
  1022. if (bq->automode > 0)
  1023. bq->automode = 0;
  1024. mode = BQ2415X_MODE_HOST_CHARGER;
  1025. } else if (strncmp(buf, "dedicated", 9) == 0) {
  1026. if (bq->automode > 0)
  1027. bq->automode = 0;
  1028. mode = BQ2415X_MODE_DEDICATED_CHARGER;
  1029. } else if (strncmp(buf, "boost", 5) == 0) {
  1030. if (bq->automode > 0)
  1031. bq->automode = 0;
  1032. mode = BQ2415X_MODE_BOOST;
  1033. } else if (strncmp(buf, "reset", 5) == 0) {
  1034. bq2415x_reset_chip(bq);
  1035. bq2415x_set_defaults(bq);
  1036. if (bq->automode <= 0)
  1037. return count;
  1038. bq->automode = 1;
  1039. mode = bq->reported_mode;
  1040. } else {
  1041. return -EINVAL;
  1042. }
  1043. ret = bq2415x_set_mode(bq, mode);
  1044. if (ret < 0)
  1045. return ret;
  1046. return count;
  1047. }
  1048. /* show mode entry (auto, none, host, dedicated or boost) */
  1049. static ssize_t bq2415x_sysfs_show_mode(struct device *dev,
  1050. struct device_attribute *attr,
  1051. char *buf)
  1052. {
  1053. struct power_supply *psy = dev_get_drvdata(dev);
  1054. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  1055. charger);
  1056. ssize_t ret = 0;
  1057. if (bq->automode > 0)
  1058. ret += sprintf(buf+ret, "auto (");
  1059. switch (bq->mode) {
  1060. case BQ2415X_MODE_OFF:
  1061. ret += sprintf(buf+ret, "off");
  1062. break;
  1063. case BQ2415X_MODE_NONE:
  1064. ret += sprintf(buf+ret, "none");
  1065. break;
  1066. case BQ2415X_MODE_HOST_CHARGER:
  1067. ret += sprintf(buf+ret, "host");
  1068. break;
  1069. case BQ2415X_MODE_DEDICATED_CHARGER:
  1070. ret += sprintf(buf+ret, "dedicated");
  1071. break;
  1072. case BQ2415X_MODE_BOOST:
  1073. ret += sprintf(buf+ret, "boost");
  1074. break;
  1075. }
  1076. if (bq->automode > 0)
  1077. ret += sprintf(buf+ret, ")");
  1078. ret += sprintf(buf+ret, "\n");
  1079. return ret;
  1080. }
  1081. /* show reported_mode entry (none, host, dedicated or boost) */
  1082. static ssize_t bq2415x_sysfs_show_reported_mode(struct device *dev,
  1083. struct device_attribute *attr,
  1084. char *buf)
  1085. {
  1086. struct power_supply *psy = dev_get_drvdata(dev);
  1087. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  1088. charger);
  1089. if (bq->automode < 0)
  1090. return -EINVAL;
  1091. switch (bq->reported_mode) {
  1092. case BQ2415X_MODE_OFF:
  1093. return sprintf(buf, "off\n");
  1094. case BQ2415X_MODE_NONE:
  1095. return sprintf(buf, "none\n");
  1096. case BQ2415X_MODE_HOST_CHARGER:
  1097. return sprintf(buf, "host\n");
  1098. case BQ2415X_MODE_DEDICATED_CHARGER:
  1099. return sprintf(buf, "dedicated\n");
  1100. case BQ2415X_MODE_BOOST:
  1101. return sprintf(buf, "boost\n");
  1102. }
  1103. return -EINVAL;
  1104. }
  1105. /* directly set raw value to chip register, format: 'register value' */
  1106. static ssize_t bq2415x_sysfs_set_registers(struct device *dev,
  1107. struct device_attribute *attr,
  1108. const char *buf,
  1109. size_t count)
  1110. {
  1111. struct power_supply *psy = dev_get_drvdata(dev);
  1112. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  1113. charger);
  1114. ssize_t ret = 0;
  1115. unsigned int reg;
  1116. unsigned int val;
  1117. if (sscanf(buf, "%x %x", &reg, &val) != 2)
  1118. return -EINVAL;
  1119. if (reg > 4 || val > 255)
  1120. return -EINVAL;
  1121. ret = bq2415x_i2c_write(bq, reg, val);
  1122. if (ret < 0)
  1123. return ret;
  1124. return count;
  1125. }
  1126. /* print value of chip register, format: 'register=value' */
  1127. static ssize_t bq2415x_sysfs_print_reg(struct bq2415x_device *bq,
  1128. u8 reg,
  1129. char *buf)
  1130. {
  1131. int ret = bq2415x_i2c_read(bq, reg);
  1132. if (ret < 0)
  1133. return sprintf(buf, "%#.2x=error %d\n", reg, ret);
  1134. return sprintf(buf, "%#.2x=%#.2x\n", reg, ret);
  1135. }
  1136. /* show all raw values of chip register, format per line: 'register=value' */
  1137. static ssize_t bq2415x_sysfs_show_registers(struct device *dev,
  1138. struct device_attribute *attr,
  1139. char *buf)
  1140. {
  1141. struct power_supply *psy = dev_get_drvdata(dev);
  1142. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  1143. charger);
  1144. ssize_t ret = 0;
  1145. ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_STATUS, buf+ret);
  1146. ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_CONTROL, buf+ret);
  1147. ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_VOLTAGE, buf+ret);
  1148. ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_VENDER, buf+ret);
  1149. ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_CURRENT, buf+ret);
  1150. return ret;
  1151. }
  1152. /* set current and voltage limit entries (in mA or mV) */
  1153. static ssize_t bq2415x_sysfs_set_limit(struct device *dev,
  1154. struct device_attribute *attr,
  1155. const char *buf,
  1156. size_t count)
  1157. {
  1158. struct power_supply *psy = dev_get_drvdata(dev);
  1159. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  1160. charger);
  1161. long val;
  1162. int ret;
  1163. if (kstrtol(buf, 10, &val) < 0)
  1164. return -EINVAL;
  1165. if (strcmp(attr->attr.name, "current_limit") == 0)
  1166. ret = bq2415x_set_current_limit(bq, val);
  1167. else if (strcmp(attr->attr.name, "weak_battery_voltage") == 0)
  1168. ret = bq2415x_set_weak_battery_voltage(bq, val);
  1169. else if (strcmp(attr->attr.name, "battery_regulation_voltage") == 0)
  1170. ret = bq2415x_set_battery_regulation_voltage(bq, val);
  1171. else if (strcmp(attr->attr.name, "charge_current") == 0)
  1172. ret = bq2415x_set_charge_current(bq, val);
  1173. else if (strcmp(attr->attr.name, "termination_current") == 0)
  1174. ret = bq2415x_set_termination_current(bq, val);
  1175. else
  1176. return -EINVAL;
  1177. if (ret < 0)
  1178. return ret;
  1179. return count;
  1180. }
  1181. /* show current and voltage limit entries (in mA or mV) */
  1182. static ssize_t bq2415x_sysfs_show_limit(struct device *dev,
  1183. struct device_attribute *attr,
  1184. char *buf)
  1185. {
  1186. struct power_supply *psy = dev_get_drvdata(dev);
  1187. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  1188. charger);
  1189. int ret;
  1190. if (strcmp(attr->attr.name, "current_limit") == 0)
  1191. ret = bq2415x_get_current_limit(bq);
  1192. else if (strcmp(attr->attr.name, "weak_battery_voltage") == 0)
  1193. ret = bq2415x_get_weak_battery_voltage(bq);
  1194. else if (strcmp(attr->attr.name, "battery_regulation_voltage") == 0)
  1195. ret = bq2415x_get_battery_regulation_voltage(bq);
  1196. else if (strcmp(attr->attr.name, "charge_current") == 0)
  1197. ret = bq2415x_get_charge_current(bq);
  1198. else if (strcmp(attr->attr.name, "termination_current") == 0)
  1199. ret = bq2415x_get_termination_current(bq);
  1200. else
  1201. return -EINVAL;
  1202. if (ret < 0)
  1203. return ret;
  1204. return sprintf(buf, "%d\n", ret);
  1205. }
  1206. /* set *_enable entries */
  1207. static ssize_t bq2415x_sysfs_set_enable(struct device *dev,
  1208. struct device_attribute *attr,
  1209. const char *buf,
  1210. size_t count)
  1211. {
  1212. struct power_supply *psy = dev_get_drvdata(dev);
  1213. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  1214. charger);
  1215. enum bq2415x_command command;
  1216. long val;
  1217. int ret;
  1218. if (kstrtol(buf, 10, &val) < 0)
  1219. return -EINVAL;
  1220. if (strcmp(attr->attr.name, "charge_termination_enable") == 0)
  1221. command = val ? BQ2415X_CHARGE_TERMINATION_ENABLE :
  1222. BQ2415X_CHARGE_TERMINATION_DISABLE;
  1223. else if (strcmp(attr->attr.name, "high_impedance_enable") == 0)
  1224. command = val ? BQ2415X_HIGH_IMPEDANCE_ENABLE :
  1225. BQ2415X_HIGH_IMPEDANCE_DISABLE;
  1226. else if (strcmp(attr->attr.name, "otg_pin_enable") == 0)
  1227. command = val ? BQ2415X_OTG_PIN_ENABLE :
  1228. BQ2415X_OTG_PIN_DISABLE;
  1229. else if (strcmp(attr->attr.name, "stat_pin_enable") == 0)
  1230. command = val ? BQ2415X_STAT_PIN_ENABLE :
  1231. BQ2415X_STAT_PIN_DISABLE;
  1232. else
  1233. return -EINVAL;
  1234. ret = bq2415x_exec_command(bq, command);
  1235. if (ret < 0)
  1236. return ret;
  1237. return count;
  1238. }
  1239. /* show *_enable entries */
  1240. static ssize_t bq2415x_sysfs_show_enable(struct device *dev,
  1241. struct device_attribute *attr,
  1242. char *buf)
  1243. {
  1244. struct power_supply *psy = dev_get_drvdata(dev);
  1245. struct bq2415x_device *bq = container_of(psy, struct bq2415x_device,
  1246. charger);
  1247. enum bq2415x_command command;
  1248. int ret;
  1249. if (strcmp(attr->attr.name, "charge_termination_enable") == 0)
  1250. command = BQ2415X_CHARGE_TERMINATION_STATUS;
  1251. else if (strcmp(attr->attr.name, "high_impedance_enable") == 0)
  1252. command = BQ2415X_HIGH_IMPEDANCE_STATUS;
  1253. else if (strcmp(attr->attr.name, "otg_pin_enable") == 0)
  1254. command = BQ2415X_OTG_PIN_STATUS;
  1255. else if (strcmp(attr->attr.name, "stat_pin_enable") == 0)
  1256. command = BQ2415X_STAT_PIN_STATUS;
  1257. else
  1258. return -EINVAL;
  1259. ret = bq2415x_exec_command(bq, command);
  1260. if (ret < 0)
  1261. return ret;
  1262. return sprintf(buf, "%d\n", ret);
  1263. }
  1264. static DEVICE_ATTR(current_limit, S_IWUSR | S_IRUGO,
  1265. bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
  1266. static DEVICE_ATTR(weak_battery_voltage, S_IWUSR | S_IRUGO,
  1267. bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
  1268. static DEVICE_ATTR(battery_regulation_voltage, S_IWUSR | S_IRUGO,
  1269. bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
  1270. static DEVICE_ATTR(charge_current, S_IWUSR | S_IRUGO,
  1271. bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
  1272. static DEVICE_ATTR(termination_current, S_IWUSR | S_IRUGO,
  1273. bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
  1274. static DEVICE_ATTR(charge_termination_enable, S_IWUSR | S_IRUGO,
  1275. bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable);
  1276. static DEVICE_ATTR(high_impedance_enable, S_IWUSR | S_IRUGO,
  1277. bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable);
  1278. static DEVICE_ATTR(otg_pin_enable, S_IWUSR | S_IRUGO,
  1279. bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable);
  1280. static DEVICE_ATTR(stat_pin_enable, S_IWUSR | S_IRUGO,
  1281. bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable);
  1282. static DEVICE_ATTR(reported_mode, S_IRUGO,
  1283. bq2415x_sysfs_show_reported_mode, NULL);
  1284. static DEVICE_ATTR(mode, S_IWUSR | S_IRUGO,
  1285. bq2415x_sysfs_show_mode, bq2415x_sysfs_set_mode);
  1286. static DEVICE_ATTR(timer, S_IWUSR | S_IRUGO,
  1287. bq2415x_sysfs_show_timer, bq2415x_sysfs_set_timer);
  1288. static DEVICE_ATTR(registers, S_IWUSR | S_IRUGO,
  1289. bq2415x_sysfs_show_registers, bq2415x_sysfs_set_registers);
  1290. static DEVICE_ATTR(otg_status, S_IRUGO, bq2415x_sysfs_show_status, NULL);
  1291. static DEVICE_ATTR(charge_status, S_IRUGO, bq2415x_sysfs_show_status, NULL);
  1292. static DEVICE_ATTR(boost_status, S_IRUGO, bq2415x_sysfs_show_status, NULL);
  1293. static DEVICE_ATTR(fault_status, S_IRUGO, bq2415x_sysfs_show_status, NULL);
  1294. static struct attribute *bq2415x_sysfs_attributes[] = {
  1295. /*
  1296. * TODO: some (appropriate) of these attrs should be switched to
  1297. * use power supply class props.
  1298. */
  1299. &dev_attr_current_limit.attr,
  1300. &dev_attr_weak_battery_voltage.attr,
  1301. &dev_attr_battery_regulation_voltage.attr,
  1302. &dev_attr_charge_current.attr,
  1303. &dev_attr_termination_current.attr,
  1304. &dev_attr_charge_termination_enable.attr,
  1305. &dev_attr_high_impedance_enable.attr,
  1306. &dev_attr_otg_pin_enable.attr,
  1307. &dev_attr_stat_pin_enable.attr,
  1308. &dev_attr_reported_mode.attr,
  1309. &dev_attr_mode.attr,
  1310. &dev_attr_timer.attr,
  1311. &dev_attr_registers.attr,
  1312. &dev_attr_otg_status.attr,
  1313. &dev_attr_charge_status.attr,
  1314. &dev_attr_boost_status.attr,
  1315. &dev_attr_fault_status.attr,
  1316. NULL,
  1317. };
  1318. static const struct attribute_group bq2415x_sysfs_attr_group = {
  1319. .attrs = bq2415x_sysfs_attributes,
  1320. };
  1321. static int bq2415x_sysfs_init(struct bq2415x_device *bq)
  1322. {
  1323. return sysfs_create_group(&bq->charger.dev->kobj,
  1324. &bq2415x_sysfs_attr_group);
  1325. }
  1326. static void bq2415x_sysfs_exit(struct bq2415x_device *bq)
  1327. {
  1328. sysfs_remove_group(&bq->charger.dev->kobj, &bq2415x_sysfs_attr_group);
  1329. }
  1330. /* main bq2415x probe function */
  1331. static int bq2415x_probe(struct i2c_client *client,
  1332. const struct i2c_device_id *id)
  1333. {
  1334. int ret;
  1335. int num;
  1336. char *name;
  1337. struct bq2415x_device *bq;
  1338. struct device_node *np = client->dev.of_node;
  1339. struct bq2415x_platform_data *pdata = client->dev.platform_data;
  1340. if (!np && !pdata) {
  1341. dev_err(&client->dev, "platform data missing\n");
  1342. return -ENODEV;
  1343. }
  1344. /* Get new ID for the new device */
  1345. mutex_lock(&bq2415x_id_mutex);
  1346. num = idr_alloc(&bq2415x_id, client, 0, 0, GFP_KERNEL);
  1347. mutex_unlock(&bq2415x_id_mutex);
  1348. if (num < 0)
  1349. return num;
  1350. name = kasprintf(GFP_KERNEL, "%s-%d", id->name, num);
  1351. if (!name) {
  1352. dev_err(&client->dev, "failed to allocate device name\n");
  1353. ret = -ENOMEM;
  1354. goto error_1;
  1355. }
  1356. bq = devm_kzalloc(&client->dev, sizeof(*bq), GFP_KERNEL);
  1357. if (!bq) {
  1358. dev_err(&client->dev, "failed to allocate device data\n");
  1359. ret = -ENOMEM;
  1360. goto error_2;
  1361. }
  1362. if (np) {
  1363. bq->notify_psy = power_supply_get_by_phandle(np, "ti,usb-charger-detection");
  1364. if (!bq->notify_psy)
  1365. return -EPROBE_DEFER;
  1366. }
  1367. else if (pdata->notify_device)
  1368. bq->notify_psy = power_supply_get_by_name(pdata->notify_device);
  1369. else
  1370. bq->notify_psy = NULL;
  1371. i2c_set_clientdata(client, bq);
  1372. bq->id = num;
  1373. bq->dev = &client->dev;
  1374. bq->chip = id->driver_data;
  1375. bq->name = name;
  1376. bq->mode = BQ2415X_MODE_OFF;
  1377. bq->reported_mode = BQ2415X_MODE_OFF;
  1378. bq->autotimer = 0;
  1379. bq->automode = 0;
  1380. if (np) {
  1381. ret = of_property_read_u32(np, "ti,current-limit",
  1382. &bq->init_data.current_limit);
  1383. if (ret)
  1384. return ret;
  1385. ret = of_property_read_u32(np, "ti,weak-battery-voltage",
  1386. &bq->init_data.weak_battery_voltage);
  1387. if (ret)
  1388. return ret;
  1389. ret = of_property_read_u32(np, "ti,battery-regulation-voltage",
  1390. &bq->init_data.battery_regulation_voltage);
  1391. if (ret)
  1392. return ret;
  1393. ret = of_property_read_u32(np, "ti,charge-current",
  1394. &bq->init_data.charge_current);
  1395. if (ret)
  1396. return ret;
  1397. ret = of_property_read_u32(np, "ti,termination-current",
  1398. &bq->init_data.termination_current);
  1399. if (ret)
  1400. return ret;
  1401. ret = of_property_read_u32(np, "ti,resistor-sense",
  1402. &bq->init_data.resistor_sense);
  1403. if (ret)
  1404. return ret;
  1405. } else {
  1406. memcpy(&bq->init_data, pdata, sizeof(bq->init_data));
  1407. }
  1408. bq2415x_reset_chip(bq);
  1409. ret = bq2415x_power_supply_init(bq);
  1410. if (ret) {
  1411. dev_err(bq->dev, "failed to register power supply: %d\n", ret);
  1412. goto error_2;
  1413. }
  1414. ret = bq2415x_sysfs_init(bq);
  1415. if (ret) {
  1416. dev_err(bq->dev, "failed to create sysfs entries: %d\n", ret);
  1417. goto error_3;
  1418. }
  1419. ret = bq2415x_set_defaults(bq);
  1420. if (ret) {
  1421. dev_err(bq->dev, "failed to set default values: %d\n", ret);
  1422. goto error_4;
  1423. }
  1424. if (bq->notify_psy) {
  1425. bq->nb.notifier_call = bq2415x_notifier_call;
  1426. ret = power_supply_reg_notifier(&bq->nb);
  1427. if (ret) {
  1428. dev_err(bq->dev, "failed to reg notifier: %d\n", ret);
  1429. goto error_5;
  1430. }
  1431. /* Query for initial reported_mode and set it */
  1432. bq2415x_notifier_call(&bq->nb, PSY_EVENT_PROP_CHANGED, bq->notify_psy);
  1433. bq2415x_set_mode(bq, bq->reported_mode);
  1434. bq->automode = 1;
  1435. dev_info(bq->dev, "automode enabled\n");
  1436. } else {
  1437. bq->automode = -1;
  1438. dev_info(bq->dev, "automode not supported\n");
  1439. }
  1440. INIT_DELAYED_WORK(&bq->work, bq2415x_timer_work);
  1441. bq2415x_set_autotimer(bq, 1);
  1442. dev_info(bq->dev, "driver registered\n");
  1443. return 0;
  1444. error_5:
  1445. error_4:
  1446. bq2415x_sysfs_exit(bq);
  1447. error_3:
  1448. bq2415x_power_supply_exit(bq);
  1449. error_2:
  1450. kfree(name);
  1451. error_1:
  1452. mutex_lock(&bq2415x_id_mutex);
  1453. idr_remove(&bq2415x_id, num);
  1454. mutex_unlock(&bq2415x_id_mutex);
  1455. return ret;
  1456. }
  1457. /* main bq2415x remove function */
  1458. static int bq2415x_remove(struct i2c_client *client)
  1459. {
  1460. struct bq2415x_device *bq = i2c_get_clientdata(client);
  1461. if (bq->notify_psy)
  1462. power_supply_unreg_notifier(&bq->nb);
  1463. bq2415x_sysfs_exit(bq);
  1464. bq2415x_power_supply_exit(bq);
  1465. bq2415x_reset_chip(bq);
  1466. mutex_lock(&bq2415x_id_mutex);
  1467. idr_remove(&bq2415x_id, bq->id);
  1468. mutex_unlock(&bq2415x_id_mutex);
  1469. dev_info(bq->dev, "driver unregistered\n");
  1470. kfree(bq->name);
  1471. return 0;
  1472. }
  1473. static const struct i2c_device_id bq2415x_i2c_id_table[] = {
  1474. { "bq2415x", BQUNKNOWN },
  1475. { "bq24150", BQ24150 },
  1476. { "bq24150a", BQ24150A },
  1477. { "bq24151", BQ24151 },
  1478. { "bq24151a", BQ24151A },
  1479. { "bq24152", BQ24152 },
  1480. { "bq24153", BQ24153 },
  1481. { "bq24153a", BQ24153A },
  1482. { "bq24155", BQ24155 },
  1483. { "bq24156", BQ24156 },
  1484. { "bq24156a", BQ24156A },
  1485. { "bq24158", BQ24158 },
  1486. {},
  1487. };
  1488. MODULE_DEVICE_TABLE(i2c, bq2415x_i2c_id_table);
  1489. static struct i2c_driver bq2415x_driver = {
  1490. .driver = {
  1491. .name = "bq2415x-charger",
  1492. },
  1493. .probe = bq2415x_probe,
  1494. .remove = bq2415x_remove,
  1495. .id_table = bq2415x_i2c_id_table,
  1496. };
  1497. module_i2c_driver(bq2415x_driver);
  1498. MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>");
  1499. MODULE_DESCRIPTION("bq2415x charger driver");
  1500. MODULE_LICENSE("GPL");