mc13783-core.c 19 KB

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