ab8500-core.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
  1. /*
  2. * Copyright (C) ST-Ericsson SA 2010
  3. *
  4. * License Terms: GNU General Public License v2
  5. * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
  6. * Author: Rabin Vincent <rabin.vincent@stericsson.com>
  7. * Author: Mattias Wallin <mattias.wallin@stericsson.com>
  8. */
  9. #include <linux/kernel.h>
  10. #include <linux/slab.h>
  11. #include <linux/init.h>
  12. #include <linux/irq.h>
  13. #include <linux/delay.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/module.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/mfd/core.h>
  18. #include <linux/mfd/abx500.h>
  19. #include <linux/mfd/ab8500.h>
  20. #include <linux/regulator/ab8500.h>
  21. /*
  22. * Interrupt register offsets
  23. * Bank : 0x0E
  24. */
  25. #define AB8500_IT_SOURCE1_REG 0x00
  26. #define AB8500_IT_SOURCE2_REG 0x01
  27. #define AB8500_IT_SOURCE3_REG 0x02
  28. #define AB8500_IT_SOURCE4_REG 0x03
  29. #define AB8500_IT_SOURCE5_REG 0x04
  30. #define AB8500_IT_SOURCE6_REG 0x05
  31. #define AB8500_IT_SOURCE7_REG 0x06
  32. #define AB8500_IT_SOURCE8_REG 0x07
  33. #define AB8500_IT_SOURCE19_REG 0x12
  34. #define AB8500_IT_SOURCE20_REG 0x13
  35. #define AB8500_IT_SOURCE21_REG 0x14
  36. #define AB8500_IT_SOURCE22_REG 0x15
  37. #define AB8500_IT_SOURCE23_REG 0x16
  38. #define AB8500_IT_SOURCE24_REG 0x17
  39. /*
  40. * latch registers
  41. */
  42. #define AB8500_IT_LATCH1_REG 0x20
  43. #define AB8500_IT_LATCH2_REG 0x21
  44. #define AB8500_IT_LATCH3_REG 0x22
  45. #define AB8500_IT_LATCH4_REG 0x23
  46. #define AB8500_IT_LATCH5_REG 0x24
  47. #define AB8500_IT_LATCH6_REG 0x25
  48. #define AB8500_IT_LATCH7_REG 0x26
  49. #define AB8500_IT_LATCH8_REG 0x27
  50. #define AB8500_IT_LATCH9_REG 0x28
  51. #define AB8500_IT_LATCH10_REG 0x29
  52. #define AB8500_IT_LATCH12_REG 0x2B
  53. #define AB8500_IT_LATCH19_REG 0x32
  54. #define AB8500_IT_LATCH20_REG 0x33
  55. #define AB8500_IT_LATCH21_REG 0x34
  56. #define AB8500_IT_LATCH22_REG 0x35
  57. #define AB8500_IT_LATCH23_REG 0x36
  58. #define AB8500_IT_LATCH24_REG 0x37
  59. /*
  60. * mask registers
  61. */
  62. #define AB8500_IT_MASK1_REG 0x40
  63. #define AB8500_IT_MASK2_REG 0x41
  64. #define AB8500_IT_MASK3_REG 0x42
  65. #define AB8500_IT_MASK4_REG 0x43
  66. #define AB8500_IT_MASK5_REG 0x44
  67. #define AB8500_IT_MASK6_REG 0x45
  68. #define AB8500_IT_MASK7_REG 0x46
  69. #define AB8500_IT_MASK8_REG 0x47
  70. #define AB8500_IT_MASK9_REG 0x48
  71. #define AB8500_IT_MASK10_REG 0x49
  72. #define AB8500_IT_MASK11_REG 0x4A
  73. #define AB8500_IT_MASK12_REG 0x4B
  74. #define AB8500_IT_MASK13_REG 0x4C
  75. #define AB8500_IT_MASK14_REG 0x4D
  76. #define AB8500_IT_MASK15_REG 0x4E
  77. #define AB8500_IT_MASK16_REG 0x4F
  78. #define AB8500_IT_MASK17_REG 0x50
  79. #define AB8500_IT_MASK18_REG 0x51
  80. #define AB8500_IT_MASK19_REG 0x52
  81. #define AB8500_IT_MASK20_REG 0x53
  82. #define AB8500_IT_MASK21_REG 0x54
  83. #define AB8500_IT_MASK22_REG 0x55
  84. #define AB8500_IT_MASK23_REG 0x56
  85. #define AB8500_IT_MASK24_REG 0x57
  86. #define AB8500_REV_REG 0x80
  87. #define AB8500_SWITCH_OFF_STATUS 0x00
  88. /*
  89. * Map interrupt numbers to the LATCH and MASK register offsets, Interrupt
  90. * numbers are indexed into this array with (num / 8).
  91. *
  92. * This is one off from the register names, i.e. AB8500_IT_MASK1_REG is at
  93. * offset 0.
  94. */
  95. static const int ab8500_irq_regoffset[AB8500_NUM_IRQ_REGS] = {
  96. 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21,
  97. };
  98. static int ab8500_get_chip_id(struct device *dev)
  99. {
  100. struct ab8500 *ab8500;
  101. if (!dev)
  102. return -EINVAL;
  103. ab8500 = dev_get_drvdata(dev->parent);
  104. return ab8500 ? (int)ab8500->chip_id : -EINVAL;
  105. }
  106. static int set_register_interruptible(struct ab8500 *ab8500, u8 bank,
  107. u8 reg, u8 data)
  108. {
  109. int ret;
  110. /*
  111. * Put the u8 bank and u8 register together into a an u16.
  112. * The bank on higher 8 bits and register in lower 8 bits.
  113. * */
  114. u16 addr = ((u16)bank) << 8 | reg;
  115. dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data);
  116. ret = mutex_lock_interruptible(&ab8500->lock);
  117. if (ret)
  118. return ret;
  119. ret = ab8500->write(ab8500, addr, data);
  120. if (ret < 0)
  121. dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
  122. addr, ret);
  123. mutex_unlock(&ab8500->lock);
  124. return ret;
  125. }
  126. static int ab8500_set_register(struct device *dev, u8 bank,
  127. u8 reg, u8 value)
  128. {
  129. struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
  130. return set_register_interruptible(ab8500, bank, reg, value);
  131. }
  132. static int get_register_interruptible(struct ab8500 *ab8500, u8 bank,
  133. u8 reg, u8 *value)
  134. {
  135. int ret;
  136. /* put the u8 bank and u8 reg together into a an u16.
  137. * bank on higher 8 bits and reg in lower */
  138. u16 addr = ((u16)bank) << 8 | reg;
  139. ret = mutex_lock_interruptible(&ab8500->lock);
  140. if (ret)
  141. return ret;
  142. ret = ab8500->read(ab8500, addr);
  143. if (ret < 0)
  144. dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
  145. addr, ret);
  146. else
  147. *value = ret;
  148. mutex_unlock(&ab8500->lock);
  149. dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret);
  150. return ret;
  151. }
  152. static int ab8500_get_register(struct device *dev, u8 bank,
  153. u8 reg, u8 *value)
  154. {
  155. struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
  156. return get_register_interruptible(ab8500, bank, reg, value);
  157. }
  158. static int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank,
  159. u8 reg, u8 bitmask, u8 bitvalues)
  160. {
  161. int ret;
  162. u8 data;
  163. /* put the u8 bank and u8 reg together into a an u16.
  164. * bank on higher 8 bits and reg in lower */
  165. u16 addr = ((u16)bank) << 8 | reg;
  166. ret = mutex_lock_interruptible(&ab8500->lock);
  167. if (ret)
  168. return ret;
  169. ret = ab8500->read(ab8500, addr);
  170. if (ret < 0) {
  171. dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
  172. addr, ret);
  173. goto out;
  174. }
  175. data = (u8)ret;
  176. data = (~bitmask & data) | (bitmask & bitvalues);
  177. ret = ab8500->write(ab8500, addr, data);
  178. if (ret < 0)
  179. dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
  180. addr, ret);
  181. dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr, data);
  182. out:
  183. mutex_unlock(&ab8500->lock);
  184. return ret;
  185. }
  186. static int ab8500_mask_and_set_register(struct device *dev,
  187. u8 bank, u8 reg, u8 bitmask, u8 bitvalues)
  188. {
  189. struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
  190. return mask_and_set_register_interruptible(ab8500, bank, reg,
  191. bitmask, bitvalues);
  192. }
  193. static struct abx500_ops ab8500_ops = {
  194. .get_chip_id = ab8500_get_chip_id,
  195. .get_register = ab8500_get_register,
  196. .set_register = ab8500_set_register,
  197. .get_register_page = NULL,
  198. .set_register_page = NULL,
  199. .mask_and_set_register = ab8500_mask_and_set_register,
  200. .event_registers_startup_state_get = NULL,
  201. .startup_irq_enabled = NULL,
  202. };
  203. static void ab8500_irq_lock(struct irq_data *data)
  204. {
  205. struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
  206. mutex_lock(&ab8500->irq_lock);
  207. }
  208. static void ab8500_irq_sync_unlock(struct irq_data *data)
  209. {
  210. struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
  211. int i;
  212. for (i = 0; i < AB8500_NUM_IRQ_REGS; i++) {
  213. u8 old = ab8500->oldmask[i];
  214. u8 new = ab8500->mask[i];
  215. int reg;
  216. if (new == old)
  217. continue;
  218. /* Interrupt register 12 doesn't exist prior to version 2.0 */
  219. if (ab8500_irq_regoffset[i] == 11 &&
  220. ab8500->chip_id < AB8500_CUT2P0)
  221. continue;
  222. ab8500->oldmask[i] = new;
  223. reg = AB8500_IT_MASK1_REG + ab8500_irq_regoffset[i];
  224. set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new);
  225. }
  226. mutex_unlock(&ab8500->irq_lock);
  227. }
  228. static void ab8500_irq_mask(struct irq_data *data)
  229. {
  230. struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
  231. int offset = data->irq - ab8500->irq_base;
  232. int index = offset / 8;
  233. int mask = 1 << (offset % 8);
  234. ab8500->mask[index] |= mask;
  235. }
  236. static void ab8500_irq_unmask(struct irq_data *data)
  237. {
  238. struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
  239. int offset = data->irq - ab8500->irq_base;
  240. int index = offset / 8;
  241. int mask = 1 << (offset % 8);
  242. ab8500->mask[index] &= ~mask;
  243. }
  244. static struct irq_chip ab8500_irq_chip = {
  245. .name = "ab8500",
  246. .irq_bus_lock = ab8500_irq_lock,
  247. .irq_bus_sync_unlock = ab8500_irq_sync_unlock,
  248. .irq_mask = ab8500_irq_mask,
  249. .irq_unmask = ab8500_irq_unmask,
  250. };
  251. static irqreturn_t ab8500_irq(int irq, void *dev)
  252. {
  253. struct ab8500 *ab8500 = dev;
  254. int i;
  255. dev_vdbg(ab8500->dev, "interrupt\n");
  256. for (i = 0; i < AB8500_NUM_IRQ_REGS; i++) {
  257. int regoffset = ab8500_irq_regoffset[i];
  258. int status;
  259. u8 value;
  260. /* Interrupt register 12 doesn't exist prior to version 2.0 */
  261. if (regoffset == 11 && ab8500->chip_id < AB8500_CUT2P0)
  262. continue;
  263. status = get_register_interruptible(ab8500, AB8500_INTERRUPT,
  264. AB8500_IT_LATCH1_REG + regoffset, &value);
  265. if (status < 0 || value == 0)
  266. continue;
  267. do {
  268. int bit = __ffs(value);
  269. int line = i * 8 + bit;
  270. handle_nested_irq(ab8500->irq_base + line);
  271. value &= ~(1 << bit);
  272. } while (value);
  273. }
  274. return IRQ_HANDLED;
  275. }
  276. static int ab8500_irq_init(struct ab8500 *ab8500)
  277. {
  278. int base = ab8500->irq_base;
  279. int irq;
  280. for (irq = base; irq < base + AB8500_NR_IRQS; irq++) {
  281. irq_set_chip_data(irq, ab8500);
  282. irq_set_chip_and_handler(irq, &ab8500_irq_chip,
  283. handle_simple_irq);
  284. irq_set_nested_thread(irq, 1);
  285. #ifdef CONFIG_ARM
  286. set_irq_flags(irq, IRQF_VALID);
  287. #else
  288. irq_set_noprobe(irq);
  289. #endif
  290. }
  291. return 0;
  292. }
  293. static void ab8500_irq_remove(struct ab8500 *ab8500)
  294. {
  295. int base = ab8500->irq_base;
  296. int irq;
  297. for (irq = base; irq < base + AB8500_NR_IRQS; irq++) {
  298. #ifdef CONFIG_ARM
  299. set_irq_flags(irq, 0);
  300. #endif
  301. irq_set_chip_and_handler(irq, NULL, NULL);
  302. irq_set_chip_data(irq, NULL);
  303. }
  304. }
  305. static struct resource __devinitdata ab8500_gpio_resources[] = {
  306. {
  307. .name = "GPIO_INT6",
  308. .start = AB8500_INT_GPIO6R,
  309. .end = AB8500_INT_GPIO41F,
  310. .flags = IORESOURCE_IRQ,
  311. }
  312. };
  313. static struct resource __devinitdata ab8500_gpadc_resources[] = {
  314. {
  315. .name = "HW_CONV_END",
  316. .start = AB8500_INT_GP_HW_ADC_CONV_END,
  317. .end = AB8500_INT_GP_HW_ADC_CONV_END,
  318. .flags = IORESOURCE_IRQ,
  319. },
  320. {
  321. .name = "SW_CONV_END",
  322. .start = AB8500_INT_GP_SW_ADC_CONV_END,
  323. .end = AB8500_INT_GP_SW_ADC_CONV_END,
  324. .flags = IORESOURCE_IRQ,
  325. },
  326. };
  327. static struct resource __devinitdata ab8500_rtc_resources[] = {
  328. {
  329. .name = "60S",
  330. .start = AB8500_INT_RTC_60S,
  331. .end = AB8500_INT_RTC_60S,
  332. .flags = IORESOURCE_IRQ,
  333. },
  334. {
  335. .name = "ALARM",
  336. .start = AB8500_INT_RTC_ALARM,
  337. .end = AB8500_INT_RTC_ALARM,
  338. .flags = IORESOURCE_IRQ,
  339. },
  340. };
  341. static struct resource __devinitdata ab8500_poweronkey_db_resources[] = {
  342. {
  343. .name = "ONKEY_DBF",
  344. .start = AB8500_INT_PON_KEY1DB_F,
  345. .end = AB8500_INT_PON_KEY1DB_F,
  346. .flags = IORESOURCE_IRQ,
  347. },
  348. {
  349. .name = "ONKEY_DBR",
  350. .start = AB8500_INT_PON_KEY1DB_R,
  351. .end = AB8500_INT_PON_KEY1DB_R,
  352. .flags = IORESOURCE_IRQ,
  353. },
  354. };
  355. static struct resource __devinitdata ab8500_av_acc_detect_resources[] = {
  356. {
  357. .name = "ACC_DETECT_1DB_F",
  358. .start = AB8500_INT_ACC_DETECT_1DB_F,
  359. .end = AB8500_INT_ACC_DETECT_1DB_F,
  360. .flags = IORESOURCE_IRQ,
  361. },
  362. {
  363. .name = "ACC_DETECT_1DB_R",
  364. .start = AB8500_INT_ACC_DETECT_1DB_R,
  365. .end = AB8500_INT_ACC_DETECT_1DB_R,
  366. .flags = IORESOURCE_IRQ,
  367. },
  368. {
  369. .name = "ACC_DETECT_21DB_F",
  370. .start = AB8500_INT_ACC_DETECT_21DB_F,
  371. .end = AB8500_INT_ACC_DETECT_21DB_F,
  372. .flags = IORESOURCE_IRQ,
  373. },
  374. {
  375. .name = "ACC_DETECT_21DB_R",
  376. .start = AB8500_INT_ACC_DETECT_21DB_R,
  377. .end = AB8500_INT_ACC_DETECT_21DB_R,
  378. .flags = IORESOURCE_IRQ,
  379. },
  380. {
  381. .name = "ACC_DETECT_22DB_F",
  382. .start = AB8500_INT_ACC_DETECT_22DB_F,
  383. .end = AB8500_INT_ACC_DETECT_22DB_F,
  384. .flags = IORESOURCE_IRQ,
  385. },
  386. {
  387. .name = "ACC_DETECT_22DB_R",
  388. .start = AB8500_INT_ACC_DETECT_22DB_R,
  389. .end = AB8500_INT_ACC_DETECT_22DB_R,
  390. .flags = IORESOURCE_IRQ,
  391. },
  392. };
  393. static struct resource __devinitdata ab8500_charger_resources[] = {
  394. {
  395. .name = "MAIN_CH_UNPLUG_DET",
  396. .start = AB8500_INT_MAIN_CH_UNPLUG_DET,
  397. .end = AB8500_INT_MAIN_CH_UNPLUG_DET,
  398. .flags = IORESOURCE_IRQ,
  399. },
  400. {
  401. .name = "MAIN_CHARGE_PLUG_DET",
  402. .start = AB8500_INT_MAIN_CH_PLUG_DET,
  403. .end = AB8500_INT_MAIN_CH_PLUG_DET,
  404. .flags = IORESOURCE_IRQ,
  405. },
  406. {
  407. .name = "VBUS_DET_R",
  408. .start = AB8500_INT_VBUS_DET_R,
  409. .end = AB8500_INT_VBUS_DET_R,
  410. .flags = IORESOURCE_IRQ,
  411. },
  412. {
  413. .name = "VBUS_DET_F",
  414. .start = AB8500_INT_VBUS_DET_F,
  415. .end = AB8500_INT_VBUS_DET_F,
  416. .flags = IORESOURCE_IRQ,
  417. },
  418. {
  419. .name = "USB_LINK_STATUS",
  420. .start = AB8500_INT_USB_LINK_STATUS,
  421. .end = AB8500_INT_USB_LINK_STATUS,
  422. .flags = IORESOURCE_IRQ,
  423. },
  424. {
  425. .name = "USB_CHARGE_DET_DONE",
  426. .start = AB8500_INT_USB_CHG_DET_DONE,
  427. .end = AB8500_INT_USB_CHG_DET_DONE,
  428. .flags = IORESOURCE_IRQ,
  429. },
  430. {
  431. .name = "VBUS_OVV",
  432. .start = AB8500_INT_VBUS_OVV,
  433. .end = AB8500_INT_VBUS_OVV,
  434. .flags = IORESOURCE_IRQ,
  435. },
  436. {
  437. .name = "USB_CH_TH_PROT_R",
  438. .start = AB8500_INT_USB_CH_TH_PROT_R,
  439. .end = AB8500_INT_USB_CH_TH_PROT_R,
  440. .flags = IORESOURCE_IRQ,
  441. },
  442. {
  443. .name = "USB_CH_TH_PROT_F",
  444. .start = AB8500_INT_USB_CH_TH_PROT_F,
  445. .end = AB8500_INT_USB_CH_TH_PROT_F,
  446. .flags = IORESOURCE_IRQ,
  447. },
  448. {
  449. .name = "MAIN_EXT_CH_NOT_OK",
  450. .start = AB8500_INT_MAIN_EXT_CH_NOT_OK,
  451. .end = AB8500_INT_MAIN_EXT_CH_NOT_OK,
  452. .flags = IORESOURCE_IRQ,
  453. },
  454. {
  455. .name = "MAIN_CH_TH_PROT_R",
  456. .start = AB8500_INT_MAIN_CH_TH_PROT_R,
  457. .end = AB8500_INT_MAIN_CH_TH_PROT_R,
  458. .flags = IORESOURCE_IRQ,
  459. },
  460. {
  461. .name = "MAIN_CH_TH_PROT_F",
  462. .start = AB8500_INT_MAIN_CH_TH_PROT_F,
  463. .end = AB8500_INT_MAIN_CH_TH_PROT_F,
  464. .flags = IORESOURCE_IRQ,
  465. },
  466. {
  467. .name = "USB_CHARGER_NOT_OKR",
  468. .start = AB8500_INT_USB_CHARGER_NOT_OK,
  469. .end = AB8500_INT_USB_CHARGER_NOT_OK,
  470. .flags = IORESOURCE_IRQ,
  471. },
  472. {
  473. .name = "USB_CHARGER_NOT_OKF",
  474. .start = AB8500_INT_USB_CHARGER_NOT_OKF,
  475. .end = AB8500_INT_USB_CHARGER_NOT_OKF,
  476. .flags = IORESOURCE_IRQ,
  477. },
  478. {
  479. .name = "CH_WD_EXP",
  480. .start = AB8500_INT_CH_WD_EXP,
  481. .end = AB8500_INT_CH_WD_EXP,
  482. .flags = IORESOURCE_IRQ,
  483. },
  484. };
  485. static struct resource __devinitdata ab8500_btemp_resources[] = {
  486. {
  487. .name = "BAT_CTRL_INDB",
  488. .start = AB8500_INT_BAT_CTRL_INDB,
  489. .end = AB8500_INT_BAT_CTRL_INDB,
  490. .flags = IORESOURCE_IRQ,
  491. },
  492. {
  493. .name = "BTEMP_LOW",
  494. .start = AB8500_INT_BTEMP_LOW,
  495. .end = AB8500_INT_BTEMP_LOW,
  496. .flags = IORESOURCE_IRQ,
  497. },
  498. {
  499. .name = "BTEMP_HIGH",
  500. .start = AB8500_INT_BTEMP_HIGH,
  501. .end = AB8500_INT_BTEMP_HIGH,
  502. .flags = IORESOURCE_IRQ,
  503. },
  504. {
  505. .name = "BTEMP_LOW_MEDIUM",
  506. .start = AB8500_INT_BTEMP_LOW_MEDIUM,
  507. .end = AB8500_INT_BTEMP_LOW_MEDIUM,
  508. .flags = IORESOURCE_IRQ,
  509. },
  510. {
  511. .name = "BTEMP_MEDIUM_HIGH",
  512. .start = AB8500_INT_BTEMP_MEDIUM_HIGH,
  513. .end = AB8500_INT_BTEMP_MEDIUM_HIGH,
  514. .flags = IORESOURCE_IRQ,
  515. },
  516. };
  517. static struct resource __devinitdata ab8500_fg_resources[] = {
  518. {
  519. .name = "NCONV_ACCU",
  520. .start = AB8500_INT_CCN_CONV_ACC,
  521. .end = AB8500_INT_CCN_CONV_ACC,
  522. .flags = IORESOURCE_IRQ,
  523. },
  524. {
  525. .name = "BATT_OVV",
  526. .start = AB8500_INT_BATT_OVV,
  527. .end = AB8500_INT_BATT_OVV,
  528. .flags = IORESOURCE_IRQ,
  529. },
  530. {
  531. .name = "LOW_BAT_F",
  532. .start = AB8500_INT_LOW_BAT_F,
  533. .end = AB8500_INT_LOW_BAT_F,
  534. .flags = IORESOURCE_IRQ,
  535. },
  536. {
  537. .name = "LOW_BAT_R",
  538. .start = AB8500_INT_LOW_BAT_R,
  539. .end = AB8500_INT_LOW_BAT_R,
  540. .flags = IORESOURCE_IRQ,
  541. },
  542. {
  543. .name = "CC_INT_CALIB",
  544. .start = AB8500_INT_CC_INT_CALIB,
  545. .end = AB8500_INT_CC_INT_CALIB,
  546. .flags = IORESOURCE_IRQ,
  547. },
  548. };
  549. static struct resource __devinitdata ab8500_chargalg_resources[] = {};
  550. static struct resource __devinitdata ab8500_debug_resources[] = {
  551. {
  552. .name = "IRQ_FIRST",
  553. .start = AB8500_INT_MAIN_EXT_CH_NOT_OK,
  554. .end = AB8500_INT_MAIN_EXT_CH_NOT_OK,
  555. .flags = IORESOURCE_IRQ,
  556. },
  557. {
  558. .name = "IRQ_LAST",
  559. .start = AB8500_INT_USB_CHARGER_NOT_OKF,
  560. .end = AB8500_INT_USB_CHARGER_NOT_OKF,
  561. .flags = IORESOURCE_IRQ,
  562. },
  563. };
  564. static struct resource __devinitdata ab8500_usb_resources[] = {
  565. {
  566. .name = "ID_WAKEUP_R",
  567. .start = AB8500_INT_ID_WAKEUP_R,
  568. .end = AB8500_INT_ID_WAKEUP_R,
  569. .flags = IORESOURCE_IRQ,
  570. },
  571. {
  572. .name = "ID_WAKEUP_F",
  573. .start = AB8500_INT_ID_WAKEUP_F,
  574. .end = AB8500_INT_ID_WAKEUP_F,
  575. .flags = IORESOURCE_IRQ,
  576. },
  577. {
  578. .name = "VBUS_DET_F",
  579. .start = AB8500_INT_VBUS_DET_F,
  580. .end = AB8500_INT_VBUS_DET_F,
  581. .flags = IORESOURCE_IRQ,
  582. },
  583. {
  584. .name = "VBUS_DET_R",
  585. .start = AB8500_INT_VBUS_DET_R,
  586. .end = AB8500_INT_VBUS_DET_R,
  587. .flags = IORESOURCE_IRQ,
  588. },
  589. {
  590. .name = "USB_LINK_STATUS",
  591. .start = AB8500_INT_USB_LINK_STATUS,
  592. .end = AB8500_INT_USB_LINK_STATUS,
  593. .flags = IORESOURCE_IRQ,
  594. },
  595. {
  596. .name = "USB_ADP_PROBE_PLUG",
  597. .start = AB8500_INT_ADP_PROBE_PLUG,
  598. .end = AB8500_INT_ADP_PROBE_PLUG,
  599. .flags = IORESOURCE_IRQ,
  600. },
  601. {
  602. .name = "USB_ADP_PROBE_UNPLUG",
  603. .start = AB8500_INT_ADP_PROBE_UNPLUG,
  604. .end = AB8500_INT_ADP_PROBE_UNPLUG,
  605. .flags = IORESOURCE_IRQ,
  606. },
  607. };
  608. static struct resource __devinitdata ab8500_temp_resources[] = {
  609. {
  610. .name = "AB8500_TEMP_WARM",
  611. .start = AB8500_INT_TEMP_WARM,
  612. .end = AB8500_INT_TEMP_WARM,
  613. .flags = IORESOURCE_IRQ,
  614. },
  615. };
  616. static struct mfd_cell __devinitdata ab8500_devs[] = {
  617. #ifdef CONFIG_DEBUG_FS
  618. {
  619. .name = "ab8500-debug",
  620. .num_resources = ARRAY_SIZE(ab8500_debug_resources),
  621. .resources = ab8500_debug_resources,
  622. },
  623. #endif
  624. {
  625. .name = "ab8500-sysctrl",
  626. },
  627. {
  628. .name = "ab8500-regulator",
  629. },
  630. {
  631. .name = "ab8500-gpio",
  632. .num_resources = ARRAY_SIZE(ab8500_gpio_resources),
  633. .resources = ab8500_gpio_resources,
  634. },
  635. {
  636. .name = "ab8500-gpadc",
  637. .num_resources = ARRAY_SIZE(ab8500_gpadc_resources),
  638. .resources = ab8500_gpadc_resources,
  639. },
  640. {
  641. .name = "ab8500-rtc",
  642. .num_resources = ARRAY_SIZE(ab8500_rtc_resources),
  643. .resources = ab8500_rtc_resources,
  644. },
  645. {
  646. .name = "ab8500-charger",
  647. .num_resources = ARRAY_SIZE(ab8500_charger_resources),
  648. .resources = ab8500_charger_resources,
  649. },
  650. {
  651. .name = "ab8500-btemp",
  652. .num_resources = ARRAY_SIZE(ab8500_btemp_resources),
  653. .resources = ab8500_btemp_resources,
  654. },
  655. {
  656. .name = "ab8500-fg",
  657. .num_resources = ARRAY_SIZE(ab8500_fg_resources),
  658. .resources = ab8500_fg_resources,
  659. },
  660. {
  661. .name = "ab8500-chargalg",
  662. .num_resources = ARRAY_SIZE(ab8500_chargalg_resources),
  663. .resources = ab8500_chargalg_resources,
  664. },
  665. {
  666. .name = "ab8500-acc-det",
  667. .num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources),
  668. .resources = ab8500_av_acc_detect_resources,
  669. },
  670. {
  671. .name = "ab8500-codec",
  672. },
  673. {
  674. .name = "ab8500-usb",
  675. .num_resources = ARRAY_SIZE(ab8500_usb_resources),
  676. .resources = ab8500_usb_resources,
  677. },
  678. {
  679. .name = "ab8500-poweron-key",
  680. .num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources),
  681. .resources = ab8500_poweronkey_db_resources,
  682. },
  683. {
  684. .name = "ab8500-pwm",
  685. .id = 1,
  686. },
  687. {
  688. .name = "ab8500-pwm",
  689. .id = 2,
  690. },
  691. {
  692. .name = "ab8500-pwm",
  693. .id = 3,
  694. },
  695. { .name = "ab8500-leds", },
  696. {
  697. .name = "ab8500-denc",
  698. },
  699. {
  700. .name = "ab8500-temp",
  701. .num_resources = ARRAY_SIZE(ab8500_temp_resources),
  702. .resources = ab8500_temp_resources,
  703. },
  704. };
  705. static ssize_t show_chip_id(struct device *dev,
  706. struct device_attribute *attr, char *buf)
  707. {
  708. struct ab8500 *ab8500;
  709. ab8500 = dev_get_drvdata(dev);
  710. return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL);
  711. }
  712. /*
  713. * ab8500 has switched off due to (SWITCH_OFF_STATUS):
  714. * 0x01 Swoff bit programming
  715. * 0x02 Thermal protection activation
  716. * 0x04 Vbat lower then BattOk falling threshold
  717. * 0x08 Watchdog expired
  718. * 0x10 Non presence of 32kHz clock
  719. * 0x20 Battery level lower than power on reset threshold
  720. * 0x40 Power on key 1 pressed longer than 10 seconds
  721. * 0x80 DB8500 thermal shutdown
  722. */
  723. static ssize_t show_switch_off_status(struct device *dev,
  724. struct device_attribute *attr, char *buf)
  725. {
  726. int ret;
  727. u8 value;
  728. struct ab8500 *ab8500;
  729. ab8500 = dev_get_drvdata(dev);
  730. ret = get_register_interruptible(ab8500, AB8500_RTC,
  731. AB8500_SWITCH_OFF_STATUS, &value);
  732. if (ret < 0)
  733. return ret;
  734. return sprintf(buf, "%#x\n", value);
  735. }
  736. static DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL);
  737. static DEVICE_ATTR(switch_off_status, S_IRUGO, show_switch_off_status, NULL);
  738. static struct attribute *ab8500_sysfs_entries[] = {
  739. &dev_attr_chip_id.attr,
  740. &dev_attr_switch_off_status.attr,
  741. NULL,
  742. };
  743. static struct attribute_group ab8500_attr_group = {
  744. .attrs = ab8500_sysfs_entries,
  745. };
  746. int __devinit ab8500_init(struct ab8500 *ab8500)
  747. {
  748. struct ab8500_platform_data *plat = dev_get_platdata(ab8500->dev);
  749. int ret;
  750. int i;
  751. u8 value;
  752. if (plat)
  753. ab8500->irq_base = plat->irq_base;
  754. mutex_init(&ab8500->lock);
  755. mutex_init(&ab8500->irq_lock);
  756. ret = get_register_interruptible(ab8500, AB8500_MISC,
  757. AB8500_REV_REG, &value);
  758. if (ret < 0)
  759. return ret;
  760. switch (value) {
  761. case AB8500_CUTEARLY:
  762. case AB8500_CUT1P0:
  763. case AB8500_CUT1P1:
  764. case AB8500_CUT2P0:
  765. case AB8500_CUT3P0:
  766. dev_info(ab8500->dev, "detected chip, revision: %#x\n", value);
  767. break;
  768. default:
  769. dev_err(ab8500->dev, "unknown chip, revision: %#x\n", value);
  770. return -EINVAL;
  771. }
  772. ab8500->chip_id = value;
  773. /*
  774. * ab8500 has switched off due to (SWITCH_OFF_STATUS):
  775. * 0x01 Swoff bit programming
  776. * 0x02 Thermal protection activation
  777. * 0x04 Vbat lower then BattOk falling threshold
  778. * 0x08 Watchdog expired
  779. * 0x10 Non presence of 32kHz clock
  780. * 0x20 Battery level lower than power on reset threshold
  781. * 0x40 Power on key 1 pressed longer than 10 seconds
  782. * 0x80 DB8500 thermal shutdown
  783. */
  784. ret = get_register_interruptible(ab8500, AB8500_RTC,
  785. AB8500_SWITCH_OFF_STATUS, &value);
  786. if (ret < 0)
  787. return ret;
  788. dev_info(ab8500->dev, "switch off status: %#x", value);
  789. if (plat && plat->init)
  790. plat->init(ab8500);
  791. /* Clear and mask all interrupts */
  792. for (i = 0; i < AB8500_NUM_IRQ_REGS; i++) {
  793. /* Interrupt register 12 doesn't exist prior to version 2.0 */
  794. if (ab8500_irq_regoffset[i] == 11 &&
  795. ab8500->chip_id < AB8500_CUT2P0)
  796. continue;
  797. get_register_interruptible(ab8500, AB8500_INTERRUPT,
  798. AB8500_IT_LATCH1_REG + ab8500_irq_regoffset[i],
  799. &value);
  800. set_register_interruptible(ab8500, AB8500_INTERRUPT,
  801. AB8500_IT_MASK1_REG + ab8500_irq_regoffset[i], 0xff);
  802. }
  803. ret = abx500_register_ops(ab8500->dev, &ab8500_ops);
  804. if (ret)
  805. return ret;
  806. for (i = 0; i < AB8500_NUM_IRQ_REGS; i++)
  807. ab8500->mask[i] = ab8500->oldmask[i] = 0xff;
  808. if (ab8500->irq_base) {
  809. ret = ab8500_irq_init(ab8500);
  810. if (ret)
  811. return ret;
  812. ret = request_threaded_irq(ab8500->irq, NULL, ab8500_irq,
  813. IRQF_ONESHOT | IRQF_NO_SUSPEND,
  814. "ab8500", ab8500);
  815. if (ret)
  816. goto out_removeirq;
  817. }
  818. ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
  819. ARRAY_SIZE(ab8500_devs), NULL,
  820. ab8500->irq_base);
  821. if (ret)
  822. goto out_freeirq;
  823. ret = sysfs_create_group(&ab8500->dev->kobj, &ab8500_attr_group);
  824. if (ret)
  825. dev_err(ab8500->dev, "error creating sysfs entries\n");
  826. return ret;
  827. out_freeirq:
  828. if (ab8500->irq_base) {
  829. free_irq(ab8500->irq, ab8500);
  830. out_removeirq:
  831. ab8500_irq_remove(ab8500);
  832. }
  833. return ret;
  834. }
  835. int __devexit ab8500_exit(struct ab8500 *ab8500)
  836. {
  837. sysfs_remove_group(&ab8500->dev->kobj, &ab8500_attr_group);
  838. mfd_remove_devices(ab8500->dev);
  839. if (ab8500->irq_base) {
  840. free_irq(ab8500->irq, ab8500);
  841. ab8500_irq_remove(ab8500);
  842. }
  843. return 0;
  844. }
  845. MODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent");
  846. MODULE_DESCRIPTION("AB8500 MFD core");
  847. MODULE_LICENSE("GPL v2");