regulator: max8997: Properly handle gpio_request failure
PATCH 1/2 regulator: max8997: Properly handle gpio_request failure
Convert to devm_gpio_request to save a few error handling code.
This patch properly handle the gpio_request failure with -EBUSY, we should return error rather than ommit the gpio_request failure with -EBUSY.
I think one of the reason we got -EBUSY is because current code does not free gpios in max8997_pmic_remove(). So it got -EBUSY when reload the module.
Yest another reason is in current code if gpio_request() returns -EBUSY, the rest of the code still calls gpio_direction_output to config buck125_gpios and set gpio value in max8997_set_gpio(). This looks wrong to me.
--- drivers/regulator/max8997.c | 40 +++++++++------------------------------- 1 file changed, 9 insertions(+), 31 deletions(-)
drivers/regulator/max8997.c +9 -31
@@ -1025,7 +1025,6 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev)*/ if (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs || pdata->buck5_gpiodvs) { -bool gpio1set = false, gpio2set = false; if (!gpio_is_valid(pdata->buck125_gpios[0]) || !gpio_is_valid(pdata->buck125_gpios[1]) ||
@@ -1035,40 +1034,20 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) goto err_out; } - ret =gpio_request (pdata->buck125_gpios[0 ], -"MAX8997 SET1" ); -if (ret == -EBUSY ) -dev_warn (&pdev->dev,"Duplicated gpio request" -" on SET1\n" ); -else if (ret) + ret =devm_gpio_request (&pdev->dev, pdata->buck125_gpios[0 ], +"MAX8997 SET1" ); +if (ret) goto err_out; -else - gpio1set = true; - - ret =gpio_request (pdata->buck125_gpios[1 ], -"MAX8997 SET2" ); -if (ret == -EBUSY ) -dev_warn (&pdev->dev,"Duplicated gpio request" -" on SET2\n" ); -else if (ret) { -if (gpio1set) -gpio_free (pdata->buck125_gpios[0 ]); + + ret =devm_gpio_request (&pdev->dev, pdata->buck125_gpios[1 ], +"MAX8997 SET2" ); +if (ret) goto err_out; - }else - gpio2set = true; - ret =gpio_request (pdata->buck125_gpios[2 ], + ret =devm_gpio_request (&pdev->dev, pdata->buck125_gpios[2 ],"MAX8997 SET3" ); -if (ret == -EBUSY ) -dev_warn (&pdev->dev,"Duplicated gpio request" -" on SET3\n" ); -else if (ret) { -if (gpio1set) -gpio_free (pdata->buck125_gpios[0 ]); -if (gpio2set) -gpio_free (pdata->buck125_gpios[1 ]); +if (ret) goto err_out; - }gpio_direction_output (pdata->buck125_gpios[0 ], (max8997->buck125_gpioindex >> 2)
@@ -1079,7 +1058,6 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev)gpio_direction_output (pdata->buck125_gpios[2 ], (max8997->buck125_gpioindex >>0 ) &0x1 );/* SET3 */ - ret =0 ; }/* DVS-GPIO disabled */
Signature · 1 line
1.7.9.5
PATCH 2/2 regulator: s5m8767: Properly handle gpio_request failure
Convert to devm_gpio_request to save a few error handling code.
This patch properly handle the gpio_request failure, we should return error when gpio_request fails rather than just show warning.
I think one of the reason we got -EBUSY is because current code does not free gpios in s5m8767_pmic_remove(). So it got -EBUSY when reload the module.
Yest another reason is in current code if gpio_request() returns error, the rest of the code still calls gpio_direction_output to config buck_gpios and buck_ds gpios. This looks wrong to me.
--- drivers/regulator/s5m8767.c | 49 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 25 deletions(-)
drivers/regulator/s5m8767.c +24 -25
@@ -559,20 +559,21 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)if (gpio_is_valid (pdata->buck_gpios[0 ]) &&gpio_is_valid (pdata->buck_gpios[1 ]) &&gpio_is_valid (pdata->buck_gpios[2 ])) { - ret =gpio_request (pdata->buck_gpios[0 ],"S5M8767 SET1" ); -if (ret == -EBUSY ) -dev_warn (&pdev->dev,"Duplicated gpio request" -" for SET1\n" ); - - ret =gpio_request (pdata->buck_gpios[1 ],"S5M8767 SET2" ); -if (ret == -EBUSY ) -dev_warn (&pdev->dev,"Duplicated gpio request" -" for SET2\n" ); - - ret =gpio_request (pdata->buck_gpios[2 ],"S5M8767 SET3" ); -if (ret == -EBUSY ) -dev_warn (&pdev->dev,"Duplicated gpio request" -" for SET3\n" ); + ret =devm_gpio_request (&pdev->dev, pdata->buck_gpios[0 ], +"S5M8767 SET1" ); +if (ret) +return ret; + + ret =devm_gpio_request (&pdev->dev, pdata->buck_gpios[1 ], +"S5M8767 SET2" ); +if (ret) +return ret; + + ret =devm_gpio_request (&pdev->dev, pdata->buck_gpios[2 ], +"S5M8767 SET3" ); +if (ret) +return ret; +/* SET1 GPIO */ gpio_direction_output (pdata->buck_gpios[0 ], (s5m8767->buck_gpioindex >>2 ) &0x1 );
@@ -582,25 +583,23 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)/* SET3 GPIO */ gpio_direction_output (pdata->buck_gpios[2 ], (s5m8767->buck_gpioindex >>0 ) &0x1 ); - ret =0 ; - }else {dev_err (&pdev->dev,"GPIO NOT VALID\n" ); ret = -EINVAL ;return ret; } - ret =gpio_request (pdata->buck_ds[0 ],"S5M8767 DS2" ); -if (ret == -EBUSY ) -dev_warn (&pdev->dev,"Duplicated gpio request for DS2\n" ); + ret =devm_gpio_request (&pdev->dev, pdata->buck_ds[0 ],"S5M8767 DS2" ); +if (ret) +return ret; - ret =gpio_request (pdata->buck_ds[1 ],"S5M8767 DS3" ); -if (ret == -EBUSY ) -dev_warn (&pdev->dev,"Duplicated gpio request for DS3\n" ); + ret =devm_gpio_request (&pdev->dev, pdata->buck_ds[1 ],"S5M8767 DS3" ); +if (ret) +return ret; - ret =gpio_request (pdata->buck_ds[2 ],"S5M8767 DS4" ); -if (ret == -EBUSY ) -dev_warn (&pdev->dev,"Duplicated gpio request for DS4\n" ); + ret =devm_gpio_request (&pdev->dev, pdata->buck_ds[2 ],"S5M8767 DS4" ); +if (ret) +return ret;/* DS2 GPIO */ gpio_direction_output (pdata->buck_ds[0 ],0x0 );
Signature · 1 line
1.7.9.5
Mark Brown
AppliedQuoted 1 line · Axel Lin
Convert to
devm_gpio_requestto save a few error handling code.
Applied both, thanks.