irq.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  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 <mach/irqs.h>
  25. #include <mach/hardware.h>
  26. #include <mach/platform.h>
  27. #include "common.h"
  28. /*
  29. * Default value representing the Activation polarity of all internal
  30. * interrupt sources
  31. */
  32. #define MIC_APR_DEFAULT 0x3FF0EFE0
  33. #define SIC1_APR_DEFAULT 0xFBD27186
  34. #define SIC2_APR_DEFAULT 0x801810C0
  35. /*
  36. * Default value representing the Activation Type of all internal
  37. * interrupt sources. All are level sensitive.
  38. */
  39. #define MIC_ATR_DEFAULT 0x00000000
  40. #define SIC1_ATR_DEFAULT 0x00026000
  41. #define SIC2_ATR_DEFAULT 0x00000000
  42. struct lpc32xx_event_group_regs {
  43. void __iomem *enab_reg;
  44. void __iomem *edge_reg;
  45. void __iomem *maskstat_reg;
  46. void __iomem *rawstat_reg;
  47. };
  48. static const struct lpc32xx_event_group_regs lpc32xx_event_int_regs = {
  49. .enab_reg = LPC32XX_CLKPWR_INT_ER,
  50. .edge_reg = LPC32XX_CLKPWR_INT_AP,
  51. .maskstat_reg = LPC32XX_CLKPWR_INT_SR,
  52. .rawstat_reg = LPC32XX_CLKPWR_INT_RS,
  53. };
  54. static const struct lpc32xx_event_group_regs lpc32xx_event_pin_regs = {
  55. .enab_reg = LPC32XX_CLKPWR_PIN_ER,
  56. .edge_reg = LPC32XX_CLKPWR_PIN_AP,
  57. .maskstat_reg = LPC32XX_CLKPWR_PIN_SR,
  58. .rawstat_reg = LPC32XX_CLKPWR_PIN_RS,
  59. };
  60. struct lpc32xx_event_info {
  61. const struct lpc32xx_event_group_regs *event_group;
  62. u32 mask;
  63. };
  64. /*
  65. * Maps an IRQ number to and event mask and register
  66. */
  67. static const struct lpc32xx_event_info lpc32xx_events[NR_IRQS] = {
  68. [IRQ_LPC32XX_GPI_08] = {
  69. .event_group = &lpc32xx_event_pin_regs,
  70. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_08_BIT,
  71. },
  72. [IRQ_LPC32XX_GPI_09] = {
  73. .event_group = &lpc32xx_event_pin_regs,
  74. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_09_BIT,
  75. },
  76. [IRQ_LPC32XX_GPI_19] = {
  77. .event_group = &lpc32xx_event_pin_regs,
  78. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_19_BIT,
  79. },
  80. [IRQ_LPC32XX_GPI_07] = {
  81. .event_group = &lpc32xx_event_pin_regs,
  82. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_07_BIT,
  83. },
  84. [IRQ_LPC32XX_GPI_00] = {
  85. .event_group = &lpc32xx_event_pin_regs,
  86. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_00_BIT,
  87. },
  88. [IRQ_LPC32XX_GPI_01] = {
  89. .event_group = &lpc32xx_event_pin_regs,
  90. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_01_BIT,
  91. },
  92. [IRQ_LPC32XX_GPI_02] = {
  93. .event_group = &lpc32xx_event_pin_regs,
  94. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_02_BIT,
  95. },
  96. [IRQ_LPC32XX_GPI_03] = {
  97. .event_group = &lpc32xx_event_pin_regs,
  98. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_03_BIT,
  99. },
  100. [IRQ_LPC32XX_GPI_04] = {
  101. .event_group = &lpc32xx_event_pin_regs,
  102. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_04_BIT,
  103. },
  104. [IRQ_LPC32XX_GPI_05] = {
  105. .event_group = &lpc32xx_event_pin_regs,
  106. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_05_BIT,
  107. },
  108. [IRQ_LPC32XX_GPI_06] = {
  109. .event_group = &lpc32xx_event_pin_regs,
  110. .mask = LPC32XX_CLKPWR_EXTSRC_GPI_06_BIT,
  111. },
  112. [IRQ_LPC32XX_GPIO_00] = {
  113. .event_group = &lpc32xx_event_int_regs,
  114. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_00_BIT,
  115. },
  116. [IRQ_LPC32XX_GPIO_01] = {
  117. .event_group = &lpc32xx_event_int_regs,
  118. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_01_BIT,
  119. },
  120. [IRQ_LPC32XX_GPIO_02] = {
  121. .event_group = &lpc32xx_event_int_regs,
  122. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_02_BIT,
  123. },
  124. [IRQ_LPC32XX_GPIO_03] = {
  125. .event_group = &lpc32xx_event_int_regs,
  126. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_03_BIT,
  127. },
  128. [IRQ_LPC32XX_GPIO_04] = {
  129. .event_group = &lpc32xx_event_int_regs,
  130. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_04_BIT,
  131. },
  132. [IRQ_LPC32XX_GPIO_05] = {
  133. .event_group = &lpc32xx_event_int_regs,
  134. .mask = LPC32XX_CLKPWR_INTSRC_GPIO_05_BIT,
  135. },
  136. [IRQ_LPC32XX_KEY] = {
  137. .event_group = &lpc32xx_event_int_regs,
  138. .mask = LPC32XX_CLKPWR_INTSRC_KEY_BIT,
  139. },
  140. [IRQ_LPC32XX_USB_OTG_ATX] = {
  141. .event_group = &lpc32xx_event_int_regs,
  142. .mask = LPC32XX_CLKPWR_INTSRC_USBATXINT_BIT,
  143. },
  144. [IRQ_LPC32XX_USB_HOST] = {
  145. .event_group = &lpc32xx_event_int_regs,
  146. .mask = LPC32XX_CLKPWR_INTSRC_USB_BIT,
  147. },
  148. [IRQ_LPC32XX_RTC] = {
  149. .event_group = &lpc32xx_event_int_regs,
  150. .mask = LPC32XX_CLKPWR_INTSRC_RTC_BIT,
  151. },
  152. [IRQ_LPC32XX_MSTIMER] = {
  153. .event_group = &lpc32xx_event_int_regs,
  154. .mask = LPC32XX_CLKPWR_INTSRC_MSTIMER_BIT,
  155. },
  156. [IRQ_LPC32XX_TS_AUX] = {
  157. .event_group = &lpc32xx_event_int_regs,
  158. .mask = LPC32XX_CLKPWR_INTSRC_TS_AUX_BIT,
  159. },
  160. [IRQ_LPC32XX_TS_P] = {
  161. .event_group = &lpc32xx_event_int_regs,
  162. .mask = LPC32XX_CLKPWR_INTSRC_TS_P_BIT,
  163. },
  164. [IRQ_LPC32XX_TS_IRQ] = {
  165. .event_group = &lpc32xx_event_int_regs,
  166. .mask = LPC32XX_CLKPWR_INTSRC_ADC_BIT,
  167. },
  168. };
  169. static void get_controller(unsigned int irq, unsigned int *base,
  170. unsigned int *irqbit)
  171. {
  172. if (irq < 32) {
  173. *base = LPC32XX_MIC_BASE;
  174. *irqbit = 1 << irq;
  175. } else if (irq < 64) {
  176. *base = LPC32XX_SIC1_BASE;
  177. *irqbit = 1 << (irq - 32);
  178. } else {
  179. *base = LPC32XX_SIC2_BASE;
  180. *irqbit = 1 << (irq - 64);
  181. }
  182. }
  183. static void lpc32xx_mask_irq(unsigned int irq)
  184. {
  185. unsigned int reg, ctrl, mask;
  186. get_controller(irq, &ctrl, &mask);
  187. reg = __raw_readl(LPC32XX_INTC_MASK(ctrl)) & ~mask;
  188. __raw_writel(reg, LPC32XX_INTC_MASK(ctrl));
  189. }
  190. static void lpc32xx_unmask_irq(unsigned int irq)
  191. {
  192. unsigned int reg, ctrl, mask;
  193. get_controller(irq, &ctrl, &mask);
  194. reg = __raw_readl(LPC32XX_INTC_MASK(ctrl)) | mask;
  195. __raw_writel(reg, LPC32XX_INTC_MASK(ctrl));
  196. }
  197. static void lpc32xx_ack_irq(unsigned int irq)
  198. {
  199. unsigned int ctrl, mask;
  200. get_controller(irq, &ctrl, &mask);
  201. __raw_writel(mask, LPC32XX_INTC_RAW_STAT(ctrl));
  202. /* Also need to clear pending wake event */
  203. if (lpc32xx_events[irq].mask != 0)
  204. __raw_writel(lpc32xx_events[irq].mask,
  205. lpc32xx_events[irq].event_group->rawstat_reg);
  206. }
  207. static void __lpc32xx_set_irq_type(unsigned int irq, int use_high_level,
  208. int use_edge)
  209. {
  210. unsigned int reg, ctrl, mask;
  211. get_controller(irq, &ctrl, &mask);
  212. /* Activation level, high or low */
  213. reg = __raw_readl(LPC32XX_INTC_POLAR(ctrl));
  214. if (use_high_level)
  215. reg |= mask;
  216. else
  217. reg &= ~mask;
  218. __raw_writel(reg, LPC32XX_INTC_POLAR(ctrl));
  219. /* Activation type, edge or level */
  220. reg = __raw_readl(LPC32XX_INTC_ACT_TYPE(ctrl));
  221. if (use_edge)
  222. reg |= mask;
  223. else
  224. reg &= ~mask;
  225. __raw_writel(reg, LPC32XX_INTC_ACT_TYPE(ctrl));
  226. /* Use same polarity for the wake events */
  227. if (lpc32xx_events[irq].mask != 0) {
  228. reg = __raw_readl(lpc32xx_events[irq].event_group->edge_reg);
  229. if (use_high_level)
  230. reg |= lpc32xx_events[irq].mask;
  231. else
  232. reg &= ~lpc32xx_events[irq].mask;
  233. __raw_writel(reg, lpc32xx_events[irq].event_group->edge_reg);
  234. }
  235. }
  236. static int lpc32xx_set_irq_type(unsigned int irq, unsigned int type)
  237. {
  238. switch (type) {
  239. case IRQ_TYPE_EDGE_RISING:
  240. /* Rising edge sensitive */
  241. __lpc32xx_set_irq_type(irq, 1, 1);
  242. break;
  243. case IRQ_TYPE_EDGE_FALLING:
  244. /* Falling edge sensitive */
  245. __lpc32xx_set_irq_type(irq, 0, 1);
  246. break;
  247. case IRQ_TYPE_LEVEL_LOW:
  248. /* Low level sensitive */
  249. __lpc32xx_set_irq_type(irq, 0, 0);
  250. break;
  251. case IRQ_TYPE_LEVEL_HIGH:
  252. /* High level sensitive */
  253. __lpc32xx_set_irq_type(irq, 1, 0);
  254. break;
  255. /* Other modes are not supported */
  256. default:
  257. return -EINVAL;
  258. }
  259. /* Ok to use the level handler for all types */
  260. set_irq_handler(irq, handle_level_irq);
  261. return 0;
  262. }
  263. static int lpc32xx_irq_wake(unsigned int irqno, unsigned int state)
  264. {
  265. unsigned long eventreg;
  266. if (lpc32xx_events[irqno].mask != 0) {
  267. eventreg = __raw_readl(lpc32xx_events[irqno].
  268. event_group->enab_reg);
  269. if (state)
  270. eventreg |= lpc32xx_events[irqno].mask;
  271. else
  272. eventreg &= ~lpc32xx_events[irqno].mask;
  273. __raw_writel(eventreg,
  274. lpc32xx_events[irqno].event_group->enab_reg);
  275. return 0;
  276. }
  277. /* Clear event */
  278. __raw_writel(lpc32xx_events[irqno].mask,
  279. lpc32xx_events[irqno].event_group->rawstat_reg);
  280. return -ENODEV;
  281. }
  282. static void __init lpc32xx_set_default_mappings(unsigned int apr,
  283. unsigned int atr, unsigned int offset)
  284. {
  285. unsigned int i;
  286. /* Set activation levels for each interrupt */
  287. i = 0;
  288. while (i < 32) {
  289. __lpc32xx_set_irq_type(offset + i, ((apr >> i) & 0x1),
  290. ((atr >> i) & 0x1));
  291. i++;
  292. }
  293. }
  294. static struct irq_chip lpc32xx_irq_chip = {
  295. .ack = lpc32xx_ack_irq,
  296. .mask = lpc32xx_mask_irq,
  297. .unmask = lpc32xx_unmask_irq,
  298. .set_type = lpc32xx_set_irq_type,
  299. .set_wake = lpc32xx_irq_wake
  300. };
  301. static void lpc32xx_sic1_handler(unsigned int irq, struct irq_desc *desc)
  302. {
  303. unsigned long ints = __raw_readl(LPC32XX_INTC_STAT(LPC32XX_SIC1_BASE));
  304. while (ints != 0) {
  305. int irqno = fls(ints) - 1;
  306. ints &= ~(1 << irqno);
  307. generic_handle_irq(LPC32XX_SIC1_IRQ(irqno));
  308. }
  309. }
  310. static void lpc32xx_sic2_handler(unsigned int irq, struct irq_desc *desc)
  311. {
  312. unsigned long ints = __raw_readl(LPC32XX_INTC_STAT(LPC32XX_SIC2_BASE));
  313. while (ints != 0) {
  314. int irqno = fls(ints) - 1;
  315. ints &= ~(1 << irqno);
  316. generic_handle_irq(LPC32XX_SIC2_IRQ(irqno));
  317. }
  318. }
  319. void __init lpc32xx_init_irq(void)
  320. {
  321. unsigned int i;
  322. /* Setup MIC */
  323. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE));
  324. __raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_MIC_BASE));
  325. __raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_MIC_BASE));
  326. /* Setup SIC1 */
  327. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE));
  328. __raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE));
  329. __raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE));
  330. /* Setup SIC2 */
  331. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE));
  332. __raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE));
  333. __raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE));
  334. /* Configure supported IRQ's */
  335. for (i = 0; i < NR_IRQS; i++) {
  336. set_irq_chip(i, &lpc32xx_irq_chip);
  337. set_irq_handler(i, handle_level_irq);
  338. set_irq_flags(i, IRQF_VALID);
  339. }
  340. /* Set default mappings */
  341. lpc32xx_set_default_mappings(MIC_APR_DEFAULT, MIC_ATR_DEFAULT, 0);
  342. lpc32xx_set_default_mappings(SIC1_APR_DEFAULT, SIC1_ATR_DEFAULT, 32);
  343. lpc32xx_set_default_mappings(SIC2_APR_DEFAULT, SIC2_ATR_DEFAULT, 64);
  344. /* mask all interrupts except SUBIRQ */
  345. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE));
  346. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE));
  347. __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE));
  348. /* MIC SUBIRQx interrupts will route handling to the chain handlers */
  349. set_irq_chained_handler(IRQ_LPC32XX_SUB1IRQ, lpc32xx_sic1_handler);
  350. set_irq_chained_handler(IRQ_LPC32XX_SUB2IRQ, lpc32xx_sic2_handler);
  351. /* Initially disable all wake events */
  352. __raw_writel(0, LPC32XX_CLKPWR_P01_ER);
  353. __raw_writel(0, LPC32XX_CLKPWR_INT_ER);
  354. __raw_writel(0, LPC32XX_CLKPWR_PIN_ER);
  355. /*
  356. * Default wake activation polarities, all pin sources are low edge
  357. * triggered
  358. */
  359. __raw_writel(LPC32XX_CLKPWR_INTSRC_TS_P_BIT |
  360. LPC32XX_CLKPWR_INTSRC_MSTIMER_BIT |
  361. LPC32XX_CLKPWR_INTSRC_RTC_BIT,
  362. LPC32XX_CLKPWR_INT_AP);
  363. __raw_writel(0, LPC32XX_CLKPWR_PIN_AP);
  364. /* Clear latched wake event states */
  365. __raw_writel(__raw_readl(LPC32XX_CLKPWR_PIN_RS),
  366. LPC32XX_CLKPWR_PIN_RS);
  367. __raw_writel(__raw_readl(LPC32XX_CLKPWR_INT_RS),
  368. LPC32XX_CLKPWR_INT_RS);
  369. }