diff options
Diffstat (limited to 'arch/arm/mach-tegra')
-rw-r--r-- | arch/arm/mach-tegra/irq.c | 54 |
1 files changed, 16 insertions, 38 deletions
diff --git a/arch/arm/mach-tegra/irq.c b/arch/arm/mach-tegra/irq.c index 4330d8995b27..567b75c4c67b 100644 --- a/arch/arm/mach-tegra/irq.c +++ b/arch/arm/mach-tegra/irq.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2010 Google, Inc. | 2 | * Copyright (C) 2011 Google, Inc. |
3 | * | 3 | * |
4 | * Author: | 4 | * Author: |
5 | * Colin Cross <ccross@google.com> | 5 | * Colin Cross <ccross@android.com> |
6 | * | 6 | * |
7 | * Copyright (C) 2010, NVIDIA Corporation | 7 | * Copyright (C) 2010, NVIDIA Corporation |
8 | * | 8 | * |
@@ -46,10 +46,6 @@ static u32 tegra_lp0_wake_enb; | |||
46 | static u32 tegra_lp0_wake_level; | 46 | static u32 tegra_lp0_wake_level; |
47 | static u32 tegra_lp0_wake_level_any; | 47 | static u32 tegra_lp0_wake_level_any; |
48 | 48 | ||
49 | static void (*tegra_gic_mask_irq)(struct irq_data *d); | ||
50 | static void (*tegra_gic_unmask_irq)(struct irq_data *d); | ||
51 | static void (*tegra_gic_ack_irq)(struct irq_data *d); | ||
52 | |||
53 | /* ensures that sufficient time is passed for a register write to | 49 | /* ensures that sufficient time is passed for a register write to |
54 | * serialize into the 32KHz domain */ | 50 | * serialize into the 32KHz domain */ |
55 | static void pmc_32kwritel(u32 val, unsigned long offs) | 51 | static void pmc_32kwritel(u32 val, unsigned long offs) |
@@ -103,58 +99,40 @@ void tegra_set_lp0_wake_pads(u32 wake_enb, u32 wake_level, u32 wake_any) | |||
103 | 99 | ||
104 | static void tegra_mask(struct irq_data *d) | 100 | static void tegra_mask(struct irq_data *d) |
105 | { | 101 | { |
106 | tegra_gic_mask_irq(d); | 102 | if (d->irq >= 32) |
107 | tegra_legacy_mask_irq(d->irq); | 103 | tegra_legacy_mask_irq(d->irq); |
108 | } | 104 | } |
109 | 105 | ||
110 | static void tegra_unmask(struct irq_data *d) | 106 | static void tegra_unmask(struct irq_data *d) |
111 | { | 107 | { |
112 | tegra_gic_unmask_irq(d); | 108 | if (d->irq >= 32) |
113 | tegra_legacy_unmask_irq(d->irq); | 109 | tegra_legacy_unmask_irq(d->irq); |
114 | } | 110 | } |
115 | 111 | ||
116 | static void tegra_ack(struct irq_data *d) | 112 | static void tegra_ack(struct irq_data *d) |
117 | { | 113 | { |
118 | tegra_legacy_force_irq_clr(d->irq); | 114 | if (d->irq >= 32) |
119 | tegra_gic_ack_irq(d); | 115 | tegra_legacy_force_irq_clr(d->irq); |
120 | } | 116 | } |
121 | 117 | ||
122 | static int tegra_retrigger(struct irq_data *d) | 118 | static int tegra_retrigger(struct irq_data *d) |
123 | { | 119 | { |
120 | if (d->irq < 32) | ||
121 | return 0; | ||
122 | |||
124 | tegra_legacy_force_irq_set(d->irq); | 123 | tegra_legacy_force_irq_set(d->irq); |
125 | return 1; | 124 | return 1; |
126 | } | 125 | } |
127 | 126 | ||
128 | static struct irq_chip tegra_irq = { | ||
129 | .name = "PPI", | ||
130 | .irq_ack = tegra_ack, | ||
131 | .irq_mask = tegra_mask, | ||
132 | .irq_unmask = tegra_unmask, | ||
133 | .irq_retrigger = tegra_retrigger, | ||
134 | }; | ||
135 | |||
136 | void __init tegra_init_irq(void) | 127 | void __init tegra_init_irq(void) |
137 | { | 128 | { |
138 | struct irq_chip *gic; | ||
139 | unsigned int i; | ||
140 | int irq; | ||
141 | |||
142 | tegra_init_legacy_irq(); | 129 | tegra_init_legacy_irq(); |
143 | 130 | ||
131 | gic_arch_extn.irq_ack = tegra_ack; | ||
132 | gic_arch_extn.irq_mask = tegra_mask; | ||
133 | gic_arch_extn.irq_unmask = tegra_unmask; | ||
134 | gic_arch_extn.irq_retrigger = tegra_retrigger; | ||
135 | |||
144 | gic_init(0, 29, IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE), | 136 | gic_init(0, 29, IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE), |
145 | IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100)); | 137 | IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100)); |
146 | |||
147 | gic = irq_get_chip(29); | ||
148 | tegra_gic_unmask_irq = gic->irq_unmask; | ||
149 | tegra_gic_mask_irq = gic->irq_mask; | ||
150 | tegra_gic_ack_irq = gic->irq_ack; | ||
151 | #ifdef CONFIG_SMP | ||
152 | tegra_irq.irq_set_affinity = gic->irq_set_affinity; | ||
153 | #endif | ||
154 | |||
155 | for (i = 0; i < INT_MAIN_NR; i++) { | ||
156 | irq = INT_PRI_BASE + i; | ||
157 | irq_set_chip_and_handler(irq, &tegra_irq, handle_level_irq); | ||
158 | set_irq_flags(irq, IRQF_VALID); | ||
159 | } | ||
160 | } | 138 | } |