diff options
| -rw-r--r-- | drivers/sh/intc/core.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index 2374468615ed..32c26d795ed0 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c | |||
| @@ -324,8 +324,16 @@ int __init register_intc_controller(struct intc_desc *desc) | |||
| 324 | 324 | ||
| 325 | res = irq_create_identity_mapping(d->domain, irq); | 325 | res = irq_create_identity_mapping(d->domain, irq); |
| 326 | if (unlikely(res)) { | 326 | if (unlikely(res)) { |
| 327 | pr_err("can't get irq_desc for %d\n", irq); | 327 | if (res == -EEXIST) { |
| 328 | continue; | 328 | res = irq_domain_associate(d->domain, irq, irq); |
| 329 | if (unlikely(res)) { | ||
| 330 | pr_err("domain association failure\n"); | ||
| 331 | continue; | ||
| 332 | } | ||
| 333 | } else { | ||
| 334 | pr_err("can't identity map IRQ %d\n", irq); | ||
| 335 | continue; | ||
| 336 | } | ||
| 329 | } | 337 | } |
| 330 | 338 | ||
| 331 | intc_irq_xlate_set(irq, vect->enum_id, d); | 339 | intc_irq_xlate_set(irq, vect->enum_id, d); |
| @@ -345,8 +353,19 @@ int __init register_intc_controller(struct intc_desc *desc) | |||
| 345 | */ | 353 | */ |
| 346 | res = irq_create_identity_mapping(d->domain, irq2); | 354 | res = irq_create_identity_mapping(d->domain, irq2); |
| 347 | if (unlikely(res)) { | 355 | if (unlikely(res)) { |
| 348 | pr_err("can't get irq_desc for %d\n", irq2); | 356 | if (res == -EEXIST) { |
| 349 | continue; | 357 | res = irq_domain_associate(d->domain, |
| 358 | irq, irq); | ||
| 359 | if (unlikely(res)) { | ||
| 360 | pr_err("domain association " | ||
| 361 | "failure\n"); | ||
| 362 | continue; | ||
| 363 | } | ||
| 364 | } else { | ||
| 365 | pr_err("can't identity map IRQ %d\n", | ||
| 366 | irq); | ||
| 367 | continue; | ||
| 368 | } | ||
| 350 | } | 369 | } |
| 351 | 370 | ||
| 352 | vect2->enum_id = 0; | 371 | vect2->enum_id = 0; |
