Skip to contentSkip to conversation

regulator: wm831x-ldo: Convert to devm_request_threaded_irq

PATCH In review Axel Lin 2 participants 3 messages Jun 13, 2012

Subsystems (2)
lore
Share & tools
lore

Axel Lin

author
#0 lore raw

PATCH 1/2 regulator: wm831x-ldo: Convert to devm_request_threaded_irq

---
 drivers/regulator/wm831x-ldo.c |    9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/regulator/wm831x-ldo.c +3 -6
index f23d020e9..ebe5af4 100644
@@ -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;
Signature · 1 line
1.7.9.5
author
#1 lore raw

PATCH 2/2 regulator: wm831x-isink: Convert to devm_request_threaded_irq

---
 drivers/regulator/wm831x-isink.c |    8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/regulator/wm831x-isink.c +3 -5
index 0d207c2..1d414d2 100644
@@ -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;
Signature · 1 line
1.7.9.5
#2 lore raw
In reply to Axel Lin
Quoted 1 line · Axel Lin

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.