irq.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. /*
  2. * arch/arm/mach-lpc32xx/irq.c
  3. *
  4. * Author: Kevin Wells <kevin.wells@nxp.com>
  5. *
  6. * Copyright (C) 2010 NXP Semiconductors
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. */
  18. #include <linux/kernel.h>
  19. #include <linux/types.h>
  20. #include <linux/interrupt.h>
  21. #include <linux/irq.h>
  22. #include <linux/err.h>
  23. #include <linux/io.h>
  24. #include <linux/of.h>
  25. #include <linux/of_address.h>
  26. #include <linux/of_irq.h>
  27. #include <linux/irqdomain.h>
  28. #include <linux/module.h>
  29. #include <mach/irqs.h>
  30. #include <mach/hardware.h>
  31. #include <mach/platform.h>
  32. #include "common.h"
  33. /*
  34. * Default value representing the Activation polarity of all internal
  35. * interrupt sources
  36. */
  37. #define MIC_APR_DEFAULT 0x3FF0EFE0
  38. #define SIC1_APR_DEFAULT 0xFBD27186
  39. #define SIC2_APR_DEFAULT 0x801810C0
  40. /*
  41. * Default value representing the Activation Type of all internal
  42. * interrupt sources. All are level sensitive.
  43. */
  44. #define MIC_ATR_DEFAULT 0x00000000
  45. #define SIC1_ATR_DEFAULT 0x00026000
  46. #define SIC2_ATR_DEFAULT 0x00000000
  47. static struct irq_domain *lpc32xx_mic_domain;
  48. static struct device_node *lpc32xx_mic_np;
  49. struct lpc32xx_event_group_regs {
  50. void __iomem *enab_reg;
  51. void __iomem *edge_reg;
  52. void __iomem *maskstat_reg;
  53. void __iomem *rawstat_reg;
  54. };
  55. static const struct lpc32xx_event_group_regs lpc32xx_event_int_regs = {
  56. .enab_reg = LPC32XX_CLKPWR_INT_ER,
  57. .edge_reg = LPC32XX_CLKPWR_INT_AP,
  58. .maskstat_reg = LPC32XX_CLKPWR_INT_SR,
  59. .rawstat_reg = LPC32XX_CLKPWR_INT_RS,
  60. };
  61. static const struct lpc32xx_event_group_regs lpc32xx_event_pin_regs = {
  62. .enab_reg = LPC32XX_CLKPWR_PIN_ER,
  63. .edge_reg = LPC32XX_CLKPWR_PIN_AP,
  64. .maskstat_reg = LPC32XX_CLKPWR_PIN_SR,
  65. .rawstat_reg = LPC32XX_CLKPWR_PIN_RS,
  66. };
  67. struct lpc32xx_event_info {
  68. const struct lpc32xx_event_group_regs *event_group;
  69. u32 mask;
  70. };
  71. /*
  72. * Maps an IRQ number to and event mask and register
  73. */
  74. static const struct lpc32xx_event_info lpc32xx_events[NR_IRQS] = {
  75. [IRQ_LPC32XX_GPI_08] = {
  76. .event_group = &lpc32xx_event_pin_regs,
  77. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_08_BIT,
  78. },
  79. [IRQ_LPC32XX_GPI_09] = {
  80. .event_group = &lpc32xx_event_pin_regs,
  81. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_09_BIT,
  82. },
  83. [IRQ_LPC32XX_GPI_19] = {
  84. .event_group = &lpc32xx_event_pin_regs,
  85. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_19_BIT,
  86. },
  87. [IRQ_LPC32XX_GPI_07] = {
  88. .event_group = &lpc32xx_event_pin_regs,
  89. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_07_BIT,
  90. },
  91. [IRQ_LPC32XX_GPI_00] = {
  92. .event_group = &lpc32xx_event_pin_regs,
  93. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_00_BIT,
  94. },
  95. [IRQ_LPC32XX_GPI_01] = {
  96. .event_group = &lpc32xx_event_pin_regs,
  97. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_01_BIT,
  98. },
  99. [IRQ_LPC32XX_GPI_02] = {
  100. .event_group = &lpc32xx_event_pin_regs,
  101. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_02_BIT,
  102. },
  103. [IRQ_LPC32XX_GPI_03] = {
  104. .event_group = &lpc32xx_event_pin_regs,
  105. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_03_BIT,
  106. },
  107. [IRQ_LPC32XX_GPI_04] = {
  108. .event_group = &lpc32xx_event_pin_regs,
  109. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_04_BIT,
  110. },
  111. [IRQ_LPC32XX_GPI_05] = {
  112. .event_group = &lpc32xx_event_pin_regs,
  113. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_05_BIT,
  114. },
  115. [IRQ_LPC32XX_GPI_06] = {
  116. .event_group = &lpc32xx_event_pin_regs,
  117. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_06_BIT,
  118. },
  119. [IRQ_LPC32XX_GPI_28] = {
  120. .event_group = &lpc32xx_event_pin_regs,
  121. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_28_BIT,
  122. },
  123. [IRQ_LPC32XX_GPIO_00] = {
  124. .event_group = &lpc32xx_event_int_regs,
  125. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_00_BIT,
  126. },
  127. [IRQ_LPC32XX_GPIO_01] = {
  128. .event_group = &lpc32xx_event_int_regs,
  129. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_01_BIT,
  130. },
  131. [IRQ_LPC32XX_GPIO_02] = {
  132. .event_group = &lpc32xx_event_int_regs,
  133. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_02_BIT,
  134. },
  135. [IRQ_LPC32XX_GPIO_03] = {
  136. .event_group = &lpc32xx_event_int_regs,
  137. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_03_BIT,
  138. },
  139. [IRQ_LPC32XX_GPIO_04] = {
  140. .event_group = &lpc32xx_event_int_regs,
  141. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_04_BIT,
  142. },
  143. [IRQ_LPC32XX_GPIO_05] = {
  144. .event_group = &lpc32xx_event_int_regs,
  145. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_05_BIT,
  146. },
  147. [IRQ_LPC32XX_KEY] = {
  148. .event_group = &lpc32xx_event_int_regs,
  149. .mask = LPC32XX_CLKPWR_INTSRC_KEY_BIT,
  150. },
  151. [IRQ_LPC32XX_ETHERNET] = {
  152. .event_group = &lpc32xx_event_int_regs,
  153. .mask = LPC32XX_CLKPWR_INTSRC_MAC_BIT,
  154. },
  155. [IRQ_LPC32XX_USB_OTG_ATX] = {
  156. .event_group = &lpc32xx_event_int_regs,
  157. .mask = LPC32XX_CLKPWR_INTSRC_USBATXINT_BIT,
  158. },
  159. [IRQ_LPC32XX_USB_HOST] = {
  160. .event_group = &lpc32xx_event_int_regs,
  161. .mask = LPC32XX_CLKPWR_INTSRC_USB_BIT,
  162. },
  163. [IRQ_LPC32XX_RTC] = {
  164. .event_group = &lpc32xx_event_int_regs,
  165. .mask = LPC32XX_CLKPWR_INTSRC_RTC_BIT,
  166. },
  167. [IRQ_LPC32XX_MSTIMER] = {
  168. .event_group = &lpc32xx_event_int_regs,
  169. .mask = LPC32XX_CLKPWR_INTSRC_MSTIMER_BIT,
  170. },
  171. [IRQ_LPC32XX_TS_AUX] = {
  172. .event_group = &lpc32xx_event_int_regs,
  173. .mask = LPC32XX_CLKPWR_INTSRC_TS_AUX_BIT,
  174. },
  175. [IRQ_LPC32XX_TS_P] = {
  176. .event_group = &lpc32xx_event_int_regs,
  177. .mask = LPC32XX_CLKPWR_INTSRC_TS_P_BIT,
  178. },
  179. [IRQ_LPC32XX_TS_IRQ] = {
  180. .event_group = &lpc32xx_event_int_regs,
  181. .mask = LPC32XX_CLKPWR_INTSRC_ADC_BIT,
  182. },
  183. };
  184. static void get_controller(unsigned int irq, unsigned int *base,
  185. unsigned int *irqbit)
  186. {
  187. if (irq < 32) {
  188. *base = LPC32XX_MIC_BASE;
  189. *irqbit = 1 << irq;
  190. } else if (irq < 64) {
  191. *base = LPC32XX_SIC1_BASE;
  192. *irqbit = 1 << (irq - 32);
  193. } else {
  194. *base = LPC32XX_SIC2_BASE;
  195. *irqbit = 1 << (irq - 64);
  196. }
  197. }
  198. static void lpc32xx_mask_irq(struct irq_data *d)
  199. {
  200. unsigned int reg, ctrl, mask;
  201. get_controller(d->hwirq, &ctrl, &mask);
  202. reg = __raw_readl(LPC32XX_INTC_MASK(ctrl)) & ~mask;
  203. __raw_writel(reg, LPC32XX_INTC_MASK(ctrl));
  204. }
  205. static void lpc32xx_unmask_irq(struct irq_data *d)
  206. {
  207. unsigned int reg, ctrl, mask;
  208. get_controller(d->hwirq, &ctrl, &mask);
  209. reg = __raw_readl(LPC32XX_INTC_MASK(ctrl)) | mask;
  210. __raw_writel(reg, LPC32XX_INTC_MASK(ctrl));
  211. }
  212. static void lpc32xx_ack_irq(struct irq_data *d)
  213. {
  214. unsigned int ctrl, mask;
  215. get_controller(d->hwirq, &ctrl, &mask);
  216. __raw_writel(mask, LPC32XX_INTC_RAW_STAT(ctrl));
  217. /* Also need to clear pending wake event */
  218. if (lpc32xx_events[d->hwirq].mask != 0)
  219. __raw_writel(lpc32xx_events[d->hwirq].mask,
  220. lpc32xx_events[d->hwirq].event_group->rawstat_reg);
  221. }
  222. static void __lpc32xx_set_irq_type(unsigned int irq, int use_high_level,
  223. int use_edge)
  224. {
  225. unsigned int reg, ctrl, mask;
  226. get_controller(irq, &ctrl, &mask);
  227. /* Activation level, high or low */
  228. reg = __raw_readl(LPC32XX_INTC_POLAR(ctrl));
  229. if (use_high_level)
  230. reg |= mask;
  231. else
  232. reg &= ~mask;
  233. __raw_writel(reg, LPC32XX_INTC_POLAR(ctrl));
  234. /* Activation type, edge or level */
  235. reg = __raw_readl(LPC32XX_INTC_ACT_TYPE(ctrl));
  236. if (use_edge)
  237. reg |= mask;
  238. else
  239. reg &= ~mask;
  240. __raw_writel(reg, LPC32XX_INTC_ACT_TYPE(ctrl));
  241. /* Use same polarity for the wake events */
  242. if (lpc32xx_events[irq].mask != 0) {
  243. reg = __raw_readl(lpc32xx_events[irq].event_group->edge_reg);
  244. if (use_high_level)
  245. reg |= lpc32xx_events[irq].mask;
  246. else
  247. reg &= ~lpc32xx_events[irq].mask;
  248. __raw_writel(reg, lpc32xx_events[irq].event_group->edge_reg);
  249. }
  250. }
  251. static int lpc32xx_set_irq_type(struct irq_data *d, unsigned int type)
  252. {
  253. switch (type) {
  254. case IRQ_TYPE_EDGE_RISING:
  255. /* Rising edge sensitive */
  256. __lpc32xx_set_irq_type(d->hwirq, 1, 1);
  257. break;
  258. case IRQ_TYPE_EDGE_FALLING:
  259. /* Falling edge sensitive */
  260. __lpc32xx_set_irq_type(d->hwirq, 0, 1);
  261. break;
  262. case IRQ_TYPE_LEVEL_LOW:
  263. /* Low level sensitive */
  264. __lpc32xx_set_irq_type(d->hwirq, 0, 0);
  265. break;
  266. case IRQ_TYPE_LEVEL_HIGH:
  267. /* High level sensitive */
  268. __lpc32xx_set_irq_type(d->hwirq, 1, 0);
  269. break;
  270. /* Other modes are not supported */
  271. default:
  272. return -EINVAL;
  273. }
  274. /* Ok to use the level handler for all types */
  275. irq_set_handler(d->hwirq, handle_level_irq);
  276. return 0;
  277. }
  278. static int lpc32xx_irq_wake(struct irq_data *d, unsigned int state)
  279. {
  280. unsigned long eventreg;
  281. if (lpc32xx_events[d->hwirq].mask != 0) {
  282. eventreg = __raw_readl(lpc32xx_events[d->hwirq].
  283. event_group->enab_reg);
  284. if (state)
  285. eventreg |= lpc32xx_events[d->hwirq].mask;
  286. else {
  287. eventreg &= ~lpc32xx_events[d->hwirq].mask;
  288. /*
  289. * When disabling the wakeup, clear the latched
  290. * event
  291. */
  292. __raw_writel(lpc32xx_events[d->hwirq].mask,
  293. lpc32xx_events[d->hwirq].
  294. event_group->rawstat_reg);
  295. }
  296. __raw_writel(eventreg,
  297. lpc32xx_events[d->hwirq].event_group->enab_reg);
  298. return 0;
  299. }
  300. /* Clear event */
  301. __raw_writel(lpc32xx_events[d->hwirq].mask,
  302. lpc32xx_events[d->hwirq].event_group->rawstat_reg);
  303. return -ENODEV;
  304. }
  305. static void __init lpc32xx_set_default_mappings(unsigned int apr,
  306. unsigned int atr, unsigned int offset)
  307. {
  308. unsigned int i;
  309. /* Set activation levels for each interrupt */
  310. i = 0;
  311. while (i < 32) {
  312. __lpc32xx_set_irq_type(offset + i, ((apr >> i) & 0x1),
  313. ((atr >> i) & 0x1));
  314. i++;
  315. }
  316. }
  317. static struct irq_chip lpc32xx_irq_chip = {
  318. .name = "MIC",
  319. .irq_ack = lpc32xx_ack_irq,
  320. .irq_mask = lpc32xx_mask_irq,
  321. .irq_unmask = lpc32xx_unmask_irq,
  322. .irq_set_type = lpc32xx_set_irq_type,
  323. .irq_set_wake = lpc32xx_irq_wake
  324. };
  325. static void lpc32xx_sic1_handler(unsigned int irq, struct irq_desc *desc)
  326. {
  327. unsigned long ints = __raw_readl(LPC32XX_INTC_STAT(LPC32XX_SIC1_BASE));
  328. while (ints != 0) {
  329. int irqno = fls(ints) - 1;
  330. ints &= ~(1 << irqno);
  331. generic_handle_irq(LPC32XX_SIC1_IRQ(irqno));
  332. }
  333. }
  334. static void lpc32xx_sic2_handler(unsigned int irq, struct irq_desc *desc)
  335. {
  336. unsigned long ints = __raw_readl(LPC32XX_INTC_STAT(LPC32XX_SIC2_BASE));
  337. while (ints != 0) {
  338. int irqno = fls(ints) - 1;
  339. ints &= ~(1 << irqno);
  340. generic_handle_irq(LPC32XX_SIC2_IRQ(irqno));
  341. }
  342. }
  343. static int __init __lpc32xx_mic_of_init(struct device_node *node,
  344. struct device_node *parent)
  345. {
  346. lpc32xx_mic_np = node;
  347. return 0;
  348. }
  349. static const struct of_device_id mic_of_match[] __initconst = {
  350. { .compatible = "nxp,lpc3220-mic", .data = __lpc32xx_mic_of_init },
  351. { }
  352. };
  353. void __init lpc32xx_init_irq(void)
  354. {
  355. unsigned int i;
  356. int irq_base;
  357. /* Setup MIC */
  358. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE));
  359. __raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_MIC_BASE));
  360. __raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_MIC_BASE));
  361. /* Setup SIC1 */
  362. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE));
  363. __raw_writel(SIC1_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE));
  364. __raw_writel(SIC1_ATR_DEFAULT,
  365. LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE));
  366. /* Setup SIC2 */
  367. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE));
  368. __raw_writel(SIC2_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE));
  369. __raw_writel(SIC2_ATR_DEFAULT,
  370. LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE));
  371. /* Configure supported IRQ's */
  372. for (i = 0; i < NR_IRQS; i++) {
  373. irq_set_chip_and_handler(i, &lpc32xx_irq_chip,
  374. handle_level_irq);
  375. set_irq_flags(i, IRQF_VALID);
  376. }
  377. /* Set default mappings */
  378. lpc32xx_set_default_mappings(MIC_APR_DEFAULT, MIC_ATR_DEFAULT, 0);
  379. lpc32xx_set_default_mappings(SIC1_APR_DEFAULT, SIC1_ATR_DEFAULT, 32);
  380. lpc32xx_set_default_mappings(SIC2_APR_DEFAULT, SIC2_ATR_DEFAULT, 64);
  381. /* mask all interrupts except SUBIRQ */
  382. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE));
  383. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE));
  384. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE));
  385. /* MIC SUBIRQx interrupts will route handling to the chain handlers */
  386. irq_set_chained_handler(IRQ_LPC32XX_SUB1IRQ, lpc32xx_sic1_handler);
  387. irq_set_chained_handler(IRQ_LPC32XX_SUB2IRQ, lpc32xx_sic2_handler);
  388. /* Initially disable all wake events */
  389. __raw_writel(0, LPC32XX_CLKPWR_P01_ER);
  390. __raw_writel(0, LPC32XX_CLKPWR_INT_ER);
  391. __raw_writel(0, LPC32XX_CLKPWR_PIN_ER);
  392. /*
  393. * Default wake activation polarities, all pin sources are low edge
  394. * triggered
  395. */
  396. __raw_writel(LPC32XX_CLKPWR_INTSRC_TS_P_BIT |
  397. LPC32XX_CLKPWR_INTSRC_MSTIMER_BIT |
  398. LPC32XX_CLKPWR_INTSRC_RTC_BIT,
  399. LPC32XX_CLKPWR_INT_AP);
  400. __raw_writel(0, LPC32XX_CLKPWR_PIN_AP);
  401. /* Clear latched wake event states */
  402. __raw_writel(__raw_readl(LPC32XX_CLKPWR_PIN_RS),
  403. LPC32XX_CLKPWR_PIN_RS);
  404. __raw_writel(__raw_readl(LPC32XX_CLKPWR_INT_RS),
  405. LPC32XX_CLKPWR_INT_RS);
  406. of_irq_init(mic_of_match);
  407. irq_base = irq_alloc_descs(-1, 0, NR_IRQS, 0);
  408. if (irq_base < 0) {
  409. pr_warn("Cannot allocate irq_descs, assuming pre-allocated\n");
  410. irq_base = 0;
  411. }
  412. lpc32xx_mic_domain = irq_domain_add_legacy(lpc32xx_mic_np, NR_IRQS,
  413. irq_base, 0,
  414. &irq_domain_simple_ops,
  415. NULL);
  416. if (!lpc32xx_mic_domain)
  417. panic("Unable to add MIC irq domain\n");
  418. }