aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/irqchip
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2013-04-12 09:27:09 -0400
committerArnd Bergmann <arnd@arndb.de>2013-04-19 17:00:43 -0400
commit863a08dc8bc7ce32ecc9136671610a93a0dd68b1 (patch)
treea5a88aaeed57ca5c32bb4ce77c3c778156c46619 /drivers/irqchip
parent92c8e4962054a6cf5171b3d7a3a77b799ca62c10 (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.c23
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
207void __init combiner_init(void __iomem *combiner_base, 207void __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}