asic3.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. /*
  2. * driver/mfd/asic3.c
  3. *
  4. * Compaq ASIC3 support.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. *
  10. * Copyright 2001 Compaq Computer Corporation.
  11. * Copyright 2004-2005 Phil Blundell
  12. * Copyright 2007 OpenedHand Ltd.
  13. *
  14. * Authors: Phil Blundell <pb@handhelds.org>,
  15. * Samuel Ortiz <sameo@openedhand.com>
  16. *
  17. */
  18. #include <linux/version.h>
  19. #include <linux/kernel.h>
  20. #include <linux/irq.h>
  21. #include <linux/io.h>
  22. #include <linux/spinlock.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/mfd/asic3.h>
  25. static inline void asic3_write_register(struct asic3 *asic,
  26. unsigned int reg, u32 value)
  27. {
  28. iowrite16(value, asic->mapping +
  29. (reg >> asic->bus_shift));
  30. }
  31. static inline u32 asic3_read_register(struct asic3 *asic,
  32. unsigned int reg)
  33. {
  34. return ioread16(asic->mapping +
  35. (reg >> asic->bus_shift));
  36. }
  37. /* IRQs */
  38. #define MAX_ASIC_ISR_LOOPS 20
  39. #define ASIC3_GPIO_Base_INCR \
  40. (ASIC3_GPIO_B_Base - ASIC3_GPIO_A_Base)
  41. static void asic3_irq_flip_edge(struct asic3 *asic,
  42. u32 base, int bit)
  43. {
  44. u16 edge;
  45. unsigned long flags;
  46. spin_lock_irqsave(&asic->lock, flags);
  47. edge = asic3_read_register(asic,
  48. base + ASIC3_GPIO_EdgeTrigger);
  49. edge ^= bit;
  50. asic3_write_register(asic,
  51. base + ASIC3_GPIO_EdgeTrigger, edge);
  52. spin_unlock_irqrestore(&asic->lock, flags);
  53. }
  54. static void asic3_irq_demux(unsigned int irq, struct irq_desc *desc)
  55. {
  56. int iter, i;
  57. unsigned long flags;
  58. struct asic3 *asic;
  59. desc->chip->ack(irq);
  60. asic = desc->handler_data;
  61. for (iter = 0 ; iter < MAX_ASIC_ISR_LOOPS; iter++) {
  62. u32 status;
  63. int bank;
  64. spin_lock_irqsave(&asic->lock, flags);
  65. status = asic3_read_register(asic,
  66. ASIC3_OFFSET(INTR, PIntStat));
  67. spin_unlock_irqrestore(&asic->lock, flags);
  68. /* Check all ten register bits */
  69. if ((status & 0x3ff) == 0)
  70. break;
  71. /* Handle GPIO IRQs */
  72. for (bank = 0; bank < ASIC3_NUM_GPIO_BANKS; bank++) {
  73. if (status & (1 << bank)) {
  74. unsigned long base, istat;
  75. base = ASIC3_GPIO_A_Base
  76. + bank * ASIC3_GPIO_Base_INCR;
  77. spin_lock_irqsave(&asic->lock, flags);
  78. istat = asic3_read_register(asic,
  79. base +
  80. ASIC3_GPIO_IntStatus);
  81. /* Clearing IntStatus */
  82. asic3_write_register(asic,
  83. base +
  84. ASIC3_GPIO_IntStatus, 0);
  85. spin_unlock_irqrestore(&asic->lock, flags);
  86. for (i = 0; i < ASIC3_GPIOS_PER_BANK; i++) {
  87. int bit = (1 << i);
  88. unsigned int irqnr;
  89. if (!(istat & bit))
  90. continue;
  91. irqnr = asic->irq_base +
  92. (ASIC3_GPIOS_PER_BANK * bank)
  93. + i;
  94. desc = irq_desc + irqnr;
  95. desc->handle_irq(irqnr, desc);
  96. if (asic->irq_bothedge[bank] & bit)
  97. asic3_irq_flip_edge(asic, base,
  98. bit);
  99. }
  100. }
  101. }
  102. /* Handle remaining IRQs in the status register */
  103. for (i = ASIC3_NUM_GPIOS; i < ASIC3_NR_IRQS; i++) {
  104. /* They start at bit 4 and go up */
  105. if (status & (1 << (i - ASIC3_NUM_GPIOS + 4))) {
  106. desc = irq_desc + + i;
  107. desc->handle_irq(asic->irq_base + i,
  108. desc);
  109. }
  110. }
  111. }
  112. if (iter >= MAX_ASIC_ISR_LOOPS)
  113. printk(KERN_ERR "%s: interrupt processing overrun\n",
  114. __FUNCTION__);
  115. }
  116. static inline int asic3_irq_to_bank(struct asic3 *asic, int irq)
  117. {
  118. int n;
  119. n = (irq - asic->irq_base) >> 4;
  120. return (n * (ASIC3_GPIO_B_Base - ASIC3_GPIO_A_Base));
  121. }
  122. static inline int asic3_irq_to_index(struct asic3 *asic, int irq)
  123. {
  124. return (irq - asic->irq_base) & 0xf;
  125. }
  126. static void asic3_mask_gpio_irq(unsigned int irq)
  127. {
  128. struct asic3 *asic = get_irq_chip_data(irq);
  129. u32 val, bank, index;
  130. unsigned long flags;
  131. bank = asic3_irq_to_bank(asic, irq);
  132. index = asic3_irq_to_index(asic, irq);
  133. spin_lock_irqsave(&asic->lock, flags);
  134. val = asic3_read_register(asic, bank + ASIC3_GPIO_Mask);
  135. val |= 1 << index;
  136. asic3_write_register(asic, bank + ASIC3_GPIO_Mask, val);
  137. spin_unlock_irqrestore(&asic->lock, flags);
  138. }
  139. static void asic3_mask_irq(unsigned int irq)
  140. {
  141. struct asic3 *asic = get_irq_chip_data(irq);
  142. int regval;
  143. unsigned long flags;
  144. spin_lock_irqsave(&asic->lock, flags);
  145. regval = asic3_read_register(asic,
  146. ASIC3_INTR_Base +
  147. ASIC3_INTR_IntMask);
  148. regval &= ~(ASIC3_INTMASK_MASK0 <<
  149. (irq - (asic->irq_base + ASIC3_NUM_GPIOS)));
  150. asic3_write_register(asic,
  151. ASIC3_INTR_Base +
  152. ASIC3_INTR_IntMask,
  153. regval);
  154. spin_unlock_irqrestore(&asic->lock, flags);
  155. }
  156. static void asic3_unmask_gpio_irq(unsigned int irq)
  157. {
  158. struct asic3 *asic = get_irq_chip_data(irq);
  159. u32 val, bank, index;
  160. unsigned long flags;
  161. bank = asic3_irq_to_bank(asic, irq);
  162. index = asic3_irq_to_index(asic, irq);
  163. spin_lock_irqsave(&asic->lock, flags);
  164. val = asic3_read_register(asic, bank + ASIC3_GPIO_Mask);
  165. val &= ~(1 << index);
  166. asic3_write_register(asic, bank + ASIC3_GPIO_Mask, val);
  167. spin_unlock_irqrestore(&asic->lock, flags);
  168. }
  169. static void asic3_unmask_irq(unsigned int irq)
  170. {
  171. struct asic3 *asic = get_irq_chip_data(irq);
  172. int regval;
  173. unsigned long flags;
  174. spin_lock_irqsave(&asic->lock, flags);
  175. regval = asic3_read_register(asic,
  176. ASIC3_INTR_Base +
  177. ASIC3_INTR_IntMask);
  178. regval |= (ASIC3_INTMASK_MASK0 <<
  179. (irq - (asic->irq_base + ASIC3_NUM_GPIOS)));
  180. asic3_write_register(asic,
  181. ASIC3_INTR_Base +
  182. ASIC3_INTR_IntMask,
  183. regval);
  184. spin_unlock_irqrestore(&asic->lock, flags);
  185. }
  186. static int asic3_gpio_irq_type(unsigned int irq, unsigned int type)
  187. {
  188. struct asic3 *asic = get_irq_chip_data(irq);
  189. u32 bank, index;
  190. u16 trigger, level, edge, bit;
  191. unsigned long flags;
  192. bank = asic3_irq_to_bank(asic, irq);
  193. index = asic3_irq_to_index(asic, irq);
  194. bit = 1<<index;
  195. spin_lock_irqsave(&asic->lock, flags);
  196. level = asic3_read_register(asic,
  197. bank + ASIC3_GPIO_LevelTrigger);
  198. edge = asic3_read_register(asic,
  199. bank + ASIC3_GPIO_EdgeTrigger);
  200. trigger = asic3_read_register(asic,
  201. bank + ASIC3_GPIO_TriggerType);
  202. asic->irq_bothedge[(irq - asic->irq_base) >> 4] &= ~bit;
  203. if (type == IRQT_RISING) {
  204. trigger |= bit;
  205. edge |= bit;
  206. } else if (type == IRQT_FALLING) {
  207. trigger |= bit;
  208. edge &= ~bit;
  209. } else if (type == IRQT_BOTHEDGE) {
  210. trigger |= bit;
  211. if (asic3_gpio_get_value(asic, irq - asic->irq_base))
  212. edge &= ~bit;
  213. else
  214. edge |= bit;
  215. asic->irq_bothedge[(irq - asic->irq_base) >> 4] |= bit;
  216. } else if (type == IRQT_LOW) {
  217. trigger &= ~bit;
  218. level &= ~bit;
  219. } else if (type == IRQT_HIGH) {
  220. trigger &= ~bit;
  221. level |= bit;
  222. } else {
  223. /*
  224. * if type == IRQT_NOEDGE, we should mask interrupts, but
  225. * be careful to not unmask them if mask was also called.
  226. * Probably need internal state for mask.
  227. */
  228. printk(KERN_NOTICE "asic3: irq type not changed.\n");
  229. }
  230. asic3_write_register(asic, bank + ASIC3_GPIO_LevelTrigger,
  231. level);
  232. asic3_write_register(asic, bank + ASIC3_GPIO_EdgeTrigger,
  233. edge);
  234. asic3_write_register(asic, bank + ASIC3_GPIO_TriggerType,
  235. trigger);
  236. spin_unlock_irqrestore(&asic->lock, flags);
  237. return 0;
  238. }
  239. static struct irq_chip asic3_gpio_irq_chip = {
  240. .name = "ASIC3-GPIO",
  241. .ack = asic3_mask_gpio_irq,
  242. .mask = asic3_mask_gpio_irq,
  243. .unmask = asic3_unmask_gpio_irq,
  244. .set_type = asic3_gpio_irq_type,
  245. };
  246. static struct irq_chip asic3_irq_chip = {
  247. .name = "ASIC3",
  248. .ack = asic3_mask_irq,
  249. .mask = asic3_mask_irq,
  250. .unmask = asic3_unmask_irq,
  251. };
  252. static int asic3_irq_probe(struct platform_device *pdev)
  253. {
  254. struct asic3 *asic = platform_get_drvdata(pdev);
  255. unsigned long clksel = 0;
  256. unsigned int irq, irq_base;
  257. asic->irq_nr = platform_get_irq(pdev, 0);
  258. if (asic->irq_nr < 0)
  259. return asic->irq_nr;
  260. /* turn on clock to IRQ controller */
  261. clksel |= CLOCK_SEL_CX;
  262. asic3_write_register(asic, ASIC3_OFFSET(CLOCK, SEL),
  263. clksel);
  264. irq_base = asic->irq_base;
  265. for (irq = irq_base; irq < irq_base + ASIC3_NR_IRQS; irq++) {
  266. if (irq < asic->irq_base + ASIC3_NUM_GPIOS)
  267. set_irq_chip(irq, &asic3_gpio_irq_chip);
  268. else
  269. set_irq_chip(irq, &asic3_irq_chip);
  270. set_irq_chip_data(irq, asic);
  271. set_irq_handler(irq, handle_level_irq);
  272. set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
  273. }
  274. asic3_write_register(asic, ASIC3_OFFSET(INTR, IntMask),
  275. ASIC3_INTMASK_GINTMASK);
  276. set_irq_chained_handler(asic->irq_nr, asic3_irq_demux);
  277. set_irq_type(asic->irq_nr, IRQT_RISING);
  278. set_irq_data(asic->irq_nr, asic);
  279. return 0;
  280. }
  281. static void asic3_irq_remove(struct platform_device *pdev)
  282. {
  283. struct asic3 *asic = platform_get_drvdata(pdev);
  284. unsigned int irq, irq_base;
  285. irq_base = asic->irq_base;
  286. for (irq = irq_base; irq < irq_base + ASIC3_NR_IRQS; irq++) {
  287. set_irq_flags(irq, 0);
  288. set_irq_handler(irq, NULL);
  289. set_irq_chip(irq, NULL);
  290. set_irq_chip_data(irq, NULL);
  291. }
  292. set_irq_chained_handler(asic->irq_nr, NULL);
  293. }
  294. /* GPIOs */
  295. static inline u32 asic3_get_gpio(struct asic3 *asic, unsigned int base,
  296. unsigned int function)
  297. {
  298. return asic3_read_register(asic, base + function);
  299. }
  300. static void asic3_set_gpio(struct asic3 *asic, unsigned int base,
  301. unsigned int function, u32 bits, u32 val)
  302. {
  303. unsigned long flags;
  304. spin_lock_irqsave(&asic->lock, flags);
  305. val |= (asic3_read_register(asic, base + function) & ~bits);
  306. asic3_write_register(asic, base + function, val);
  307. spin_unlock_irqrestore(&asic->lock, flags);
  308. }
  309. #define asic3_get_gpio_a(asic, fn) \
  310. asic3_get_gpio(asic, ASIC3_GPIO_A_Base, ASIC3_GPIO_##fn)
  311. #define asic3_get_gpio_b(asic, fn) \
  312. asic3_get_gpio(asic, ASIC3_GPIO_B_Base, ASIC3_GPIO_##fn)
  313. #define asic3_get_gpio_c(asic, fn) \
  314. asic3_get_gpio(asic, ASIC3_GPIO_C_Base, ASIC3_GPIO_##fn)
  315. #define asic3_get_gpio_d(asic, fn) \
  316. asic3_get_gpio(asic, ASIC3_GPIO_D_Base, ASIC3_GPIO_##fn)
  317. #define asic3_set_gpio_a(asic, fn, bits, val) \
  318. asic3_set_gpio(asic, ASIC3_GPIO_A_Base, ASIC3_GPIO_##fn, bits, val)
  319. #define asic3_set_gpio_b(asic, fn, bits, val) \
  320. asic3_set_gpio(asic, ASIC3_GPIO_B_Base, ASIC3_GPIO_##fn, bits, val)
  321. #define asic3_set_gpio_c(asic, fn, bits, val) \
  322. asic3_set_gpio(asic, ASIC3_GPIO_C_Base, ASIC3_GPIO_##fn, bits, val)
  323. #define asic3_set_gpio_d(asic, fn, bits, val) \
  324. asic3_set_gpio(asic, ASIC3_GPIO_D_Base, ASIC3_GPIO_##fn, bits, val)
  325. #define asic3_set_gpio_banks(asic, fn, bits, pdata, field) \
  326. do { \
  327. asic3_set_gpio_a((asic), fn, (bits), (pdata)->gpio_a.field); \
  328. asic3_set_gpio_b((asic), fn, (bits), (pdata)->gpio_b.field); \
  329. asic3_set_gpio_c((asic), fn, (bits), (pdata)->gpio_c.field); \
  330. asic3_set_gpio_d((asic), fn, (bits), (pdata)->gpio_d.field); \
  331. } while (0)
  332. int asic3_gpio_get_value(struct asic3 *asic, unsigned gpio)
  333. {
  334. u32 mask = ASIC3_GPIO_bit(gpio);
  335. switch (gpio >> 4) {
  336. case ASIC3_GPIO_BANK_A:
  337. return asic3_get_gpio_a(asic, Status) & mask;
  338. case ASIC3_GPIO_BANK_B:
  339. return asic3_get_gpio_b(asic, Status) & mask;
  340. case ASIC3_GPIO_BANK_C:
  341. return asic3_get_gpio_c(asic, Status) & mask;
  342. case ASIC3_GPIO_BANK_D:
  343. return asic3_get_gpio_d(asic, Status) & mask;
  344. default:
  345. printk(KERN_ERR "%s: invalid GPIO value 0x%x",
  346. __FUNCTION__, gpio);
  347. return -EINVAL;
  348. }
  349. }
  350. EXPORT_SYMBOL(asic3_gpio_get_value);
  351. void asic3_gpio_set_value(struct asic3 *asic, unsigned gpio, int val)
  352. {
  353. u32 mask = ASIC3_GPIO_bit(gpio);
  354. u32 bitval = 0;
  355. if (val)
  356. bitval = mask;
  357. switch (gpio >> 4) {
  358. case ASIC3_GPIO_BANK_A:
  359. asic3_set_gpio_a(asic, Out, mask, bitval);
  360. return;
  361. case ASIC3_GPIO_BANK_B:
  362. asic3_set_gpio_b(asic, Out, mask, bitval);
  363. return;
  364. case ASIC3_GPIO_BANK_C:
  365. asic3_set_gpio_c(asic, Out, mask, bitval);
  366. return;
  367. case ASIC3_GPIO_BANK_D:
  368. asic3_set_gpio_d(asic, Out, mask, bitval);
  369. return;
  370. default:
  371. printk(KERN_ERR "%s: invalid GPIO value 0x%x",
  372. __FUNCTION__, gpio);
  373. return;
  374. }
  375. }
  376. EXPORT_SYMBOL(asic3_gpio_set_value);
  377. static int asic3_gpio_probe(struct platform_device *pdev)
  378. {
  379. struct asic3_platform_data *pdata = pdev->dev.platform_data;
  380. struct asic3 *asic = platform_get_drvdata(pdev);
  381. asic3_write_register(asic, ASIC3_GPIO_OFFSET(A, Mask), 0xffff);
  382. asic3_write_register(asic, ASIC3_GPIO_OFFSET(B, Mask), 0xffff);
  383. asic3_write_register(asic, ASIC3_GPIO_OFFSET(C, Mask), 0xffff);
  384. asic3_write_register(asic, ASIC3_GPIO_OFFSET(D, Mask), 0xffff);
  385. asic3_set_gpio_a(asic, SleepMask, 0xffff, 0xffff);
  386. asic3_set_gpio_b(asic, SleepMask, 0xffff, 0xffff);
  387. asic3_set_gpio_c(asic, SleepMask, 0xffff, 0xffff);
  388. asic3_set_gpio_d(asic, SleepMask, 0xffff, 0xffff);
  389. if (pdata) {
  390. asic3_set_gpio_banks(asic, Out, 0xffff, pdata, init);
  391. asic3_set_gpio_banks(asic, Direction, 0xffff, pdata, dir);
  392. asic3_set_gpio_banks(asic, SleepMask, 0xffff, pdata,
  393. sleep_mask);
  394. asic3_set_gpio_banks(asic, SleepOut, 0xffff, pdata, sleep_out);
  395. asic3_set_gpio_banks(asic, BattFaultOut, 0xffff, pdata,
  396. batt_fault_out);
  397. asic3_set_gpio_banks(asic, SleepConf, 0xffff, pdata,
  398. sleep_conf);
  399. asic3_set_gpio_banks(asic, AltFunction, 0xffff, pdata,
  400. alt_function);
  401. }
  402. return 0;
  403. }
  404. static void asic3_gpio_remove(struct platform_device *pdev)
  405. {
  406. return;
  407. }
  408. /* Core */
  409. static int asic3_probe(struct platform_device *pdev)
  410. {
  411. struct asic3_platform_data *pdata = pdev->dev.platform_data;
  412. struct asic3 *asic;
  413. struct resource *mem;
  414. unsigned long clksel;
  415. int ret;
  416. asic = kzalloc(sizeof(struct asic3), GFP_KERNEL);
  417. if (!asic)
  418. return -ENOMEM;
  419. spin_lock_init(&asic->lock);
  420. platform_set_drvdata(pdev, asic);
  421. asic->dev = &pdev->dev;
  422. mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  423. if (!mem) {
  424. ret = -ENOMEM;
  425. printk(KERN_ERR "asic3: no MEM resource\n");
  426. goto err_out_1;
  427. }
  428. asic->mapping = ioremap(mem->start, PAGE_SIZE);
  429. if (!asic->mapping) {
  430. ret = -ENOMEM;
  431. printk(KERN_ERR "asic3: couldn't ioremap\n");
  432. goto err_out_1;
  433. }
  434. asic->irq_base = pdata->irq_base;
  435. if (pdata && pdata->bus_shift)
  436. asic->bus_shift = 2 - pdata->bus_shift;
  437. else
  438. asic->bus_shift = 0;
  439. clksel = 0;
  440. asic3_write_register(asic, ASIC3_OFFSET(CLOCK, SEL), clksel);
  441. ret = asic3_irq_probe(pdev);
  442. if (ret < 0) {
  443. printk(KERN_ERR "asic3: couldn't probe IRQs\n");
  444. goto err_out_2;
  445. }
  446. asic3_gpio_probe(pdev);
  447. if (pdata->children) {
  448. int i;
  449. for (i = 0; i < pdata->n_children; i++) {
  450. pdata->children[i]->dev.parent = &pdev->dev;
  451. platform_device_register(pdata->children[i]);
  452. }
  453. }
  454. printk(KERN_INFO "ASIC3 Core driver\n");
  455. return 0;
  456. err_out_2:
  457. iounmap(asic->mapping);
  458. err_out_1:
  459. kfree(asic);
  460. return ret;
  461. }
  462. static int asic3_remove(struct platform_device *pdev)
  463. {
  464. struct asic3 *asic = platform_get_drvdata(pdev);
  465. asic3_gpio_remove(pdev);
  466. asic3_irq_remove(pdev);
  467. asic3_write_register(asic, ASIC3_OFFSET(CLOCK, SEL), 0);
  468. iounmap(asic->mapping);
  469. kfree(asic);
  470. return 0;
  471. }
  472. static void asic3_shutdown(struct platform_device *pdev)
  473. {
  474. }
  475. static struct platform_driver asic3_device_driver = {
  476. .driver = {
  477. .name = "asic3",
  478. },
  479. .probe = asic3_probe,
  480. .remove = __devexit_p(asic3_remove),
  481. .shutdown = asic3_shutdown,
  482. };
  483. static int __init asic3_init(void)
  484. {
  485. int retval = 0;
  486. retval = platform_driver_register(&asic3_device_driver);
  487. return retval;
  488. }
  489. subsys_initcall(asic3_init);