mc13783-core.c 18 KB

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