Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
irq.c
Go to the documentation of this file.
1 /*
2  * linux/arch/h8300/platform/h8s/ints_h8s.c
3  * Interrupt handling CPU variants
4  *
5  * Yoshinori Sato <[email protected]>
6  *
7  */
8 
9 #include <linux/init.h>
10 #include <linux/errno.h>
11 #include <linux/kernel.h>
12 
13 #include <asm/ptrace.h>
14 #include <asm/traps.h>
15 #include <asm/irq.h>
16 #include <asm/io.h>
17 #include <asm/gpio-internal.h>
18 #include <asm/regs267x.h>
19 
20 /* saved vector list */
22 #if defined(CONFIG_GDB_DEBUG)
23  TRACE_VEC,
24  TRAP3_VEC,
25 #endif
26  -1
27 };
28 
29 /* trap entry table */
30 const H8300_VECTOR __initconst h8300_trap_table[] = {
31  0,0,0,0,0,
32  trace_break, /* TRACE */
33  0,0,
34  system_call, /* TRAPA #0 */
35  0,0,0,0,0,0,0
36 };
37 
38 /* IRQ pin assignment */
39 struct irq_pins {
40  unsigned char port_no;
41  unsigned char bit_no;
42 } __attribute__((aligned(1),packed));
43 /* ISTR = 0 */
44 static const struct irq_pins irq_assign_table0[16]={
53 };
54 /* ISTR = 1 */
55 static const struct irq_pins irq_assign_table1[16]={
64 };
65 
66 /* IRQ to GPIO pin translation */
67 #define IRQ_GPIO_MAP(irqbit,irq,port,bit) \
68 do { \
69  if (*(volatile unsigned short *)ITSR & irqbit) { \
70  port = irq_assign_table1[irq - EXT_IRQ0].port_no; \
71  bit = irq_assign_table1[irq - EXT_IRQ0].bit_no; \
72  } else { \
73  port = irq_assign_table0[irq - EXT_IRQ0].port_no; \
74  bit = irq_assign_table0[irq - EXT_IRQ0].bit_no; \
75  } \
76 } while(0)
77 
78 int h8300_enable_irq_pin(unsigned int irq)
79 {
80  if (irq >= EXT_IRQ0 && irq <= EXT_IRQ15) {
81  unsigned short ptn = 1 << (irq - EXT_IRQ0);
82  unsigned int port_no,bit_no;
83  IRQ_GPIO_MAP(ptn, irq, port_no, bit_no);
84  if (H8300_GPIO_RESERVE(port_no, bit_no) == 0)
85  return -EBUSY; /* pin already use */
86  H8300_GPIO_DDR(port_no, bit_no, H8300_GPIO_INPUT);
87  *(volatile unsigned short *)ISR &= ~ptn; /* ISR clear */
88  }
89 
90  return 0;
91 }
92 
93 void h8300_disable_irq_pin(unsigned int irq)
94 {
95  if (irq >= EXT_IRQ0 && irq <= EXT_IRQ15) {
96  /* disable interrupt & release IRQ pin */
97  unsigned short ptn = 1 << (irq - EXT_IRQ0);
98  unsigned short port_no,bit_no;
99  *(volatile unsigned short *)ISR &= ~ptn;
100  *(volatile unsigned short *)IER &= ~ptn;
101  IRQ_GPIO_MAP(ptn, irq, port_no, bit_no);
102  H8300_GPIO_FREE(port_no, bit_no);
103  }
104 }