mc13xxx-core.c 22 KB

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