mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
power: supply: ab8500_fg: Request all IRQs as threaded
Since these IRQs are cascaded from a nested IRQ, the generic IRQ system detects this and refuse to deliver a fastpath IRQ in response to request_irq(): nested = irq_settings_is_nested_thread(desc); if (nested) { if (!new->thread_fn) { ret = -EINVAL; goto out_mput; } (...) Threaded IRQs work just as well so let's just request threaded IRQs. One of the IRQs are alread requested as threaded anyways. Cc: Marcus Cooper <codekipper@gmail.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
This commit is contained in:
parent
532b623f3c
commit
807042539d
1 changed files with 11 additions and 36 deletions
|
@ -3001,14 +3001,11 @@ static int ab8500_fg_remove(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ab8500 fg driver interrupts and their respective isr */
|
/* ab8500 fg driver interrupts and their respective isr */
|
||||||
static struct ab8500_fg_interrupts ab8500_fg_irq_th[] = {
|
static struct ab8500_fg_interrupts ab8500_fg_irq[] = {
|
||||||
{"NCONV_ACCU", ab8500_fg_cc_convend_handler},
|
{"NCONV_ACCU", ab8500_fg_cc_convend_handler},
|
||||||
{"BATT_OVV", ab8500_fg_batt_ovv_handler},
|
{"BATT_OVV", ab8500_fg_batt_ovv_handler},
|
||||||
{"LOW_BAT_F", ab8500_fg_lowbatf_handler},
|
{"LOW_BAT_F", ab8500_fg_lowbatf_handler},
|
||||||
{"CC_INT_CALIB", ab8500_fg_cc_int_calib_handler},
|
{"CC_INT_CALIB", ab8500_fg_cc_int_calib_handler},
|
||||||
};
|
|
||||||
|
|
||||||
static struct ab8500_fg_interrupts ab8500_fg_irq_bh[] = {
|
|
||||||
{"CCEOC", ab8500_fg_cc_data_end_handler},
|
{"CCEOC", ab8500_fg_cc_data_end_handler},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3149,45 +3146,26 @@ static int ab8500_fg_probe(struct platform_device *pdev)
|
||||||
init_completion(&di->ab8500_fg_complete);
|
init_completion(&di->ab8500_fg_complete);
|
||||||
|
|
||||||
/* Register primary interrupt handlers */
|
/* Register primary interrupt handlers */
|
||||||
for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq_th); i++) {
|
for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq); i++) {
|
||||||
irq = platform_get_irq_byname(pdev, ab8500_fg_irq_th[i].name);
|
irq = platform_get_irq_byname(pdev, ab8500_fg_irq[i].name);
|
||||||
if (irq < 0) {
|
if (irq < 0) {
|
||||||
ret = irq;
|
ret = irq;
|
||||||
goto free_irq_th;
|
goto free_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = request_irq(irq, ab8500_fg_irq_th[i].isr,
|
ret = request_threaded_irq(irq, NULL, ab8500_fg_irq[i].isr,
|
||||||
IRQF_SHARED | IRQF_NO_SUSPEND,
|
IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
|
||||||
ab8500_fg_irq_th[i].name, di);
|
ab8500_fg_irq[i].name, di);
|
||||||
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
dev_err(dev, "failed to request %s IRQ %d: %d\n",
|
dev_err(dev, "failed to request %s IRQ %d: %d\n",
|
||||||
ab8500_fg_irq_th[i].name, irq, ret);
|
ab8500_fg_irq[i].name, irq, ret);
|
||||||
goto free_irq_th;
|
goto free_irq;
|
||||||
}
|
}
|
||||||
dev_dbg(dev, "Requested %s IRQ %d: %d\n",
|
dev_dbg(dev, "Requested %s IRQ %d: %d\n",
|
||||||
ab8500_fg_irq_th[i].name, irq, ret);
|
ab8500_fg_irq[i].name, irq, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register threaded interrupt handler */
|
|
||||||
irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
|
|
||||||
if (irq < 0) {
|
|
||||||
ret = irq;
|
|
||||||
goto free_irq_th;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = request_threaded_irq(irq, NULL, ab8500_fg_irq_bh[0].isr,
|
|
||||||
IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
|
|
||||||
ab8500_fg_irq_bh[0].name, di);
|
|
||||||
|
|
||||||
if (ret != 0) {
|
|
||||||
dev_err(dev, "failed to request %s IRQ %d: %d\n",
|
|
||||||
ab8500_fg_irq_bh[0].name, irq, ret);
|
|
||||||
goto free_irq_th;
|
|
||||||
}
|
|
||||||
dev_dbg(dev, "Requested %s IRQ %d: %d\n",
|
|
||||||
ab8500_fg_irq_bh[0].name, irq, ret);
|
|
||||||
|
|
||||||
di->irq = platform_get_irq_byname(pdev, "CCEOC");
|
di->irq = platform_get_irq_byname(pdev, "CCEOC");
|
||||||
disable_irq(di->irq);
|
disable_irq(di->irq);
|
||||||
di->nbr_cceoc_irq_cnt = 0;
|
di->nbr_cceoc_irq_cnt = 0;
|
||||||
|
@ -3223,12 +3201,9 @@ static int ab8500_fg_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
free_irq:
|
free_irq:
|
||||||
/* We also have to free all registered irqs */
|
/* We also have to free all registered irqs */
|
||||||
irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
|
|
||||||
free_irq(irq, di);
|
|
||||||
free_irq_th:
|
|
||||||
while (--i >= 0) {
|
while (--i >= 0) {
|
||||||
/* Last assignment of i from primary interrupt handlers */
|
/* Last assignment of i from primary interrupt handlers */
|
||||||
irq = platform_get_irq_byname(pdev, ab8500_fg_irq_th[i].name);
|
irq = platform_get_irq_byname(pdev, ab8500_fg_irq[i].name);
|
||||||
free_irq(irq, di);
|
free_irq(irq, di);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue