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  * s6000 irq crossbar
3  *
4  * Copyright (c) 2009 emlix GmbH
5  * Authors: Johannes Weiner <[email protected]>
6  * Oskar Schirmer <[email protected]>
7  */
8 #include <linux/io.h>
9 #include <asm/irq.h>
10 #include <variant/hardware.h>
11 
12 /* S6_REG_INTC */
13 #define INTC_STATUS 0x000
14 #define INTC_RAW 0x010
15 #define INTC_STATUS_AG 0x100
16 #define INTC_CFG(n) (0x200 + 4 * (n))
17 
18 /*
19  * The s6000 has a crossbar that multiplexes interrupt output lines
20  * from the peripherals to input lines on the xtensa core.
21  *
22  * We leave the mapping decisions to the platform as it depends on the
23  * actually connected peripherals which distribution makes sense.
24  */
25 extern const signed char *platform_irq_mappings[NR_IRQS];
26 
27 static unsigned long scp_to_intc_enable[] = {
28 #define TO_INTC_ENABLE(n) (((n) << 1) + 1)
29  TO_INTC_ENABLE(0),
30  TO_INTC_ENABLE(1),
31  TO_INTC_ENABLE(2),
32  TO_INTC_ENABLE(3),
33  TO_INTC_ENABLE(4),
34  TO_INTC_ENABLE(5),
35  TO_INTC_ENABLE(6),
36  TO_INTC_ENABLE(7),
37  TO_INTC_ENABLE(8),
38  TO_INTC_ENABLE(9),
39  TO_INTC_ENABLE(10),
40  TO_INTC_ENABLE(11),
41  TO_INTC_ENABLE(12),
42  -1,
43  -1,
44  TO_INTC_ENABLE(13),
45  -1,
46  TO_INTC_ENABLE(14),
47  -1,
48  TO_INTC_ENABLE(15),
49 #undef TO_INTC_ENABLE
50 };
51 
52 static void irq_set(unsigned int irq, int enable)
53 {
54  unsigned long en;
55  const signed char *m = platform_irq_mappings[irq];
56 
57  if (!m)
58  return;
59  en = enable ? scp_to_intc_enable[irq] : 0;
60  while (*m >= 0) {
61  writel(en, S6_REG_INTC + INTC_CFG(*m));
62  m++;
63  }
64 }
65 
66 void variant_irq_enable(unsigned int irq)
67 {
68  irq_set(irq, 1);
69 }
70 
71 void variant_irq_disable(unsigned int irq)
72 {
73  irq_set(irq, 0);
74 }