diff options
Diffstat (limited to 'drivers/mfd/arizona-irq.c')
-rw-r--r-- | drivers/mfd/arizona-irq.c | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/drivers/mfd/arizona-irq.c b/drivers/mfd/arizona-irq.c index 682bc865fa8b..5fef014920a3 100644 --- a/drivers/mfd/arizona-irq.c +++ b/drivers/mfd/arizona-irq.c | |||
@@ -310,7 +310,7 @@ int arizona_irq_init(struct arizona *arizona) | |||
310 | if (ret != 0) { | 310 | if (ret != 0) { |
311 | dev_err(arizona->dev, | 311 | dev_err(arizona->dev, |
312 | "Failed to add AOD IRQs: %d\n", ret); | 312 | "Failed to add AOD IRQs: %d\n", ret); |
313 | goto err_domain; | 313 | goto err; |
314 | } | 314 | } |
315 | } | 315 | } |
316 | 316 | ||
@@ -323,30 +323,6 @@ int arizona_irq_init(struct arizona *arizona) | |||
323 | goto err_aod; | 323 | goto err_aod; |
324 | } | 324 | } |
325 | 325 | ||
326 | /* Make sure the boot done IRQ is unmasked for resumes */ | ||
327 | i = arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE); | ||
328 | ret = request_threaded_irq(i, NULL, arizona_boot_done, IRQF_ONESHOT, | ||
329 | "Boot done", arizona); | ||
330 | if (ret != 0) { | ||
331 | dev_err(arizona->dev, "Failed to request boot done %d: %d\n", | ||
332 | arizona->irq, ret); | ||
333 | goto err_boot_done; | ||
334 | } | ||
335 | |||
336 | /* Handle control interface errors in the core */ | ||
337 | if (arizona->ctrlif_error) { | ||
338 | i = arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR); | ||
339 | ret = request_threaded_irq(i, NULL, arizona_ctrlif_err, | ||
340 | IRQF_ONESHOT, | ||
341 | "Control interface error", arizona); | ||
342 | if (ret != 0) { | ||
343 | dev_err(arizona->dev, | ||
344 | "Failed to request CTRLIF_ERR %d: %d\n", | ||
345 | arizona->irq, ret); | ||
346 | goto err_ctrlif; | ||
347 | } | ||
348 | } | ||
349 | |||
350 | /* Used to emulate edge trigger and to work around broken pinmux */ | 326 | /* Used to emulate edge trigger and to work around broken pinmux */ |
351 | if (arizona->pdata.irq_gpio) { | 327 | if (arizona->pdata.irq_gpio) { |
352 | if (gpio_to_irq(arizona->pdata.irq_gpio) != arizona->irq) { | 328 | if (gpio_to_irq(arizona->pdata.irq_gpio) != arizona->irq) { |
@@ -376,21 +352,42 @@ int arizona_irq_init(struct arizona *arizona) | |||
376 | goto err_main_irq; | 352 | goto err_main_irq; |
377 | } | 353 | } |
378 | 354 | ||
355 | /* Make sure the boot done IRQ is unmasked for resumes */ | ||
356 | i = arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE); | ||
357 | ret = request_threaded_irq(i, NULL, arizona_boot_done, IRQF_ONESHOT, | ||
358 | "Boot done", arizona); | ||
359 | if (ret != 0) { | ||
360 | dev_err(arizona->dev, "Failed to request boot done %d: %d\n", | ||
361 | arizona->irq, ret); | ||
362 | goto err_boot_done; | ||
363 | } | ||
364 | |||
365 | /* Handle control interface errors in the core */ | ||
366 | if (arizona->ctrlif_error) { | ||
367 | i = arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR); | ||
368 | ret = request_threaded_irq(i, NULL, arizona_ctrlif_err, | ||
369 | IRQF_ONESHOT, | ||
370 | "Control interface error", arizona); | ||
371 | if (ret != 0) { | ||
372 | dev_err(arizona->dev, | ||
373 | "Failed to request CTRLIF_ERR %d: %d\n", | ||
374 | arizona->irq, ret); | ||
375 | goto err_ctrlif; | ||
376 | } | ||
377 | } | ||
378 | |||
379 | return 0; | 379 | return 0; |
380 | 380 | ||
381 | err_main_irq: | ||
382 | if (arizona->ctrlif_error) | ||
383 | free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR), | ||
384 | arizona); | ||
385 | err_ctrlif: | 381 | err_ctrlif: |
386 | free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona); | 382 | free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona); |
387 | err_boot_done: | 383 | err_boot_done: |
384 | free_irq(arizona->irq, arizona); | ||
385 | err_main_irq: | ||
388 | regmap_del_irq_chip(irq_create_mapping(arizona->virq, 1), | 386 | regmap_del_irq_chip(irq_create_mapping(arizona->virq, 1), |
389 | arizona->irq_chip); | 387 | arizona->irq_chip); |
390 | err_aod: | 388 | err_aod: |
391 | regmap_del_irq_chip(irq_create_mapping(arizona->virq, 0), | 389 | regmap_del_irq_chip(irq_create_mapping(arizona->virq, 0), |
392 | arizona->aod_irq_chip); | 390 | arizona->aod_irq_chip); |
393 | err_domain: | ||
394 | err: | 391 | err: |
395 | return ret; | 392 | return ret; |
396 | } | 393 | } |