irq.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. * linux/arch/mips/tx4938/toshiba_rbtx4938/irq.c
  3. *
  4. * Toshiba RBTX4938 specific interrupt handlers
  5. * Copyright (C) 2000-2001 Toshiba Corporation
  6. *
  7. * 2003-2005 (c) MontaVista Software, Inc. This file is licensed under the
  8. * terms of the GNU General Public License version 2. This program is
  9. * licensed "as is" without any warranty of any kind, whether express
  10. * or implied.
  11. *
  12. * Support for TX4938 in 2.6 - Manish Lachwani (mlachwani@mvista.com)
  13. */
  14. /*
  15. IRQ Device
  16. 16 TX4938-CP0/00 Software 0
  17. 17 TX4938-CP0/01 Software 1
  18. 18 TX4938-CP0/02 Cascade TX4938-CP0
  19. 19 TX4938-CP0/03 Multiplexed -- do not use
  20. 20 TX4938-CP0/04 Multiplexed -- do not use
  21. 21 TX4938-CP0/05 Multiplexed -- do not use
  22. 22 TX4938-CP0/06 Multiplexed -- do not use
  23. 23 TX4938-CP0/07 CPU TIMER
  24. 24 TX4938-PIC/00
  25. 25 TX4938-PIC/01
  26. 26 TX4938-PIC/02 Cascade RBTX4938-IOC
  27. 27 TX4938-PIC/03 RBTX4938 RTL-8019AS Ethernet
  28. 28 TX4938-PIC/04
  29. 29 TX4938-PIC/05 TX4938 ETH1
  30. 30 TX4938-PIC/06 TX4938 ETH0
  31. 31 TX4938-PIC/07
  32. 32 TX4938-PIC/08 TX4938 SIO 0
  33. 33 TX4938-PIC/09 TX4938 SIO 1
  34. 34 TX4938-PIC/10 TX4938 DMA0
  35. 35 TX4938-PIC/11 TX4938 DMA1
  36. 36 TX4938-PIC/12 TX4938 DMA2
  37. 37 TX4938-PIC/13 TX4938 DMA3
  38. 38 TX4938-PIC/14
  39. 39 TX4938-PIC/15
  40. 40 TX4938-PIC/16 TX4938 PCIC
  41. 41 TX4938-PIC/17 TX4938 TMR0
  42. 42 TX4938-PIC/18 TX4938 TMR1
  43. 43 TX4938-PIC/19 TX4938 TMR2
  44. 44 TX4938-PIC/20
  45. 45 TX4938-PIC/21
  46. 46 TX4938-PIC/22 TX4938 PCIERR
  47. 47 TX4938-PIC/23
  48. 48 TX4938-PIC/24
  49. 49 TX4938-PIC/25
  50. 50 TX4938-PIC/26
  51. 51 TX4938-PIC/27
  52. 52 TX4938-PIC/28
  53. 53 TX4938-PIC/29
  54. 54 TX4938-PIC/30
  55. 55 TX4938-PIC/31 TX4938 SPI
  56. 56 RBTX4938-IOC/00 PCI-D
  57. 57 RBTX4938-IOC/01 PCI-C
  58. 58 RBTX4938-IOC/02 PCI-B
  59. 59 RBTX4938-IOC/03 PCI-A
  60. 60 RBTX4938-IOC/04 RTC
  61. 61 RBTX4938-IOC/05 ATA
  62. 62 RBTX4938-IOC/06 MODEM
  63. 63 RBTX4938-IOC/07 SWINT
  64. */
  65. #include <linux/init.h>
  66. #include <linux/kernel.h>
  67. #include <linux/types.h>
  68. #include <linux/mm.h>
  69. #include <linux/swap.h>
  70. #include <linux/ioport.h>
  71. #include <linux/sched.h>
  72. #include <linux/interrupt.h>
  73. #include <linux/pci.h>
  74. #include <linux/timex.h>
  75. #include <asm/bootinfo.h>
  76. #include <asm/page.h>
  77. #include <asm/io.h>
  78. #include <asm/irq.h>
  79. #include <asm/processor.h>
  80. #include <asm/reboot.h>
  81. #include <asm/time.h>
  82. #include <asm/wbflush.h>
  83. #include <linux/bootmem.h>
  84. #include <asm/tx4938/rbtx4938.h>
  85. static void toshiba_rbtx4938_irq_ioc_enable(unsigned int irq);
  86. static void toshiba_rbtx4938_irq_ioc_disable(unsigned int irq);
  87. #define TOSHIBA_RBTX4938_IOC_NAME "RBTX4938-IOC"
  88. static struct irq_chip toshiba_rbtx4938_irq_ioc_type = {
  89. .name = TOSHIBA_RBTX4938_IOC_NAME,
  90. .ack = toshiba_rbtx4938_irq_ioc_disable,
  91. .mask = toshiba_rbtx4938_irq_ioc_disable,
  92. .mask_ack = toshiba_rbtx4938_irq_ioc_disable,
  93. .unmask = toshiba_rbtx4938_irq_ioc_enable,
  94. };
  95. #define TOSHIBA_RBTX4938_IOC_INTR_ENAB 0xb7f02000
  96. #define TOSHIBA_RBTX4938_IOC_INTR_STAT 0xb7f0200a
  97. int
  98. toshiba_rbtx4938_irq_nested(int sw_irq)
  99. {
  100. u8 level3;
  101. level3 = reg_rd08(TOSHIBA_RBTX4938_IOC_INTR_STAT) & 0xff;
  102. if (level3) {
  103. /* must use fls so onboard ATA has priority */
  104. sw_irq = TOSHIBA_RBTX4938_IRQ_IOC_BEG + fls(level3) - 1;
  105. }
  106. wbflush();
  107. return sw_irq;
  108. }
  109. static struct irqaction toshiba_rbtx4938_irq_ioc_action = {
  110. .handler = no_action,
  111. .flags = 0,
  112. .mask = CPU_MASK_NONE,
  113. .name = TOSHIBA_RBTX4938_IOC_NAME,
  114. };
  115. /**********************************************************************************/
  116. /* Functions for ioc */
  117. /**********************************************************************************/
  118. static void __init
  119. toshiba_rbtx4938_irq_ioc_init(void)
  120. {
  121. int i;
  122. for (i = TOSHIBA_RBTX4938_IRQ_IOC_BEG;
  123. i <= TOSHIBA_RBTX4938_IRQ_IOC_END; i++)
  124. set_irq_chip_and_handler(i, &toshiba_rbtx4938_irq_ioc_type,
  125. handle_level_irq);
  126. setup_irq(RBTX4938_IRQ_IOCINT,
  127. &toshiba_rbtx4938_irq_ioc_action);
  128. }
  129. static void
  130. toshiba_rbtx4938_irq_ioc_enable(unsigned int irq)
  131. {
  132. volatile unsigned char v;
  133. v = TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB);
  134. v |= (1 << (irq - TOSHIBA_RBTX4938_IRQ_IOC_BEG));
  135. TX4938_WR08(TOSHIBA_RBTX4938_IOC_INTR_ENAB, v);
  136. mmiowb();
  137. TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB);
  138. }
  139. static void
  140. toshiba_rbtx4938_irq_ioc_disable(unsigned int irq)
  141. {
  142. volatile unsigned char v;
  143. v = TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB);
  144. v &= ~(1 << (irq - TOSHIBA_RBTX4938_IRQ_IOC_BEG));
  145. TX4938_WR08(TOSHIBA_RBTX4938_IOC_INTR_ENAB, v);
  146. mmiowb();
  147. TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB);
  148. }
  149. void __init arch_init_irq(void)
  150. {
  151. extern void tx4938_irq_init(void);
  152. /* Now, interrupt control disabled, */
  153. /* all IRC interrupts are masked, */
  154. /* all IRC interrupt mode are Low Active. */
  155. /* mask all IOC interrupts */
  156. *rbtx4938_imask_ptr = 0;
  157. /* clear SoftInt interrupts */
  158. *rbtx4938_softint_ptr = 0;
  159. tx4938_irq_init();
  160. toshiba_rbtx4938_irq_ioc_init();
  161. /* Onboard 10M Ether: High Active */
  162. TX4938_WR(TX4938_MKA(TX4938_IRC_IRDM0), 0x00000040);
  163. wbflush();
  164. }