diff options
| author | Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> | 2007-12-11 10:52:50 -0500 |
|---|---|---|
| committer | Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> | 2008-03-31 04:33:11 -0400 |
| commit | ed6f5987235c628e1041311d7c1efdf659e2dad7 (patch) | |
| tree | f0580d8d1531608020874ddb30e06dd690ecefa9 | |
| parent | 5e69b945f20aec17bf057acbb61b6682461e7149 (diff) | |
ns9xxx: add support for irq priorisation
prio2irq(0) is the highest prioritized interrupt. For now there is no
binary change intended.
If you intend to change the priorisation, you have to assert:
∀ x ∈ {0, 1, ⋯ 31}: (irq2prio ∘ prio2irq)(x) = x
Signed-off-by: Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
| -rw-r--r-- | arch/arm/mach-ns9xxx/irq.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/arch/arm/mach-ns9xxx/irq.c b/arch/arm/mach-ns9xxx/irq.c index 7ddc8fde7748..36e5835e6097 100644 --- a/arch/arm/mach-ns9xxx/irq.c +++ b/arch/arm/mach-ns9xxx/irq.c | |||
| @@ -19,12 +19,17 @@ | |||
| 19 | 19 | ||
| 20 | #include "generic.h" | 20 | #include "generic.h" |
| 21 | 21 | ||
| 22 | /* simple interrupt prio table: prio(x) < prio(y) <=> x < y */ | ||
| 23 | #define irq2prio(i) (i) | ||
| 24 | #define prio2irq(p) (p) | ||
| 25 | |||
| 22 | static void ns9xxx_mask_irq(unsigned int irq) | 26 | static void ns9xxx_mask_irq(unsigned int irq) |
| 23 | { | 27 | { |
| 24 | /* XXX: better use cpp symbols */ | 28 | /* XXX: better use cpp symbols */ |
| 25 | u32 ic = __raw_readl(SYS_IC(irq / 4)); | 29 | int prio = irq2prio(irq); |
| 26 | ic &= ~(1 << (7 + 8 * (3 - (irq & 3)))); | 30 | u32 ic = __raw_readl(SYS_IC(prio / 4)); |
| 27 | __raw_writel(ic, SYS_IC(irq / 4)); | 31 | ic &= ~(1 << (7 + 8 * (3 - (prio & 3)))); |
| 32 | __raw_writel(ic, SYS_IC(prio / 4)); | ||
| 28 | } | 33 | } |
| 29 | 34 | ||
| 30 | static void ns9xxx_ack_irq(unsigned int irq) | 35 | static void ns9xxx_ack_irq(unsigned int irq) |
| @@ -41,9 +46,10 @@ static void ns9xxx_maskack_irq(unsigned int irq) | |||
| 41 | static void ns9xxx_unmask_irq(unsigned int irq) | 46 | static void ns9xxx_unmask_irq(unsigned int irq) |
| 42 | { | 47 | { |
| 43 | /* XXX: better use cpp symbols */ | 48 | /* XXX: better use cpp symbols */ |
| 44 | u32 ic = __raw_readl(SYS_IC(irq / 4)); | 49 | int prio = irq2prio(irq); |
| 45 | ic |= 1 << (7 + 8 * (3 - (irq & 3))); | 50 | u32 ic = __raw_readl(SYS_IC(prio / 4)); |
| 46 | __raw_writel(ic, SYS_IC(irq / 4)); | 51 | ic |= 1 << (7 + 8 * (3 - (prio & 3))); |
| 52 | __raw_writel(ic, SYS_IC(prio / 4)); | ||
| 47 | } | 53 | } |
| 48 | 54 | ||
| 49 | static struct irq_chip ns9xxx_chip = { | 55 | static struct irq_chip ns9xxx_chip = { |
| @@ -96,14 +102,14 @@ void __init ns9xxx_init_irq(void) | |||
| 96 | 102 | ||
| 97 | /* disable all IRQs */ | 103 | /* disable all IRQs */ |
| 98 | for (i = 0; i < 8; ++i) | 104 | for (i = 0; i < 8; ++i) |
| 99 | __raw_writel((4 * i) << 24 | (4 * i + 1) << 16 | | 105 | __raw_writel(prio2irq(4 * i) << 24 | |
| 100 | (4 * i + 2) << 8 | (4 * i + 3), SYS_IC(i)); | 106 | prio2irq(4 * i + 1) << 16 | |
| 107 | prio2irq(4 * i + 2) << 8 | | ||
| 108 | prio2irq(4 * i + 3), | ||
| 109 | SYS_IC(i)); | ||
| 101 | 110 | ||
| 102 | /* simple interrupt prio table: | ||
| 103 | * prio(x) < prio(y) <=> x < y | ||
| 104 | */ | ||
| 105 | for (i = 0; i < 32; ++i) | 111 | for (i = 0; i < 32; ++i) |
| 106 | __raw_writel(i, SYS_IVA(i)); | 112 | __raw_writel(prio2irq(i), SYS_IVA(i)); |
| 107 | 113 | ||
| 108 | for (i = 0; i <= 31; ++i) { | 114 | for (i = 0; i <= 31; ++i) { |
| 109 | set_irq_chip(i, &ns9xxx_chip); | 115 | set_irq_chip(i, &ns9xxx_chip); |
