pm2301_charger.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263
  1. /*
  2. * Copyright 2012 ST Ericsson.
  3. *
  4. * Power supply driver for ST Ericsson pm2xxx_charger charger
  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 version 2 as
  8. * published by the Free Software Foundation.
  9. */
  10. #include <linux/init.h>
  11. #include <linux/module.h>
  12. #include <linux/device.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/delay.h>
  15. #include <linux/slab.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/power_supply.h>
  18. #include <linux/regulator/consumer.h>
  19. #include <linux/err.h>
  20. #include <linux/i2c.h>
  21. #include <linux/workqueue.h>
  22. #include <linux/mfd/abx500/ab8500.h>
  23. #include <linux/mfd/abx500/ab8500-bm.h>
  24. #include <linux/mfd/abx500/ux500_chargalg.h>
  25. #include <linux/pm2301_charger.h>
  26. #include <linux/gpio.h>
  27. #include <linux/pm_runtime.h>
  28. #include "pm2301_charger.h"
  29. #define to_pm2xxx_charger_ac_device_info(x) container_of((x), \
  30. struct pm2xxx_charger, ac_chg)
  31. #define SLEEP_MIN 50
  32. #define SLEEP_MAX 100
  33. #define PM2XXX_AUTOSUSPEND_DELAY 500
  34. static int pm2xxx_interrupt_registers[] = {
  35. PM2XXX_REG_INT1,
  36. PM2XXX_REG_INT2,
  37. PM2XXX_REG_INT3,
  38. PM2XXX_REG_INT4,
  39. PM2XXX_REG_INT5,
  40. PM2XXX_REG_INT6,
  41. };
  42. static enum power_supply_property pm2xxx_charger_ac_props[] = {
  43. POWER_SUPPLY_PROP_HEALTH,
  44. POWER_SUPPLY_PROP_PRESENT,
  45. POWER_SUPPLY_PROP_ONLINE,
  46. POWER_SUPPLY_PROP_VOLTAGE_AVG,
  47. };
  48. static int pm2xxx_charger_voltage_map[] = {
  49. 3500,
  50. 3525,
  51. 3550,
  52. 3575,
  53. 3600,
  54. 3625,
  55. 3650,
  56. 3675,
  57. 3700,
  58. 3725,
  59. 3750,
  60. 3775,
  61. 3800,
  62. 3825,
  63. 3850,
  64. 3875,
  65. 3900,
  66. 3925,
  67. 3950,
  68. 3975,
  69. 4000,
  70. 4025,
  71. 4050,
  72. 4075,
  73. 4100,
  74. 4125,
  75. 4150,
  76. 4175,
  77. 4200,
  78. 4225,
  79. 4250,
  80. 4275,
  81. 4300,
  82. };
  83. static int pm2xxx_charger_current_map[] = {
  84. 200,
  85. 200,
  86. 400,
  87. 600,
  88. 800,
  89. 1000,
  90. 1200,
  91. 1400,
  92. 1600,
  93. 1800,
  94. 2000,
  95. 2200,
  96. 2400,
  97. 2600,
  98. 2800,
  99. 3000,
  100. };
  101. static const struct i2c_device_id pm2xxx_ident[] = {
  102. { "pm2301", 0 },
  103. { }
  104. };
  105. static void set_lpn_pin(struct pm2xxx_charger *pm2)
  106. {
  107. if (!pm2->ac.charger_connected && gpio_is_valid(pm2->lpn_pin)) {
  108. gpio_set_value(pm2->lpn_pin, 1);
  109. usleep_range(SLEEP_MIN, SLEEP_MAX);
  110. }
  111. }
  112. static void clear_lpn_pin(struct pm2xxx_charger *pm2)
  113. {
  114. if (!pm2->ac.charger_connected && gpio_is_valid(pm2->lpn_pin))
  115. gpio_set_value(pm2->lpn_pin, 0);
  116. }
  117. static int pm2xxx_reg_read(struct pm2xxx_charger *pm2, int reg, u8 *val)
  118. {
  119. int ret;
  120. /* wake up the device */
  121. pm_runtime_get_sync(pm2->dev);
  122. ret = i2c_smbus_read_i2c_block_data(pm2->config.pm2xxx_i2c, reg,
  123. 1, val);
  124. if (ret < 0)
  125. dev_err(pm2->dev, "Error reading register at 0x%x\n", reg);
  126. else
  127. ret = 0;
  128. pm_runtime_put_sync(pm2->dev);
  129. return ret;
  130. }
  131. static int pm2xxx_reg_write(struct pm2xxx_charger *pm2, int reg, u8 val)
  132. {
  133. int ret;
  134. /* wake up the device */
  135. pm_runtime_get_sync(pm2->dev);
  136. ret = i2c_smbus_write_i2c_block_data(pm2->config.pm2xxx_i2c, reg,
  137. 1, &val);
  138. if (ret < 0)
  139. dev_err(pm2->dev, "Error writing register at 0x%x\n", reg);
  140. else
  141. ret = 0;
  142. pm_runtime_put_sync(pm2->dev);
  143. return ret;
  144. }
  145. static int pm2xxx_charging_enable_mngt(struct pm2xxx_charger *pm2)
  146. {
  147. int ret;
  148. /* Enable charging */
  149. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2,
  150. (PM2XXX_CH_AUTO_RESUME_EN | PM2XXX_CHARGER_ENA));
  151. return ret;
  152. }
  153. static int pm2xxx_charging_disable_mngt(struct pm2xxx_charger *pm2)
  154. {
  155. int ret;
  156. /* Disable SW EOC ctrl */
  157. ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG, PM2XXX_SWCTRL_HW);
  158. if (ret < 0) {
  159. dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
  160. return ret;
  161. }
  162. /* Disable charging */
  163. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2,
  164. (PM2XXX_CH_AUTO_RESUME_DIS | PM2XXX_CHARGER_DIS));
  165. if (ret < 0) {
  166. dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
  167. return ret;
  168. }
  169. return 0;
  170. }
  171. static int pm2xxx_charger_batt_therm_mngt(struct pm2xxx_charger *pm2, int val)
  172. {
  173. queue_work(pm2->charger_wq, &pm2->check_main_thermal_prot_work);
  174. return 0;
  175. }
  176. int pm2xxx_charger_die_therm_mngt(struct pm2xxx_charger *pm2, int val)
  177. {
  178. queue_work(pm2->charger_wq, &pm2->check_main_thermal_prot_work);
  179. return 0;
  180. }
  181. static int pm2xxx_charger_ovv_mngt(struct pm2xxx_charger *pm2, int val)
  182. {
  183. dev_err(pm2->dev, "Overvoltage detected\n");
  184. pm2->flags.ovv = true;
  185. power_supply_changed(&pm2->ac_chg.psy);
  186. /* Schedule a new HW failure check */
  187. queue_delayed_work(pm2->charger_wq, &pm2->check_hw_failure_work, 0);
  188. return 0;
  189. }
  190. static int pm2xxx_charger_wd_exp_mngt(struct pm2xxx_charger *pm2, int val)
  191. {
  192. dev_dbg(pm2->dev , "20 minutes watchdog occured\n");
  193. pm2->ac.wd_expired = true;
  194. power_supply_changed(&pm2->ac_chg.psy);
  195. return 0;
  196. }
  197. static int pm2xxx_charger_vbat_lsig_mngt(struct pm2xxx_charger *pm2, int val)
  198. {
  199. int ret;
  200. switch (val) {
  201. case PM2XXX_INT1_ITVBATLOWR:
  202. dev_dbg(pm2->dev, "VBAT grows above VBAT_LOW level\n");
  203. /* Enable SW EOC ctrl */
  204. ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG,
  205. PM2XXX_SWCTRL_SW);
  206. if (ret < 0) {
  207. dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
  208. return ret;
  209. }
  210. break;
  211. case PM2XXX_INT1_ITVBATLOWF:
  212. dev_dbg(pm2->dev, "VBAT drops below VBAT_LOW level\n");
  213. /* Disable SW EOC ctrl */
  214. ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG,
  215. PM2XXX_SWCTRL_HW);
  216. if (ret < 0) {
  217. dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
  218. return ret;
  219. }
  220. break;
  221. default:
  222. dev_err(pm2->dev, "Unknown VBAT level\n");
  223. }
  224. return 0;
  225. }
  226. static int pm2xxx_charger_bat_disc_mngt(struct pm2xxx_charger *pm2, int val)
  227. {
  228. dev_dbg(pm2->dev, "battery disconnected\n");
  229. return 0;
  230. }
  231. static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val)
  232. {
  233. int ret;
  234. ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT2, val);
  235. if (ret < 0) {
  236. dev_err(pm2->dev, "Charger detection failed\n");
  237. goto out;
  238. }
  239. *val &= (PM2XXX_INT2_S_ITVPWR1PLUG | PM2XXX_INT2_S_ITVPWR2PLUG);
  240. out:
  241. return ret;
  242. }
  243. static int pm2xxx_charger_itv_pwr_plug_mngt(struct pm2xxx_charger *pm2, int val)
  244. {
  245. int ret;
  246. u8 read_val;
  247. /*
  248. * Since we can't be sure that the events are received
  249. * synchronously, we have the check if the main charger is
  250. * connected by reading the interrupt source register.
  251. */
  252. ret = pm2xxx_charger_detection(pm2, &read_val);
  253. if ((ret == 0) && read_val) {
  254. pm2->ac.charger_connected = 1;
  255. pm2->ac_conn = true;
  256. queue_work(pm2->charger_wq, &pm2->ac_work);
  257. }
  258. return ret;
  259. }
  260. static int pm2xxx_charger_itv_pwr_unplug_mngt(struct pm2xxx_charger *pm2,
  261. int val)
  262. {
  263. pm2->ac.charger_connected = 0;
  264. queue_work(pm2->charger_wq, &pm2->ac_work);
  265. return 0;
  266. }
  267. static int pm2_int_reg0(void *pm2_data, int val)
  268. {
  269. struct pm2xxx_charger *pm2 = pm2_data;
  270. int ret = 0;
  271. if (val & PM2XXX_INT1_ITVBATLOWR) {
  272. ret = pm2xxx_charger_vbat_lsig_mngt(pm2,
  273. PM2XXX_INT1_ITVBATLOWR);
  274. if (ret < 0)
  275. goto out;
  276. }
  277. if (val & PM2XXX_INT1_ITVBATLOWF) {
  278. ret = pm2xxx_charger_vbat_lsig_mngt(pm2,
  279. PM2XXX_INT1_ITVBATLOWF);
  280. if (ret < 0)
  281. goto out;
  282. }
  283. if (val & PM2XXX_INT1_ITVBATDISCONNECT) {
  284. ret = pm2xxx_charger_bat_disc_mngt(pm2,
  285. PM2XXX_INT1_ITVBATDISCONNECT);
  286. if (ret < 0)
  287. goto out;
  288. }
  289. out:
  290. return ret;
  291. }
  292. static int pm2_int_reg1(void *pm2_data, int val)
  293. {
  294. struct pm2xxx_charger *pm2 = pm2_data;
  295. int ret = 0;
  296. if (val & (PM2XXX_INT2_ITVPWR1PLUG | PM2XXX_INT2_ITVPWR2PLUG)) {
  297. dev_dbg(pm2->dev , "Main charger plugged\n");
  298. ret = pm2xxx_charger_itv_pwr_plug_mngt(pm2, val &
  299. (PM2XXX_INT2_ITVPWR1PLUG | PM2XXX_INT2_ITVPWR2PLUG));
  300. }
  301. if (val &
  302. (PM2XXX_INT2_ITVPWR1UNPLUG | PM2XXX_INT2_ITVPWR2UNPLUG)) {
  303. dev_dbg(pm2->dev , "Main charger unplugged\n");
  304. ret = pm2xxx_charger_itv_pwr_unplug_mngt(pm2, val &
  305. (PM2XXX_INT2_ITVPWR1UNPLUG |
  306. PM2XXX_INT2_ITVPWR2UNPLUG));
  307. }
  308. return ret;
  309. }
  310. static int pm2_int_reg2(void *pm2_data, int val)
  311. {
  312. struct pm2xxx_charger *pm2 = pm2_data;
  313. int ret = 0;
  314. if (val & PM2XXX_INT3_ITAUTOTIMEOUTWD)
  315. ret = pm2xxx_charger_wd_exp_mngt(pm2, val);
  316. if (val & (PM2XXX_INT3_ITCHPRECHARGEWD |
  317. PM2XXX_INT3_ITCHCCWD | PM2XXX_INT3_ITCHCVWD)) {
  318. dev_dbg(pm2->dev,
  319. "Watchdog occured for precharge, CC and CV charge\n");
  320. }
  321. return ret;
  322. }
  323. static int pm2_int_reg3(void *pm2_data, int val)
  324. {
  325. struct pm2xxx_charger *pm2 = pm2_data;
  326. int ret = 0;
  327. if (val & (PM2XXX_INT4_ITCHARGINGON)) {
  328. dev_dbg(pm2->dev ,
  329. "chargind operation has started\n");
  330. }
  331. if (val & (PM2XXX_INT4_ITVRESUME)) {
  332. dev_dbg(pm2->dev,
  333. "battery discharged down to VResume threshold\n");
  334. }
  335. if (val & (PM2XXX_INT4_ITBATTFULL)) {
  336. dev_dbg(pm2->dev , "battery fully detected\n");
  337. }
  338. if (val & (PM2XXX_INT4_ITCVPHASE)) {
  339. dev_dbg(pm2->dev, "CV phase enter with 0.5C charging\n");
  340. }
  341. if (val & (PM2XXX_INT4_ITVPWR2OVV | PM2XXX_INT4_ITVPWR1OVV)) {
  342. pm2->failure_case = VPWR_OVV;
  343. ret = pm2xxx_charger_ovv_mngt(pm2, val &
  344. (PM2XXX_INT4_ITVPWR2OVV | PM2XXX_INT4_ITVPWR1OVV));
  345. dev_dbg(pm2->dev, "VPWR/VSYSTEM overvoltage detected\n");
  346. }
  347. if (val & (PM2XXX_INT4_S_ITBATTEMPCOLD |
  348. PM2XXX_INT4_S_ITBATTEMPHOT)) {
  349. ret = pm2xxx_charger_batt_therm_mngt(pm2, val &
  350. (PM2XXX_INT4_S_ITBATTEMPCOLD |
  351. PM2XXX_INT4_S_ITBATTEMPHOT));
  352. dev_dbg(pm2->dev, "BTEMP is too Low/High\n");
  353. }
  354. return ret;
  355. }
  356. static int pm2_int_reg4(void *pm2_data, int val)
  357. {
  358. struct pm2xxx_charger *pm2 = pm2_data;
  359. int ret = 0;
  360. if (val & PM2XXX_INT5_ITVSYSTEMOVV) {
  361. pm2->failure_case = VSYSTEM_OVV;
  362. ret = pm2xxx_charger_ovv_mngt(pm2, val &
  363. PM2XXX_INT5_ITVSYSTEMOVV);
  364. dev_dbg(pm2->dev, "VSYSTEM overvoltage detected\n");
  365. }
  366. if (val & (PM2XXX_INT5_ITTHERMALWARNINGFALL |
  367. PM2XXX_INT5_ITTHERMALWARNINGRISE |
  368. PM2XXX_INT5_ITTHERMALSHUTDOWNFALL |
  369. PM2XXX_INT5_ITTHERMALSHUTDOWNRISE)) {
  370. dev_dbg(pm2->dev, "BTEMP die temperature is too Low/High\n");
  371. ret = pm2xxx_charger_die_therm_mngt(pm2, val &
  372. (PM2XXX_INT5_ITTHERMALWARNINGFALL |
  373. PM2XXX_INT5_ITTHERMALWARNINGRISE |
  374. PM2XXX_INT5_ITTHERMALSHUTDOWNFALL |
  375. PM2XXX_INT5_ITTHERMALSHUTDOWNRISE));
  376. }
  377. return ret;
  378. }
  379. static int pm2_int_reg5(void *pm2_data, int val)
  380. {
  381. struct pm2xxx_charger *pm2 = pm2_data;
  382. int ret = 0;
  383. if (val & (PM2XXX_INT6_ITVPWR2DROP | PM2XXX_INT6_ITVPWR1DROP)) {
  384. dev_dbg(pm2->dev, "VMPWR drop to VBAT level\n");
  385. }
  386. if (val & (PM2XXX_INT6_ITVPWR2VALIDRISE |
  387. PM2XXX_INT6_ITVPWR1VALIDRISE |
  388. PM2XXX_INT6_ITVPWR2VALIDFALL |
  389. PM2XXX_INT6_ITVPWR1VALIDFALL)) {
  390. dev_dbg(pm2->dev, "Falling/Rising edge on WPWR1/2\n");
  391. }
  392. return ret;
  393. }
  394. static irqreturn_t pm2xxx_irq_int(int irq, void *data)
  395. {
  396. struct pm2xxx_charger *pm2 = data;
  397. struct pm2xxx_interrupts *interrupt = pm2->pm2_int;
  398. int i;
  399. /* wake up the device */
  400. pm_runtime_get_sync(pm2->dev);
  401. do {
  402. for (i = 0; i < PM2XXX_NUM_INT_REG; i++) {
  403. pm2xxx_reg_read(pm2,
  404. pm2xxx_interrupt_registers[i],
  405. &(interrupt->reg[i]));
  406. if (interrupt->reg[i] > 0)
  407. interrupt->handler[i](pm2, interrupt->reg[i]);
  408. }
  409. } while (gpio_get_value(pm2->pdata->gpio_irq_number) == 0);
  410. pm_runtime_mark_last_busy(pm2->dev);
  411. pm_runtime_put_autosuspend(pm2->dev);
  412. return IRQ_HANDLED;
  413. }
  414. static int pm2xxx_charger_get_ac_cv(struct pm2xxx_charger *pm2)
  415. {
  416. int ret = 0;
  417. u8 val;
  418. if (pm2->ac.charger_connected && pm2->ac.charger_online) {
  419. ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT4, &val);
  420. if (ret < 0) {
  421. dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
  422. goto out;
  423. }
  424. if (val & PM2XXX_INT4_S_ITCVPHASE)
  425. ret = PM2XXX_CONST_VOLT;
  426. else
  427. ret = PM2XXX_CONST_CURR;
  428. }
  429. out:
  430. return ret;
  431. }
  432. static int pm2xxx_current_to_regval(int curr)
  433. {
  434. int i;
  435. if (curr < pm2xxx_charger_current_map[0])
  436. return 0;
  437. for (i = 1; i < ARRAY_SIZE(pm2xxx_charger_current_map); i++) {
  438. if (curr < pm2xxx_charger_current_map[i])
  439. return (i - 1);
  440. }
  441. i = ARRAY_SIZE(pm2xxx_charger_current_map) - 1;
  442. if (curr == pm2xxx_charger_current_map[i])
  443. return i;
  444. else
  445. return -EINVAL;
  446. }
  447. static int pm2xxx_voltage_to_regval(int curr)
  448. {
  449. int i;
  450. if (curr < pm2xxx_charger_voltage_map[0])
  451. return 0;
  452. for (i = 1; i < ARRAY_SIZE(pm2xxx_charger_voltage_map); i++) {
  453. if (curr < pm2xxx_charger_voltage_map[i])
  454. return i - 1;
  455. }
  456. i = ARRAY_SIZE(pm2xxx_charger_voltage_map) - 1;
  457. if (curr == pm2xxx_charger_voltage_map[i])
  458. return i;
  459. else
  460. return -EINVAL;
  461. }
  462. static int pm2xxx_charger_update_charger_current(struct ux500_charger *charger,
  463. int ich_out)
  464. {
  465. int ret;
  466. int curr_index;
  467. struct pm2xxx_charger *pm2;
  468. u8 val;
  469. if (charger->psy.type == POWER_SUPPLY_TYPE_MAINS)
  470. pm2 = to_pm2xxx_charger_ac_device_info(charger);
  471. else
  472. return -ENXIO;
  473. curr_index = pm2xxx_current_to_regval(ich_out);
  474. if (curr_index < 0) {
  475. dev_err(pm2->dev,
  476. "Charger current too high, charging not started\n");
  477. return -ENXIO;
  478. }
  479. ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val);
  480. if (ret >= 0) {
  481. val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK;
  482. val |= curr_index;
  483. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val);
  484. if (ret < 0) {
  485. dev_err(pm2->dev,
  486. "%s write failed\n", __func__);
  487. }
  488. }
  489. else
  490. dev_err(pm2->dev, "%s read failed\n", __func__);
  491. return ret;
  492. }
  493. static int pm2xxx_charger_ac_get_property(struct power_supply *psy,
  494. enum power_supply_property psp,
  495. union power_supply_propval *val)
  496. {
  497. struct pm2xxx_charger *pm2;
  498. pm2 = to_pm2xxx_charger_ac_device_info(psy_to_ux500_charger(psy));
  499. switch (psp) {
  500. case POWER_SUPPLY_PROP_HEALTH:
  501. if (pm2->flags.mainextchnotok)
  502. val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
  503. else if (pm2->ac.wd_expired)
  504. val->intval = POWER_SUPPLY_HEALTH_DEAD;
  505. else if (pm2->flags.main_thermal_prot)
  506. val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
  507. else if (pm2->flags.ovv)
  508. val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
  509. else
  510. val->intval = POWER_SUPPLY_HEALTH_GOOD;
  511. break;
  512. case POWER_SUPPLY_PROP_ONLINE:
  513. val->intval = pm2->ac.charger_online;
  514. break;
  515. case POWER_SUPPLY_PROP_PRESENT:
  516. val->intval = pm2->ac.charger_connected;
  517. break;
  518. case POWER_SUPPLY_PROP_VOLTAGE_AVG:
  519. pm2->ac.cv_active = pm2xxx_charger_get_ac_cv(pm2);
  520. val->intval = pm2->ac.cv_active;
  521. break;
  522. default:
  523. return -EINVAL;
  524. }
  525. return 0;
  526. }
  527. static int pm2xxx_charging_init(struct pm2xxx_charger *pm2)
  528. {
  529. int ret = 0;
  530. /* enable CC and CV watchdog */
  531. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG3,
  532. (PM2XXX_CH_WD_CV_PHASE_60MIN | PM2XXX_CH_WD_CC_PHASE_60MIN));
  533. if( ret < 0)
  534. return ret;
  535. /* enable precharge watchdog */
  536. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG4,
  537. PM2XXX_CH_WD_PRECH_PHASE_60MIN);
  538. /* Disable auto timeout */
  539. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG5,
  540. PM2XXX_CH_WD_AUTO_TIMEOUT_20MIN);
  541. /*
  542. * EOC current level = 100mA
  543. * Precharge current level = 100mA
  544. * CC current level = 1000mA
  545. */
  546. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6,
  547. (PM2XXX_DIR_CH_CC_CURRENT_1000MA |
  548. PM2XXX_CH_PRECH_CURRENT_100MA |
  549. PM2XXX_CH_EOC_CURRENT_100MA));
  550. /*
  551. * recharge threshold = 3.8V
  552. * Precharge to CC threshold = 2.9V
  553. */
  554. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG7,
  555. (PM2XXX_CH_PRECH_VOL_2_9 | PM2XXX_CH_VRESUME_VOL_3_8));
  556. /* float voltage charger level = 4.2V */
  557. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8,
  558. PM2XXX_CH_VOLT_4_2);
  559. /* Voltage drop between VBAT and VSYS in HW charging = 300mV */
  560. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG9,
  561. (PM2XXX_CH_150MV_DROP_300MV | PM2XXX_CHARCHING_INFO_DIS |
  562. PM2XXX_CH_CC_REDUCED_CURRENT_IDENT |
  563. PM2XXX_CH_CC_MODEDROP_DIS));
  564. /* Input charger level of over voltage = 10V */
  565. ret = pm2xxx_reg_write(pm2, PM2XXX_INP_VOLT_VPWR2,
  566. PM2XXX_VPWR2_OVV_10);
  567. ret = pm2xxx_reg_write(pm2, PM2XXX_INP_VOLT_VPWR1,
  568. PM2XXX_VPWR1_OVV_10);
  569. /* Input charger drop */
  570. ret = pm2xxx_reg_write(pm2, PM2XXX_INP_DROP_VPWR2,
  571. (PM2XXX_VPWR2_HW_OPT_DIS | PM2XXX_VPWR2_VALID_DIS |
  572. PM2XXX_VPWR2_DROP_DIS));
  573. ret = pm2xxx_reg_write(pm2, PM2XXX_INP_DROP_VPWR1,
  574. (PM2XXX_VPWR1_HW_OPT_DIS | PM2XXX_VPWR1_VALID_DIS |
  575. PM2XXX_VPWR1_DROP_DIS));
  576. /* Disable battery low monitoring */
  577. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_LOW_LEV_COMP_REG,
  578. PM2XXX_VBAT_LOW_MONITORING_ENA);
  579. return ret;
  580. }
  581. static int pm2xxx_charger_ac_en(struct ux500_charger *charger,
  582. int enable, int vset, int iset)
  583. {
  584. int ret;
  585. int volt_index;
  586. int curr_index;
  587. u8 val;
  588. struct pm2xxx_charger *pm2 = to_pm2xxx_charger_ac_device_info(charger);
  589. if (enable) {
  590. if (!pm2->ac.charger_connected) {
  591. dev_dbg(pm2->dev, "AC charger not connected\n");
  592. return -ENXIO;
  593. }
  594. dev_dbg(pm2->dev, "Enable AC: %dmV %dmA\n", vset, iset);
  595. if (!pm2->vddadc_en_ac) {
  596. regulator_enable(pm2->regu);
  597. pm2->vddadc_en_ac = true;
  598. }
  599. ret = pm2xxx_charging_init(pm2);
  600. if (ret < 0) {
  601. dev_err(pm2->dev, "%s charging init failed\n",
  602. __func__);
  603. goto error_occured;
  604. }
  605. volt_index = pm2xxx_voltage_to_regval(vset);
  606. curr_index = pm2xxx_current_to_regval(iset);
  607. if (volt_index < 0 || curr_index < 0) {
  608. dev_err(pm2->dev,
  609. "Charger voltage or current too high, "
  610. "charging not started\n");
  611. return -ENXIO;
  612. }
  613. ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG8, &val);
  614. if (ret < 0) {
  615. dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
  616. goto error_occured;
  617. }
  618. val &= ~PM2XXX_CH_VOLT_MASK;
  619. val |= volt_index;
  620. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8, val);
  621. if (ret < 0) {
  622. dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
  623. goto error_occured;
  624. }
  625. ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val);
  626. if (ret < 0) {
  627. dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
  628. goto error_occured;
  629. }
  630. val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK;
  631. val |= curr_index;
  632. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val);
  633. if (ret < 0) {
  634. dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
  635. goto error_occured;
  636. }
  637. if (!pm2->bat->enable_overshoot) {
  638. ret = pm2xxx_reg_read(pm2, PM2XXX_LED_CTRL_REG, &val);
  639. if (ret < 0) {
  640. dev_err(pm2->dev, "%s pm2xxx read failed\n",
  641. __func__);
  642. goto error_occured;
  643. }
  644. val |= PM2XXX_ANTI_OVERSHOOT_EN;
  645. ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG, val);
  646. if (ret < 0) {
  647. dev_err(pm2->dev, "%s pm2xxx write failed\n",
  648. __func__);
  649. goto error_occured;
  650. }
  651. }
  652. ret = pm2xxx_charging_enable_mngt(pm2);
  653. if (ret < 0) {
  654. dev_err(pm2->dev, "Failed to enable"
  655. "pm2xxx ac charger\n");
  656. goto error_occured;
  657. }
  658. pm2->ac.charger_online = 1;
  659. } else {
  660. pm2->ac.charger_online = 0;
  661. pm2->ac.wd_expired = false;
  662. /* Disable regulator if enabled */
  663. if (pm2->vddadc_en_ac) {
  664. regulator_disable(pm2->regu);
  665. pm2->vddadc_en_ac = false;
  666. }
  667. ret = pm2xxx_charging_disable_mngt(pm2);
  668. if (ret < 0) {
  669. dev_err(pm2->dev, "failed to disable"
  670. "pm2xxx ac charger\n");
  671. goto error_occured;
  672. }
  673. dev_dbg(pm2->dev, "PM2301: " "Disabled AC charging\n");
  674. }
  675. power_supply_changed(&pm2->ac_chg.psy);
  676. error_occured:
  677. return ret;
  678. }
  679. static int pm2xxx_charger_watchdog_kick(struct ux500_charger *charger)
  680. {
  681. int ret;
  682. struct pm2xxx_charger *pm2;
  683. if (charger->psy.type == POWER_SUPPLY_TYPE_MAINS)
  684. pm2 = to_pm2xxx_charger_ac_device_info(charger);
  685. else
  686. return -ENXIO;
  687. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_WD_KICK, WD_TIMER);
  688. if (ret)
  689. dev_err(pm2->dev, "Failed to kick WD!\n");
  690. return ret;
  691. }
  692. static void pm2xxx_charger_ac_work(struct work_struct *work)
  693. {
  694. struct pm2xxx_charger *pm2 = container_of(work,
  695. struct pm2xxx_charger, ac_work);
  696. power_supply_changed(&pm2->ac_chg.psy);
  697. sysfs_notify(&pm2->ac_chg.psy.dev->kobj, NULL, "present");
  698. };
  699. static void pm2xxx_charger_check_hw_failure_work(struct work_struct *work)
  700. {
  701. u8 reg_value;
  702. struct pm2xxx_charger *pm2 = container_of(work,
  703. struct pm2xxx_charger, check_hw_failure_work.work);
  704. if (pm2->flags.ovv) {
  705. pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT4, &reg_value);
  706. if (!(reg_value & (PM2XXX_INT4_S_ITVPWR1OVV |
  707. PM2XXX_INT4_S_ITVPWR2OVV))) {
  708. pm2->flags.ovv = false;
  709. power_supply_changed(&pm2->ac_chg.psy);
  710. }
  711. }
  712. /* If we still have a failure, schedule a new check */
  713. if (pm2->flags.ovv) {
  714. queue_delayed_work(pm2->charger_wq,
  715. &pm2->check_hw_failure_work, round_jiffies(HZ));
  716. }
  717. }
  718. static void pm2xxx_charger_check_main_thermal_prot_work(
  719. struct work_struct *work)
  720. {
  721. int ret;
  722. u8 val;
  723. struct pm2xxx_charger *pm2 = container_of(work, struct pm2xxx_charger,
  724. check_main_thermal_prot_work);
  725. /* Check if die temp warning is still active */
  726. ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT5, &val);
  727. if (ret < 0) {
  728. dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
  729. return;
  730. }
  731. if (val & (PM2XXX_INT5_S_ITTHERMALWARNINGRISE
  732. | PM2XXX_INT5_S_ITTHERMALSHUTDOWNRISE))
  733. pm2->flags.main_thermal_prot = true;
  734. else if (val & (PM2XXX_INT5_S_ITTHERMALWARNINGFALL
  735. | PM2XXX_INT5_S_ITTHERMALSHUTDOWNFALL))
  736. pm2->flags.main_thermal_prot = false;
  737. power_supply_changed(&pm2->ac_chg.psy);
  738. }
  739. static struct pm2xxx_interrupts pm2xxx_int = {
  740. .handler[0] = pm2_int_reg0,
  741. .handler[1] = pm2_int_reg1,
  742. .handler[2] = pm2_int_reg2,
  743. .handler[3] = pm2_int_reg3,
  744. .handler[4] = pm2_int_reg4,
  745. .handler[5] = pm2_int_reg5,
  746. };
  747. static struct pm2xxx_irq pm2xxx_charger_irq[] = {
  748. {"PM2XXX_IRQ_INT", pm2xxx_irq_int},
  749. };
  750. static int pm2xxx_wall_charger_resume(struct i2c_client *i2c_client)
  751. {
  752. struct pm2xxx_charger *pm2;
  753. pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(i2c_client);
  754. set_lpn_pin(pm2);
  755. /* If we still have a HW failure, schedule a new check */
  756. if (pm2->flags.ovv)
  757. queue_delayed_work(pm2->charger_wq,
  758. &pm2->check_hw_failure_work, 0);
  759. return 0;
  760. }
  761. static int pm2xxx_wall_charger_suspend(struct i2c_client *i2c_client,
  762. pm_message_t state)
  763. {
  764. struct pm2xxx_charger *pm2;
  765. pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(i2c_client);
  766. clear_lpn_pin(pm2);
  767. /* Cancel any pending HW failure check */
  768. if (delayed_work_pending(&pm2->check_hw_failure_work))
  769. cancel_delayed_work(&pm2->check_hw_failure_work);
  770. flush_work(&pm2->ac_work);
  771. flush_work(&pm2->check_main_thermal_prot_work);
  772. return 0;
  773. }
  774. #ifdef CONFIG_PM
  775. static int pm2xxx_runtime_suspend(struct device *dev)
  776. {
  777. struct i2c_client *pm2xxx_i2c_client = to_i2c_client(dev);
  778. struct pm2xxx_charger *pm2;
  779. int ret = 0;
  780. pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(pm2xxx_i2c_client);
  781. if (!pm2) {
  782. dev_err(pm2->dev, "no pm2xxx_charger data supplied\n");
  783. ret = -EINVAL;
  784. return ret;
  785. }
  786. clear_lpn_pin(pm2);
  787. return ret;
  788. }
  789. static int pm2xxx_runtime_resume(struct device *dev)
  790. {
  791. struct i2c_client *pm2xxx_i2c_client = to_i2c_client(dev);
  792. struct pm2xxx_charger *pm2;
  793. int ret = 0;
  794. pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(pm2xxx_i2c_client);
  795. if (!pm2) {
  796. dev_err(pm2->dev, "no pm2xxx_charger data supplied\n");
  797. ret = -EINVAL;
  798. return ret;
  799. }
  800. if (gpio_is_valid(pm2->lpn_pin) && gpio_get_value(pm2->lpn_pin) == 0)
  801. set_lpn_pin(pm2);
  802. return ret;
  803. }
  804. static const struct dev_pm_ops pm2xxx_pm_ops = {
  805. .runtime_suspend = pm2xxx_runtime_suspend,
  806. .runtime_resume = pm2xxx_runtime_resume,
  807. };
  808. #define PM2XXX_PM_OPS (&pm2xxx_pm_ops)
  809. #else
  810. #define PM2XXX_PM_OPS NULL
  811. #endif
  812. static int pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
  813. const struct i2c_device_id *id)
  814. {
  815. struct pm2xxx_platform_data *pl_data = i2c_client->dev.platform_data;
  816. struct pm2xxx_charger *pm2;
  817. int ret = 0;
  818. u8 val;
  819. int i;
  820. pm2 = kzalloc(sizeof(struct pm2xxx_charger), GFP_KERNEL);
  821. if (!pm2) {
  822. dev_err(pm2->dev, "pm2xxx_charger allocation failed\n");
  823. return -ENOMEM;
  824. }
  825. /* get parent data */
  826. pm2->dev = &i2c_client->dev;
  827. pm2->pm2_int = &pm2xxx_int;
  828. /* get charger spcific platform data */
  829. if (!pl_data->wall_charger) {
  830. dev_err(pm2->dev, "no charger platform data supplied\n");
  831. ret = -EINVAL;
  832. goto free_device_info;
  833. }
  834. pm2->pdata = pl_data->wall_charger;
  835. /* get battery specific platform data */
  836. if (!pl_data->battery) {
  837. dev_err(pm2->dev, "no battery platform data supplied\n");
  838. ret = -EINVAL;
  839. goto free_device_info;
  840. }
  841. pm2->bat = pl_data->battery;
  842. if (!i2c_check_functionality(i2c_client->adapter,
  843. I2C_FUNC_SMBUS_BYTE_DATA |
  844. I2C_FUNC_SMBUS_READ_WORD_DATA)) {
  845. ret = -ENODEV;
  846. dev_info(pm2->dev, "pm2301 i2c_check_functionality failed\n");
  847. goto free_device_info;
  848. }
  849. pm2->config.pm2xxx_i2c = i2c_client;
  850. pm2->config.pm2xxx_id = (struct i2c_device_id *) id;
  851. i2c_set_clientdata(i2c_client, pm2);
  852. /* AC supply */
  853. /* power_supply base class */
  854. pm2->ac_chg.psy.name = pm2->pdata->label;
  855. pm2->ac_chg.psy.type = POWER_SUPPLY_TYPE_MAINS;
  856. pm2->ac_chg.psy.properties = pm2xxx_charger_ac_props;
  857. pm2->ac_chg.psy.num_properties = ARRAY_SIZE(pm2xxx_charger_ac_props);
  858. pm2->ac_chg.psy.get_property = pm2xxx_charger_ac_get_property;
  859. pm2->ac_chg.psy.supplied_to = pm2->pdata->supplied_to;
  860. pm2->ac_chg.psy.num_supplicants = pm2->pdata->num_supplicants;
  861. /* pm2xxx_charger sub-class */
  862. pm2->ac_chg.ops.enable = &pm2xxx_charger_ac_en;
  863. pm2->ac_chg.ops.kick_wd = &pm2xxx_charger_watchdog_kick;
  864. pm2->ac_chg.ops.update_curr = &pm2xxx_charger_update_charger_current;
  865. pm2->ac_chg.max_out_volt = pm2xxx_charger_voltage_map[
  866. ARRAY_SIZE(pm2xxx_charger_voltage_map) - 1];
  867. pm2->ac_chg.max_out_curr = pm2xxx_charger_current_map[
  868. ARRAY_SIZE(pm2xxx_charger_current_map) - 1];
  869. pm2->ac_chg.wdt_refresh = WD_KICK_INTERVAL;
  870. pm2->ac_chg.enabled = true;
  871. pm2->ac_chg.external = true;
  872. /* Create a work queue for the charger */
  873. pm2->charger_wq =
  874. create_singlethread_workqueue("pm2xxx_charger_wq");
  875. if (pm2->charger_wq == NULL) {
  876. dev_err(pm2->dev, "failed to create work queue\n");
  877. goto free_device_info;
  878. }
  879. /* Init work for charger detection */
  880. INIT_WORK(&pm2->ac_work, pm2xxx_charger_ac_work);
  881. /* Init work for checking HW status */
  882. INIT_WORK(&pm2->check_main_thermal_prot_work,
  883. pm2xxx_charger_check_main_thermal_prot_work);
  884. /* Init work for HW failure check */
  885. INIT_DEFERRABLE_WORK(&pm2->check_hw_failure_work,
  886. pm2xxx_charger_check_hw_failure_work);
  887. /*
  888. * VDD ADC supply needs to be enabled from this driver when there
  889. * is a charger connected to avoid erroneous BTEMP_HIGH/LOW
  890. * interrupts during charging
  891. */
  892. pm2->regu = regulator_get(pm2->dev, "vddadc");
  893. if (IS_ERR(pm2->regu)) {
  894. ret = PTR_ERR(pm2->regu);
  895. dev_err(pm2->dev, "failed to get vddadc regulator\n");
  896. goto free_charger_wq;
  897. }
  898. /* Register AC charger class */
  899. ret = power_supply_register(pm2->dev, &pm2->ac_chg.psy);
  900. if (ret) {
  901. dev_err(pm2->dev, "failed to register AC charger\n");
  902. goto free_regulator;
  903. }
  904. /* Register interrupts */
  905. ret = request_threaded_irq(gpio_to_irq(pm2->pdata->gpio_irq_number),
  906. NULL,
  907. pm2xxx_charger_irq[0].isr,
  908. pm2->pdata->irq_type,
  909. pm2xxx_charger_irq[0].name, pm2);
  910. if (ret != 0) {
  911. dev_err(pm2->dev, "failed to request %s IRQ %d: %d\n",
  912. pm2xxx_charger_irq[0].name,
  913. gpio_to_irq(pm2->pdata->gpio_irq_number), ret);
  914. goto unregister_pm2xxx_charger;
  915. }
  916. ret = pm_runtime_set_active(pm2->dev);
  917. if (ret)
  918. dev_err(pm2->dev, "set active Error\n");
  919. pm_runtime_enable(pm2->dev);
  920. pm_runtime_set_autosuspend_delay(pm2->dev, PM2XXX_AUTOSUSPEND_DELAY);
  921. pm_runtime_use_autosuspend(pm2->dev);
  922. pm_runtime_resume(pm2->dev);
  923. /* pm interrupt can wake up system */
  924. ret = enable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number));
  925. if (ret) {
  926. dev_err(pm2->dev, "failed to set irq wake\n");
  927. goto unregister_pm2xxx_interrupt;
  928. }
  929. mutex_init(&pm2->lock);
  930. if (gpio_is_valid(pm2->pdata->lpn_gpio)) {
  931. /* get lpn GPIO from platform data */
  932. pm2->lpn_pin = pm2->pdata->lpn_gpio;
  933. /*
  934. * Charger detection mechanism requires pulling up the LPN pin
  935. * while i2c communication if Charger is not connected
  936. * LPN pin of PM2301 is GPIO60 of AB9540
  937. */
  938. ret = gpio_request(pm2->lpn_pin, "pm2301_lpm_gpio");
  939. if (ret < 0) {
  940. dev_err(pm2->dev, "pm2301_lpm_gpio request failed\n");
  941. goto disable_pm2_irq_wake;
  942. }
  943. ret = gpio_direction_output(pm2->lpn_pin, 0);
  944. if (ret < 0) {
  945. dev_err(pm2->dev, "pm2301_lpm_gpio direction failed\n");
  946. goto free_gpio;
  947. }
  948. set_lpn_pin(pm2);
  949. }
  950. /* read interrupt registers */
  951. for (i = 0; i < PM2XXX_NUM_INT_REG; i++)
  952. pm2xxx_reg_read(pm2,
  953. pm2xxx_interrupt_registers[i],
  954. &val);
  955. ret = pm2xxx_charger_detection(pm2, &val);
  956. if ((ret == 0) && val) {
  957. pm2->ac.charger_connected = 1;
  958. ab8500_override_turn_on_stat(~AB8500_POW_KEY_1_ON,
  959. AB8500_MAIN_CH_DET);
  960. pm2->ac_conn = true;
  961. power_supply_changed(&pm2->ac_chg.psy);
  962. sysfs_notify(&pm2->ac_chg.psy.dev->kobj, NULL, "present");
  963. }
  964. return 0;
  965. free_gpio:
  966. if (gpio_is_valid(pm2->lpn_pin))
  967. gpio_free(pm2->lpn_pin);
  968. disable_pm2_irq_wake:
  969. disable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number));
  970. unregister_pm2xxx_interrupt:
  971. /* disable interrupt */
  972. free_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), pm2);
  973. unregister_pm2xxx_charger:
  974. /* unregister power supply */
  975. power_supply_unregister(&pm2->ac_chg.psy);
  976. free_regulator:
  977. /* disable the regulator */
  978. regulator_put(pm2->regu);
  979. free_charger_wq:
  980. destroy_workqueue(pm2->charger_wq);
  981. free_device_info:
  982. kfree(pm2);
  983. return ret;
  984. }
  985. static int pm2xxx_wall_charger_remove(struct i2c_client *i2c_client)
  986. {
  987. struct pm2xxx_charger *pm2 = i2c_get_clientdata(i2c_client);
  988. /* Disable pm_runtime */
  989. pm_runtime_disable(pm2->dev);
  990. /* Disable AC charging */
  991. pm2xxx_charger_ac_en(&pm2->ac_chg, false, 0, 0);
  992. /* Disable wake by pm interrupt */
  993. disable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number));
  994. /* Disable interrupts */
  995. free_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), pm2);
  996. /* Delete the work queue */
  997. destroy_workqueue(pm2->charger_wq);
  998. flush_scheduled_work();
  999. /* disable the regulator */
  1000. regulator_put(pm2->regu);
  1001. power_supply_unregister(&pm2->ac_chg.psy);
  1002. if (gpio_is_valid(pm2->lpn_pin))
  1003. gpio_free(pm2->lpn_pin);
  1004. kfree(pm2);
  1005. return 0;
  1006. }
  1007. static const struct i2c_device_id pm2xxx_id[] = {
  1008. { "pm2301", 0 },
  1009. { }
  1010. };
  1011. MODULE_DEVICE_TABLE(i2c, pm2xxx_id);
  1012. static struct i2c_driver pm2xxx_charger_driver = {
  1013. .probe = pm2xxx_wall_charger_probe,
  1014. .remove = pm2xxx_wall_charger_remove,
  1015. .suspend = pm2xxx_wall_charger_suspend,
  1016. .resume = pm2xxx_wall_charger_resume,
  1017. .driver = {
  1018. .name = "pm2xxx-wall_charger",
  1019. .owner = THIS_MODULE,
  1020. .pm = PM2XXX_PM_OPS,
  1021. },
  1022. .id_table = pm2xxx_id,
  1023. };
  1024. static int __init pm2xxx_charger_init(void)
  1025. {
  1026. return i2c_add_driver(&pm2xxx_charger_driver);
  1027. }
  1028. static void __exit pm2xxx_charger_exit(void)
  1029. {
  1030. i2c_del_driver(&pm2xxx_charger_driver);
  1031. }
  1032. device_initcall_sync(pm2xxx_charger_init);
  1033. module_exit(pm2xxx_charger_exit);
  1034. MODULE_LICENSE("GPL v2");
  1035. MODULE_AUTHOR("Rajkumar kasirajan, Olivier Launay");
  1036. MODULE_ALIAS("platform:pm2xxx-charger");
  1037. MODULE_DESCRIPTION("PM2xxx charger management driver");