pm2301_charger.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455
  1. /*
  2. * Power supply driver for ST Ericsson pm2xxx_charger charger
  3. *
  4. * Copyright 2012 ST Ericsson.
  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/completion.h>
  19. #include <linux/regulator/consumer.h>
  20. #include <linux/err.h>
  21. #include <linux/i2c.h>
  22. #include <linux/workqueue.h>
  23. #include <linux/kobject.h>
  24. #include <linux/mfd/abx500.h>
  25. #include <linux/mfd/abx500/ab8500.h>
  26. #include <linux/mfd/abx500/ab8500-bm.h>
  27. #include <linux/mfd/abx500/ab8500-gpadc.h>
  28. #include <linux/mfd/abx500/ux500_chargalg.h>
  29. #include <linux/pm2301_charger.h>
  30. #define MAIN_WDOG_ENA 0x01
  31. #define MAIN_WDOG_KICK 0x02
  32. #define MAIN_WDOG_DIS 0x00
  33. #define CHARG_WD_KICK 0x01
  34. #define MAIN_CH_ENA 0x01
  35. #define MAIN_CH_NO_OVERSHOOT_ENA_N 0x02
  36. #define MAIN_CH_DET 0x01
  37. #define MAIN_CH_CV_ON 0x04
  38. #define OTP_ENABLE_WD 0x01
  39. #define MAIN_CH_INPUT_CURR_SHIFT 4
  40. #define LED_INDICATOR_PWM_ENA 0x01
  41. #define LED_INDICATOR_PWM_DIS 0x00
  42. #define LED_IND_CUR_5MA 0x04
  43. #define LED_INDICATOR_PWM_DUTY_252_256 0xBF
  44. /* HW failure constants */
  45. #define MAIN_CH_TH_PROT 0x02
  46. #define MAIN_CH_NOK 0x01
  47. /* Watchdog timeout constant */
  48. #define WD_TIMER 0x30 /* 4min */
  49. #define WD_KICK_INTERVAL (60 * HZ)
  50. /* Constant voltage/current */
  51. #define PM2XXX_CONST_CURR 0x0
  52. #define PM2XXX_CONST_VOLT 0x1
  53. /* Lowest charger voltage is 3.39V -> 0x4E */
  54. #define LOW_VOLT_REG 0x4E
  55. #define PM2XXX_BATT_CTRL_REG1 0x00
  56. #define PM2XXX_BATT_CTRL_REG2 0x01
  57. #define PM2XXX_BATT_CTRL_REG3 0x02
  58. #define PM2XXX_BATT_CTRL_REG4 0x03
  59. #define PM2XXX_BATT_CTRL_REG5 0x04
  60. #define PM2XXX_BATT_CTRL_REG6 0x05
  61. #define PM2XXX_BATT_CTRL_REG7 0x06
  62. #define PM2XXX_BATT_CTRL_REG8 0x07
  63. #define PM2XXX_NTC_CTRL_REG1 0x08
  64. #define PM2XXX_NTC_CTRL_REG2 0x09
  65. #define PM2XXX_BATT_CTRL_REG9 0x0A
  66. #define PM2XXX_BATT_STAT_REG1 0x0B
  67. #define PM2XXX_INP_VOLT_VPWR2 0x11
  68. #define PM2XXX_INP_DROP_VPWR2 0x13
  69. #define PM2XXX_INP_VOLT_VPWR1 0x15
  70. #define PM2XXX_INP_DROP_VPWR1 0x17
  71. #define PM2XXX_INP_MODE_VPWR 0x18
  72. #define PM2XXX_BATT_WD_KICK 0x70
  73. #define PM2XXX_DEV_VER_STAT 0x0C
  74. #define PM2XXX_THERM_WARN_CTRL_REG 0x20
  75. #define PM2XXX_BATT_DISC_REG 0x21
  76. #define PM2XXX_BATT_LOW_LEV_COMP_REG 0x22
  77. #define PM2XXX_BATT_LOW_LEV_VAL_REG 0x23
  78. #define PM2XXX_I2C_PAD_CTRL_REG 0x24
  79. #define PM2XXX_SW_CTRL_REG 0x26
  80. #define PM2XXX_LED_CTRL_REG 0x28
  81. #define PM2XXX_REG_INT1 0x40
  82. #define PM2XXX_MASK_REG_INT1 0x50
  83. #define PM2XXX_SRCE_REG_INT1 0x60
  84. #define PM2XXX_REG_INT2 0x41
  85. #define PM2XXX_MASK_REG_INT2 0x51
  86. #define PM2XXX_SRCE_REG_INT2 0x61
  87. #define PM2XXX_REG_INT3 0x42
  88. #define PM2XXX_MASK_REG_INT3 0x52
  89. #define PM2XXX_SRCE_REG_INT3 0x62
  90. #define PM2XXX_REG_INT4 0x43
  91. #define PM2XXX_MASK_REG_INT4 0x53
  92. #define PM2XXX_SRCE_REG_INT4 0x63
  93. #define PM2XXX_REG_INT5 0x44
  94. #define PM2XXX_MASK_REG_INT5 0x54
  95. #define PM2XXX_SRCE_REG_INT5 0x64
  96. #define PM2XXX_REG_INT6 0x45
  97. #define PM2XXX_MASK_REG_INT6 0x55
  98. #define PM2XXX_SRCE_REG_INT6 0x65
  99. #define VPWR_OVV 0x0
  100. #define VSYSTEM_OVV 0x1
  101. /* control Reg 1 */
  102. #define PM2XXX_CH_RESUME_EN 0x1
  103. #define PM2XXX_CH_RESUME_DIS 0x0
  104. /* control Reg 2 */
  105. #define PM2XXX_CH_AUTO_RESUME_EN 0X2
  106. #define PM2XXX_CH_AUTO_RESUME_DIS 0X0
  107. #define PM2XXX_CHARGER_ENA 0x4
  108. #define PM2XXX_CHARGER_DIS 0x0
  109. /* control Reg 3 */
  110. #define PM2XXX_CH_WD_CC_PHASE_OFF 0x0
  111. #define PM2XXX_CH_WD_CC_PHASE_5MIN 0x1
  112. #define PM2XXX_CH_WD_CC_PHASE_10MIN 0x2
  113. #define PM2XXX_CH_WD_CC_PHASE_30MIN 0x3
  114. #define PM2XXX_CH_WD_CC_PHASE_60MIN 0x4
  115. #define PM2XXX_CH_WD_CC_PHASE_120MIN 0x5
  116. #define PM2XXX_CH_WD_CC_PHASE_240MIN 0x6
  117. #define PM2XXX_CH_WD_CC_PHASE_360MIN 0x7
  118. #define PM2XXX_CH_WD_CV_PHASE_OFF (0x0<<3)
  119. #define PM2XXX_CH_WD_CV_PHASE_5MIN (0x1<<3)
  120. #define PM2XXX_CH_WD_CV_PHASE_10MIN (0x2<<3)
  121. #define PM2XXX_CH_WD_CV_PHASE_30MIN (0x3<<3)
  122. #define PM2XXX_CH_WD_CV_PHASE_60MIN (0x4<<3)
  123. #define PM2XXX_CH_WD_CV_PHASE_120MIN (0x5<<3)
  124. #define PM2XXX_CH_WD_CV_PHASE_240MIN (0x6<<3)
  125. #define PM2XXX_CH_WD_CV_PHASE_360MIN (0x7<<3)
  126. /* control Reg 4 */
  127. #define PM2XXX_CH_WD_PRECH_PHASE_OFF 0x0
  128. #define PM2XXX_CH_WD_PRECH_PHASE_1MIN 0x1
  129. #define PM2XXX_CH_WD_PRECH_PHASE_5MIN 0x2
  130. #define PM2XXX_CH_WD_PRECH_PHASE_10MIN 0x3
  131. #define PM2XXX_CH_WD_PRECH_PHASE_30MIN 0x4
  132. #define PM2XXX_CH_WD_PRECH_PHASE_60MIN 0x5
  133. #define PM2XXX_CH_WD_PRECH_PHASE_120MIN 0x6
  134. #define PM2XXX_CH_WD_PRECH_PHASE_240MIN 0x7
  135. /* control Reg 5 */
  136. #define PM2XXX_CH_WD_AUTO_TIMEOUT_NONE 0x0
  137. #define PM2XXX_CH_WD_AUTO_TIMEOUT_20MIN 0x1
  138. /* control Reg 6 */
  139. #define PM2XXX_DIR_CH_CC_CURRENT_MASK 0x0F
  140. #define PM2XXX_DIR_CH_CC_CURRENT_200MA 0x0
  141. #define PM2XXX_DIR_CH_CC_CURRENT_400MA 0x2
  142. #define PM2XXX_DIR_CH_CC_CURRENT_600MA 0x3
  143. #define PM2XXX_DIR_CH_CC_CURRENT_800MA 0x4
  144. #define PM2XXX_DIR_CH_CC_CURRENT_1000MA 0x5
  145. #define PM2XXX_DIR_CH_CC_CURRENT_1200MA 0x6
  146. #define PM2XXX_DIR_CH_CC_CURRENT_1400MA 0x7
  147. #define PM2XXX_DIR_CH_CC_CURRENT_1600MA 0x8
  148. #define PM2XXX_DIR_CH_CC_CURRENT_1800MA 0x9
  149. #define PM2XXX_DIR_CH_CC_CURRENT_2000MA 0xA
  150. #define PM2XXX_DIR_CH_CC_CURRENT_2200MA 0xB
  151. #define PM2XXX_DIR_CH_CC_CURRENT_2400MA 0xC
  152. #define PM2XXX_DIR_CH_CC_CURRENT_2600MA 0xD
  153. #define PM2XXX_DIR_CH_CC_CURRENT_2800MA 0xE
  154. #define PM2XXX_DIR_CH_CC_CURRENT_3000MA 0xF
  155. #define PM2XXX_CH_PRECH_CURRENT_MASK 0x30
  156. #define PM2XXX_CH_PRECH_CURRENT_25MA (0x0<<4)
  157. #define PM2XXX_CH_PRECH_CURRENT_50MA (0x1<<4)
  158. #define PM2XXX_CH_PRECH_CURRENT_75MA (0x2<<4)
  159. #define PM2XXX_CH_PRECH_CURRENT_100MA (0x3<<4)
  160. #define PM2XXX_CH_EOC_CURRENT_MASK 0xC0
  161. #define PM2XXX_CH_EOC_CURRENT_100MA (0x0<<6)
  162. #define PM2XXX_CH_EOC_CURRENT_150MA (0x1<<6)
  163. #define PM2XXX_CH_EOC_CURRENT_300MA (0x2<<6)
  164. #define PM2XXX_CH_EOC_CURRENT_400MA (0x3<<6)
  165. /* control Reg 7 */
  166. #define PM2XXX_CH_PRECH_VOL_2_5 0x0
  167. #define PM2XXX_CH_PRECH_VOL_2_7 0x1
  168. #define PM2XXX_CH_PRECH_VOL_2_9 0x2
  169. #define PM2XXX_CH_PRECH_VOL_3_1 0x3
  170. #define PM2XXX_CH_VRESUME_VOL_3_2 (0x0<<2)
  171. #define PM2XXX_CH_VRESUME_VOL_3_4 (0x1<<2)
  172. #define PM2XXX_CH_VRESUME_VOL_3_6 (0x2<<2)
  173. #define PM2XXX_CH_VRESUME_VOL_3_8 (0x3<<2)
  174. /* control Reg 8 */
  175. #define PM2XXX_CH_VOLT_MASK 0x3F
  176. #define PM2XXX_CH_VOLT_3_5 0x0
  177. #define PM2XXX_CH_VOLT_3_5225 0x1
  178. #define PM2XXX_CH_VOLT_3_6 0x4
  179. #define PM2XXX_CH_VOLT_3_7 0x8
  180. #define PM2XXX_CH_VOLT_4_0 0x14
  181. #define PM2XXX_CH_VOLT_4_175 0x1B
  182. #define PM2XXX_CH_VOLT_4_2 0x1C
  183. #define PM2XXX_CH_VOLT_4_275 0x1F
  184. #define PM2XXX_CH_VOLT_4_3 0x20
  185. /*NTC control register 1*/
  186. #define PM2XXX_BTEMP_HIGH_TH_45 0x0
  187. #define PM2XXX_BTEMP_HIGH_TH_50 0x1
  188. #define PM2XXX_BTEMP_HIGH_TH_55 0x2
  189. #define PM2XXX_BTEMP_HIGH_TH_60 0x3
  190. #define PM2XXX_BTEMP_HIGH_TH_65 0x4
  191. #define PM2XXX_BTEMP_LOW_TH_N5 (0x0<<3)
  192. #define PM2XXX_BTEMP_LOW_TH_0 (0x1<<3)
  193. #define PM2XXX_BTEMP_LOW_TH_5 (0x2<<3)
  194. #define PM2XXX_BTEMP_LOW_TH_10 (0x3<<3)
  195. /*NTC control register 2*/
  196. #define PM2XXX_NTC_BETA_COEFF_3477 0x0
  197. #define PM2XXX_NTC_BETA_COEFF_3964 0x1
  198. #define PM2XXX_NTC_RES_10K (0x0<<2)
  199. #define PM2XXX_NTC_RES_47K (0x1<<2)
  200. #define PM2XXX_NTC_RES_100K (0x2<<2)
  201. #define PM2XXX_NTC_RES_NO_NTC (0x3<<2)
  202. /* control Reg 9 */
  203. #define PM2XXX_CH_CC_MODEDROP_EN 1
  204. #define PM2XXX_CH_CC_MODEDROP_DIS 0
  205. #define PM2XXX_CH_CC_REDUCED_CURRENT_100MA (0x0<<1)
  206. #define PM2XXX_CH_CC_REDUCED_CURRENT_200MA (0x1<<1)
  207. #define PM2XXX_CH_CC_REDUCED_CURRENT_400MA (0x2<<1)
  208. #define PM2XXX_CH_CC_REDUCED_CURRENT_IDENT (0x3<<1)
  209. #define PM2XXX_CHARCHING_INFO_DIS (0<<3)
  210. #define PM2XXX_CHARCHING_INFO_EN (1<<3)
  211. #define PM2XXX_CH_150MV_DROP_300MV (0<<4)
  212. #define PM2XXX_CH_150MV_DROP_150MV (1<<4)
  213. /* charger status register */
  214. #define PM2XXX_CHG_STATUS_OFF 0x0
  215. #define PM2XXX_CHG_STATUS_ON 0x1
  216. #define PM2XXX_CHG_STATUS_FULL 0x2
  217. #define PM2XXX_CHG_STATUS_ERR 0x3
  218. #define PM2XXX_CHG_STATUS_WAIT 0x4
  219. #define PM2XXX_CHG_STATUS_NOBAT 0x5
  220. /* Input charger voltage VPWR2 */
  221. #define PM2XXX_VPWR2_OVV_6_0 0x0
  222. #define PM2XXX_VPWR2_OVV_6_3 0x1
  223. #define PM2XXX_VPWR2_OVV_10 0x2
  224. #define PM2XXX_VPWR2_OVV_NONE 0x3
  225. /* Input charger voltage VPWR1 */
  226. #define PM2XXX_VPWR1_OVV_6_0 0x0
  227. #define PM2XXX_VPWR1_OVV_6_3 0x1
  228. #define PM2XXX_VPWR1_OVV_10 0x2
  229. #define PM2XXX_VPWR1_OVV_NONE 0x3
  230. /* Battery low level comparator control register */
  231. #define PM2XXX_VBAT_LOW_MONITORING_DIS 0x0
  232. #define PM2XXX_VBAT_LOW_MONITORING_ENA 0x1
  233. /* Battery low level value control register */
  234. #define PM2XXX_VBAT_LOW_LEVEL_2_3 0x0
  235. #define PM2XXX_VBAT_LOW_LEVEL_2_4 0x1
  236. #define PM2XXX_VBAT_LOW_LEVEL_2_5 0x2
  237. #define PM2XXX_VBAT_LOW_LEVEL_2_6 0x3
  238. #define PM2XXX_VBAT_LOW_LEVEL_2_7 0x4
  239. #define PM2XXX_VBAT_LOW_LEVEL_2_8 0x5
  240. #define PM2XXX_VBAT_LOW_LEVEL_2_9 0x6
  241. #define PM2XXX_VBAT_LOW_LEVEL_3_0 0x7
  242. #define PM2XXX_VBAT_LOW_LEVEL_3_1 0x8
  243. #define PM2XXX_VBAT_LOW_LEVEL_3_2 0x9
  244. #define PM2XXX_VBAT_LOW_LEVEL_3_3 0xA
  245. #define PM2XXX_VBAT_LOW_LEVEL_3_4 0xB
  246. #define PM2XXX_VBAT_LOW_LEVEL_3_5 0xC
  247. #define PM2XXX_VBAT_LOW_LEVEL_3_6 0xD
  248. #define PM2XXX_VBAT_LOW_LEVEL_3_7 0xE
  249. #define PM2XXX_VBAT_LOW_LEVEL_3_8 0xF
  250. #define PM2XXX_VBAT_LOW_LEVEL_3_9 0x10
  251. #define PM2XXX_VBAT_LOW_LEVEL_4_0 0x11
  252. #define PM2XXX_VBAT_LOW_LEVEL_4_1 0x12
  253. #define PM2XXX_VBAT_LOW_LEVEL_4_2 0x13
  254. /* SW CTRL */
  255. #define PM2XXX_SWCTRL_HW 0x0
  256. #define PM2XXX_SWCTRL_SW 0x1
  257. /* LED Driver Control */
  258. #define PM2XXX_LED_CURRENT_MASK 0x0C
  259. #define PM2XXX_LED_CURRENT_2_5MA (0X0<<2)
  260. #define PM2XXX_LED_CURRENT_1MA (0X1<<2)
  261. #define PM2XXX_LED_CURRENT_5MA (0X2<<2)
  262. #define PM2XXX_LED_CURRENT_10MA (0X3<<2)
  263. #define PM2XXX_LED_SELECT_MASK 0x02
  264. #define PM2XXX_LED_SELECT_EN (0X0<<1)
  265. #define PM2XXX_LED_SELECT_DIS (0X1<<1)
  266. #define PM2XXX_ANTI_OVERSHOOT_MASK 0x01
  267. #define PM2XXX_ANTI_OVERSHOOT_DIS 0X0
  268. #define PM2XXX_ANTI_OVERSHOOT_EN 0X1
  269. #define to_pm2xxx_charger_ac_device_info(x) container_of((x), \
  270. struct pm2xxx_charger, ac_chg)
  271. static int pm2xxx_interrupt_registers[] = {
  272. PM2XXX_REG_INT1,
  273. PM2XXX_REG_INT2,
  274. PM2XXX_REG_INT3,
  275. PM2XXX_REG_INT4,
  276. PM2XXX_REG_INT5,
  277. PM2XXX_REG_INT6,
  278. };
  279. enum pm2xxx_reg_int1 {
  280. PM2XXX_INT1_ITVBATDISCONNECT = 0x02,
  281. PM2XXX_INT1_ITVBATLOWR = 0x04,
  282. PM2XXX_INT1_ITVBATLOWF = 0x08,
  283. };
  284. enum pm2xxx_mask_reg_int1 {
  285. PM2XXX_INT1_M_ITVBATDISCONNECT = 0x02,
  286. PM2XXX_INT1_M_ITVBATLOWR = 0x04,
  287. PM2XXX_INT1_M_ITVBATLOWF = 0x08,
  288. };
  289. enum pm2xxx_source_reg_int1 {
  290. PM2XXX_INT1_S_ITVBATDISCONNECT = 0x02,
  291. PM2XXX_INT1_S_ITVBATLOWR = 0x04,
  292. PM2XXX_INT1_S_ITVBATLOWF = 0x08,
  293. };
  294. enum pm2xxx_reg_int2 {
  295. PM2XXX_INT2_ITVPWR2PLUG = 0x01,
  296. PM2XXX_INT2_ITVPWR2UNPLUG = 0x02,
  297. PM2XXX_INT2_ITVPWR1PLUG = 0x04,
  298. PM2XXX_INT2_ITVPWR1UNPLUG = 0x08,
  299. };
  300. enum pm2xxx_mask_reg_int2 {
  301. PM2XXX_INT2_M_ITVPWR2PLUG = 0x01,
  302. PM2XXX_INT2_M_ITVPWR2UNPLUG = 0x02,
  303. PM2XXX_INT2_M_ITVPWR1PLUG = 0x04,
  304. PM2XXX_INT2_M_ITVPWR1UNPLUG = 0x08,
  305. };
  306. enum pm2xxx_source_reg_int2 {
  307. PM2XXX_INT2_S_ITVPWR2PLUG = 0x03,
  308. PM2XXX_INT2_S_ITVPWR1PLUG = 0x0c,
  309. };
  310. enum pm2xxx_reg_int3 {
  311. PM2XXX_INT3_ITCHPRECHARGEWD = 0x01,
  312. PM2XXX_INT3_ITCHCCWD = 0x02,
  313. PM2XXX_INT3_ITCHCVWD = 0x04,
  314. PM2XXX_INT3_ITAUTOTIMEOUTWD = 0x08,
  315. };
  316. enum pm2xxx_mask_reg_int3 {
  317. PM2XXX_INT3_M_ITCHPRECHARGEWD = 0x01,
  318. PM2XXX_INT3_M_ITCHCCWD = 0x02,
  319. PM2XXX_INT3_M_ITCHCVWD = 0x04,
  320. PM2XXX_INT3_M_ITAUTOTIMEOUTWD = 0x08,
  321. };
  322. enum pm2xxx_source_reg_int3 {
  323. PM2XXX_INT3_S_ITCHPRECHARGEWD = 0x01,
  324. PM2XXX_INT3_S_ITCHCCWD = 0x02,
  325. PM2XXX_INT3_S_ITCHCVWD = 0x04,
  326. PM2XXX_INT3_S_ITAUTOTIMEOUTWD = 0x08,
  327. };
  328. enum pm2xxx_reg_int4 {
  329. PM2XXX_INT4_ITBATTEMPCOLD = 0x01,
  330. PM2XXX_INT4_ITBATTEMPHOT = 0x02,
  331. PM2XXX_INT4_ITVPWR2OVV = 0x04,
  332. PM2XXX_INT4_ITVPWR1OVV = 0x08,
  333. PM2XXX_INT4_ITCHARGINGON = 0x10,
  334. PM2XXX_INT4_ITVRESUME = 0x20,
  335. PM2XXX_INT4_ITBATTFULL = 0x40,
  336. PM2XXX_INT4_ITCVPHASE = 0x80,
  337. };
  338. enum pm2xxx_mask_reg_int4 {
  339. PM2XXX_INT4_M_ITBATTEMPCOLD = 0x01,
  340. PM2XXX_INT4_M_ITBATTEMPHOT = 0x02,
  341. PM2XXX_INT4_M_ITVPWR2OVV = 0x04,
  342. PM2XXX_INT4_M_ITVPWR1OVV = 0x08,
  343. PM2XXX_INT4_M_ITCHARGINGON = 0x10,
  344. PM2XXX_INT4_M_ITVRESUME = 0x20,
  345. PM2XXX_INT4_M_ITBATTFULL = 0x40,
  346. PM2XXX_INT4_M_ITCVPHASE = 0x80,
  347. };
  348. enum pm2xxx_source_reg_int4 {
  349. PM2XXX_INT4_S_ITBATTEMPCOLD = 0x01,
  350. PM2XXX_INT4_S_ITBATTEMPHOT = 0x02,
  351. PM2XXX_INT4_S_ITVPWR2OVV = 0x04,
  352. PM2XXX_INT4_S_ITVPWR1OVV = 0x08,
  353. PM2XXX_INT4_S_ITCHARGINGON = 0x10,
  354. PM2XXX_INT4_S_ITVRESUME = 0x20,
  355. PM2XXX_INT4_S_ITBATTFULL = 0x40,
  356. PM2XXX_INT4_S_ITCVPHASE = 0x80,
  357. };
  358. enum pm2xxx_reg_int5 {
  359. PM2XXX_INT5_ITTHERMALSHUTDOWNRISE = 0x01,
  360. PM2XXX_INT5_ITTHERMALSHUTDOWNFALL = 0x02,
  361. PM2XXX_INT5_ITTHERMALWARNINGRISE = 0x04,
  362. PM2XXX_INT5_ITTHERMALWARNINGFALL = 0x08,
  363. PM2XXX_INT5_ITVSYSTEMOVV = 0x10,
  364. };
  365. enum pm2xxx_mask_reg_int5 {
  366. PM2XXX_INT5_M_ITTHERMALSHUTDOWNRISE = 0x01,
  367. PM2XXX_INT5_M_ITTHERMALSHUTDOWNFALL = 0x02,
  368. PM2XXX_INT5_M_ITTHERMALWARNINGRISE = 0x04,
  369. PM2XXX_INT5_M_ITTHERMALWARNINGFALL = 0x08,
  370. PM2XXX_INT5_M_ITVSYSTEMOVV = 0x10,
  371. };
  372. enum pm2xxx_source_reg_int5 {
  373. PM2XXX_INT5_S_ITTHERMALSHUTDOWNRISE = 0x01,
  374. PM2XXX_INT5_S_ITTHERMALSHUTDOWNFALL = 0x02,
  375. PM2XXX_INT5_S_ITTHERMALWARNINGRISE = 0x04,
  376. PM2XXX_INT5_S_ITTHERMALWARNINGFALL = 0x08,
  377. PM2XXX_INT5_S_ITVSYSTEMOVV = 0x10,
  378. };
  379. enum pm2xxx_reg_int6 {
  380. PM2XXX_INT6_ITVPWR2DROP = 0x01,
  381. PM2XXX_INT6_ITVPWR1DROP = 0x02,
  382. PM2XXX_INT6_ITVPWR2VALIDRISE = 0x04,
  383. PM2XXX_INT6_ITVPWR2VALIDFALL = 0x08,
  384. PM2XXX_INT6_ITVPWR1VALIDRISE = 0x10,
  385. PM2XXX_INT6_ITVPWR1VALIDFALL = 0x20,
  386. };
  387. enum pm2xxx_mask_reg_int6 {
  388. PM2XXX_INT6_M_ITVPWR2DROP = 0x01,
  389. PM2XXX_INT6_M_ITVPWR1DROP = 0x02,
  390. PM2XXX_INT6_M_ITVPWR2VALIDRISE = 0x04,
  391. PM2XXX_INT6_M_ITVPWR2VALIDFALL = 0x08,
  392. PM2XXX_INT6_M_ITVPWR1VALIDRISE = 0x10,
  393. PM2XXX_INT6_M_ITVPWR1VALIDFALL = 0x20,
  394. };
  395. enum pm2xxx_source_reg_int6 {
  396. PM2XXX_INT6_S_ITVPWR2DROP = 0x01,
  397. PM2XXX_INT6_S_ITVPWR1DROP = 0x02,
  398. PM2XXX_INT6_S_ITVPWR2VALIDRISE = 0x04,
  399. PM2XXX_INT6_S_ITVPWR2VALIDFALL = 0x08,
  400. PM2XXX_INT6_S_ITVPWR1VALIDRISE = 0x10,
  401. PM2XXX_INT6_S_ITVPWR1VALIDFALL = 0x20,
  402. };
  403. static enum power_supply_property pm2xxx_charger_ac_props[] = {
  404. POWER_SUPPLY_PROP_HEALTH,
  405. POWER_SUPPLY_PROP_PRESENT,
  406. POWER_SUPPLY_PROP_ONLINE,
  407. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  408. POWER_SUPPLY_PROP_VOLTAGE_AVG,
  409. POWER_SUPPLY_PROP_CURRENT_NOW,
  410. };
  411. static int pm2xxx_charger_voltage_map[] = {
  412. 3500,
  413. 3525,
  414. 3550,
  415. 3575,
  416. 3600,
  417. 3625,
  418. 3650,
  419. 3675,
  420. 3700,
  421. 3725,
  422. 3750,
  423. 3775,
  424. 3800,
  425. 3825,
  426. 3850,
  427. 3875,
  428. 3900,
  429. 3925,
  430. 3950,
  431. 3975,
  432. 4000,
  433. 4025,
  434. 4050,
  435. 4075,
  436. 4100,
  437. 4125,
  438. 4150,
  439. 4175,
  440. 4200,
  441. 4225,
  442. 4250,
  443. 4275,
  444. 4300,
  445. };
  446. static int pm2xxx_charger_current_map[] = {
  447. 200,
  448. 200,
  449. 400,
  450. 600,
  451. 800,
  452. 1000,
  453. 1200,
  454. 1400,
  455. 1600,
  456. 1800,
  457. 2000,
  458. 2200,
  459. 2400,
  460. 2600,
  461. 2800,
  462. 3000,
  463. };
  464. struct pm2xxx_irq {
  465. char *name;
  466. irqreturn_t (*isr)(int irq, void *data);
  467. };
  468. struct pm2xxx_charger_info {
  469. int charger_connected;
  470. int charger_online;
  471. int charger_voltage;
  472. int cv_active;
  473. bool wd_expired;
  474. };
  475. struct pm2xxx_charger_event_flags {
  476. bool mainextchnotok;
  477. bool main_thermal_prot;
  478. bool ovv;
  479. bool chgwdexp;
  480. };
  481. struct pm2xxx_config {
  482. struct i2c_client *pm2xxx_i2c;
  483. struct i2c_device_id *pm2xxx_id;
  484. };
  485. struct pm2xxx_charger {
  486. struct device *dev;
  487. u8 chip_id;
  488. bool vddadc_en_ac;
  489. struct pm2xxx_config config;
  490. bool ac_conn;
  491. unsigned int gpio_irq;
  492. int vbat;
  493. int old_vbat;
  494. int failure_case;
  495. int failure_input_ovv;
  496. u8 pm2_int[6];
  497. struct ab8500_gpadc *gpadc;
  498. struct regulator *regu;
  499. struct pm2xxx_bm_data *bat;
  500. struct mutex lock;
  501. struct ab8500 *parent;
  502. struct pm2xxx_charger_info ac;
  503. struct pm2xxx_charger_platform_data *pdata;
  504. struct workqueue_struct *charger_wq;
  505. struct delayed_work check_vbat_work;
  506. struct work_struct ac_work;
  507. struct work_struct check_main_thermal_prot_work;
  508. struct ux500_charger ac_chg;
  509. struct pm2xxx_charger_event_flags flags;
  510. };
  511. static const struct i2c_device_id pm2xxx_ident[] = {
  512. { "pm2301", 0 },
  513. { }
  514. };
  515. static int pm2xxx_reg_read(struct pm2xxx_charger *pm2, int reg, u8 *val)
  516. {
  517. int ret;
  518. ret = i2c_smbus_read_i2c_block_data(pm2->config.pm2xxx_i2c, reg,
  519. 1, val);
  520. if (ret < 0)
  521. dev_err(pm2->dev, "Error reading register at 0x%x\n", reg);
  522. return ret;
  523. }
  524. static int pm2xxx_reg_write(struct pm2xxx_charger *pm2, int reg, u8 val)
  525. {
  526. int ret;
  527. ret = i2c_smbus_write_i2c_block_data(pm2->config.pm2xxx_i2c, reg,
  528. 1, &val);
  529. if (ret < 0)
  530. dev_err(pm2->dev, "Error writing register at 0x%x\n", reg);
  531. return ret;
  532. }
  533. static int pm2xxx_charging_enable_mngt(struct pm2xxx_charger *pm2)
  534. {
  535. int ret;
  536. /* Enable charging */
  537. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2,
  538. (PM2XXX_CH_AUTO_RESUME_EN | PM2XXX_CHARGER_ENA));
  539. return ret;
  540. }
  541. static int pm2xxx_charging_disable_mngt(struct pm2xxx_charger *pm2)
  542. {
  543. int ret;
  544. /* Disable charging */
  545. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2,
  546. (PM2XXX_CH_AUTO_RESUME_DIS | PM2XXX_CHARGER_DIS));
  547. return ret;
  548. }
  549. static int pm2xxx_charger_batt_therm_mngt(struct pm2xxx_charger *pm2, int val)
  550. {
  551. queue_work(pm2->charger_wq, &pm2->check_main_thermal_prot_work);
  552. return 0;
  553. }
  554. int pm2xxx_charger_die_therm_mngt(struct pm2xxx_charger *pm2, int val)
  555. {
  556. queue_work(pm2->charger_wq, &pm2->check_main_thermal_prot_work);
  557. return 0;
  558. }
  559. static int pm2xxx_charger_ovv_mngt(struct pm2xxx_charger *pm2, int val)
  560. {
  561. int ret = 0;
  562. pm2->failure_input_ovv++;
  563. if (pm2->failure_input_ovv < 4) {
  564. ret = pm2xxx_charging_enable_mngt(pm2);
  565. goto out;
  566. } else {
  567. pm2->failure_input_ovv = 0;
  568. dev_err(pm2->dev, "Overvoltage detected\n");
  569. pm2->flags.ovv = true;
  570. power_supply_changed(&pm2->ac_chg.psy);
  571. }
  572. out:
  573. return ret;
  574. }
  575. static int pm2xxx_charger_wd_exp_mngt(struct pm2xxx_charger *pm2, int val)
  576. {
  577. dev_dbg(pm2->dev , "20 minutes watchdog occured\n");
  578. pm2->ac.wd_expired = true;
  579. power_supply_changed(&pm2->ac_chg.psy);
  580. return 0;
  581. }
  582. static int pm2xxx_charger_vbat_lsig_mngt(struct pm2xxx_charger *pm2, int val)
  583. {
  584. switch (val) {
  585. case PM2XXX_INT1_ITVBATLOWR:
  586. dev_dbg(pm2->dev, "VBAT grows above VBAT_LOW level\n");
  587. break;
  588. case PM2XXX_INT1_ITVBATLOWF:
  589. dev_dbg(pm2->dev, "VBAT drops below VBAT_LOW level\n");
  590. break;
  591. default:
  592. dev_err(pm2->dev, "Unknown VBAT level\n");
  593. }
  594. return 0;
  595. }
  596. static int pm2xxx_charger_bat_disc_mngt(struct pm2xxx_charger *pm2, int val)
  597. {
  598. dev_dbg(pm2->dev, "battery disconnected\n");
  599. return (pm2xxx_charging_disable_mngt(pm2));
  600. }
  601. static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val)
  602. {
  603. int ret = 0;
  604. ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT2, val);
  605. if (ret < 0) {
  606. dev_err(pm2->dev, "Charger detection failed\n");
  607. goto out;
  608. }
  609. *val &= (PM2XXX_INT2_S_ITVPWR1PLUG | PM2XXX_INT2_S_ITVPWR2PLUG);
  610. out:
  611. return ret;
  612. }
  613. static int pm2xxx_charger_itv_pwr_plug_mngt(struct pm2xxx_charger *pm2, int val)
  614. {
  615. int ret;
  616. u8 read_val;
  617. /*
  618. * Since we can't be sure that the events are received
  619. * synchronously, we have the check if the main charger is
  620. * connected by reading the interrupt source register.
  621. */
  622. ret = pm2xxx_charger_detection(pm2, &read_val);
  623. if ((ret == 0) && read_val) {
  624. pm2->ac.charger_connected = 1;
  625. pm2->ac_conn = true;
  626. queue_work(pm2->charger_wq, &pm2->ac_work);
  627. }
  628. return ret;
  629. }
  630. static int pm2xxx_charger_itv_pwr_unplug_mngt(struct pm2xxx_charger *pm2,
  631. int val)
  632. {
  633. pm2->ac.charger_connected = 0;
  634. queue_work(pm2->charger_wq, &pm2->ac_work);
  635. return 0;
  636. }
  637. static int pm2_int_reg0(struct pm2xxx_charger *pm2)
  638. {
  639. int ret = 0;
  640. if (pm2->pm2_int[0] &
  641. (PM2XXX_INT1_ITVBATLOWR | PM2XXX_INT1_ITVBATLOWF)) {
  642. ret = pm2xxx_charger_vbat_lsig_mngt(pm2, pm2->pm2_int[0] &
  643. (PM2XXX_INT1_ITVBATLOWR | PM2XXX_INT1_ITVBATLOWF));
  644. }
  645. if (pm2->pm2_int[0] & PM2XXX_INT1_ITVBATDISCONNECT) {
  646. ret = pm2xxx_charger_bat_disc_mngt(pm2,
  647. PM2XXX_INT1_ITVBATDISCONNECT);
  648. }
  649. return ret;
  650. }
  651. static int pm2_int_reg1(struct pm2xxx_charger *pm2)
  652. {
  653. int ret = 0;
  654. if (pm2->pm2_int[1] &
  655. (PM2XXX_INT2_ITVPWR1PLUG | PM2XXX_INT2_ITVPWR2PLUG)) {
  656. dev_dbg(pm2->dev , "Main charger plugged\n");
  657. ret = pm2xxx_charger_itv_pwr_plug_mngt(pm2, pm2->pm2_int[1] &
  658. (PM2XXX_INT2_ITVPWR1PLUG | PM2XXX_INT2_ITVPWR2PLUG));
  659. }
  660. if (pm2->pm2_int[1] &
  661. (PM2XXX_INT2_ITVPWR1UNPLUG | PM2XXX_INT2_ITVPWR2UNPLUG)) {
  662. dev_dbg(pm2->dev , "Main charger unplugged\n");
  663. ret = pm2xxx_charger_itv_pwr_unplug_mngt(pm2, pm2->pm2_int[1] &
  664. (PM2XXX_INT2_ITVPWR1UNPLUG |
  665. PM2XXX_INT2_ITVPWR2UNPLUG));
  666. }
  667. return ret;
  668. }
  669. static int pm2_int_reg2(struct pm2xxx_charger *pm2)
  670. {
  671. int ret = 0;
  672. if (pm2->pm2_int[2] & PM2XXX_INT3_ITAUTOTIMEOUTWD)
  673. ret = pm2xxx_charger_wd_exp_mngt(pm2, pm2->pm2_int[2]);
  674. if (pm2->pm2_int[2] & (PM2XXX_INT3_ITCHPRECHARGEWD |
  675. PM2XXX_INT3_ITCHCCWD | PM2XXX_INT3_ITCHCVWD)) {
  676. dev_dbg(pm2->dev,
  677. "Watchdog occured for precharge, CC and CV charge\n");
  678. }
  679. return ret;
  680. }
  681. static int pm2_int_reg3(struct pm2xxx_charger *pm2)
  682. {
  683. int ret = 0;
  684. if (pm2->pm2_int[3] & (PM2XXX_INT4_ITCHARGINGON)) {
  685. dev_dbg(pm2->dev ,
  686. "chargind operation has started\n");
  687. }
  688. if (pm2->pm2_int[3] & (PM2XXX_INT4_ITVRESUME)) {
  689. dev_dbg(pm2->dev,
  690. "battery discharged down to VResume threshold\n");
  691. }
  692. if (pm2->pm2_int[3] & (PM2XXX_INT4_ITBATTFULL)) {
  693. dev_dbg(pm2->dev , "battery fully detected\n");
  694. }
  695. if (pm2->pm2_int[3] & (PM2XXX_INT4_ITCVPHASE)) {
  696. dev_dbg(pm2->dev, "CV phase enter with 0.5C charging\n");
  697. }
  698. if (pm2->pm2_int[3] &
  699. (PM2XXX_INT4_ITVPWR2OVV | PM2XXX_INT4_ITVPWR1OVV)) {
  700. pm2->failure_case = VPWR_OVV;
  701. ret = pm2xxx_charger_ovv_mngt(pm2, pm2->pm2_int[3] &
  702. (PM2XXX_INT4_ITVPWR2OVV | PM2XXX_INT4_ITVPWR1OVV));
  703. dev_dbg(pm2->dev, "VPWR/VSYSTEM overvoltage detected\n");
  704. }
  705. if (pm2->pm2_int[3] & (PM2XXX_INT4_S_ITBATTEMPCOLD |
  706. PM2XXX_INT4_S_ITBATTEMPHOT)) {
  707. ret = pm2xxx_charger_batt_therm_mngt(pm2,
  708. pm2->pm2_int[3] & (PM2XXX_INT4_S_ITBATTEMPCOLD |
  709. PM2XXX_INT4_S_ITBATTEMPHOT));
  710. dev_dbg(pm2->dev, "BTEMP is too Low/High\n");
  711. }
  712. return ret;
  713. }
  714. static int pm2_int_reg4(struct pm2xxx_charger *pm2)
  715. {
  716. int ret = 0;
  717. if (pm2->pm2_int[4] & PM2XXX_INT5_ITVSYSTEMOVV) {
  718. pm2->failure_case = VSYSTEM_OVV;
  719. ret = pm2xxx_charger_ovv_mngt(pm2, pm2->pm2_int[4] &
  720. PM2XXX_INT5_ITVSYSTEMOVV);
  721. dev_dbg(pm2->dev, "VSYSTEM overvoltage detected\n");
  722. }
  723. if (pm2->pm2_int[4] & (PM2XXX_INT5_ITTHERMALWARNINGFALL |
  724. PM2XXX_INT5_ITTHERMALWARNINGRISE |
  725. PM2XXX_INT5_ITTHERMALSHUTDOWNFALL |
  726. PM2XXX_INT5_ITTHERMALSHUTDOWNRISE)) {
  727. dev_dbg(pm2->dev, "BTEMP die temperature is too Low/High\n");
  728. ret = pm2xxx_charger_die_therm_mngt(pm2, pm2->pm2_int[4] &
  729. (PM2XXX_INT5_ITTHERMALWARNINGFALL |
  730. PM2XXX_INT5_ITTHERMALWARNINGRISE |
  731. PM2XXX_INT5_ITTHERMALSHUTDOWNFALL |
  732. PM2XXX_INT5_ITTHERMALSHUTDOWNRISE));
  733. }
  734. return ret;
  735. }
  736. static int pm2_int_reg5(struct pm2xxx_charger *pm2)
  737. {
  738. if (pm2->pm2_int[5]
  739. & (PM2XXX_INT6_ITVPWR2DROP | PM2XXX_INT6_ITVPWR1DROP)) {
  740. dev_dbg(pm2->dev, "VMPWR drop to VBAT level\n");
  741. }
  742. if (pm2->pm2_int[5] & (PM2XXX_INT6_ITVPWR2VALIDRISE |
  743. PM2XXX_INT6_ITVPWR1VALIDRISE |
  744. PM2XXX_INT6_ITVPWR2VALIDFALL |
  745. PM2XXX_INT6_ITVPWR1VALIDFALL)) {
  746. dev_dbg(pm2->dev, "Falling/Rising edge on WPWR1/2\n");
  747. }
  748. return 0;
  749. }
  750. static irqreturn_t pm2xxx_irq_int(int irq, void *data)
  751. {
  752. struct pm2xxx_charger *pm2 = data;
  753. int ret, i;
  754. for (i = 0; i < ARRAY_SIZE(pm2->pm2_int); i++) {
  755. ret = pm2xxx_reg_read(pm2, pm2xxx_interrupt_registers[i],
  756. &(pm2->pm2_int[i]));
  757. }
  758. pm2_int_reg0(pm2);
  759. pm2_int_reg1(pm2);
  760. pm2_int_reg2(pm2);
  761. pm2_int_reg3(pm2);
  762. pm2_int_reg4(pm2);
  763. pm2_int_reg5(pm2);
  764. return IRQ_HANDLED;
  765. }
  766. static int pm2xxx_charger_get_ac_voltage(struct pm2xxx_charger *pm2)
  767. {
  768. int vch = 0;
  769. if (pm2->ac.charger_connected) {
  770. vch = ab8500_gpadc_convert(pm2->gpadc, MAIN_CHARGER_V);
  771. if (vch < 0)
  772. dev_err(pm2->dev, "%s gpadc conv failed,\n", __func__);
  773. }
  774. return vch;
  775. }
  776. static int pm2xxx_charger_get_ac_cv(struct pm2xxx_charger *pm2)
  777. {
  778. int ret = 0;
  779. u8 val;
  780. if (pm2->ac.charger_connected && pm2->ac.charger_online) {
  781. ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT4, &val);
  782. if (ret < 0) {
  783. dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
  784. goto out;
  785. }
  786. if (val & PM2XXX_INT4_S_ITCVPHASE)
  787. ret = PM2XXX_CONST_VOLT;
  788. else
  789. ret = PM2XXX_CONST_CURR;
  790. }
  791. out:
  792. return ret;
  793. }
  794. static int pm2xxx_charger_get_ac_current(struct pm2xxx_charger *pm2)
  795. {
  796. int ich = 0;
  797. if (pm2->ac.charger_online) {
  798. ich = ab8500_gpadc_convert(pm2->gpadc, MAIN_CHARGER_C);
  799. if (ich < 0)
  800. dev_err(pm2->dev, "%s gpadc conv failed\n", __func__);
  801. }
  802. return ich;
  803. }
  804. static int pm2xxx_current_to_regval(int curr)
  805. {
  806. int i;
  807. if (curr < pm2xxx_charger_current_map[0])
  808. return 0;
  809. for (i = 1; i < ARRAY_SIZE(pm2xxx_charger_current_map); i++) {
  810. if (curr < pm2xxx_charger_current_map[i])
  811. return (i - 1);
  812. }
  813. i = ARRAY_SIZE(pm2xxx_charger_current_map) - 1;
  814. if (curr == pm2xxx_charger_current_map[i])
  815. return i;
  816. else
  817. return -EINVAL;
  818. }
  819. static int pm2xxx_voltage_to_regval(int curr)
  820. {
  821. int i;
  822. if (curr < pm2xxx_charger_voltage_map[0])
  823. return 0;
  824. for (i = 1; i < ARRAY_SIZE(pm2xxx_charger_voltage_map); i++) {
  825. if (curr < pm2xxx_charger_voltage_map[i])
  826. return i - 1;
  827. }
  828. i = ARRAY_SIZE(pm2xxx_charger_voltage_map) - 1;
  829. if (curr == pm2xxx_charger_voltage_map[i])
  830. return i;
  831. else
  832. return -EINVAL;
  833. }
  834. static int pm2xxx_charger_update_charger_current(struct ux500_charger *charger,
  835. int ich_out)
  836. {
  837. int ret;
  838. int curr_index;
  839. struct pm2xxx_charger *pm2;
  840. u8 val;
  841. if (charger->psy.type == POWER_SUPPLY_TYPE_MAINS)
  842. pm2 = to_pm2xxx_charger_ac_device_info(charger);
  843. else
  844. return -ENXIO;
  845. curr_index = pm2xxx_current_to_regval(ich_out);
  846. if (curr_index < 0) {
  847. dev_err(pm2->dev,
  848. "Charger current too high: charging not started\n");
  849. return -ENXIO;
  850. }
  851. ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val);
  852. if (ret >= 0) {
  853. val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK;
  854. val |= curr_index;
  855. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val);
  856. if (ret < 0) {
  857. dev_err(pm2->dev,
  858. "%s write failed\n", __func__);
  859. }
  860. }
  861. else
  862. dev_err(pm2->dev, "%s read failed\n", __func__);
  863. return ret;
  864. }
  865. static int pm2xxx_charger_ac_get_property(struct power_supply *psy,
  866. enum power_supply_property psp,
  867. union power_supply_propval *val)
  868. {
  869. struct pm2xxx_charger *pm2;
  870. pm2 = to_pm2xxx_charger_ac_device_info(psy_to_ux500_charger(psy));
  871. switch (psp) {
  872. case POWER_SUPPLY_PROP_HEALTH:
  873. if (pm2->flags.mainextchnotok)
  874. val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
  875. else if (pm2->ac.wd_expired)
  876. val->intval = POWER_SUPPLY_HEALTH_DEAD;
  877. else if (pm2->flags.main_thermal_prot)
  878. val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
  879. else
  880. val->intval = POWER_SUPPLY_HEALTH_GOOD;
  881. break;
  882. case POWER_SUPPLY_PROP_ONLINE:
  883. val->intval = pm2->ac.charger_online;
  884. break;
  885. case POWER_SUPPLY_PROP_PRESENT:
  886. val->intval = pm2->ac.charger_connected;
  887. break;
  888. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  889. pm2->ac.charger_voltage = pm2xxx_charger_get_ac_voltage(pm2);
  890. val->intval = pm2->ac.charger_voltage * 1000;
  891. break;
  892. case POWER_SUPPLY_PROP_VOLTAGE_AVG:
  893. pm2->ac.cv_active = pm2xxx_charger_get_ac_cv(pm2);
  894. val->intval = pm2->ac.cv_active;
  895. break;
  896. case POWER_SUPPLY_PROP_CURRENT_NOW:
  897. val->intval = pm2xxx_charger_get_ac_current(pm2) * 1000;
  898. break;
  899. default:
  900. return -EINVAL;
  901. }
  902. return 0;
  903. }
  904. static int pm2xxx_charging_init(struct pm2xxx_charger *pm2)
  905. {
  906. int ret = 0;
  907. /* enable CC and CV watchdog */
  908. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG3,
  909. (PM2XXX_CH_WD_CV_PHASE_60MIN | PM2XXX_CH_WD_CC_PHASE_60MIN));
  910. if( ret < 0)
  911. return ret;
  912. /* enable precharge watchdog */
  913. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG4,
  914. PM2XXX_CH_WD_PRECH_PHASE_60MIN);
  915. return ret;
  916. }
  917. static int pm2xxx_charger_ac_en(struct ux500_charger *charger,
  918. int enable, int vset, int iset)
  919. {
  920. int ret;
  921. int volt_index;
  922. int curr_index;
  923. u8 val;
  924. struct pm2xxx_charger *pm2 = to_pm2xxx_charger_ac_device_info(charger);
  925. if (enable) {
  926. if (!pm2->ac.charger_connected) {
  927. dev_dbg(pm2->dev, "AC charger not connected\n");
  928. return -ENXIO;
  929. }
  930. dev_dbg(pm2->dev, "Enable AC: %dmV %dmA\n", vset, iset);
  931. if (!pm2->vddadc_en_ac) {
  932. regulator_enable(pm2->regu);
  933. pm2->vddadc_en_ac = true;
  934. }
  935. ret = pm2xxx_charging_init(pm2);
  936. if (ret < 0) {
  937. dev_err(pm2->dev, "%s charging init failed\n",
  938. __func__);
  939. goto error_occured;
  940. }
  941. volt_index = pm2xxx_voltage_to_regval(vset);
  942. curr_index = pm2xxx_current_to_regval(iset);
  943. if (volt_index < 0 || curr_index < 0) {
  944. dev_err(pm2->dev,
  945. "Charger voltage or current too high, "
  946. "charging not started\n");
  947. return -ENXIO;
  948. }
  949. ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG8, &val);
  950. if (ret >= 0) {
  951. val &= ~PM2XXX_CH_VOLT_MASK;
  952. val |= volt_index;
  953. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8, val);
  954. if (ret < 0) {
  955. dev_err(pm2->dev,
  956. "%s write failed\n", __func__);
  957. goto error_occured;
  958. }
  959. else
  960. dev_err(pm2->dev, "%s read failed\n", __func__);
  961. }
  962. ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val);
  963. if (ret >= 0) {
  964. val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK;
  965. val |= curr_index;
  966. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val);
  967. if (ret < 0) {
  968. dev_err(pm2->dev,
  969. "%s write failed\n", __func__);
  970. goto error_occured;
  971. }
  972. else
  973. dev_err(pm2->dev, "%s read failed\n", __func__);
  974. }
  975. if (!pm2->bat->enable_overshoot) {
  976. ret = pm2xxx_reg_read(pm2, PM2XXX_LED_CTRL_REG, &val);
  977. if (ret >= 0) {
  978. val |= PM2XXX_ANTI_OVERSHOOT_EN;
  979. ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG,
  980. val);
  981. if (ret < 0){
  982. dev_err(pm2->dev, "%s write failed\n",
  983. __func__);
  984. goto error_occured;
  985. }
  986. }
  987. else
  988. dev_err(pm2->dev, "%s read failed\n", __func__);
  989. }
  990. ret = pm2xxx_charging_enable_mngt(pm2);
  991. if (ret) {
  992. dev_err(pm2->dev, "%s write failed\n", __func__);
  993. goto error_occured;
  994. }
  995. pm2->ac.charger_online = 1;
  996. } else {
  997. pm2->ac.charger_online = 0;
  998. pm2->ac.wd_expired = false;
  999. /* Disable regulator if enabled */
  1000. if (pm2->vddadc_en_ac) {
  1001. regulator_disable(pm2->regu);
  1002. pm2->vddadc_en_ac = false;
  1003. }
  1004. ret = pm2xxx_charging_disable_mngt(pm2);
  1005. if (ret) {
  1006. dev_err(pm2->dev, "%s write failed\n", __func__);
  1007. return ret;
  1008. }
  1009. dev_dbg(pm2->dev, "PM2301: " "Disabled AC charging\n");
  1010. }
  1011. power_supply_changed(&pm2->ac_chg.psy);
  1012. error_occured:
  1013. return ret;
  1014. }
  1015. static int pm2xxx_charger_watchdog_kick(struct ux500_charger *charger)
  1016. {
  1017. int ret;
  1018. struct pm2xxx_charger *pm2;
  1019. if (charger->psy.type == POWER_SUPPLY_TYPE_MAINS)
  1020. pm2 = to_pm2xxx_charger_ac_device_info(charger);
  1021. else
  1022. return -ENXIO;
  1023. ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_WD_KICK, WD_TIMER);
  1024. if (ret)
  1025. dev_err(pm2->dev, "Failed to kick WD!\n");
  1026. return ret;
  1027. }
  1028. static void pm2xxx_charger_ac_work(struct work_struct *work)
  1029. {
  1030. struct pm2xxx_charger *pm2 = container_of(work,
  1031. struct pm2xxx_charger, ac_work);
  1032. power_supply_changed(&pm2->ac_chg.psy);
  1033. sysfs_notify(&pm2->ac_chg.psy.dev->kobj, NULL, "present");
  1034. };
  1035. static void pm2xxx_charger_check_main_thermal_prot_work(
  1036. struct work_struct *work)
  1037. {
  1038. };
  1039. static struct pm2xxx_irq pm2xxx_charger_irq[] = {
  1040. {"PM2XXX_IRQ_INT", pm2xxx_irq_int},
  1041. };
  1042. static int pm2xxx_wall_charger_resume(struct i2c_client *i2c_client)
  1043. {
  1044. return 0;
  1045. }
  1046. static int pm2xxx_wall_charger_suspend(struct i2c_client *i2c_client,
  1047. pm_message_t state)
  1048. {
  1049. return 0;
  1050. }
  1051. static int __devinit pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
  1052. const struct i2c_device_id *id)
  1053. {
  1054. struct pm2xxx_platform_data *pl_data = i2c_client->dev.platform_data;
  1055. struct pm2xxx_charger *pm2;
  1056. int ret = 0;
  1057. u8 val;
  1058. pm2 = kzalloc(sizeof(struct pm2xxx_charger), GFP_KERNEL);
  1059. if (!pm2) {
  1060. dev_err(pm2->dev, "pm2xxx_charger allocation failed\n");
  1061. return -ENOMEM;
  1062. }
  1063. /* get parent data */
  1064. pm2->dev = &i2c_client->dev;
  1065. pm2->gpadc = ab8500_gpadc_get("ab8500-gpadc.0");
  1066. /* get charger spcific platform data */
  1067. if (!pl_data->wall_charger) {
  1068. dev_err(pm2->dev, "no charger platform data supplied\n");
  1069. ret = -EINVAL;
  1070. goto free_device_info;
  1071. }
  1072. pm2->pdata = pl_data->wall_charger;
  1073. /* get battery specific platform data */
  1074. if (!pl_data->battery) {
  1075. dev_err(pm2->dev, "no battery platform data supplied\n");
  1076. ret = -EINVAL;
  1077. goto free_device_info;
  1078. }
  1079. pm2->bat = pl_data->battery;
  1080. if (!i2c_check_functionality(i2c_client->adapter,
  1081. I2C_FUNC_SMBUS_BYTE_DATA |
  1082. I2C_FUNC_SMBUS_READ_WORD_DATA)) {
  1083. ret = -ENODEV;
  1084. dev_info(pm2->dev, "pm2301 i2c_check_functionality failed\n");
  1085. goto free_device_info;
  1086. }
  1087. pm2->config.pm2xxx_i2c = i2c_client;
  1088. pm2->config.pm2xxx_id = (struct i2c_device_id *) id;
  1089. i2c_set_clientdata(i2c_client, pm2);
  1090. /* AC supply */
  1091. /* power_supply base class */
  1092. pm2->ac_chg.psy.name = pm2->pdata->label;
  1093. pm2->ac_chg.psy.type = POWER_SUPPLY_TYPE_MAINS;
  1094. pm2->ac_chg.psy.properties = pm2xxx_charger_ac_props;
  1095. pm2->ac_chg.psy.num_properties = ARRAY_SIZE(pm2xxx_charger_ac_props);
  1096. pm2->ac_chg.psy.get_property = pm2xxx_charger_ac_get_property;
  1097. pm2->ac_chg.psy.supplied_to = pm2->pdata->supplied_to;
  1098. pm2->ac_chg.psy.num_supplicants = pm2->pdata->num_supplicants;
  1099. /* pm2xxx_charger sub-class */
  1100. pm2->ac_chg.ops.enable = &pm2xxx_charger_ac_en;
  1101. pm2->ac_chg.ops.kick_wd = &pm2xxx_charger_watchdog_kick;
  1102. pm2->ac_chg.ops.update_curr = &pm2xxx_charger_update_charger_current;
  1103. pm2->ac_chg.max_out_volt = pm2xxx_charger_voltage_map[
  1104. ARRAY_SIZE(pm2xxx_charger_voltage_map) - 1];
  1105. pm2->ac_chg.max_out_curr = pm2xxx_charger_current_map[
  1106. ARRAY_SIZE(pm2xxx_charger_current_map) - 1];
  1107. /* Create a work queue for the charger */
  1108. pm2->charger_wq =
  1109. create_singlethread_workqueue("pm2xxx_charger_wq");
  1110. if (pm2->charger_wq == NULL) {
  1111. dev_err(pm2->dev, "failed to create work queue\n");
  1112. goto free_device_info;
  1113. }
  1114. /* Init work for charger detection */
  1115. INIT_WORK(&pm2->ac_work, pm2xxx_charger_ac_work);
  1116. /* Init work for checking HW status */
  1117. INIT_WORK(&pm2->check_main_thermal_prot_work,
  1118. pm2xxx_charger_check_main_thermal_prot_work);
  1119. /*
  1120. * VDD ADC supply needs to be enabled from this driver when there
  1121. * is a charger connected to avoid erroneous BTEMP_HIGH/LOW
  1122. * interrupts during charging
  1123. */
  1124. pm2->regu = regulator_get(pm2->dev, "vddadc");
  1125. if (IS_ERR(pm2->regu)) {
  1126. ret = PTR_ERR(pm2->regu);
  1127. dev_err(pm2->dev, "failed to get vddadc regulator\n");
  1128. goto free_charger_wq;
  1129. }
  1130. /* Register AC charger class */
  1131. ret = power_supply_register(pm2->dev, &pm2->ac_chg.psy);
  1132. if (ret) {
  1133. dev_err(pm2->dev, "failed to register AC charger\n");
  1134. goto free_regulator;
  1135. }
  1136. /* Register interrupts */
  1137. ret = request_threaded_irq(pm2->pdata->irq_number, NULL,
  1138. pm2xxx_charger_irq[0].isr,
  1139. pm2->pdata->irq_type,
  1140. pm2xxx_charger_irq[0].name, pm2);
  1141. if (ret != 0) {
  1142. dev_err(pm2->dev, "failed to request %s IRQ %d: %d\n",
  1143. pm2xxx_charger_irq[0].name, pm2->pdata->irq_number, ret);
  1144. goto unregister_pm2xxx_charger;
  1145. }
  1146. /*
  1147. * I2C Read/Write will fail, if AC adaptor is not connected.
  1148. * fix the charger detection mechanism.
  1149. */
  1150. ret = pm2xxx_charger_detection(pm2, &val);
  1151. if ((ret == 0) && val) {
  1152. pm2->ac.charger_connected = 1;
  1153. pm2->ac_conn = true;
  1154. power_supply_changed(&pm2->ac_chg.psy);
  1155. sysfs_notify(&pm2->ac_chg.psy.dev->kobj, NULL, "present");
  1156. }
  1157. return 0;
  1158. unregister_pm2xxx_charger:
  1159. /* unregister power supply */
  1160. power_supply_unregister(&pm2->ac_chg.psy);
  1161. free_regulator:
  1162. /* disable the regulator */
  1163. regulator_put(pm2->regu);
  1164. free_charger_wq:
  1165. destroy_workqueue(pm2->charger_wq);
  1166. free_device_info:
  1167. kfree(pm2);
  1168. return ret;
  1169. }
  1170. static int __devexit pm2xxx_wall_charger_remove(struct i2c_client *i2c_client)
  1171. {
  1172. struct pm2xxx_charger *pm2 = i2c_get_clientdata(i2c_client);
  1173. /* Disable AC charging */
  1174. pm2xxx_charger_ac_en(&pm2->ac_chg, false, 0, 0);
  1175. /* Disable interrupts */
  1176. free_irq(pm2->pdata->irq_number, pm2);
  1177. /* Delete the work queue */
  1178. destroy_workqueue(pm2->charger_wq);
  1179. flush_scheduled_work();
  1180. /* disable the regulator */
  1181. regulator_put(pm2->regu);
  1182. power_supply_unregister(&pm2->ac_chg.psy);
  1183. kfree(pm2);
  1184. return 0;
  1185. }
  1186. static const struct i2c_device_id pm2xxx_id[] = {
  1187. { "pm2301", 0 },
  1188. { }
  1189. };
  1190. MODULE_DEVICE_TABLE(i2c, pm2xxx_id);
  1191. static struct i2c_driver pm2xxx_charger_driver = {
  1192. .probe = pm2xxx_wall_charger_probe,
  1193. .remove = __devexit_p(pm2xxx_wall_charger_remove),
  1194. .suspend = pm2xxx_wall_charger_suspend,
  1195. .resume = pm2xxx_wall_charger_resume,
  1196. .driver = {
  1197. .name = "pm2xxx-wall_charger",
  1198. .owner = THIS_MODULE,
  1199. },
  1200. .id_table = pm2xxx_id,
  1201. };
  1202. static int __init pm2xxx_charger_init(void)
  1203. {
  1204. return i2c_add_driver(&pm2xxx_charger_driver);
  1205. }
  1206. static void __exit pm2xxx_charger_exit(void)
  1207. {
  1208. i2c_del_driver(&pm2xxx_charger_driver);
  1209. }
  1210. subsys_initcall_sync(pm2xxx_charger_init);
  1211. module_exit(pm2xxx_charger_exit);
  1212. MODULE_LICENSE("GPL v2");
  1213. MODULE_AUTHOR("Rajkumar kasirajan, Olivier Launay");
  1214. MODULE_ALIAS("platform:pm2xxx-charger");
  1215. MODULE_DESCRIPTION("PM2xxx charger management driver");