aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/arizona-irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mfd/arizona-irq.c')
-rw-r--r--drivers/mfd/arizona-irq.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/mfd/arizona-irq.c b/drivers/mfd/arizona-irq.c
index 17102f589100..d420dbc0e2b0 100644
--- a/drivers/mfd/arizona-irq.c
+++ b/drivers/mfd/arizona-irq.c
@@ -188,24 +188,33 @@ int arizona_irq_init(struct arizona *arizona)
188 int flags = IRQF_ONESHOT; 188 int flags = IRQF_ONESHOT;
189 int ret, i; 189 int ret, i;
190 const struct regmap_irq_chip *aod, *irq; 190 const struct regmap_irq_chip *aod, *irq;
191 bool ctrlif_error = true;
192 struct irq_data *irq_data; 191 struct irq_data *irq_data;
193 192
193 arizona->ctrlif_error = true;
194
194 switch (arizona->type) { 195 switch (arizona->type) {
195#ifdef CONFIG_MFD_WM5102 196#ifdef CONFIG_MFD_WM5102
196 case WM5102: 197 case WM5102:
197 aod = &wm5102_aod; 198 aod = &wm5102_aod;
198 irq = &wm5102_irq; 199 irq = &wm5102_irq;
199 200
200 ctrlif_error = false; 201 arizona->ctrlif_error = false;
201 break; 202 break;
202#endif 203#endif
203#ifdef CONFIG_MFD_WM5110 204#ifdef CONFIG_MFD_WM5110
204 case WM5110: 205 case WM5110:
205 aod = &wm5110_aod; 206 aod = &wm5110_aod;
206 irq = &wm5110_irq;
207 207
208 ctrlif_error = false; 208 switch (arizona->rev) {
209 case 0 ... 2:
210 irq = &wm5110_irq;
211 break;
212 default:
213 irq = &wm5110_revd_irq;
214 break;
215 }
216
217 arizona->ctrlif_error = false;
209 break; 218 break;
210#endif 219#endif
211#ifdef CONFIG_MFD_WM8997 220#ifdef CONFIG_MFD_WM8997
@@ -213,7 +222,7 @@ int arizona_irq_init(struct arizona *arizona)
213 aod = &wm8997_aod; 222 aod = &wm8997_aod;
214 irq = &wm8997_irq; 223 irq = &wm8997_irq;
215 224
216 ctrlif_error = false; 225 arizona->ctrlif_error = false;
217 break; 226 break;
218#endif 227#endif
219 default: 228 default:
@@ -300,7 +309,7 @@ int arizona_irq_init(struct arizona *arizona)
300 } 309 }
301 310
302 /* Handle control interface errors in the core */ 311 /* Handle control interface errors in the core */
303 if (ctrlif_error) { 312 if (arizona->ctrlif_error) {
304 i = arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR); 313 i = arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR);
305 ret = request_threaded_irq(i, NULL, arizona_ctrlif_err, 314 ret = request_threaded_irq(i, NULL, arizona_ctrlif_err,
306 IRQF_ONESHOT, 315 IRQF_ONESHOT,
@@ -345,7 +354,9 @@ int arizona_irq_init(struct arizona *arizona)
345 return 0; 354 return 0;
346 355
347err_main_irq: 356err_main_irq:
348 free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR), arizona); 357 if (arizona->ctrlif_error)
358 free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR),
359 arizona);
349err_ctrlif: 360err_ctrlif:
350 free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona); 361 free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona);
351err_boot_done: 362err_boot_done:
@@ -361,7 +372,9 @@ err:
361 372
362int arizona_irq_exit(struct arizona *arizona) 373int arizona_irq_exit(struct arizona *arizona)
363{ 374{
364 free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR), arizona); 375 if (arizona->ctrlif_error)
376 free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR),
377 arizona);
365 free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona); 378 free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona);
366 regmap_del_irq_chip(irq_create_mapping(arizona->virq, 1), 379 regmap_del_irq_chip(irq_create_mapping(arizona->virq, 1),
367 arizona->irq_chip); 380 arizona->irq_chip);