mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
iio: adc: qcom-spmi-iadc: balance enable_irq_wake() on driver unbind
iadc_probe() calls enable_irq_wake() after a successful devm_request_irq(), but the driver has no remove callback or matching disable_irq_wake(), so the wake reference count on the IRQ is leaked on module unload or driver unbind. Check the IRQ request error first, then register a devm action that calls disable_irq_wake() so the wake reference is released in the same scope as the enable. While here, drop the inverted "if (!ret) ... else return ret" in favour of the standard "if (ret) return ret;" pattern. Signed-off-by: Stepan Ionichev <sozdayvek@gmail.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
744bccc264
commit
929fec2964
|
|
@ -481,6 +481,11 @@ static const struct iio_chan_spec iadc_channels[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static void iadc_disable_irq_wake(void *data)
|
||||
{
|
||||
disable_irq_wake((unsigned long)data);
|
||||
}
|
||||
|
||||
static int iadc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
|
@ -538,9 +543,16 @@ static int iadc_probe(struct platform_device *pdev)
|
|||
if (!iadc->poll_eoc) {
|
||||
ret = devm_request_irq(dev, irq_eoc, iadc_isr, 0,
|
||||
"spmi-iadc", iadc);
|
||||
if (!ret)
|
||||
enable_irq_wake(irq_eoc);
|
||||
else
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = enable_irq_wake(irq_eoc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = devm_add_action_or_reset(dev, iadc_disable_irq_wake,
|
||||
(void *)(unsigned long)irq_eoc);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
ret = devm_device_init_wakeup(iadc->dev);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user