diff options
author | Arnd Bergmann <arnd@arndb.de> | 2013-04-12 09:27:09 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2013-04-19 17:00:43 -0400 |
commit | 863a08dc8bc7ce32ecc9136671610a93a0dd68b1 (patch) | |
tree | a5a88aaeed57ca5c32bb4ce77c3c778156c46619 /drivers/irqchip | |
parent | 92c8e4962054a6cf5171b3d7a3a77b799ca62c10 (diff) |
irqchip: exynos: pass irq_base from platform
The platform code knows the IRQ base, while the irqchip driver
should really not. This is a littly hacky because we still
hardwire the IRQ base to 160 for the combiner in the DT case,
when we should really use -1. Removing that line will cause
a linear IRQ domain to be use, as we should.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/irqchip')
-rw-r--r-- | drivers/irqchip/exynos-combiner.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/irqchip/exynos-combiner.c b/drivers/irqchip/exynos-combiner.c index acb9c74b070a..6855c92c2262 100644 --- a/drivers/irqchip/exynos-combiner.c +++ b/drivers/irqchip/exynos-combiner.c | |||
@@ -206,27 +206,22 @@ static unsigned int combiner_lookup_irq(int group) | |||
206 | 206 | ||
207 | void __init combiner_init(void __iomem *combiner_base, | 207 | void __init combiner_init(void __iomem *combiner_base, |
208 | struct device_node *np, | 208 | struct device_node *np, |
209 | unsigned int max_nr) | 209 | unsigned int max_nr, |
210 | int irq_base) | ||
210 | { | 211 | { |
211 | int i, irq, irq_base; | 212 | int i, irq; |
212 | unsigned int nr_irq; | 213 | unsigned int nr_irq; |
213 | struct combiner_chip_data *combiner_data; | 214 | struct combiner_chip_data *combiner_data; |
214 | 215 | ||
215 | nr_irq = max_nr * IRQ_IN_COMBINER; | 216 | nr_irq = max_nr * IRQ_IN_COMBINER; |
216 | 217 | ||
217 | irq_base = irq_alloc_descs(COMBINER_IRQ(0, 0), 1, nr_irq, 0); | ||
218 | if (IS_ERR_VALUE(irq_base)) { | ||
219 | irq_base = COMBINER_IRQ(0, 0); | ||
220 | pr_warning("%s: irq desc alloc failed. Continuing with %d as linux irq base\n", __func__, irq_base); | ||
221 | } | ||
222 | |||
223 | combiner_data = kcalloc(max_nr, sizeof (*combiner_data), GFP_KERNEL); | 218 | combiner_data = kcalloc(max_nr, sizeof (*combiner_data), GFP_KERNEL); |
224 | if (!combiner_data) { | 219 | if (!combiner_data) { |
225 | pr_warning("%s: could not allocate combiner data\n", __func__); | 220 | pr_warning("%s: could not allocate combiner data\n", __func__); |
226 | return; | 221 | return; |
227 | } | 222 | } |
228 | 223 | ||
229 | combiner_irq_domain = irq_domain_add_legacy(np, nr_irq, irq_base, 0, | 224 | combiner_irq_domain = irq_domain_add_simple(np, nr_irq, irq_base, |
230 | &combiner_irq_domain_ops, combiner_data); | 225 | &combiner_irq_domain_ops, combiner_data); |
231 | if (WARN_ON(!combiner_irq_domain)) { | 226 | if (WARN_ON(!combiner_irq_domain)) { |
232 | pr_warning("%s: irq domain init failed\n", __func__); | 227 | pr_warning("%s: irq domain init failed\n", __func__); |
@@ -253,6 +248,7 @@ static int __init combiner_of_init(struct device_node *np, | |||
253 | { | 248 | { |
254 | void __iomem *combiner_base; | 249 | void __iomem *combiner_base; |
255 | unsigned int max_nr = 20; | 250 | unsigned int max_nr = 20; |
251 | int irq_base = -1; | ||
256 | 252 | ||
257 | combiner_base = of_iomap(np, 0); | 253 | combiner_base = of_iomap(np, 0); |
258 | if (!combiner_base) { | 254 | if (!combiner_base) { |
@@ -266,7 +262,14 @@ static int __init combiner_of_init(struct device_node *np, | |||
266 | __func__, max_nr); | 262 | __func__, max_nr); |
267 | } | 263 | } |
268 | 264 | ||
269 | combiner_init(combiner_base, np, max_nr); | 265 | /* |
266 | * FIXME: This is a hardwired COMBINER_IRQ(0,0). Once all devices | ||
267 | * get their IRQ from DT, remove this in order to get dynamic | ||
268 | * allocation. | ||
269 | */ | ||
270 | irq_base = 160; | ||
271 | |||
272 | combiner_init(combiner_base, np, max_nr, irq_base); | ||
270 | 273 | ||
271 | return 0; | 274 | return 0; |
272 | } | 275 | } |