irq.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright 2000 MontaVista Software Inc.
  3.  * Author: MontaVista Software, Inc.
  4.  *          ppopov@mvista.com or source@mvista.com
  5.  *
  6.  * This file was derived from Carsten Langgaard's
  7.  * arch/mips/mips-boards/atlas/atlas_int.c.
  8.  *
  9.  * Carsten Langgaard, carstenl@mips.com
  10.  * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
  11.  *
  12.  *  This program is free software; you can redistribute  it and/or modify it
  13.  *  under  the terms of  the GNU General  Public License as published by the
  14.  *  Free Software Foundation;  either version 2 of the  License, or (at your
  15.  *  option) any later version.
  16.  *
  17.  *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
  18.  *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
  19.  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
  20.  *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
  21.  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
  23.  *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  24.  *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
  25.  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  *
  28.  *  You should have received a copy of the  GNU General Public License along
  29.  *  with this program; if not, write  to the Free Software Foundation, Inc.,
  30.  *  675 Mass Ave, Cambridge, MA 02139, USA.
  31.  */
  32. #include <linux/errno.h>
  33. #include <linux/init.h>
  34. #include <linux/kernel_stat.h>
  35. #include <linux/module.h>
  36. #include <linux/signal.h>
  37. #include <linux/sched.h>
  38. #include <linux/types.h>
  39. #include <linux/interrupt.h>
  40. #include <linux/ioport.h>
  41. #include <linux/timex.h>
  42. #include <linux/slab.h>
  43. #include <linux/random.h>
  44. #include <asm/bitops.h>
  45. #include <asm/bootinfo.h>
  46. #include <asm/io.h>
  47. #include <asm/irq.h>
  48. #include <asm/mipsregs.h>
  49. #include <asm/system.h>
  50. #include <asm/galileo-boards/ev96100int.h>
  51. extern asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs);
  52. extern void mips_timer_interrupt(int irq, struct pt_regs *regs);
  53. extern asmlinkage void ev96100IRQ(void);
  54. static void disable_ev96100_irq(unsigned int irq_nr)
  55. {
  56. unsigned long flags;
  57. save_and_cli(flags);
  58. clear_cp0_status(0x100 << irq_nr);
  59. restore_flags(flags);
  60. }
  61. static inline void enable_ev96100_irq(unsigned int irq_nr)
  62. {
  63. unsigned long flags;
  64. save_and_cli(flags);
  65. set_cp0_status(0x100 << irq_nr);
  66. restore_flags(flags);
  67. }
  68. static unsigned int startup_ev96100_irq(unsigned int irq)
  69. {
  70. enable_ev96100_irq(irq);
  71. return 0; /* never anything pending */
  72. }
  73. #define shutdown_ev96100_irq disable_ev96100_irq
  74. #define mask_and_ack_ev96100_irq disable_ev96100_irq
  75. static void end_ev96100_irq (unsigned int irq)
  76. {
  77. if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
  78. enable_ev96100_irq(irq);
  79. }
  80. static inline unsigned int ffz8(unsigned int word)
  81. {
  82. unsigned long k;
  83. k = 7;
  84. if (word & 0x0fUL) { k -= 4;  word <<= 4;  }
  85. if (word & 0x30UL) { k -= 2;  word <<= 2;  }
  86. if (word & 0x40UL) { k -= 1; }
  87. return k;
  88. }
  89. asmlinkage void ev96100_cpu_irq(unsigned long cause, struct pt_regs * regs)
  90. {
  91. if (!(cause & 0xff00))
  92. return;
  93. do_IRQ(ffz8((cause >> 8) & 0xff), regs);
  94. }
  95. static struct hw_interrupt_type ev96100_irq_type = {
  96. "EV96100",
  97. startup_ev96100_irq,
  98. shutdown_ev96100_irq,
  99. enable_ev96100_irq,
  100. disable_ev96100_irq,
  101. mask_and_ack_ev96100_irq,
  102. end_ev96100_irq
  103. };
  104. void __init init_IRQ(void)
  105. {
  106. int i;
  107. set_except_vector(0, ev96100IRQ);
  108. init_generic_irq();
  109. for (i = 0; i < 8; i++) {
  110. irq_desc[i].status = IRQ_DISABLED;
  111. irq_desc[i].action = 0;
  112. irq_desc[i].depth = 1;
  113. irq_desc[i].handler = &ev96100_irq_type;
  114. }
  115. }