mc13xxx-core.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  1. /*
  2. * Copyright 2009-2010 Pengutronix
  3. * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
  4. *
  5. * loosely based on an earlier driver that has
  6. * Copyright 2009 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it under
  9. * the terms of the GNU General Public License version 2 as published by the
  10. * Free Software Foundation.
  11. */
  12. #include <linux/slab.h>
  13. #include <linux/module.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/mutex.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/mfd/core.h>
  18. #include <linux/mfd/mc13xxx.h>
  19. #include <linux/of.h>
  20. #include <linux/of_device.h>
  21. #include <linux/of_gpio.h>
  22. #include "mc13xxx.h"
  23. #define MC13XXX_IRQSTAT0 0
  24. #define MC13XXX_IRQSTAT0_ADCDONEI (1 << 0)
  25. #define MC13XXX_IRQSTAT0_ADCBISDONEI (1 << 1)
  26. #define MC13XXX_IRQSTAT0_TSI (1 << 2)
  27. #define MC13783_IRQSTAT0_WHIGHI (1 << 3)
  28. #define MC13783_IRQSTAT0_WLOWI (1 << 4)
  29. #define MC13XXX_IRQSTAT0_CHGDETI (1 << 6)
  30. #define MC13783_IRQSTAT0_CHGOVI (1 << 7)
  31. #define MC13XXX_IRQSTAT0_CHGREVI (1 << 8)
  32. #define MC13XXX_IRQSTAT0_CHGSHORTI (1 << 9)
  33. #define MC13XXX_IRQSTAT0_CCCVI (1 << 10)
  34. #define MC13XXX_IRQSTAT0_CHGCURRI (1 << 11)
  35. #define MC13XXX_IRQSTAT0_BPONI (1 << 12)
  36. #define MC13XXX_IRQSTAT0_LOBATLI (1 << 13)
  37. #define MC13XXX_IRQSTAT0_LOBATHI (1 << 14)
  38. #define MC13783_IRQSTAT0_UDPI (1 << 15)
  39. #define MC13783_IRQSTAT0_USBI (1 << 16)
  40. #define MC13783_IRQSTAT0_IDI (1 << 19)
  41. #define MC13783_IRQSTAT0_SE1I (1 << 21)
  42. #define MC13783_IRQSTAT0_CKDETI (1 << 22)
  43. #define MC13783_IRQSTAT0_UDMI (1 << 23)
  44. #define MC13XXX_IRQMASK0 1
  45. #define MC13XXX_IRQMASK0_ADCDONEM MC13XXX_IRQSTAT0_ADCDONEI
  46. #define MC13XXX_IRQMASK0_ADCBISDONEM MC13XXX_IRQSTAT0_ADCBISDONEI
  47. #define MC13XXX_IRQMASK0_TSM MC13XXX_IRQSTAT0_TSI
  48. #define MC13783_IRQMASK0_WHIGHM MC13783_IRQSTAT0_WHIGHI
  49. #define MC13783_IRQMASK0_WLOWM MC13783_IRQSTAT0_WLOWI
  50. #define MC13XXX_IRQMASK0_CHGDETM MC13XXX_IRQSTAT0_CHGDETI
  51. #define MC13783_IRQMASK0_CHGOVM MC13783_IRQSTAT0_CHGOVI
  52. #define MC13XXX_IRQMASK0_CHGREVM MC13XXX_IRQSTAT0_CHGREVI
  53. #define MC13XXX_IRQMASK0_CHGSHORTM MC13XXX_IRQSTAT0_CHGSHORTI
  54. #define MC13XXX_IRQMASK0_CCCVM MC13XXX_IRQSTAT0_CCCVI
  55. #define MC13XXX_IRQMASK0_CHGCURRM MC13XXX_IRQSTAT0_CHGCURRI
  56. #define MC13XXX_IRQMASK0_BPONM MC13XXX_IRQSTAT0_BPONI
  57. #define MC13XXX_IRQMASK0_LOBATLM MC13XXX_IRQSTAT0_LOBATLI
  58. #define MC13XXX_IRQMASK0_LOBATHM MC13XXX_IRQSTAT0_LOBATHI
  59. #define MC13783_IRQMASK0_UDPM MC13783_IRQSTAT0_UDPI
  60. #define MC13783_IRQMASK0_USBM MC13783_IRQSTAT0_USBI
  61. #define MC13783_IRQMASK0_IDM MC13783_IRQSTAT0_IDI
  62. #define MC13783_IRQMASK0_SE1M MC13783_IRQSTAT0_SE1I
  63. #define MC13783_IRQMASK0_CKDETM MC13783_IRQSTAT0_CKDETI
  64. #define MC13783_IRQMASK0_UDMM MC13783_IRQSTAT0_UDMI
  65. #define MC13XXX_IRQSTAT1 3
  66. #define MC13XXX_IRQSTAT1_1HZI (1 << 0)
  67. #define MC13XXX_IRQSTAT1_TODAI (1 << 1)
  68. #define MC13783_IRQSTAT1_ONOFD1I (1 << 3)
  69. #define MC13783_IRQSTAT1_ONOFD2I (1 << 4)
  70. #define MC13783_IRQSTAT1_ONOFD3I (1 << 5)
  71. #define MC13XXX_IRQSTAT1_SYSRSTI (1 << 6)
  72. #define MC13XXX_IRQSTAT1_RTCRSTI (1 << 7)
  73. #define MC13XXX_IRQSTAT1_PCI (1 << 8)
  74. #define MC13XXX_IRQSTAT1_WARMI (1 << 9)
  75. #define MC13XXX_IRQSTAT1_MEMHLDI (1 << 10)
  76. #define MC13783_IRQSTAT1_PWRRDYI (1 << 11)
  77. #define MC13XXX_IRQSTAT1_THWARNLI (1 << 12)
  78. #define MC13XXX_IRQSTAT1_THWARNHI (1 << 13)
  79. #define MC13XXX_IRQSTAT1_CLKI (1 << 14)
  80. #define MC13783_IRQSTAT1_SEMAFI (1 << 15)
  81. #define MC13783_IRQSTAT1_MC2BI (1 << 17)
  82. #define MC13783_IRQSTAT1_HSDETI (1 << 18)
  83. #define MC13783_IRQSTAT1_HSLI (1 << 19)
  84. #define MC13783_IRQSTAT1_ALSPTHI (1 << 20)
  85. #define MC13783_IRQSTAT1_AHSSHORTI (1 << 21)
  86. #define MC13XXX_IRQMASK1 4
  87. #define MC13XXX_IRQMASK1_1HZM MC13XXX_IRQSTAT1_1HZI
  88. #define MC13XXX_IRQMASK1_TODAM MC13XXX_IRQSTAT1_TODAI
  89. #define MC13783_IRQMASK1_ONOFD1M MC13783_IRQSTAT1_ONOFD1I
  90. #define MC13783_IRQMASK1_ONOFD2M MC13783_IRQSTAT1_ONOFD2I
  91. #define MC13783_IRQMASK1_ONOFD3M MC13783_IRQSTAT1_ONOFD3I
  92. #define MC13XXX_IRQMASK1_SYSRSTM MC13XXX_IRQSTAT1_SYSRSTI
  93. #define MC13XXX_IRQMASK1_RTCRSTM MC13XXX_IRQSTAT1_RTCRSTI
  94. #define MC13XXX_IRQMASK1_PCM MC13XXX_IRQSTAT1_PCI
  95. #define MC13XXX_IRQMASK1_WARMM MC13XXX_IRQSTAT1_WARMI
  96. #define MC13XXX_IRQMASK1_MEMHLDM MC13XXX_IRQSTAT1_MEMHLDI
  97. #define MC13783_IRQMASK1_PWRRDYM MC13783_IRQSTAT1_PWRRDYI
  98. #define MC13XXX_IRQMASK1_THWARNLM MC13XXX_IRQSTAT1_THWARNLI
  99. #define MC13XXX_IRQMASK1_THWARNHM MC13XXX_IRQSTAT1_THWARNHI
  100. #define MC13XXX_IRQMASK1_CLKM MC13XXX_IRQSTAT1_CLKI
  101. #define MC13783_IRQMASK1_SEMAFM MC13783_IRQSTAT1_SEMAFI
  102. #define MC13783_IRQMASK1_MC2BM MC13783_IRQSTAT1_MC2BI
  103. #define MC13783_IRQMASK1_HSDETM MC13783_IRQSTAT1_HSDETI
  104. #define MC13783_IRQMASK1_HSLM MC13783_IRQSTAT1_HSLI
  105. #define MC13783_IRQMASK1_ALSPTHM MC13783_IRQSTAT1_ALSPTHI
  106. #define MC13783_IRQMASK1_AHSSHORTM MC13783_IRQSTAT1_AHSSHORTI
  107. #define MC13XXX_REVISION 7
  108. #define MC13XXX_REVISION_REVMETAL (0x07 << 0)
  109. #define MC13XXX_REVISION_REVFULL (0x03 << 3)
  110. #define MC13XXX_REVISION_ICID (0x07 << 6)
  111. #define MC13XXX_REVISION_FIN (0x03 << 9)
  112. #define MC13XXX_REVISION_FAB (0x03 << 11)
  113. #define MC13XXX_REVISION_ICIDCODE (0x3f << 13)
  114. #define MC13XXX_ADC1 44
  115. #define MC13XXX_ADC1_ADEN (1 << 0)
  116. #define MC13XXX_ADC1_RAND (1 << 1)
  117. #define MC13XXX_ADC1_ADSEL (1 << 3)
  118. #define MC13XXX_ADC1_ASC (1 << 20)
  119. #define MC13XXX_ADC1_ADTRIGIGN (1 << 21)
  120. #define MC13XXX_ADC2 45
  121. void mc13xxx_lock(struct mc13xxx *mc13xxx)
  122. {
  123. if (!mutex_trylock(&mc13xxx->lock)) {
  124. dev_dbg(mc13xxx->dev, "wait for %s from %pf\n",
  125. __func__, __builtin_return_address(0));
  126. mutex_lock(&mc13xxx->lock);
  127. }
  128. dev_dbg(mc13xxx->dev, "%s from %pf\n",
  129. __func__, __builtin_return_address(0));
  130. }
  131. EXPORT_SYMBOL(mc13xxx_lock);
  132. void mc13xxx_unlock(struct mc13xxx *mc13xxx)
  133. {
  134. dev_dbg(mc13xxx->dev, "%s from %pf\n",
  135. __func__, __builtin_return_address(0));
  136. mutex_unlock(&mc13xxx->lock);
  137. }
  138. EXPORT_SYMBOL(mc13xxx_unlock);
  139. int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)
  140. {
  141. int ret;
  142. BUG_ON(!mutex_is_locked(&mc13xxx->lock));
  143. if (offset > MC13XXX_NUMREGS)
  144. return -EINVAL;
  145. ret = regmap_read(mc13xxx->regmap, offset, val);
  146. dev_vdbg(mc13xxx->dev, "[0x%02x] -> 0x%06x\n", offset, *val);
  147. return ret;
  148. }
  149. EXPORT_SYMBOL(mc13xxx_reg_read);
  150. int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)
  151. {
  152. BUG_ON(!mutex_is_locked(&mc13xxx->lock));
  153. dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x\n", offset, val);
  154. if (offset > MC13XXX_NUMREGS || val > 0xffffff)
  155. return -EINVAL;
  156. return regmap_write(mc13xxx->regmap, offset, val);
  157. }
  158. EXPORT_SYMBOL(mc13xxx_reg_write);
  159. int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset,
  160. u32 mask, u32 val)
  161. {
  162. BUG_ON(!mutex_is_locked(&mc13xxx->lock));
  163. BUG_ON(val & ~mask);
  164. dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x (mask: 0x%06x)\n",
  165. offset, val, mask);
  166. return regmap_update_bits(mc13xxx->regmap, offset, mask, val);
  167. }
  168. EXPORT_SYMBOL(mc13xxx_reg_rmw);
  169. int mc13xxx_irq_mask(struct mc13xxx *mc13xxx, int irq)
  170. {
  171. int ret;
  172. unsigned int offmask = irq < 24 ? MC13XXX_IRQMASK0 : MC13XXX_IRQMASK1;
  173. u32 irqbit = 1 << (irq < 24 ? irq : irq - 24);
  174. u32 mask;
  175. if (irq < 0 || irq >= MC13XXX_NUM_IRQ)
  176. return -EINVAL;
  177. ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
  178. if (ret)
  179. return ret;
  180. if (mask & irqbit)
  181. /* already masked */
  182. return 0;
  183. return mc13xxx_reg_write(mc13xxx, offmask, mask | irqbit);
  184. }
  185. EXPORT_SYMBOL(mc13xxx_irq_mask);
  186. int mc13xxx_irq_unmask(struct mc13xxx *mc13xxx, int irq)
  187. {
  188. int ret;
  189. unsigned int offmask = irq < 24 ? MC13XXX_IRQMASK0 : MC13XXX_IRQMASK1;
  190. u32 irqbit = 1 << (irq < 24 ? irq : irq - 24);
  191. u32 mask;
  192. if (irq < 0 || irq >= MC13XXX_NUM_IRQ)
  193. return -EINVAL;
  194. ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
  195. if (ret)
  196. return ret;
  197. if (!(mask & irqbit))
  198. /* already unmasked */
  199. return 0;
  200. return mc13xxx_reg_write(mc13xxx, offmask, mask & ~irqbit);
  201. }
  202. EXPORT_SYMBOL(mc13xxx_irq_unmask);
  203. int mc13xxx_irq_status(struct mc13xxx *mc13xxx, int irq,
  204. int *enabled, int *pending)
  205. {
  206. int ret;
  207. unsigned int offmask = irq < 24 ? MC13XXX_IRQMASK0 : MC13XXX_IRQMASK1;
  208. unsigned int offstat = irq < 24 ? MC13XXX_IRQSTAT0 : MC13XXX_IRQSTAT1;
  209. u32 irqbit = 1 << (irq < 24 ? irq : irq - 24);
  210. if (irq < 0 || irq >= MC13XXX_NUM_IRQ)
  211. return -EINVAL;
  212. if (enabled) {
  213. u32 mask;
  214. ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
  215. if (ret)
  216. return ret;
  217. *enabled = mask & irqbit;
  218. }
  219. if (pending) {
  220. u32 stat;
  221. ret = mc13xxx_reg_read(mc13xxx, offstat, &stat);
  222. if (ret)
  223. return ret;
  224. *pending = stat & irqbit;
  225. }
  226. return 0;
  227. }
  228. EXPORT_SYMBOL(mc13xxx_irq_status);
  229. int mc13xxx_irq_ack(struct mc13xxx *mc13xxx, int irq)
  230. {
  231. unsigned int offstat = irq < 24 ? MC13XXX_IRQSTAT0 : MC13XXX_IRQSTAT1;
  232. unsigned int val = 1 << (irq < 24 ? irq : irq - 24);
  233. BUG_ON(irq < 0 || irq >= MC13XXX_NUM_IRQ);
  234. return mc13xxx_reg_write(mc13xxx, offstat, val);
  235. }
  236. EXPORT_SYMBOL(mc13xxx_irq_ack);
  237. int mc13xxx_irq_request_nounmask(struct mc13xxx *mc13xxx, int irq,
  238. irq_handler_t handler, const char *name, void *dev)
  239. {
  240. BUG_ON(!mutex_is_locked(&mc13xxx->lock));
  241. BUG_ON(!handler);
  242. if (irq < 0 || irq >= MC13XXX_NUM_IRQ)
  243. return -EINVAL;
  244. if (mc13xxx->irqhandler[irq])
  245. return -EBUSY;
  246. mc13xxx->irqhandler[irq] = handler;
  247. mc13xxx->irqdata[irq] = dev;
  248. return 0;
  249. }
  250. EXPORT_SYMBOL(mc13xxx_irq_request_nounmask);
  251. int mc13xxx_irq_request(struct mc13xxx *mc13xxx, int irq,
  252. irq_handler_t handler, const char *name, void *dev)
  253. {
  254. int ret;
  255. ret = mc13xxx_irq_request_nounmask(mc13xxx, irq, handler, name, dev);
  256. if (ret)
  257. return ret;
  258. ret = mc13xxx_irq_unmask(mc13xxx, irq);
  259. if (ret) {
  260. mc13xxx->irqhandler[irq] = NULL;
  261. mc13xxx->irqdata[irq] = NULL;
  262. return ret;
  263. }
  264. return 0;
  265. }
  266. EXPORT_SYMBOL(mc13xxx_irq_request);
  267. int mc13xxx_irq_free(struct mc13xxx *mc13xxx, int irq, void *dev)
  268. {
  269. int ret;
  270. BUG_ON(!mutex_is_locked(&mc13xxx->lock));
  271. if (irq < 0 || irq >= MC13XXX_NUM_IRQ || !mc13xxx->irqhandler[irq] ||
  272. mc13xxx->irqdata[irq] != dev)
  273. return -EINVAL;
  274. ret = mc13xxx_irq_mask(mc13xxx, irq);
  275. if (ret)
  276. return ret;
  277. mc13xxx->irqhandler[irq] = NULL;
  278. mc13xxx->irqdata[irq] = NULL;
  279. return 0;
  280. }
  281. EXPORT_SYMBOL(mc13xxx_irq_free);
  282. static inline irqreturn_t mc13xxx_irqhandler(struct mc13xxx *mc13xxx, int irq)
  283. {
  284. return mc13xxx->irqhandler[irq](irq, mc13xxx->irqdata[irq]);
  285. }
  286. /*
  287. * returns: number of handled irqs or negative error
  288. * locking: holds mc13xxx->lock
  289. */
  290. static int mc13xxx_irq_handle(struct mc13xxx *mc13xxx,
  291. unsigned int offstat, unsigned int offmask, int baseirq)
  292. {
  293. u32 stat, mask;
  294. int ret = mc13xxx_reg_read(mc13xxx, offstat, &stat);
  295. int num_handled = 0;
  296. if (ret)
  297. return ret;
  298. ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
  299. if (ret)
  300. return ret;
  301. while (stat & ~mask) {
  302. int irq = __ffs(stat & ~mask);
  303. stat &= ~(1 << irq);
  304. if (likely(mc13xxx->irqhandler[baseirq + irq])) {
  305. irqreturn_t handled;
  306. handled = mc13xxx_irqhandler(mc13xxx, baseirq + irq);
  307. if (handled == IRQ_HANDLED)
  308. num_handled++;
  309. } else {
  310. dev_err(mc13xxx->dev,
  311. "BUG: irq %u but no handler\n",
  312. baseirq + irq);
  313. mask |= 1 << irq;
  314. ret = mc13xxx_reg_write(mc13xxx, offmask, mask);
  315. }
  316. }
  317. return num_handled;
  318. }
  319. static irqreturn_t mc13xxx_irq_thread(int irq, void *data)
  320. {
  321. struct mc13xxx *mc13xxx = data;
  322. irqreturn_t ret;
  323. int handled = 0;
  324. mc13xxx_lock(mc13xxx);
  325. ret = mc13xxx_irq_handle(mc13xxx, MC13XXX_IRQSTAT0,
  326. MC13XXX_IRQMASK0, 0);
  327. if (ret > 0)
  328. handled = 1;
  329. ret = mc13xxx_irq_handle(mc13xxx, MC13XXX_IRQSTAT1,
  330. MC13XXX_IRQMASK1, 24);
  331. if (ret > 0)
  332. handled = 1;
  333. mc13xxx_unlock(mc13xxx);
  334. return IRQ_RETVAL(handled);
  335. }
  336. static const char *mc13xxx_chipname[] = {
  337. [MC13XXX_ID_MC13783] = "mc13783",
  338. [MC13XXX_ID_MC13892] = "mc13892",
  339. };
  340. #define maskval(reg, mask) (((reg) & (mask)) >> __ffs(mask))
  341. static int mc13xxx_identify(struct mc13xxx *mc13xxx)
  342. {
  343. u32 icid;
  344. u32 revision;
  345. int ret;
  346. /*
  347. * Get the generation ID from register 46, as apparently some older
  348. * IC revisions only have this info at this location. Newer ICs seem to
  349. * have both.
  350. */
  351. ret = mc13xxx_reg_read(mc13xxx, 46, &icid);
  352. if (ret)
  353. return ret;
  354. icid = (icid >> 6) & 0x7;
  355. switch (icid) {
  356. case 2:
  357. mc13xxx->ictype = MC13XXX_ID_MC13783;
  358. break;
  359. case 7:
  360. mc13xxx->ictype = MC13XXX_ID_MC13892;
  361. break;
  362. default:
  363. mc13xxx->ictype = MC13XXX_ID_INVALID;
  364. break;
  365. }
  366. if (mc13xxx->ictype == MC13XXX_ID_MC13783 ||
  367. mc13xxx->ictype == MC13XXX_ID_MC13892) {
  368. ret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision);
  369. dev_info(mc13xxx->dev, "%s: rev: %d.%d, "
  370. "fin: %d, fab: %d, icid: %d/%d\n",
  371. mc13xxx_chipname[mc13xxx->ictype],
  372. maskval(revision, MC13XXX_REVISION_REVFULL),
  373. maskval(revision, MC13XXX_REVISION_REVMETAL),
  374. maskval(revision, MC13XXX_REVISION_FIN),
  375. maskval(revision, MC13XXX_REVISION_FAB),
  376. maskval(revision, MC13XXX_REVISION_ICID),
  377. maskval(revision, MC13XXX_REVISION_ICIDCODE));
  378. }
  379. return (mc13xxx->ictype == MC13XXX_ID_INVALID) ? -ENODEV : 0;
  380. }
  381. static const char *mc13xxx_get_chipname(struct mc13xxx *mc13xxx)
  382. {
  383. return mc13xxx_chipname[mc13xxx->ictype];
  384. }
  385. int mc13xxx_get_flags(struct mc13xxx *mc13xxx)
  386. {
  387. return mc13xxx->flags;
  388. }
  389. EXPORT_SYMBOL(mc13xxx_get_flags);
  390. #define MC13XXX_ADC1_CHAN0_SHIFT 5
  391. #define MC13XXX_ADC1_CHAN1_SHIFT 8
  392. #define MC13783_ADC1_ATO_SHIFT 11
  393. #define MC13783_ADC1_ATOX (1 << 19)
  394. struct mc13xxx_adcdone_data {
  395. struct mc13xxx *mc13xxx;
  396. struct completion done;
  397. };
  398. static irqreturn_t mc13xxx_handler_adcdone(int irq, void *data)
  399. {
  400. struct mc13xxx_adcdone_data *adcdone_data = data;
  401. mc13xxx_irq_ack(adcdone_data->mc13xxx, irq);
  402. complete_all(&adcdone_data->done);
  403. return IRQ_HANDLED;
  404. }
  405. #define MC13XXX_ADC_WORKING (1 << 0)
  406. int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
  407. unsigned int channel, u8 ato, bool atox,
  408. unsigned int *sample)
  409. {
  410. u32 adc0, adc1, old_adc0;
  411. int i, ret;
  412. struct mc13xxx_adcdone_data adcdone_data = {
  413. .mc13xxx = mc13xxx,
  414. };
  415. init_completion(&adcdone_data.done);
  416. dev_dbg(mc13xxx->dev, "%s\n", __func__);
  417. mc13xxx_lock(mc13xxx);
  418. if (mc13xxx->adcflags & MC13XXX_ADC_WORKING) {
  419. ret = -EBUSY;
  420. goto out;
  421. }
  422. mc13xxx->adcflags |= MC13XXX_ADC_WORKING;
  423. mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0);
  424. adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2;
  425. adc1 = MC13XXX_ADC1_ADEN | MC13XXX_ADC1_ADTRIGIGN | MC13XXX_ADC1_ASC;
  426. if (channel > 7)
  427. adc1 |= MC13XXX_ADC1_ADSEL;
  428. switch (mode) {
  429. case MC13XXX_ADC_MODE_TS:
  430. adc0 |= MC13XXX_ADC0_ADREFEN | MC13XXX_ADC0_TSMOD0 |
  431. MC13XXX_ADC0_TSMOD1;
  432. adc1 |= 4 << MC13XXX_ADC1_CHAN1_SHIFT;
  433. break;
  434. case MC13XXX_ADC_MODE_SINGLE_CHAN:
  435. adc0 |= old_adc0 & MC13XXX_ADC0_CONFIG_MASK;
  436. adc1 |= (channel & 0x7) << MC13XXX_ADC1_CHAN0_SHIFT;
  437. adc1 |= MC13XXX_ADC1_RAND;
  438. break;
  439. case MC13XXX_ADC_MODE_MULT_CHAN:
  440. adc0 |= old_adc0 & MC13XXX_ADC0_CONFIG_MASK;
  441. adc1 |= 4 << MC13XXX_ADC1_CHAN1_SHIFT;
  442. break;
  443. default:
  444. mc13xxx_unlock(mc13xxx);
  445. return -EINVAL;
  446. }
  447. adc1 |= ato << MC13783_ADC1_ATO_SHIFT;
  448. if (atox)
  449. adc1 |= MC13783_ADC1_ATOX;
  450. dev_dbg(mc13xxx->dev, "%s: request irq\n", __func__);
  451. mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_ADCDONE,
  452. mc13xxx_handler_adcdone, __func__, &adcdone_data);
  453. mc13xxx_irq_ack(mc13xxx, MC13XXX_IRQ_ADCDONE);
  454. mc13xxx_reg_write(mc13xxx, MC13XXX_ADC0, adc0);
  455. mc13xxx_reg_write(mc13xxx, MC13XXX_ADC1, adc1);
  456. mc13xxx_unlock(mc13xxx);
  457. ret = wait_for_completion_interruptible_timeout(&adcdone_data.done, HZ);
  458. if (!ret)
  459. ret = -ETIMEDOUT;
  460. mc13xxx_lock(mc13xxx);
  461. mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_ADCDONE, &adcdone_data);
  462. if (ret > 0)
  463. for (i = 0; i < 4; ++i) {
  464. ret = mc13xxx_reg_read(mc13xxx,
  465. MC13XXX_ADC2, &sample[i]);
  466. if (ret)
  467. break;
  468. }
  469. if (mode == MC13XXX_ADC_MODE_TS)
  470. /* restore TSMOD */
  471. mc13xxx_reg_write(mc13xxx, MC13XXX_ADC0, old_adc0);
  472. mc13xxx->adcflags &= ~MC13XXX_ADC_WORKING;
  473. out:
  474. mc13xxx_unlock(mc13xxx);
  475. return ret;
  476. }
  477. EXPORT_SYMBOL_GPL(mc13xxx_adc_do_conversion);
  478. static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
  479. const char *format, void *pdata, size_t pdata_size)
  480. {
  481. char buf[30];
  482. const char *name = mc13xxx_get_chipname(mc13xxx);
  483. struct mfd_cell cell = {
  484. .platform_data = pdata,
  485. .pdata_size = pdata_size,
  486. };
  487. /* there is no asnprintf in the kernel :-( */
  488. if (snprintf(buf, sizeof(buf), format, name) > sizeof(buf))
  489. return -E2BIG;
  490. cell.name = kmemdup(buf, strlen(buf) + 1, GFP_KERNEL);
  491. if (!cell.name)
  492. return -ENOMEM;
  493. return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0);
  494. }
  495. static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format)
  496. {
  497. return mc13xxx_add_subdevice_pdata(mc13xxx, format, NULL, 0);
  498. }
  499. #ifdef CONFIG_OF
  500. static int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx)
  501. {
  502. struct device_node *np = mc13xxx->dev->of_node;
  503. if (!np)
  504. return -ENODEV;
  505. if (of_get_property(np, "fsl,mc13xxx-uses-adc", NULL))
  506. mc13xxx->flags |= MC13XXX_USE_ADC;
  507. if (of_get_property(np, "fsl,mc13xxx-uses-codec", NULL))
  508. mc13xxx->flags |= MC13XXX_USE_CODEC;
  509. if (of_get_property(np, "fsl,mc13xxx-uses-rtc", NULL))
  510. mc13xxx->flags |= MC13XXX_USE_RTC;
  511. if (of_get_property(np, "fsl,mc13xxx-uses-touch", NULL))
  512. mc13xxx->flags |= MC13XXX_USE_TOUCHSCREEN;
  513. return 0;
  514. }
  515. #else
  516. static inline int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx)
  517. {
  518. return -ENODEV;
  519. }
  520. #endif
  521. int mc13xxx_common_init(struct mc13xxx *mc13xxx,
  522. struct mc13xxx_platform_data *pdata, int irq)
  523. {
  524. int ret;
  525. mc13xxx_lock(mc13xxx);
  526. ret = mc13xxx_identify(mc13xxx);
  527. if (ret)
  528. goto err_revision;
  529. /* mask all irqs */
  530. ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK0, 0x00ffffff);
  531. if (ret)
  532. goto err_mask;
  533. ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK1, 0x00ffffff);
  534. if (ret)
  535. goto err_mask;
  536. ret = request_threaded_irq(irq, NULL, mc13xxx_irq_thread,
  537. IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx);
  538. if (ret) {
  539. err_mask:
  540. err_revision:
  541. mc13xxx_unlock(mc13xxx);
  542. kfree(mc13xxx);
  543. return ret;
  544. }
  545. mc13xxx->irq = irq;
  546. mc13xxx_unlock(mc13xxx);
  547. if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata)
  548. mc13xxx->flags = pdata->flags;
  549. if (mc13xxx->flags & MC13XXX_USE_ADC)
  550. mc13xxx_add_subdevice(mc13xxx, "%s-adc");
  551. if (mc13xxx->flags & MC13XXX_USE_CODEC)
  552. mc13xxx_add_subdevice_pdata(mc13xxx, "%s-codec",
  553. pdata->codec, sizeof(*pdata->codec));
  554. if (mc13xxx->flags & MC13XXX_USE_RTC)
  555. mc13xxx_add_subdevice(mc13xxx, "%s-rtc");
  556. if (mc13xxx->flags & MC13XXX_USE_TOUCHSCREEN)
  557. mc13xxx_add_subdevice_pdata(mc13xxx, "%s-ts",
  558. &pdata->touch, sizeof(pdata->touch));
  559. if (pdata) {
  560. mc13xxx_add_subdevice_pdata(mc13xxx, "%s-regulator",
  561. &pdata->regulators, sizeof(pdata->regulators));
  562. mc13xxx_add_subdevice_pdata(mc13xxx, "%s-led",
  563. pdata->leds, sizeof(*pdata->leds));
  564. mc13xxx_add_subdevice_pdata(mc13xxx, "%s-pwrbutton",
  565. pdata->buttons, sizeof(*pdata->buttons));
  566. } else {
  567. mc13xxx_add_subdevice(mc13xxx, "%s-regulator");
  568. mc13xxx_add_subdevice(mc13xxx, "%s-led");
  569. mc13xxx_add_subdevice(mc13xxx, "%s-pwrbutton");
  570. }
  571. return 0;
  572. }
  573. EXPORT_SYMBOL_GPL(mc13xxx_common_init);
  574. void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx)
  575. {
  576. free_irq(mc13xxx->irq, mc13xxx);
  577. mfd_remove_devices(mc13xxx->dev);
  578. }
  579. EXPORT_SYMBOL_GPL(mc13xxx_common_cleanup);
  580. MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC");
  581. MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>");
  582. MODULE_LICENSE("GPL v2");