|
@@ -188,16 +188,17 @@ int arizona_irq_init(struct arizona *arizona)
|
|
int flags = IRQF_ONESHOT;
|
|
int flags = IRQF_ONESHOT;
|
|
int ret, i;
|
|
int ret, i;
|
|
const struct regmap_irq_chip *aod, *irq;
|
|
const struct regmap_irq_chip *aod, *irq;
|
|
- bool ctrlif_error = true;
|
|
|
|
struct irq_data *irq_data;
|
|
struct irq_data *irq_data;
|
|
|
|
|
|
|
|
+ arizona->ctrlif_error = true;
|
|
|
|
+
|
|
switch (arizona->type) {
|
|
switch (arizona->type) {
|
|
#ifdef CONFIG_MFD_WM5102
|
|
#ifdef CONFIG_MFD_WM5102
|
|
case WM5102:
|
|
case WM5102:
|
|
aod = &wm5102_aod;
|
|
aod = &wm5102_aod;
|
|
irq = &wm5102_irq;
|
|
irq = &wm5102_irq;
|
|
|
|
|
|
- ctrlif_error = false;
|
|
|
|
|
|
+ arizona->ctrlif_error = false;
|
|
break;
|
|
break;
|
|
#endif
|
|
#endif
|
|
#ifdef CONFIG_MFD_WM5110
|
|
#ifdef CONFIG_MFD_WM5110
|
|
@@ -213,7 +214,7 @@ int arizona_irq_init(struct arizona *arizona)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- ctrlif_error = false;
|
|
|
|
|
|
+ arizona->ctrlif_error = false;
|
|
break;
|
|
break;
|
|
#endif
|
|
#endif
|
|
#ifdef CONFIG_MFD_WM8997
|
|
#ifdef CONFIG_MFD_WM8997
|
|
@@ -221,7 +222,7 @@ int arizona_irq_init(struct arizona *arizona)
|
|
aod = &wm8997_aod;
|
|
aod = &wm8997_aod;
|
|
irq = &wm8997_irq;
|
|
irq = &wm8997_irq;
|
|
|
|
|
|
- ctrlif_error = false;
|
|
|
|
|
|
+ arizona->ctrlif_error = false;
|
|
break;
|
|
break;
|
|
#endif
|
|
#endif
|
|
default:
|
|
default:
|
|
@@ -308,7 +309,7 @@ int arizona_irq_init(struct arizona *arizona)
|
|
}
|
|
}
|
|
|
|
|
|
/* Handle control interface errors in the core */
|
|
/* Handle control interface errors in the core */
|
|
- if (ctrlif_error) {
|
|
|
|
|
|
+ if (arizona->ctrlif_error) {
|
|
i = arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR);
|
|
i = arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR);
|
|
ret = request_threaded_irq(i, NULL, arizona_ctrlif_err,
|
|
ret = request_threaded_irq(i, NULL, arizona_ctrlif_err,
|
|
IRQF_ONESHOT,
|
|
IRQF_ONESHOT,
|
|
@@ -353,7 +354,9 @@ int arizona_irq_init(struct arizona *arizona)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
err_main_irq:
|
|
err_main_irq:
|
|
- free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR), arizona);
|
|
|
|
|
|
+ if (arizona->ctrlif_error)
|
|
|
|
+ free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR),
|
|
|
|
+ arizona);
|
|
err_ctrlif:
|
|
err_ctrlif:
|
|
free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona);
|
|
free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona);
|
|
err_boot_done:
|
|
err_boot_done:
|
|
@@ -369,7 +372,9 @@ err:
|
|
|
|
|
|
int arizona_irq_exit(struct arizona *arizona)
|
|
int arizona_irq_exit(struct arizona *arizona)
|
|
{
|
|
{
|
|
- free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR), arizona);
|
|
|
|
|
|
+ if (arizona->ctrlif_error)
|
|
|
|
+ free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR),
|
|
|
|
+ arizona);
|
|
free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona);
|
|
free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona);
|
|
regmap_del_irq_chip(irq_create_mapping(arizona->virq, 1),
|
|
regmap_del_irq_chip(irq_create_mapping(arizona->virq, 1),
|
|
arizona->irq_chip);
|
|
arizona->irq_chip);
|