2012-06-13 01:59:36

by Axel Lin

[permalink] [raw]
Subject: [PATCH 1/2] regulator: wm831x-ldo: Convert to devm_request_threaded_irq

Signed-off-by: Axel Lin <[email protected]>
---
drivers/regulator/wm831x-ldo.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/regulator/wm831x-ldo.c b/drivers/regulator/wm831x-ldo.c
index f23d020e9..ebe5af4 100644
--- a/drivers/regulator/wm831x-ldo.c
+++ b/drivers/regulator/wm831x-ldo.c
@@ -322,9 +322,9 @@ static __devinit int wm831x_gp_ldo_probe(struct platform_device *pdev)
}

irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
- ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
- IRQF_TRIGGER_RISING, ldo->name,
- ldo);
+ ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
+ wm831x_ldo_uv_irq, IRQF_TRIGGER_RISING,
+ ldo->name, ldo);
if (ret != 0) {
dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
irq, ret);
@@ -346,9 +346,6 @@ static __devexit int wm831x_gp_ldo_remove(struct platform_device *pdev)
struct wm831x_ldo *ldo = platform_get_drvdata(pdev);

platform_set_drvdata(pdev, NULL);
-
- free_irq(wm831x_irq(ldo->wm831x,
- platform_get_irq_byname(pdev, "UV")), ldo);
regulator_unregister(ldo->regulator);

return 0;
--
1.7.9.5



2012-06-13 02:00:27

by Axel Lin

[permalink] [raw]
Subject: [PATCH 2/2] regulator: wm831x-isink: Convert to devm_request_threaded_irq

Signed-off-by: Axel Lin <[email protected]>
---
drivers/regulator/wm831x-isink.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/regulator/wm831x-isink.c b/drivers/regulator/wm831x-isink.c
index 0d207c2..1d414d2 100644
--- a/drivers/regulator/wm831x-isink.c
+++ b/drivers/regulator/wm831x-isink.c
@@ -203,8 +203,9 @@ static __devinit int wm831x_isink_probe(struct platform_device *pdev)
}

irq = wm831x_irq(wm831x, platform_get_irq(pdev, 0));
- ret = request_threaded_irq(irq, NULL, wm831x_isink_irq,
- IRQF_TRIGGER_RISING, isink->name, isink);
+ ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
+ wm831x_isink_irq, IRQF_TRIGGER_RISING,
+ isink->name, isink);
if (ret != 0) {
dev_err(&pdev->dev, "Failed to request ISINK IRQ %d: %d\n",
irq, ret);
@@ -226,9 +227,6 @@ static __devexit int wm831x_isink_remove(struct platform_device *pdev)
struct wm831x_isink *isink = platform_get_drvdata(pdev);

platform_set_drvdata(pdev, NULL);
-
- free_irq(wm831x_irq(isink->wm831x, platform_get_irq(pdev, 0)), isink);
-
regulator_unregister(isink->regulator);

return 0;
--
1.7.9.5


2012-06-13 09:30:19

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH 1/2] regulator: wm831x-ldo: Convert to devm_request_threaded_irq

On Wed, Jun 13, 2012 at 09:59:27AM +0800, Axel Lin wrote:
> Signed-off-by: Axel Lin <[email protected]>

No, this (and generally a large proportion of possible usages of
devm_request_threaded_irq()) is a bad idea - we need to ensure that the
interrupt cannot fire when we're not in a position to handle it which in
thi case means after the regulator is unregistered. Since we're not
doing anything to explicitly quiesce the interrupt other than free it we
need to ensure that the free_irq() happens strictly before the regulator
is unregistered.


Attachments:
(No filename) (548.00 B)
signature.asc (836.00 B)
Digital signature
Download all attachments