regulator: core: Provide managed regulator registration
Subsystems (3)
Mark Brown
maintainerPATCH 1/11 regulator: core: Provide managed regulator registration
From: Mark Brown <[email protected]>
Many regulator drivers have a remove function that consists solely of calling regulator_unregister() so provide a devm_regulator_register() in order to allow this repeated code to be removed and help eliminate error handling code.
--- drivers/regulator/core.c | 66 ++++++++++++++++++++++++++++++++++++++++ include/linux/regulator/driver.h | 5 +++ 2 files changed, 71 insertions(+)
drivers/regulator/core.c +66 -0
@@ -3492,6 +3492,44 @@ clean: }EXPORT_SYMBOL_GPL (regulator_register); +static void devm_rdev_release (struct device *dev,void *res) +{ +regulator_unregister (*(struct regulator_dev **)res); +} + +/** +* devm_regulator_register - Resource managed regulator_register() +* @regulator_desc: regulator to register +* @config: runtime configuration for regulator +* +* Called by regulator drivers to register a regulator. Returns a +* valid pointer to struct regulator_dev on success or an ERR_PTR() on +* error. The regulator will automaticall be released when the device +* is unbound. +*/ +struct regulator_dev *devm_regulator_register (struct device *dev, +const struct regulator_desc *regulator_desc, +const struct regulator_config *config) +{ +struct regulator_dev **ptr, *rdev; + + ptr =devres_alloc (devm_rdev_release,sizeof (*ptr), +GFP_KERNEL ); +if (!ptr) +return ERR_PTR (-ENOMEM ); + + rdev =regulator_register (regulator_desc, config); +if (!IS_ERR (rdev)) { + *ptr = rdev; +devres_add (dev, ptr); + }else { +devres_free (ptr); + } + +return rdev; +} +EXPORT_SYMBOL_GPL (devm_regulator_register); +/** * regulator_unregister - unregister regulator * @rdev: regulator to unregister
@@ -3521,6 +3559,34 @@ void regulator_unregister(struct regulator_dev *rdev) }EXPORT_SYMBOL_GPL (regulator_unregister); +static int devm_rdev_match (struct device *dev,void *res,void *data) +{ +struct regulator_dev **r = res; +if (!r || !*r) { +WARN_ON (!r || !*r); +return 0 ; + } +return *r == data; +} + +/** +* devm_regulator_unregister - Resource managed regulator_unregister() +* @regulator: regulator to free +* +* Unregister a regulator registered with devm_regulator_register(). +* Normally this function will not need to be called and the resource +* management code will ensure that the resource is freed. +*/ +void devm_regulator_unregister (struct device *dev,struct regulator_dev *rdev) +{ +int rc; + + rc =devres_release (dev, devm_rdev_release, devm_rdev_match, rdev); +if (rc !=0 ) +WARN_ON (rc); +} +EXPORT_SYMBOL_GPL (devm_regulator_unregister); +/** * regulator_suspend_prepare - prepare regulators for system wide suspend * @state: system suspend state
include/linux/regulator/driver.h +5 -0
@@ -334,7 +334,12 @@ struct regulator_dev {struct regulator_dev *regulator_register (const struct regulator_desc *regulator_desc,const struct regulator_config *config); +struct regulator_dev * +devm_regulator_register (struct device *dev, +const struct regulator_desc *regulator_desc, +const struct regulator_config *config);void regulator_unregister (struct regulator_dev *rdev); +void devm_regulator_unregister (struct device *dev,struct regulator_dev *rdev);int regulator_notifier_call_chain (struct regulator_dev *rdev,unsigned long event,void *data);
Signature · 1 line
1.8.4.rc3
Mark Brown
maintainerPATCH 2/11 regulator: arizona-ldo1: Convert to devm_regulator_register()
From: Mark Brown <[email protected]>
--- drivers/regulator/arizona-ldo1.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-)
drivers/regulator/arizona-ldo1.c +1 -11
@@ -226,7 +226,7 @@ static int arizona_ldo1_probe(struct platform_device *pdev)else config.init_data = &ldo1->init_data; - ldo1->regulator =regulator_register (desc, &config); + ldo1->regulator =devm_regulator_register (&pdev->dev, desc, &config);if (IS_ERR (ldo1->regulator)) { ret =PTR_ERR (ldo1->regulator); dev_err(arizona->dev, "Failed to register LDO1 supply: %d\n",
@@ -239,18 +239,8 @@ static int arizona_ldo1_probe(struct platform_device *pdev)return 0 ; } -static int arizona_ldo1_remove (struct platform_device *pdev) -{ -struct arizona_ldo1 *ldo1 =platform_get_drvdata (pdev); - -regulator_unregister (ldo1->regulator); - -return 0 ; -} -static struct platform_driver arizona_ldo1_driver = { .probe = arizona_ldo1_probe, - .remove = arizona_ldo1_remove, .driver = { .name ="arizona-ldo1" , .owner =THIS_MODULE ,
Signature · 1 line
1.8.4.rc3
Mark Brown
maintainerPATCH 3/11 regulator: arizona-micsupp: Convert to devm_regulator_register()
In reply to Mark BrownFrom: Mark Brown <[email protected]>
--- drivers/regulator/arizona-micsupp.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-)
drivers/regulator/arizona-micsupp.c +3 -11
@@ -225,7 +225,9 @@ static int arizona_micsupp_probe(struct platform_device *pdev)regmap_update_bits (arizona->regmap,ARIZONA_MIC_CHARGE_PUMP_1 ,ARIZONA_CPMIC_BYPASS ,0 ); - micsupp->regulator =regulator_register (&arizona_micsupp, &config); + micsupp->regulator =devm_regulator_register (&pdev->dev, + &arizona_micsupp, + &config);if (IS_ERR (micsupp->regulator)) { ret =PTR_ERR (micsupp->regulator); dev_err(arizona->dev, "Failed to register mic supply: %d\n",
@@ -238,18 +240,8 @@ static int arizona_micsupp_probe(struct platform_device *pdev)return 0 ; } -static int arizona_micsupp_remove (struct platform_device *pdev) -{ -struct arizona_micsupp *micsupp =platform_get_drvdata (pdev); - -regulator_unregister (micsupp->regulator); - -return 0 ; -} -static struct platform_driver arizona_micsupp_driver = { .probe = arizona_micsupp_probe, - .remove = arizona_micsupp_remove, .driver = { .name ="arizona-micsupp" , .owner =THIS_MODULE ,
Signature · 1 line
1.8.4.rc3
Mark Brown
maintainerPATCH 4/11 regulator: s2mps11: Convert to devm_regulator_register()
In reply to Mark BrownFrom: Mark Brown <[email protected]>
--- drivers/regulator/s2mps11.c | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-)
drivers/regulator/s2mps11.c +1 -19
@@ -453,28 +453,11 @@ common_reg: ret =PTR_ERR (s2mps11->rdev[i]);dev_err (&pdev->dev,"regulator init failed for %d\n" , i); - s2mps11->rdev[i] =NULL ; - goto err; +return ret; } }return 0 ; -err: -for (i =0 ; i <S2MPS11_REGULATOR_MAX ; i++) -regulator_unregister (s2mps11->rdev[i]); - -return ret; -} - -static int s2mps11_pmic_remove (struct platform_device *pdev) -{ -struct s2mps11_info *s2mps11 =platform_get_drvdata (pdev); -int i; - -for (i =0 ; i <S2MPS11_REGULATOR_MAX ; i++) -regulator_unregister (s2mps11->rdev[i]); - -return 0 ; }static const struct platform_device_id s2mps11_pmic_id[] = {
@@ -489,7 +472,6 @@ static struct platform_driver s2mps11_pmic_driver = { .owner = THIS_MODULE, }, .probe = s2mps11_pmic_probe, - .remove = s2mps11_pmic_remove, .id_table = s2mps11_pmic_id, };
Signature · 1 line
1.8.4.rc3
RE: [PATCH 04/11] regulator: s2mps11: Convert to devm_regulator_register()
Quoted 5 lines · Mark Brown
Subject: [PATCH 04/11] regulator: s2mps11: Convert to
devm_regulator_register()From: Mark Brown <[email protected]>
Signed-off-by Mark Brown <[email protected]>
Thanks,
Sangbeom.
Mark Brown
maintainerPATCH 5/11 regulator: s5m8767: Covert to devm_regulator_register()
In reply to Mark BrownFrom: Mark Brown <[email protected]>
--- drivers/regulator/s5m8767.c | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-)
drivers/regulator/s5m8767.c +3 -21
@@ -910,34 +910,17 @@ static int s5m8767_pmic_probe(struct platform_device *pdev) config.regmap = iodev->regmap; config.of_node = pdata->regulators[i].reg_node; - rdev[i] =regulator_register (®ulators[id], &config); + rdev[i] =devm_regulator_register (&pdev->dev, ®ulators[id], + &config);if (IS_ERR (rdev[i])) { ret =PTR_ERR (rdev[i]);dev_err (s5m8767->dev,"regulator init failed for %d\n" , id); - rdev[i] =NULL ; - goto err; +return ret; } }return 0 ; -err: -for (i =0 ; i < s5m8767->num_regulators; i++) -regulator_unregister (rdev[i]); - -return ret; -} - -static int s5m8767_pmic_remove (struct platform_device *pdev) -{ -struct s5m8767_info *s5m8767 =platform_get_drvdata (pdev); -struct regulator_dev **rdev = s5m8767->rdev; -int i; - -for (i =0 ; i < s5m8767->num_regulators; i++) -regulator_unregister (rdev[i]); - -return 0 ; }static const struct platform_device_id s5m8767_pmic_id[] = {
@@ -952,7 +935,6 @@ static struct platform_driver s5m8767_pmic_driver = { .owner = THIS_MODULE, }, .probe = s5m8767_pmic_probe, - .remove = s5m8767_pmic_remove, .id_table = s5m8767_pmic_id, };
Signature · 1 line
1.8.4.rc3
RE: [PATCH 05/11] regulator: s5m8767: Covert to devm_regulator_register()
Quoted 5 lines · Mark Brown
Subject: [PATCH 05/11] regulator: s5m8767: Covert to
devm_regulator_register()From: Mark Brown <[email protected]>
Signed-off-by Mark Brown <[email protected]>
Thanks,
Sangbeom.
Mark Brown
maintainerPATCH 6/11 regulator: wm831x-dcdc: Convert to devm_regulator_register()
In reply to Mark BrownFrom: Mark Brown <[email protected]>
--- drivers/regulator/wm831x-dcdc.c | 66 ++++++++--------------------------------- 1 file changed, 12 insertions(+), 54 deletions(-)
drivers/regulator/wm831x-dcdc.c +12 -54
@@ -523,7 +523,8 @@ static int wm831x_buckv_probe(struct platform_device *pdev) config.driver_data = dcdc; config.regmap = wm831x->regmap; - dcdc->regulator =regulator_register (&dcdc->desc, &config); + dcdc->regulator =devm_regulator_register (&pdev->dev, &dcdc->desc, + &config);if (IS_ERR (dcdc->regulator)) { ret =PTR_ERR (dcdc->regulator); dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
@@ -538,7 +539,7 @@ static int wm831x_buckv_probe(struct platform_device *pdev)if (ret !=0 ) {dev_err (&pdev->dev,"Failed to request UV IRQ %d: %d\n" , irq, ret); - goto err_regulator; + goto err; } irq =wm831x_irq (wm831x,platform_get_irq_byname (pdev,"HC" ));
@@ -548,31 +549,19 @@ static int wm831x_buckv_probe(struct platform_device *pdev)if (ret !=0 ) {dev_err (&pdev->dev,"Failed to request HC IRQ %d: %d\n" , irq, ret); - goto err_regulator; + goto err; }platform_set_drvdata (pdev, dcdc);return 0 ; -err_regulator: -regulator_unregister (dcdc->regulator); err:return ret; } -static int wm831x_buckv_remove (struct platform_device *pdev) -{ -struct wm831x_dcdc *dcdc =platform_get_drvdata (pdev); - -regulator_unregister (dcdc->regulator); - -return 0 ; -} -static struct platform_driver wm831x_buckv_driver = { .probe = wm831x_buckv_probe, - .remove = wm831x_buckv_remove, .driver = { .name ="wm831x-buckv" , .owner =THIS_MODULE ,
@@ -673,7 +662,8 @@ static int wm831x_buckp_probe(struct platform_device *pdev) config.driver_data = dcdc; config.regmap = wm831x->regmap; - dcdc->regulator =regulator_register (&dcdc->desc, &config); + dcdc->regulator =devm_regulator_register (&pdev->dev, &dcdc->desc, + &config);if (IS_ERR (dcdc->regulator)) { ret =PTR_ERR (dcdc->regulator); dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
@@ -688,31 +678,19 @@ static int wm831x_buckp_probe(struct platform_device *pdev)if (ret !=0 ) {dev_err (&pdev->dev,"Failed to request UV IRQ %d: %d\n" , irq, ret); - goto err_regulator; + goto err; }platform_set_drvdata (pdev, dcdc);return 0 ; -err_regulator: -regulator_unregister (dcdc->regulator); err:return ret; } -static int wm831x_buckp_remove (struct platform_device *pdev) -{ -struct wm831x_dcdc *dcdc =platform_get_drvdata (pdev); - -regulator_unregister (dcdc->regulator); - -return 0 ; -} -static struct platform_driver wm831x_buckp_driver = { .probe = wm831x_buckp_probe, - .remove = wm831x_buckp_remove, .driver = { .name ="wm831x-buckp" , .owner =THIS_MODULE ,
@@ -804,7 +782,8 @@ static int wm831x_boostp_probe(struct platform_device *pdev) config.driver_data = dcdc; config.regmap = wm831x->regmap; - dcdc->regulator =regulator_register (&dcdc->desc, &config); + dcdc->regulator =devm_regulator_register (&pdev->dev, &dcdc->desc, + &config);if (IS_ERR (dcdc->regulator)) { ret =PTR_ERR (dcdc->regulator); dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
@@ -820,31 +799,19 @@ static int wm831x_boostp_probe(struct platform_device *pdev)if (ret !=0 ) {dev_err (&pdev->dev,"Failed to request UV IRQ %d: %d\n" , irq, ret); - goto err_regulator; + goto err; }platform_set_drvdata (pdev, dcdc);return 0 ; -err_regulator: -regulator_unregister (dcdc->regulator); err:return ret; } -static int wm831x_boostp_remove (struct platform_device *pdev) -{ -struct wm831x_dcdc *dcdc =platform_get_drvdata (pdev); - -regulator_unregister (dcdc->regulator); - -return 0 ; -} -static struct platform_driver wm831x_boostp_driver = { .probe = wm831x_boostp_probe, - .remove = wm831x_boostp_remove, .driver = { .name ="wm831x-boostp" , .owner =THIS_MODULE ,
@@ -904,7 +871,8 @@ static int wm831x_epe_probe(struct platform_device *pdev) config.driver_data = dcdc; config.regmap = wm831x->regmap; - dcdc->regulator =regulator_register (&dcdc->desc, &config); + dcdc->regulator =devm_regulator_register (&pdev->dev, &dcdc->desc, + &config);if (IS_ERR (dcdc->regulator)) { ret =PTR_ERR (dcdc->regulator); dev_err(wm831x->dev, "Failed to register EPE%d: %d\n",
@@ -920,18 +888,8 @@ err:return ret; } -static int wm831x_epe_remove (struct platform_device *pdev) -{ -struct wm831x_dcdc *dcdc =platform_get_drvdata (pdev); - -regulator_unregister (dcdc->regulator); - -return 0 ; -} -static struct platform_driver wm831x_epe_driver = { .probe = wm831x_epe_probe, - .remove = wm831x_epe_remove, .driver = { .name ="wm831x-epe" , .owner =THIS_MODULE ,
Signature · 1 line
1.8.4.rc3
Mark Brown
maintainerPATCH 7/11 regulator: wm831x-isink: Convert to devm_regulator_register()
In reply to Mark BrownFrom: Mark Brown <[email protected]>
--- drivers/regulator/wm831x-isink.c | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-)
drivers/regulator/wm831x-isink.c +3 -14
@@ -194,7 +194,8 @@ static int wm831x_isink_probe(struct platform_device *pdev) config.init_data = pdata->isink[id]; config.driver_data = isink; - isink->regulator =regulator_register (&isink->desc, &config); + isink->regulator =devm_regulator_register (&pdev->dev, &isink->desc, + &config);if (IS_ERR (isink->regulator)) { ret =PTR_ERR (isink->regulator); dev_err(wm831x->dev, "Failed to register ISINK%d: %d\n",
@@ -210,31 +211,19 @@ static int wm831x_isink_probe(struct platform_device *pdev)if (ret !=0 ) {dev_err (&pdev->dev,"Failed to request ISINK IRQ %d: %d\n" , irq, ret); - goto err_regulator; + goto err; }platform_set_drvdata (pdev, isink);return 0 ; -err_regulator: -regulator_unregister (isink->regulator); err:return ret; } -static int wm831x_isink_remove (struct platform_device *pdev) -{ -struct wm831x_isink *isink =platform_get_drvdata (pdev); - -regulator_unregister (isink->regulator); - -return 0 ; -} -static struct platform_driver wm831x_isink_driver = { .probe = wm831x_isink_probe, - .remove = wm831x_isink_remove, .driver = { .name ="wm831x-isink" , .owner =THIS_MODULE ,
Signature · 1 line
1.8.4.rc3
Mark Brown
maintainerPATCH 8/11 regulator: wm831x-ldo: Convert to devm_regulator_register()
In reply to Mark BrownFrom: Mark Brown <[email protected]>
--- drivers/regulator/wm831x-ldo.c | 47 +++++++----------------------------------- 1 file changed, 8 insertions(+), 39 deletions(-)
drivers/regulator/wm831x-ldo.c +8 -39
@@ -279,7 +279,8 @@ static int wm831x_gp_ldo_probe(struct platform_device *pdev) config.driver_data = ldo; config.regmap = wm831x->regmap; - ldo->regulator =regulator_register (&ldo->desc, &config); + ldo->regulator =devm_regulator_register (&pdev->dev, &ldo->desc, + &config);if (IS_ERR (ldo->regulator)) { ret =PTR_ERR (ldo->regulator); dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
@@ -295,31 +296,19 @@ static int wm831x_gp_ldo_probe(struct platform_device *pdev)if (ret !=0 ) {dev_err (&pdev->dev,"Failed to request UV IRQ %d: %d\n" , irq, ret); - goto err_regulator; + goto err; }platform_set_drvdata (pdev, ldo);return 0 ; -err_regulator: -regulator_unregister (ldo->regulator); err:return ret; } -static int wm831x_gp_ldo_remove (struct platform_device *pdev) -{ -struct wm831x_ldo *ldo =platform_get_drvdata (pdev); - -regulator_unregister (ldo->regulator); - -return 0 ; -} -static struct platform_driver wm831x_gp_ldo_driver = { .probe = wm831x_gp_ldo_probe, - .remove = wm831x_gp_ldo_remove, .driver = { .name ="wm831x-ldo" , .owner =THIS_MODULE ,
@@ -504,7 +493,8 @@ static int wm831x_aldo_probe(struct platform_device *pdev) config.driver_data = ldo; config.regmap = wm831x->regmap; - ldo->regulator =regulator_register (&ldo->desc, &config); + ldo->regulator =devm_regulator_register (&pdev->dev, &ldo->desc, + &config);if (IS_ERR (ldo->regulator)) { ret =PTR_ERR (ldo->regulator); dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
@@ -519,31 +509,19 @@ static int wm831x_aldo_probe(struct platform_device *pdev)if (ret !=0 ) {dev_err (&pdev->dev,"Failed to request UV IRQ %d: %d\n" , irq, ret); - goto err_regulator; + goto err; }platform_set_drvdata (pdev, ldo);return 0 ; -err_regulator: -regulator_unregister (ldo->regulator); err:return ret; } -static int wm831x_aldo_remove (struct platform_device *pdev) -{ -struct wm831x_ldo *ldo =platform_get_drvdata (pdev); - -regulator_unregister (ldo->regulator); - -return 0 ; -} -static struct platform_driver wm831x_aldo_driver = { .probe = wm831x_aldo_probe, - .remove = wm831x_aldo_remove, .driver = { .name ="wm831x-aldo" , .owner =THIS_MODULE ,
@@ -661,7 +639,8 @@ static int wm831x_alive_ldo_probe(struct platform_device *pdev) config.driver_data = ldo; config.regmap = wm831x->regmap; - ldo->regulator =regulator_register (&ldo->desc, &config); + ldo->regulator =devm_regulator_register (&pdev->dev, &ldo->desc, + &config);if (IS_ERR (ldo->regulator)) { ret =PTR_ERR (ldo->regulator); dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
@@ -677,18 +656,8 @@ err:return ret; } -static int wm831x_alive_ldo_remove (struct platform_device *pdev) -{ -struct wm831x_ldo *ldo =platform_get_drvdata (pdev); - -regulator_unregister (ldo->regulator); - -return 0 ; -} -static struct platform_driver wm831x_alive_ldo_driver = { .probe = wm831x_alive_ldo_probe, - .remove = wm831x_alive_ldo_remove, .driver = { .name ="wm831x-alive-ldo" , .owner =THIS_MODULE ,
Signature · 1 line
1.8.4.rc3
Mark Brown
maintainerPATCH 9/11 regulator: wm8350: Convert to devm_regulator_register()
In reply to Mark BrownFrom: Mark Brown <[email protected]>
--- drivers/regulator/wm8350-regulator.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/regulator/wm8350-regulator.c +2 -4
@@ -1206,7 +1206,8 @@ static int wm8350_regulator_probe(struct platform_device *pdev) config.regmap = wm8350->regmap;/* register regulator */ - rdev =regulator_register (&wm8350_reg[pdev->id], &config); + rdev =devm_regulator_register (&pdev->dev, &wm8350_reg[pdev->id], + &config);if (IS_ERR (rdev)) {dev_err (&pdev->dev,"failed to register %s\n" , wm8350_reg[pdev->id].name);
@@ -1217,7 +1218,6 @@ static int wm8350_regulator_probe(struct platform_device *pdev) ret =wm8350_register_irq (wm8350, wm8350_reg[pdev->id].irq, pmic_uv_handler,0 ,"UV" , rdev);if (ret <0 ) { -regulator_unregister (rdev);dev_err (&pdev->dev,"failed to register regulator %s IRQ\n" , wm8350_reg[pdev->id].name);return ret;
@@ -1233,8 +1233,6 @@ static int wm8350_regulator_remove(struct platform_device *pdev)wm8350_free_irq (wm8350, wm8350_reg[pdev->id].irq, rdev); -regulator_unregister (rdev); -return 0 ; }
Signature · 1 line
1.8.4.rc3