mc13783-core.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. /*
  2. * Copyright 2009 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/spi/spi.h>
  15. #include <linux/mfd/core.h>
  16. #include <linux/mfd/mc13783-private.h>
  17. #define MC13783_IRQSTAT0 0
  18. #define MC13783_IRQSTAT0_ADCDONEI (1 << 0)
  19. #define MC13783_IRQSTAT0_ADCBISDONEI (1 << 1)
  20. #define MC13783_IRQSTAT0_TSI (1 << 2)
  21. #define MC13783_IRQSTAT0_WHIGHI (1 << 3)
  22. #define MC13783_IRQSTAT0_WLOWI (1 << 4)
  23. #define MC13783_IRQSTAT0_CHGDETI (1 << 6)
  24. #define MC13783_IRQSTAT0_CHGOVI (1 << 7)
  25. #define MC13783_IRQSTAT0_CHGREVI (1 << 8)
  26. #define MC13783_IRQSTAT0_CHGSHORTI (1 << 9)
  27. #define MC13783_IRQSTAT0_CCCVI (1 << 10)
  28. #define MC13783_IRQSTAT0_CHGCURRI (1 << 11)
  29. #define MC13783_IRQSTAT0_BPONI (1 << 12)
  30. #define MC13783_IRQSTAT0_LOBATLI (1 << 13)
  31. #define MC13783_IRQSTAT0_LOBATHI (1 << 14)
  32. #define MC13783_IRQSTAT0_UDPI (1 << 15)
  33. #define MC13783_IRQSTAT0_USBI (1 << 16)
  34. #define MC13783_IRQSTAT0_IDI (1 << 19)
  35. #define MC13783_IRQSTAT0_SE1I (1 << 21)
  36. #define MC13783_IRQSTAT0_CKDETI (1 << 22)
  37. #define MC13783_IRQSTAT0_UDMI (1 << 23)
  38. #define MC13783_IRQMASK0 1
  39. #define MC13783_IRQMASK0_ADCDONEM MC13783_IRQSTAT0_ADCDONEI
  40. #define MC13783_IRQMASK0_ADCBISDONEM MC13783_IRQSTAT0_ADCBISDONEI
  41. #define MC13783_IRQMASK0_TSM MC13783_IRQSTAT0_TSI
  42. #define MC13783_IRQMASK0_WHIGHM MC13783_IRQSTAT0_WHIGHI
  43. #define MC13783_IRQMASK0_WLOWM MC13783_IRQSTAT0_WLOWI
  44. #define MC13783_IRQMASK0_CHGDETM MC13783_IRQSTAT0_CHGDETI
  45. #define MC13783_IRQMASK0_CHGOVM MC13783_IRQSTAT0_CHGOVI
  46. #define MC13783_IRQMASK0_CHGREVM MC13783_IRQSTAT0_CHGREVI
  47. #define MC13783_IRQMASK0_CHGSHORTM MC13783_IRQSTAT0_CHGSHORTI
  48. #define MC13783_IRQMASK0_CCCVM MC13783_IRQSTAT0_CCCVI
  49. #define MC13783_IRQMASK0_CHGCURRM MC13783_IRQSTAT0_CHGCURRI
  50. #define MC13783_IRQMASK0_BPONM MC13783_IRQSTAT0_BPONI
  51. #define MC13783_IRQMASK0_LOBATLM MC13783_IRQSTAT0_LOBATLI
  52. #define MC13783_IRQMASK0_LOBATHM MC13783_IRQSTAT0_LOBATHI
  53. #define MC13783_IRQMASK0_UDPM MC13783_IRQSTAT0_UDPI
  54. #define MC13783_IRQMASK0_USBM MC13783_IRQSTAT0_USBI
  55. #define MC13783_IRQMASK0_IDM MC13783_IRQSTAT0_IDI
  56. #define MC13783_IRQMASK0_SE1M MC13783_IRQSTAT0_SE1I
  57. #define MC13783_IRQMASK0_CKDETM MC13783_IRQSTAT0_CKDETI
  58. #define MC13783_IRQMASK0_UDMM MC13783_IRQSTAT0_UDMI
  59. #define MC13783_IRQSTAT1 3
  60. #define MC13783_IRQSTAT1_1HZI (1 << 0)
  61. #define MC13783_IRQSTAT1_TODAI (1 << 1)
  62. #define MC13783_IRQSTAT1_ONOFD1I (1 << 3)
  63. #define MC13783_IRQSTAT1_ONOFD2I (1 << 4)
  64. #define MC13783_IRQSTAT1_ONOFD3I (1 << 5)
  65. #define MC13783_IRQSTAT1_SYSRSTI (1 << 6)
  66. #define MC13783_IRQSTAT1_RTCRSTI (1 << 7)
  67. #define MC13783_IRQSTAT1_PCI (1 << 8)
  68. #define MC13783_IRQSTAT1_WARMI (1 << 9)
  69. #define MC13783_IRQSTAT1_MEMHLDI (1 << 10)
  70. #define MC13783_IRQSTAT1_PWRRDYI (1 << 11)
  71. #define MC13783_IRQSTAT1_THWARNLI (1 << 12)
  72. #define MC13783_IRQSTAT1_THWARNHI (1 << 13)
  73. #define MC13783_IRQSTAT1_CLKI (1 << 14)
  74. #define MC13783_IRQSTAT1_SEMAFI (1 << 15)
  75. #define MC13783_IRQSTAT1_MC2BI (1 << 17)
  76. #define MC13783_IRQSTAT1_HSDETI (1 << 18)
  77. #define MC13783_IRQSTAT1_HSLI (1 << 19)
  78. #define MC13783_IRQSTAT1_ALSPTHI (1 << 20)
  79. #define MC13783_IRQSTAT1_AHSSHORTI (1 << 21)
  80. #define MC13783_IRQMASK1 4
  81. #define MC13783_IRQMASK1_1HZM MC13783_IRQSTAT1_1HZI
  82. #define MC13783_IRQMASK1_TODAM MC13783_IRQSTAT1_TODAI
  83. #define MC13783_IRQMASK1_ONOFD1M MC13783_IRQSTAT1_ONOFD1I
  84. #define MC13783_IRQMASK1_ONOFD2M MC13783_IRQSTAT1_ONOFD2I
  85. #define MC13783_IRQMASK1_ONOFD3M MC13783_IRQSTAT1_ONOFD3I
  86. #define MC13783_IRQMASK1_SYSRSTM MC13783_IRQSTAT1_SYSRSTI
  87. #define MC13783_IRQMASK1_RTCRSTM MC13783_IRQSTAT1_RTCRSTI
  88. #define MC13783_IRQMASK1_PCM MC13783_IRQSTAT1_PCI
  89. #define MC13783_IRQMASK1_WARMM MC13783_IRQSTAT1_WARMI
  90. #define MC13783_IRQMASK1_MEMHLDM MC13783_IRQSTAT1_MEMHLDI
  91. #define MC13783_IRQMASK1_PWRRDYM MC13783_IRQSTAT1_PWRRDYI
  92. #define MC13783_IRQMASK1_THWARNLM MC13783_IRQSTAT1_THWARNLI
  93. #define MC13783_IRQMASK1_THWARNHM MC13783_IRQSTAT1_THWARNHI
  94. #define MC13783_IRQMASK1_CLKM MC13783_IRQSTAT1_CLKI
  95. #define MC13783_IRQMASK1_SEMAFM MC13783_IRQSTAT1_SEMAFI
  96. #define MC13783_IRQMASK1_MC2BM MC13783_IRQSTAT1_MC2BI
  97. #define MC13783_IRQMASK1_HSDETM MC13783_IRQSTAT1_HSDETI
  98. #define MC13783_IRQMASK1_HSLM MC13783_IRQSTAT1_HSLI
  99. #define MC13783_IRQMASK1_ALSPTHM MC13783_IRQSTAT1_ALSPTHI
  100. #define MC13783_IRQMASK1_AHSSHORTM MC13783_IRQSTAT1_AHSSHORTI
  101. #define MC13783_ADC1 44
  102. #define MC13783_ADC1_ADEN (1 << 0)
  103. #define MC13783_ADC1_RAND (1 << 1)
  104. #define MC13783_ADC1_ADSEL (1 << 3)
  105. #define MC13783_ADC1_ASC (1 << 20)
  106. #define MC13783_ADC1_ADTRIGIGN (1 << 21)
  107. #define MC13783_NUMREGS 0x3f
  108. void mc13783_lock(struct mc13783 *mc13783)
  109. {
  110. if (!mutex_trylock(&mc13783->lock)) {
  111. dev_dbg(&mc13783->spidev->dev, "wait for %s from %pf\n",
  112. __func__, __builtin_return_address(0));
  113. mutex_lock(&mc13783->lock);
  114. }
  115. dev_dbg(&mc13783->spidev->dev, "%s from %pf\n",
  116. __func__, __builtin_return_address(0));
  117. }
  118. EXPORT_SYMBOL(mc13783_lock);
  119. void mc13783_unlock(struct mc13783 *mc13783)
  120. {
  121. dev_dbg(&mc13783->spidev->dev, "%s from %pf\n",
  122. __func__, __builtin_return_address(0));
  123. mutex_unlock(&mc13783->lock);
  124. }
  125. EXPORT_SYMBOL(mc13783_unlock);
  126. #define MC13783_REGOFFSET_SHIFT 25
  127. int mc13783_reg_read(struct mc13783 *mc13783, unsigned int offset, u32 *val)
  128. {
  129. struct spi_transfer t;
  130. struct spi_message m;
  131. int ret;
  132. BUG_ON(!mutex_is_locked(&mc13783->lock));
  133. if (offset > MC13783_NUMREGS)
  134. return -EINVAL;
  135. *val = offset << MC13783_REGOFFSET_SHIFT;
  136. memset(&t, 0, sizeof(t));
  137. t.tx_buf = val;
  138. t.rx_buf = val;
  139. t.len = sizeof(u32);
  140. spi_message_init(&m);
  141. spi_message_add_tail(&t, &m);
  142. ret = spi_sync(mc13783->spidev, &m);
  143. /* error in message.status implies error return from spi_sync */
  144. BUG_ON(!ret && m.status);
  145. if (ret)
  146. return ret;
  147. *val &= 0xffffff;
  148. dev_vdbg(&mc13783->spidev->dev, "[0x%02x] -> 0x%06x\n", offset, *val);
  149. return 0;
  150. }
  151. EXPORT_SYMBOL(mc13783_reg_read);
  152. int mc13783_reg_write(struct mc13783 *mc13783, unsigned int offset, u32 val)
  153. {
  154. u32 buf;
  155. struct spi_transfer t;
  156. struct spi_message m;
  157. int ret;
  158. BUG_ON(!mutex_is_locked(&mc13783->lock));
  159. dev_vdbg(&mc13783->spidev->dev, "[0x%02x] <- 0x%06x\n", offset, val);
  160. if (offset > MC13783_NUMREGS || val > 0xffffff)
  161. return -EINVAL;
  162. buf = 1 << 31 | offset << MC13783_REGOFFSET_SHIFT | val;
  163. memset(&t, 0, sizeof(t));
  164. t.tx_buf = &buf;
  165. t.rx_buf = &buf;
  166. t.len = sizeof(u32);
  167. spi_message_init(&m);
  168. spi_message_add_tail(&t, &m);
  169. ret = spi_sync(mc13783->spidev, &m);
  170. BUG_ON(!ret && m.status);
  171. if (ret)
  172. return ret;
  173. return 0;
  174. }
  175. EXPORT_SYMBOL(mc13783_reg_write);
  176. int mc13783_reg_rmw(struct mc13783 *mc13783, unsigned int offset,
  177. u32 mask, u32 val)
  178. {
  179. int ret;
  180. u32 valread;
  181. BUG_ON(val & ~mask);
  182. ret = mc13783_reg_read(mc13783, offset, &valread);
  183. if (ret)
  184. return ret;
  185. valread = (valread & ~mask) | val;
  186. return mc13783_reg_write(mc13783, offset, valread);
  187. }
  188. EXPORT_SYMBOL(mc13783_reg_rmw);
  189. int mc13783_irq_mask(struct mc13783 *mc13783, int irq)
  190. {
  191. int ret;
  192. unsigned int offmask = irq < 24 ? MC13783_IRQMASK0 : MC13783_IRQMASK1;
  193. u32 irqbit = 1 << (irq < 24 ? irq : irq - 24);
  194. u32 mask;
  195. if (irq < 0 || irq >= MC13783_NUM_IRQ)
  196. return -EINVAL;
  197. ret = mc13783_reg_read(mc13783, offmask, &mask);
  198. if (ret)
  199. return ret;
  200. if (mask & irqbit)
  201. /* already masked */
  202. return 0;
  203. return mc13783_reg_write(mc13783, offmask, mask | irqbit);
  204. }
  205. EXPORT_SYMBOL(mc13783_irq_mask);
  206. int mc13783_irq_unmask(struct mc13783 *mc13783, int irq)
  207. {
  208. int ret;
  209. unsigned int offmask = irq < 24 ? MC13783_IRQMASK0 : MC13783_IRQMASK1;
  210. u32 irqbit = 1 << (irq < 24 ? irq : irq - 24);
  211. u32 mask;
  212. if (irq < 0 || irq >= MC13783_NUM_IRQ)
  213. return -EINVAL;
  214. ret = mc13783_reg_read(mc13783, offmask, &mask);
  215. if (ret)
  216. return ret;
  217. if (!(mask & irqbit))
  218. /* already unmasked */
  219. return 0;
  220. return mc13783_reg_write(mc13783, offmask, mask & ~irqbit);
  221. }
  222. EXPORT_SYMBOL(mc13783_irq_unmask);
  223. int mc13783_irq_status(struct mc13783 *mc13783, int irq,
  224. int *enabled, int *pending)
  225. {
  226. int ret;
  227. unsigned int offmask = irq < 24 ? MC13783_IRQMASK0 : MC13783_IRQMASK1;
  228. unsigned int offstat = irq < 24 ? MC13783_IRQSTAT0 : MC13783_IRQSTAT1;
  229. u32 irqbit = 1 << (irq < 24 ? irq : irq - 24);
  230. if (irq < 0 || irq >= MC13783_NUM_IRQ)
  231. return -EINVAL;
  232. if (enabled) {
  233. u32 mask;
  234. ret = mc13783_reg_read(mc13783, offmask, &mask);
  235. if (ret)
  236. return ret;
  237. *enabled = mask & irqbit;
  238. }
  239. if (pending) {
  240. u32 stat;
  241. ret = mc13783_reg_read(mc13783, offstat, &stat);
  242. if (ret)
  243. return ret;
  244. *pending = stat & irqbit;
  245. }
  246. return 0;
  247. }
  248. EXPORT_SYMBOL(mc13783_irq_status);
  249. int mc13783_irq_ack(struct mc13783 *mc13783, int irq)
  250. {
  251. unsigned int offstat = irq < 24 ? MC13783_IRQSTAT0 : MC13783_IRQSTAT1;
  252. unsigned int val = 1 << (irq < 24 ? irq : irq - 24);
  253. BUG_ON(irq < 0 || irq >= MC13783_NUM_IRQ);
  254. return mc13783_reg_write(mc13783, offstat, val);
  255. }
  256. EXPORT_SYMBOL(mc13783_irq_ack);
  257. int mc13783_irq_request_nounmask(struct mc13783 *mc13783, int irq,
  258. irq_handler_t handler, const char *name, void *dev)
  259. {
  260. BUG_ON(!mutex_is_locked(&mc13783->lock));
  261. BUG_ON(!handler);
  262. if (irq < 0 || irq >= MC13783_NUM_IRQ)
  263. return -EINVAL;
  264. if (mc13783->irqhandler[irq])
  265. return -EBUSY;
  266. mc13783->irqhandler[irq] = handler;
  267. mc13783->irqdata[irq] = dev;
  268. return 0;
  269. }
  270. EXPORT_SYMBOL(mc13783_irq_request_nounmask);
  271. int mc13783_irq_request(struct mc13783 *mc13783, int irq,
  272. irq_handler_t handler, const char *name, void *dev)
  273. {
  274. int ret;
  275. ret = mc13783_irq_request_nounmask(mc13783, irq, handler, name, dev);
  276. if (ret)
  277. return ret;
  278. ret = mc13783_irq_unmask(mc13783, irq);
  279. if (ret) {
  280. mc13783->irqhandler[irq] = NULL;
  281. mc13783->irqdata[irq] = NULL;
  282. return ret;
  283. }
  284. return 0;
  285. }
  286. EXPORT_SYMBOL(mc13783_irq_request);
  287. int mc13783_irq_free(struct mc13783 *mc13783, int irq, void *dev)
  288. {
  289. int ret;
  290. BUG_ON(!mutex_is_locked(&mc13783->lock));
  291. if (irq < 0 || irq >= MC13783_NUM_IRQ || !mc13783->irqhandler[irq] ||
  292. mc13783->irqdata[irq] != dev)
  293. return -EINVAL;
  294. ret = mc13783_irq_mask(mc13783, irq);
  295. if (ret)
  296. return ret;
  297. mc13783->irqhandler[irq] = NULL;
  298. mc13783->irqdata[irq] = NULL;
  299. return 0;
  300. }
  301. EXPORT_SYMBOL(mc13783_irq_free);
  302. static inline irqreturn_t mc13783_irqhandler(struct mc13783 *mc13783, int irq)
  303. {
  304. return mc13783->irqhandler[irq](irq, mc13783->irqdata[irq]);
  305. }
  306. /*
  307. * returns: number of handled irqs or negative error
  308. * locking: holds mc13783->lock
  309. */
  310. static int mc13783_irq_handle(struct mc13783 *mc13783,
  311. unsigned int offstat, unsigned int offmask, int baseirq)
  312. {
  313. u32 stat, mask;
  314. int ret = mc13783_reg_read(mc13783, offstat, &stat);
  315. int num_handled = 0;
  316. if (ret)
  317. return ret;
  318. ret = mc13783_reg_read(mc13783, offmask, &mask);
  319. if (ret)
  320. return ret;
  321. while (stat & ~mask) {
  322. int irq = __ffs(stat & ~mask);
  323. stat &= ~(1 << irq);
  324. if (likely(mc13783->irqhandler[baseirq + irq])) {
  325. irqreturn_t handled;
  326. handled = mc13783_irqhandler(mc13783, baseirq + irq);
  327. if (handled == IRQ_HANDLED)
  328. num_handled++;
  329. } else {
  330. dev_err(&mc13783->spidev->dev,
  331. "BUG: irq %u but no handler\n",
  332. baseirq + irq);
  333. mask |= 1 << irq;
  334. ret = mc13783_reg_write(mc13783, offmask, mask);
  335. }
  336. }
  337. return num_handled;
  338. }
  339. static irqreturn_t mc13783_irq_thread(int irq, void *data)
  340. {
  341. struct mc13783 *mc13783 = data;
  342. irqreturn_t ret;
  343. int handled = 0;
  344. mc13783_lock(mc13783);
  345. ret = mc13783_irq_handle(mc13783, MC13783_IRQSTAT0,
  346. MC13783_IRQMASK0, MC13783_IRQ_ADCDONE);
  347. if (ret > 0)
  348. handled = 1;
  349. ret = mc13783_irq_handle(mc13783, MC13783_IRQSTAT1,
  350. MC13783_IRQMASK1, MC13783_IRQ_1HZ);
  351. if (ret > 0)
  352. handled = 1;
  353. mc13783_unlock(mc13783);
  354. return IRQ_RETVAL(handled);
  355. }
  356. #define MC13783_ADC1_CHAN0_SHIFT 5
  357. #define MC13783_ADC1_CHAN1_SHIFT 8
  358. struct mc13783_adcdone_data {
  359. struct mc13783 *mc13783;
  360. struct completion done;
  361. };
  362. static irqreturn_t mc13783_handler_adcdone(int irq, void *data)
  363. {
  364. struct mc13783_adcdone_data *adcdone_data = data;
  365. mc13783_irq_ack(adcdone_data->mc13783, irq);
  366. complete_all(&adcdone_data->done);
  367. return IRQ_HANDLED;
  368. }
  369. #define MC13783_ADC_WORKING (1 << 16)
  370. int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode,
  371. unsigned int channel, unsigned int *sample)
  372. {
  373. u32 adc0, adc1, old_adc0;
  374. int i, ret;
  375. struct mc13783_adcdone_data adcdone_data = {
  376. .mc13783 = mc13783,
  377. };
  378. init_completion(&adcdone_data.done);
  379. dev_dbg(&mc13783->spidev->dev, "%s\n", __func__);
  380. mc13783_lock(mc13783);
  381. if (mc13783->flags & MC13783_ADC_WORKING) {
  382. ret = -EBUSY;
  383. goto out;
  384. }
  385. mc13783->flags |= MC13783_ADC_WORKING;
  386. mc13783_reg_read(mc13783, MC13783_ADC0, &old_adc0);
  387. adc0 = MC13783_ADC0_ADINC1 | MC13783_ADC0_ADINC2;
  388. adc1 = MC13783_ADC1_ADEN | MC13783_ADC1_ADTRIGIGN | MC13783_ADC1_ASC;
  389. if (channel > 7)
  390. adc1 |= MC13783_ADC1_ADSEL;
  391. switch (mode) {
  392. case MC13783_ADC_MODE_TS:
  393. adc0 |= MC13783_ADC0_ADREFEN | MC13783_ADC0_TSMOD0 |
  394. MC13783_ADC0_TSMOD1;
  395. adc1 |= 4 << MC13783_ADC1_CHAN1_SHIFT;
  396. break;
  397. case MC13783_ADC_MODE_SINGLE_CHAN:
  398. adc0 |= old_adc0 & MC13783_ADC0_TSMOD_MASK;
  399. adc1 |= (channel & 0x7) << MC13783_ADC1_CHAN0_SHIFT;
  400. adc1 |= MC13783_ADC1_RAND;
  401. break;
  402. case MC13783_ADC_MODE_MULT_CHAN:
  403. adc0 |= old_adc0 & MC13783_ADC0_TSMOD_MASK;
  404. adc1 |= 4 << MC13783_ADC1_CHAN1_SHIFT;
  405. break;
  406. default:
  407. mc13783_unlock(mc13783);
  408. return -EINVAL;
  409. }
  410. dev_dbg(&mc13783->spidev->dev, "%s: request irq\n", __func__);
  411. mc13783_irq_request(mc13783, MC13783_IRQ_ADCDONE,
  412. mc13783_handler_adcdone, __func__, &adcdone_data);
  413. mc13783_irq_ack(mc13783, MC13783_IRQ_ADCDONE);
  414. mc13783_reg_write(mc13783, MC13783_REG_ADC_0, adc0);
  415. mc13783_reg_write(mc13783, MC13783_REG_ADC_1, adc1);
  416. mc13783_unlock(mc13783);
  417. ret = wait_for_completion_interruptible_timeout(&adcdone_data.done, HZ);
  418. if (!ret)
  419. ret = -ETIMEDOUT;
  420. mc13783_lock(mc13783);
  421. mc13783_irq_free(mc13783, MC13783_IRQ_ADCDONE, &adcdone_data);
  422. if (ret > 0)
  423. for (i = 0; i < 4; ++i) {
  424. ret = mc13783_reg_read(mc13783,
  425. MC13783_REG_ADC_2, &sample[i]);
  426. if (ret)
  427. break;
  428. }
  429. if (mode == MC13783_ADC_MODE_TS)
  430. /* restore TSMOD */
  431. mc13783_reg_write(mc13783, MC13783_REG_ADC_0, old_adc0);
  432. mc13783->flags &= ~MC13783_ADC_WORKING;
  433. out:
  434. mc13783_unlock(mc13783);
  435. return ret;
  436. }
  437. EXPORT_SYMBOL_GPL(mc13783_adc_do_conversion);
  438. static int mc13783_add_subdevice_pdata(struct mc13783 *mc13783,
  439. const char *name, void *pdata, size_t pdata_size)
  440. {
  441. struct mfd_cell cell = {
  442. .name = name,
  443. .platform_data = pdata,
  444. .data_size = pdata_size,
  445. };
  446. return mfd_add_devices(&mc13783->spidev->dev, -1, &cell, 1, NULL, 0);
  447. }
  448. static int mc13783_add_subdevice(struct mc13783 *mc13783, const char *name)
  449. {
  450. return mc13783_add_subdevice_pdata(mc13783, name, NULL, 0);
  451. }
  452. static int mc13783_check_revision(struct mc13783 *mc13783)
  453. {
  454. u32 rev_id, rev1, rev2, finid, icid;
  455. mc13783_reg_read(mc13783, MC13783_REG_REVISION, &rev_id);
  456. rev1 = (rev_id & 0x018) >> 3;
  457. rev2 = (rev_id & 0x007);
  458. icid = (rev_id & 0x01C0) >> 6;
  459. finid = (rev_id & 0x01E00) >> 9;
  460. /* Ver 0.2 is actually 3.2a. Report as 3.2 */
  461. if ((rev1 == 0) && (rev2 == 2))
  462. rev1 = 3;
  463. if (rev1 == 0 || icid != 2) {
  464. dev_err(&mc13783->spidev->dev, "No MC13783 detected.\n");
  465. return -ENODEV;
  466. }
  467. dev_info(&mc13783->spidev->dev,
  468. "MC13783 Rev %d.%d FinVer %x detected\n",
  469. rev1, rev2, finid);
  470. return 0;
  471. }
  472. static int mc13783_probe(struct spi_device *spi)
  473. {
  474. struct mc13783 *mc13783;
  475. struct mc13783_platform_data *pdata = dev_get_platdata(&spi->dev);
  476. int ret;
  477. mc13783 = kzalloc(sizeof(*mc13783), GFP_KERNEL);
  478. if (!mc13783)
  479. return -ENOMEM;
  480. dev_set_drvdata(&spi->dev, mc13783);
  481. spi->mode = SPI_MODE_0 | SPI_CS_HIGH;
  482. spi->bits_per_word = 32;
  483. spi_setup(spi);
  484. mc13783->spidev = spi;
  485. mutex_init(&mc13783->lock);
  486. mc13783_lock(mc13783);
  487. ret = mc13783_check_revision(mc13783);
  488. if (ret)
  489. goto err_revision;
  490. /* mask all irqs */
  491. ret = mc13783_reg_write(mc13783, MC13783_IRQMASK0, 0x00ffffff);
  492. if (ret)
  493. goto err_mask;
  494. ret = mc13783_reg_write(mc13783, MC13783_IRQMASK1, 0x00ffffff);
  495. if (ret)
  496. goto err_mask;
  497. ret = request_threaded_irq(spi->irq, NULL, mc13783_irq_thread,
  498. IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13783", mc13783);
  499. if (ret) {
  500. err_mask:
  501. err_revision:
  502. mutex_unlock(&mc13783->lock);
  503. dev_set_drvdata(&spi->dev, NULL);
  504. kfree(mc13783);
  505. return ret;
  506. }
  507. /* This should go away (BEGIN) */
  508. if (pdata) {
  509. mc13783->flags = pdata->flags;
  510. mc13783->regulators = pdata->regulators;
  511. mc13783->num_regulators = pdata->num_regulators;
  512. }
  513. /* This should go away (END) */
  514. mc13783_unlock(mc13783);
  515. if (pdata->flags & MC13783_USE_ADC)
  516. mc13783_add_subdevice(mc13783, "mc13783-adc");
  517. if (pdata->flags & MC13783_USE_CODEC)
  518. mc13783_add_subdevice(mc13783, "mc13783-codec");
  519. if (pdata->flags & MC13783_USE_REGULATOR) {
  520. struct mc13783_regulator_platform_data regulator_pdata = {
  521. .num_regulators = pdata->num_regulators,
  522. .regulators = pdata->regulators,
  523. };
  524. mc13783_add_subdevice_pdata(mc13783, "mc13783-regulator",
  525. &regulator_pdata, sizeof(regulator_pdata));
  526. }
  527. if (pdata->flags & MC13783_USE_RTC)
  528. mc13783_add_subdevice(mc13783, "mc13783-rtc");
  529. if (pdata->flags & MC13783_USE_TOUCHSCREEN)
  530. mc13783_add_subdevice(mc13783, "mc13783-ts");
  531. if (pdata->flags & MC13783_USE_LED)
  532. mc13783_add_subdevice_pdata(mc13783, "mc13783-led",
  533. pdata->leds, sizeof(*pdata->leds));
  534. return 0;
  535. }
  536. static int __devexit mc13783_remove(struct spi_device *spi)
  537. {
  538. struct mc13783 *mc13783 = dev_get_drvdata(&spi->dev);
  539. free_irq(mc13783->spidev->irq, mc13783);
  540. mfd_remove_devices(&spi->dev);
  541. return 0;
  542. }
  543. static struct spi_driver mc13783_driver = {
  544. .driver = {
  545. .name = "mc13783",
  546. .bus = &spi_bus_type,
  547. .owner = THIS_MODULE,
  548. },
  549. .probe = mc13783_probe,
  550. .remove = __devexit_p(mc13783_remove),
  551. };
  552. static int __init mc13783_init(void)
  553. {
  554. return spi_register_driver(&mc13783_driver);
  555. }
  556. subsys_initcall(mc13783_init);
  557. static void __exit mc13783_exit(void)
  558. {
  559. spi_unregister_driver(&mc13783_driver);
  560. }
  561. module_exit(mc13783_exit);
  562. MODULE_DESCRIPTION("Core driver for Freescale MC13783 PMIC");
  563. MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>");
  564. MODULE_LICENSE("GPL v2");