diff options
Diffstat (limited to 'drivers/mfd/arizona-irq.c')
-rw-r--r-- | drivers/mfd/arizona-irq.c | 29 |
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 | ||
347 | err_main_irq: | 356 | err_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); | ||
349 | err_ctrlif: | 360 | err_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); |
351 | err_boot_done: | 362 | err_boot_done: |
@@ -361,7 +372,9 @@ err: | |||
361 | 372 | ||
362 | int arizona_irq_exit(struct arizona *arizona) | 373 | int 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); |