irq.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. /*
  2. * BRIEF MODULE DESCRIPTION
  3. * Au1000 interrupt routines.
  4. *
  5. * Copyright 2001 MontaVista Software Inc.
  6. * Author: MontaVista Software, Inc.
  7. * ppopov@mvista.com or source@mvista.com
  8. *
  9. * This program is free software; you can redistribute it and/or modify it
  10. * under the terms of the GNU General Public License as published by the
  11. * Free Software Foundation; either version 2 of the License, or (at your
  12. * option) any later version.
  13. *
  14. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  15. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  16. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
  17. * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  18. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  19. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  20. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  21. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  22. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  23. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. *
  25. * You should have received a copy of the GNU General Public License along
  26. * with this program; if not, write to the Free Software Foundation, Inc.,
  27. * 675 Mass Ave, Cambridge, MA 02139, USA.
  28. */
  29. #include <linux/errno.h>
  30. #include <linux/init.h>
  31. #include <linux/irq.h>
  32. #include <linux/kernel_stat.h>
  33. #include <linux/module.h>
  34. #include <linux/signal.h>
  35. #include <linux/sched.h>
  36. #include <linux/types.h>
  37. #include <linux/interrupt.h>
  38. #include <linux/ioport.h>
  39. #include <linux/timex.h>
  40. #include <linux/slab.h>
  41. #include <linux/random.h>
  42. #include <linux/delay.h>
  43. #include <linux/bitops.h>
  44. #include <asm/bootinfo.h>
  45. #include <asm/io.h>
  46. #include <asm/mipsregs.h>
  47. #include <asm/system.h>
  48. #include <asm/mach-au1x00/au1000.h>
  49. #ifdef CONFIG_MIPS_PB1000
  50. #include <asm/mach-pb1x00/pb1000.h>
  51. #endif
  52. #undef DEBUG_IRQ
  53. #ifdef DEBUG_IRQ
  54. /* note: prints function name for you */
  55. #define DPRINTK(fmt, args...) printk("%s: " fmt, __FUNCTION__ , ## args)
  56. #else
  57. #define DPRINTK(fmt, args...)
  58. #endif
  59. #define EXT_INTC0_REQ0 2 /* IP 2 */
  60. #define EXT_INTC0_REQ1 3 /* IP 3 */
  61. #define EXT_INTC1_REQ0 4 /* IP 4 */
  62. #define EXT_INTC1_REQ1 5 /* IP 5 */
  63. #define MIPS_TIMER_IP 7 /* IP 7 */
  64. extern void set_debug_traps(void);
  65. extern irq_cpustat_t irq_stat [NR_CPUS];
  66. extern void mips_timer_interrupt(void);
  67. static void setup_local_irq(unsigned int irq, int type, int int_req);
  68. static unsigned int startup_irq(unsigned int irq);
  69. static void end_irq(unsigned int irq_nr);
  70. static inline void mask_and_ack_level_irq(unsigned int irq_nr);
  71. static inline void mask_and_ack_rise_edge_irq(unsigned int irq_nr);
  72. static inline void mask_and_ack_fall_edge_irq(unsigned int irq_nr);
  73. static inline void mask_and_ack_either_edge_irq(unsigned int irq_nr);
  74. inline void local_enable_irq(unsigned int irq_nr);
  75. inline void local_disable_irq(unsigned int irq_nr);
  76. void (*board_init_irq)(void);
  77. static DEFINE_SPINLOCK(irq_lock);
  78. static unsigned int startup_irq(unsigned int irq_nr)
  79. {
  80. local_enable_irq(irq_nr);
  81. return 0;
  82. }
  83. static void shutdown_irq(unsigned int irq_nr)
  84. {
  85. local_disable_irq(irq_nr);
  86. return;
  87. }
  88. inline void local_enable_irq(unsigned int irq_nr)
  89. {
  90. if (irq_nr > AU1000_LAST_INTC0_INT) {
  91. au_writel(1<<(irq_nr-32), IC1_MASKSET);
  92. au_writel(1<<(irq_nr-32), IC1_WAKESET);
  93. }
  94. else {
  95. au_writel(1<<irq_nr, IC0_MASKSET);
  96. au_writel(1<<irq_nr, IC0_WAKESET);
  97. }
  98. au_sync();
  99. }
  100. inline void local_disable_irq(unsigned int irq_nr)
  101. {
  102. if (irq_nr > AU1000_LAST_INTC0_INT) {
  103. au_writel(1<<(irq_nr-32), IC1_MASKCLR);
  104. au_writel(1<<(irq_nr-32), IC1_WAKECLR);
  105. }
  106. else {
  107. au_writel(1<<irq_nr, IC0_MASKCLR);
  108. au_writel(1<<irq_nr, IC0_WAKECLR);
  109. }
  110. au_sync();
  111. }
  112. static inline void mask_and_ack_rise_edge_irq(unsigned int irq_nr)
  113. {
  114. if (irq_nr > AU1000_LAST_INTC0_INT) {
  115. au_writel(1<<(irq_nr-32), IC1_RISINGCLR);
  116. au_writel(1<<(irq_nr-32), IC1_MASKCLR);
  117. }
  118. else {
  119. au_writel(1<<irq_nr, IC0_RISINGCLR);
  120. au_writel(1<<irq_nr, IC0_MASKCLR);
  121. }
  122. au_sync();
  123. }
  124. static inline void mask_and_ack_fall_edge_irq(unsigned int irq_nr)
  125. {
  126. if (irq_nr > AU1000_LAST_INTC0_INT) {
  127. au_writel(1<<(irq_nr-32), IC1_FALLINGCLR);
  128. au_writel(1<<(irq_nr-32), IC1_MASKCLR);
  129. }
  130. else {
  131. au_writel(1<<irq_nr, IC0_FALLINGCLR);
  132. au_writel(1<<irq_nr, IC0_MASKCLR);
  133. }
  134. au_sync();
  135. }
  136. static inline void mask_and_ack_either_edge_irq(unsigned int irq_nr)
  137. {
  138. /* This may assume that we don't get interrupts from
  139. * both edges at once, or if we do, that we don't care.
  140. */
  141. if (irq_nr > AU1000_LAST_INTC0_INT) {
  142. au_writel(1<<(irq_nr-32), IC1_FALLINGCLR);
  143. au_writel(1<<(irq_nr-32), IC1_RISINGCLR);
  144. au_writel(1<<(irq_nr-32), IC1_MASKCLR);
  145. }
  146. else {
  147. au_writel(1<<irq_nr, IC0_FALLINGCLR);
  148. au_writel(1<<irq_nr, IC0_RISINGCLR);
  149. au_writel(1<<irq_nr, IC0_MASKCLR);
  150. }
  151. au_sync();
  152. }
  153. static inline void mask_and_ack_level_irq(unsigned int irq_nr)
  154. {
  155. local_disable_irq(irq_nr);
  156. au_sync();
  157. #if defined(CONFIG_MIPS_PB1000)
  158. if (irq_nr == AU1000_GPIO_15) {
  159. au_writel(0x8000, PB1000_MDR); /* ack int */
  160. au_sync();
  161. }
  162. #endif
  163. return;
  164. }
  165. static void end_irq(unsigned int irq_nr)
  166. {
  167. if (!(irq_desc[irq_nr].status & (IRQ_DISABLED|IRQ_INPROGRESS))) {
  168. local_enable_irq(irq_nr);
  169. }
  170. #if defined(CONFIG_MIPS_PB1000)
  171. if (irq_nr == AU1000_GPIO_15) {
  172. au_writel(0x4000, PB1000_MDR); /* enable int */
  173. au_sync();
  174. }
  175. #endif
  176. }
  177. unsigned long save_local_and_disable(int controller)
  178. {
  179. int i;
  180. unsigned long flags, mask;
  181. spin_lock_irqsave(&irq_lock, flags);
  182. if (controller) {
  183. mask = au_readl(IC1_MASKSET);
  184. for (i=32; i<64; i++) {
  185. local_disable_irq(i);
  186. }
  187. }
  188. else {
  189. mask = au_readl(IC0_MASKSET);
  190. for (i=0; i<32; i++) {
  191. local_disable_irq(i);
  192. }
  193. }
  194. spin_unlock_irqrestore(&irq_lock, flags);
  195. return mask;
  196. }
  197. void restore_local_and_enable(int controller, unsigned long mask)
  198. {
  199. int i;
  200. unsigned long flags, new_mask;
  201. spin_lock_irqsave(&irq_lock, flags);
  202. for (i=0; i<32; i++) {
  203. if (mask & (1<<i)) {
  204. if (controller)
  205. local_enable_irq(i+32);
  206. else
  207. local_enable_irq(i);
  208. }
  209. }
  210. if (controller)
  211. new_mask = au_readl(IC1_MASKSET);
  212. else
  213. new_mask = au_readl(IC0_MASKSET);
  214. spin_unlock_irqrestore(&irq_lock, flags);
  215. }
  216. static struct irq_chip rise_edge_irq_type = {
  217. .typename = "Au1000 Rise Edge",
  218. .startup = startup_irq,
  219. .shutdown = shutdown_irq,
  220. .enable = local_enable_irq,
  221. .disable = local_disable_irq,
  222. .ack = mask_and_ack_rise_edge_irq,
  223. .end = end_irq,
  224. };
  225. static struct irq_chip fall_edge_irq_type = {
  226. .typename = "Au1000 Fall Edge",
  227. .startup = startup_irq,
  228. .shutdown = shutdown_irq,
  229. .enable = local_enable_irq,
  230. .disable = local_disable_irq,
  231. .ack = mask_and_ack_fall_edge_irq,
  232. .end = end_irq,
  233. };
  234. static struct irq_chip either_edge_irq_type = {
  235. .typename = "Au1000 Rise or Fall Edge",
  236. .startup = startup_irq,
  237. .shutdown = shutdown_irq,
  238. .enable = local_enable_irq,
  239. .disable = local_disable_irq,
  240. .ack = mask_and_ack_either_edge_irq,
  241. .end = end_irq,
  242. };
  243. static struct irq_chip level_irq_type = {
  244. .typename = "Au1000 Level",
  245. .startup = startup_irq,
  246. .shutdown = shutdown_irq,
  247. .enable = local_enable_irq,
  248. .disable = local_disable_irq,
  249. .ack = mask_and_ack_level_irq,
  250. .end = end_irq,
  251. };
  252. #ifdef CONFIG_PM
  253. void startup_match20_interrupt(irq_handler_t handler)
  254. {
  255. struct irq_desc *desc = &irq_desc[AU1000_TOY_MATCH2_INT];
  256. static struct irqaction action;
  257. memset(&action, 0, sizeof(struct irqaction));
  258. /* This is a big problem.... since we didn't use request_irq
  259. * when kernel/irq.c calls probe_irq_xxx this interrupt will
  260. * be probed for usage. This will end up disabling the device :(
  261. * Give it a bogus "action" pointer -- this will keep it from
  262. * getting auto-probed!
  263. *
  264. * By setting the status to match that of request_irq() we
  265. * can avoid it. --cgray
  266. */
  267. action.dev_id = handler;
  268. action.flags = IRQF_DISABLED;
  269. cpus_clear(action.mask);
  270. action.name = "Au1xxx TOY";
  271. action.handler = handler;
  272. action.next = NULL;
  273. desc->action = &action;
  274. desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING | IRQ_INPROGRESS);
  275. local_enable_irq(AU1000_TOY_MATCH2_INT);
  276. }
  277. #endif
  278. static void setup_local_irq(unsigned int irq_nr, int type, int int_req)
  279. {
  280. if (irq_nr > AU1000_MAX_INTR) return;
  281. /* Config2[n], Config1[n], Config0[n] */
  282. if (irq_nr > AU1000_LAST_INTC0_INT) {
  283. switch (type) {
  284. case INTC_INT_RISE_EDGE: /* 0:0:1 */
  285. au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
  286. au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
  287. au_writel(1<<(irq_nr-32), IC1_CFG0SET);
  288. irq_desc[irq_nr].chip = &rise_edge_irq_type;
  289. break;
  290. case INTC_INT_FALL_EDGE: /* 0:1:0 */
  291. au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
  292. au_writel(1<<(irq_nr-32), IC1_CFG1SET);
  293. au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
  294. irq_desc[irq_nr].chip = &fall_edge_irq_type;
  295. break;
  296. case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
  297. au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
  298. au_writel(1<<(irq_nr-32), IC1_CFG1SET);
  299. au_writel(1<<(irq_nr-32), IC1_CFG0SET);
  300. irq_desc[irq_nr].chip = &either_edge_irq_type;
  301. break;
  302. case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
  303. au_writel(1<<(irq_nr-32), IC1_CFG2SET);
  304. au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
  305. au_writel(1<<(irq_nr-32), IC1_CFG0SET);
  306. irq_desc[irq_nr].chip = &level_irq_type;
  307. break;
  308. case INTC_INT_LOW_LEVEL: /* 1:1:0 */
  309. au_writel(1<<(irq_nr-32), IC1_CFG2SET);
  310. au_writel(1<<(irq_nr-32), IC1_CFG1SET);
  311. au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
  312. irq_desc[irq_nr].chip = &level_irq_type;
  313. break;
  314. case INTC_INT_DISABLED: /* 0:0:0 */
  315. au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
  316. au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
  317. au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
  318. break;
  319. default: /* disable the interrupt */
  320. printk("unexpected int type %d (irq %d)\n", type, irq_nr);
  321. au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
  322. au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
  323. au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
  324. return;
  325. }
  326. if (int_req) /* assign to interrupt request 1 */
  327. au_writel(1<<(irq_nr-32), IC1_ASSIGNCLR);
  328. else /* assign to interrupt request 0 */
  329. au_writel(1<<(irq_nr-32), IC1_ASSIGNSET);
  330. au_writel(1<<(irq_nr-32), IC1_SRCSET);
  331. au_writel(1<<(irq_nr-32), IC1_MASKCLR);
  332. au_writel(1<<(irq_nr-32), IC1_WAKECLR);
  333. }
  334. else {
  335. switch (type) {
  336. case INTC_INT_RISE_EDGE: /* 0:0:1 */
  337. au_writel(1<<irq_nr, IC0_CFG2CLR);
  338. au_writel(1<<irq_nr, IC0_CFG1CLR);
  339. au_writel(1<<irq_nr, IC0_CFG0SET);
  340. irq_desc[irq_nr].chip = &rise_edge_irq_type;
  341. break;
  342. case INTC_INT_FALL_EDGE: /* 0:1:0 */
  343. au_writel(1<<irq_nr, IC0_CFG2CLR);
  344. au_writel(1<<irq_nr, IC0_CFG1SET);
  345. au_writel(1<<irq_nr, IC0_CFG0CLR);
  346. irq_desc[irq_nr].chip = &fall_edge_irq_type;
  347. break;
  348. case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
  349. au_writel(1<<irq_nr, IC0_CFG2CLR);
  350. au_writel(1<<irq_nr, IC0_CFG1SET);
  351. au_writel(1<<irq_nr, IC0_CFG0SET);
  352. irq_desc[irq_nr].chip = &either_edge_irq_type;
  353. break;
  354. case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
  355. au_writel(1<<irq_nr, IC0_CFG2SET);
  356. au_writel(1<<irq_nr, IC0_CFG1CLR);
  357. au_writel(1<<irq_nr, IC0_CFG0SET);
  358. irq_desc[irq_nr].chip = &level_irq_type;
  359. break;
  360. case INTC_INT_LOW_LEVEL: /* 1:1:0 */
  361. au_writel(1<<irq_nr, IC0_CFG2SET);
  362. au_writel(1<<irq_nr, IC0_CFG1SET);
  363. au_writel(1<<irq_nr, IC0_CFG0CLR);
  364. irq_desc[irq_nr].chip = &level_irq_type;
  365. break;
  366. case INTC_INT_DISABLED: /* 0:0:0 */
  367. au_writel(1<<irq_nr, IC0_CFG0CLR);
  368. au_writel(1<<irq_nr, IC0_CFG1CLR);
  369. au_writel(1<<irq_nr, IC0_CFG2CLR);
  370. break;
  371. default: /* disable the interrupt */
  372. printk("unexpected int type %d (irq %d)\n", type, irq_nr);
  373. au_writel(1<<irq_nr, IC0_CFG0CLR);
  374. au_writel(1<<irq_nr, IC0_CFG1CLR);
  375. au_writel(1<<irq_nr, IC0_CFG2CLR);
  376. return;
  377. }
  378. if (int_req) /* assign to interrupt request 1 */
  379. au_writel(1<<irq_nr, IC0_ASSIGNCLR);
  380. else /* assign to interrupt request 0 */
  381. au_writel(1<<irq_nr, IC0_ASSIGNSET);
  382. au_writel(1<<irq_nr, IC0_SRCSET);
  383. au_writel(1<<irq_nr, IC0_MASKCLR);
  384. au_writel(1<<irq_nr, IC0_WAKECLR);
  385. }
  386. au_sync();
  387. }
  388. void __init arch_init_irq(void)
  389. {
  390. int i;
  391. unsigned long cp0_status;
  392. au1xxx_irq_map_t *imp;
  393. extern au1xxx_irq_map_t au1xxx_irq_map[];
  394. extern au1xxx_irq_map_t au1xxx_ic0_map[];
  395. extern int au1xxx_nr_irqs;
  396. extern int au1xxx_ic0_nr_irqs;
  397. cp0_status = read_c0_status();
  398. /* Initialize interrupt controllers to a safe state.
  399. */
  400. au_writel(0xffffffff, IC0_CFG0CLR);
  401. au_writel(0xffffffff, IC0_CFG1CLR);
  402. au_writel(0xffffffff, IC0_CFG2CLR);
  403. au_writel(0xffffffff, IC0_MASKCLR);
  404. au_writel(0xffffffff, IC0_ASSIGNSET);
  405. au_writel(0xffffffff, IC0_WAKECLR);
  406. au_writel(0xffffffff, IC0_SRCSET);
  407. au_writel(0xffffffff, IC0_FALLINGCLR);
  408. au_writel(0xffffffff, IC0_RISINGCLR);
  409. au_writel(0x00000000, IC0_TESTBIT);
  410. au_writel(0xffffffff, IC1_CFG0CLR);
  411. au_writel(0xffffffff, IC1_CFG1CLR);
  412. au_writel(0xffffffff, IC1_CFG2CLR);
  413. au_writel(0xffffffff, IC1_MASKCLR);
  414. au_writel(0xffffffff, IC1_ASSIGNSET);
  415. au_writel(0xffffffff, IC1_WAKECLR);
  416. au_writel(0xffffffff, IC1_SRCSET);
  417. au_writel(0xffffffff, IC1_FALLINGCLR);
  418. au_writel(0xffffffff, IC1_RISINGCLR);
  419. au_writel(0x00000000, IC1_TESTBIT);
  420. /* Initialize IC0, which is fixed per processor.
  421. */
  422. imp = au1xxx_ic0_map;
  423. for (i=0; i<au1xxx_ic0_nr_irqs; i++) {
  424. setup_local_irq(imp->im_irq, imp->im_type, imp->im_request);
  425. imp++;
  426. }
  427. /* Now set up the irq mapping for the board.
  428. */
  429. imp = au1xxx_irq_map;
  430. for (i=0; i<au1xxx_nr_irqs; i++) {
  431. setup_local_irq(imp->im_irq, imp->im_type, imp->im_request);
  432. imp++;
  433. }
  434. set_c0_status(ALLINTS);
  435. /* Board specific IRQ initialization.
  436. */
  437. if (board_init_irq)
  438. (*board_init_irq)();
  439. }
  440. /*
  441. * Interrupts are nested. Even if an interrupt handler is registered
  442. * as "fast", we might get another interrupt before we return from
  443. * intcX_reqX_irqdispatch().
  444. */
  445. static void intc0_req0_irqdispatch(void)
  446. {
  447. int irq = 0;
  448. static unsigned long intc0_req0 = 0;
  449. intc0_req0 |= au_readl(IC0_REQ0INT);
  450. if (!intc0_req0)
  451. return;
  452. #ifdef AU1000_USB_DEV_REQ_INT
  453. /*
  454. * Because of the tight timing of SETUP token to reply
  455. * transactions, the USB devices-side packet complete
  456. * interrupt needs the highest priority.
  457. */
  458. if ((intc0_req0 & (1<<AU1000_USB_DEV_REQ_INT))) {
  459. intc0_req0 &= ~(1<<AU1000_USB_DEV_REQ_INT);
  460. do_IRQ(AU1000_USB_DEV_REQ_INT);
  461. return;
  462. }
  463. #endif
  464. irq = au_ffs(intc0_req0) - 1;
  465. intc0_req0 &= ~(1<<irq);
  466. do_IRQ(irq);
  467. }
  468. static void intc0_req1_irqdispatch(void)
  469. {
  470. int irq = 0;
  471. static unsigned long intc0_req1 = 0;
  472. intc0_req1 |= au_readl(IC0_REQ1INT);
  473. if (!intc0_req1)
  474. return;
  475. irq = au_ffs(intc0_req1) - 1;
  476. intc0_req1 &= ~(1<<irq);
  477. do_IRQ(irq);
  478. }
  479. /*
  480. * Interrupt Controller 1:
  481. * interrupts 32 - 63
  482. */
  483. static void intc1_req0_irqdispatch(void)
  484. {
  485. int irq = 0;
  486. static unsigned long intc1_req0 = 0;
  487. intc1_req0 |= au_readl(IC1_REQ0INT);
  488. if (!intc1_req0)
  489. return;
  490. irq = au_ffs(intc1_req0) - 1;
  491. intc1_req0 &= ~(1<<irq);
  492. irq += 32;
  493. do_IRQ(irq);
  494. }
  495. static void intc1_req1_irqdispatch(void)
  496. {
  497. int irq = 0;
  498. static unsigned long intc1_req1 = 0;
  499. intc1_req1 |= au_readl(IC1_REQ1INT);
  500. if (!intc1_req1)
  501. return;
  502. irq = au_ffs(intc1_req1) - 1;
  503. intc1_req1 &= ~(1<<irq);
  504. irq += 32;
  505. do_IRQ(irq);
  506. }
  507. #ifdef CONFIG_PM
  508. /* Save/restore the interrupt controller state.
  509. * Called from the save/restore core registers as part of the
  510. * au_sleep function in power.c.....maybe I should just pm_register()
  511. * them instead?
  512. */
  513. static unsigned int sleep_intctl_config0[2];
  514. static unsigned int sleep_intctl_config1[2];
  515. static unsigned int sleep_intctl_config2[2];
  516. static unsigned int sleep_intctl_src[2];
  517. static unsigned int sleep_intctl_assign[2];
  518. static unsigned int sleep_intctl_wake[2];
  519. static unsigned int sleep_intctl_mask[2];
  520. void
  521. save_au1xxx_intctl(void)
  522. {
  523. sleep_intctl_config0[0] = au_readl(IC0_CFG0RD);
  524. sleep_intctl_config1[0] = au_readl(IC0_CFG1RD);
  525. sleep_intctl_config2[0] = au_readl(IC0_CFG2RD);
  526. sleep_intctl_src[0] = au_readl(IC0_SRCRD);
  527. sleep_intctl_assign[0] = au_readl(IC0_ASSIGNRD);
  528. sleep_intctl_wake[0] = au_readl(IC0_WAKERD);
  529. sleep_intctl_mask[0] = au_readl(IC0_MASKRD);
  530. sleep_intctl_config0[1] = au_readl(IC1_CFG0RD);
  531. sleep_intctl_config1[1] = au_readl(IC1_CFG1RD);
  532. sleep_intctl_config2[1] = au_readl(IC1_CFG2RD);
  533. sleep_intctl_src[1] = au_readl(IC1_SRCRD);
  534. sleep_intctl_assign[1] = au_readl(IC1_ASSIGNRD);
  535. sleep_intctl_wake[1] = au_readl(IC1_WAKERD);
  536. sleep_intctl_mask[1] = au_readl(IC1_MASKRD);
  537. }
  538. /* For most restore operations, we clear the entire register and
  539. * then set the bits we found during the save.
  540. */
  541. void
  542. restore_au1xxx_intctl(void)
  543. {
  544. au_writel(0xffffffff, IC0_MASKCLR); au_sync();
  545. au_writel(0xffffffff, IC0_CFG0CLR); au_sync();
  546. au_writel(sleep_intctl_config0[0], IC0_CFG0SET); au_sync();
  547. au_writel(0xffffffff, IC0_CFG1CLR); au_sync();
  548. au_writel(sleep_intctl_config1[0], IC0_CFG1SET); au_sync();
  549. au_writel(0xffffffff, IC0_CFG2CLR); au_sync();
  550. au_writel(sleep_intctl_config2[0], IC0_CFG2SET); au_sync();
  551. au_writel(0xffffffff, IC0_SRCCLR); au_sync();
  552. au_writel(sleep_intctl_src[0], IC0_SRCSET); au_sync();
  553. au_writel(0xffffffff, IC0_ASSIGNCLR); au_sync();
  554. au_writel(sleep_intctl_assign[0], IC0_ASSIGNSET); au_sync();
  555. au_writel(0xffffffff, IC0_WAKECLR); au_sync();
  556. au_writel(sleep_intctl_wake[0], IC0_WAKESET); au_sync();
  557. au_writel(0xffffffff, IC0_RISINGCLR); au_sync();
  558. au_writel(0xffffffff, IC0_FALLINGCLR); au_sync();
  559. au_writel(0x00000000, IC0_TESTBIT); au_sync();
  560. au_writel(0xffffffff, IC1_MASKCLR); au_sync();
  561. au_writel(0xffffffff, IC1_CFG0CLR); au_sync();
  562. au_writel(sleep_intctl_config0[1], IC1_CFG0SET); au_sync();
  563. au_writel(0xffffffff, IC1_CFG1CLR); au_sync();
  564. au_writel(sleep_intctl_config1[1], IC1_CFG1SET); au_sync();
  565. au_writel(0xffffffff, IC1_CFG2CLR); au_sync();
  566. au_writel(sleep_intctl_config2[1], IC1_CFG2SET); au_sync();
  567. au_writel(0xffffffff, IC1_SRCCLR); au_sync();
  568. au_writel(sleep_intctl_src[1], IC1_SRCSET); au_sync();
  569. au_writel(0xffffffff, IC1_ASSIGNCLR); au_sync();
  570. au_writel(sleep_intctl_assign[1], IC1_ASSIGNSET); au_sync();
  571. au_writel(0xffffffff, IC1_WAKECLR); au_sync();
  572. au_writel(sleep_intctl_wake[1], IC1_WAKESET); au_sync();
  573. au_writel(0xffffffff, IC1_RISINGCLR); au_sync();
  574. au_writel(0xffffffff, IC1_FALLINGCLR); au_sync();
  575. au_writel(0x00000000, IC1_TESTBIT); au_sync();
  576. au_writel(sleep_intctl_mask[1], IC1_MASKSET); au_sync();
  577. au_writel(sleep_intctl_mask[0], IC0_MASKSET); au_sync();
  578. }
  579. #endif /* CONFIG_PM */
  580. asmlinkage void plat_irq_dispatch(void)
  581. {
  582. unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
  583. if (pending & CAUSEF_IP7)
  584. mips_timer_interrupt();
  585. else if (pending & CAUSEF_IP2)
  586. intc0_req0_irqdispatch();
  587. else if (pending & CAUSEF_IP3)
  588. intc0_req1_irqdispatch();
  589. else if (pending & CAUSEF_IP4)
  590. intc1_req0_irqdispatch();
  591. else if (pending & CAUSEF_IP5)
  592. intc1_req1_irqdispatch();
  593. else
  594. spurious_interrupt();
  595. }