2022-07-30 08:16:18

by 'Manivannan Sadhasivam'

[permalink] [raw]
Subject: [PATCH] remoteproc: qcom_q6v5_pas: Do not fail if regulators are not found

devm_regulator_get_optional() API will return -ENODEV if the regulator was
not found. For the optional supplies CX, PX we should not fail in that case
but rather continue. So let's catch that error and continue silently if
those regulators are not found.

The commit 3f52d118f992 ("remoteproc: qcom_q6v5_pas: Deal silently with
optional px and cx regulators") was supposed to do the same but it missed
the fact that devm_regulator_get_optional() API returns -ENODEV when the
regulator was not found.

Cc: Abel Vesa <[email protected]>
Fixes: 3f52d118f992 ("remoteproc: qcom_q6v5_pas: Deal silently with optional px and cx regulators")
Reported-by: Steev Klimaszewski <[email protected]>
Signed-off-by: Manivannan Sadhasivam <[email protected]>
---
drivers/remoteproc/qcom_q6v5_pas.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
index 98f133f9bb60..5bf69ef53819 100644
--- a/drivers/remoteproc/qcom_q6v5_pas.c
+++ b/drivers/remoteproc/qcom_q6v5_pas.c
@@ -362,12 +362,24 @@ static int adsp_init_clock(struct qcom_adsp *adsp)
static int adsp_init_regulator(struct qcom_adsp *adsp)
{
adsp->cx_supply = devm_regulator_get_optional(adsp->dev, "cx");
- if (IS_ERR(adsp->cx_supply))
- return PTR_ERR(adsp->cx_supply);
+ if (IS_ERR(adsp->cx_supply)) {
+ /* Do not fail if the regulator is not found */
+ if (PTR_ERR(adsp->cx_supply) == -ENODEV)
+ adsp->cx_supply = NULL;
+ else
+ return PTR_ERR(adsp->cx_supply);
+ }

- regulator_set_load(adsp->cx_supply, 100000);
+ if (adsp->cx_supply)
+ regulator_set_load(adsp->cx_supply, 100000);

adsp->px_supply = devm_regulator_get_optional(adsp->dev, "px");
+ if (IS_ERR(adsp->px_supply)) {
+ /* Do not fail if the regulator is not found */
+ if (PTR_ERR(adsp->px_supply) == -ENODEV)
+ adsp->px_supply = NULL;
+ }
+
return PTR_ERR_OR_ZERO(adsp->px_supply);
}

--
2.25.1



2022-07-30 18:13:11

by Abel Vesa

[permalink] [raw]
Subject: Re: [PATCH] remoteproc: qcom_q6v5_pas: Do not fail if regulators are not found

On 22-07-30 11:58:34, Manivannan Sadhasivam wrote:
> devm_regulator_get_optional() API will return -ENODEV if the regulator was
> not found. For the optional supplies CX, PX we should not fail in that case
> but rather continue. So let's catch that error and continue silently if
> those regulators are not found.
>
> The commit 3f52d118f992 ("remoteproc: qcom_q6v5_pas: Deal silently with
> optional px and cx regulators") was supposed to do the same but it missed
> the fact that devm_regulator_get_optional() API returns -ENODEV when the
> regulator was not found.
>
> Cc: Abel Vesa <[email protected]>
> Fixes: 3f52d118f992 ("remoteproc: qcom_q6v5_pas: Deal silently with optional px and cx regulators")
> Reported-by: Steev Klimaszewski <[email protected]>
> Signed-off-by: Manivannan Sadhasivam <[email protected]>

Yep, makes sense.

Reviewed-by: Abel Vesa <[email protected]>

> ---
> drivers/remoteproc/qcom_q6v5_pas.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
> index 98f133f9bb60..5bf69ef53819 100644
> --- a/drivers/remoteproc/qcom_q6v5_pas.c
> +++ b/drivers/remoteproc/qcom_q6v5_pas.c
> @@ -362,12 +362,24 @@ static int adsp_init_clock(struct qcom_adsp *adsp)
> static int adsp_init_regulator(struct qcom_adsp *adsp)
> {
> adsp->cx_supply = devm_regulator_get_optional(adsp->dev, "cx");
> - if (IS_ERR(adsp->cx_supply))
> - return PTR_ERR(adsp->cx_supply);
> + if (IS_ERR(adsp->cx_supply)) {
> + /* Do not fail if the regulator is not found */

Maybe this comment is redundant.

> + if (PTR_ERR(adsp->cx_supply) == -ENODEV)
> + adsp->cx_supply = NULL;
> + else
> + return PTR_ERR(adsp->cx_supply);
> + }
>
> - regulator_set_load(adsp->cx_supply, 100000);
> + if (adsp->cx_supply)
> + regulator_set_load(adsp->cx_supply, 100000);
>
> adsp->px_supply = devm_regulator_get_optional(adsp->dev, "px");
> + if (IS_ERR(adsp->px_supply)) {
> + /* Do not fail if the regulator is not found */

Same here.

> + if (PTR_ERR(adsp->px_supply) == -ENODEV)
> + adsp->px_supply = NULL;
> + }
> +
> return PTR_ERR_OR_ZERO(adsp->px_supply);
> }
>
> --
> 2.25.1
>

2022-07-31 08:46:27

by Johan Hovold

[permalink] [raw]
Subject: Re: [PATCH] remoteproc: qcom_q6v5_pas: Do not fail if regulators are not found

On Sat, Jul 30, 2022 at 11:58:34AM +0530, Manivannan Sadhasivam wrote:
> devm_regulator_get_optional() API will return -ENODEV if the regulator was
> not found. For the optional supplies CX, PX we should not fail in that case
> but rather continue. So let's catch that error and continue silently if
> those regulators are not found.
>
> The commit 3f52d118f992 ("remoteproc: qcom_q6v5_pas: Deal silently with
> optional px and cx regulators") was supposed to do the same but it missed
> the fact that devm_regulator_get_optional() API returns -ENODEV when the
> regulator was not found.
>
> Cc: Abel Vesa <[email protected]>
> Fixes: 3f52d118f992 ("remoteproc: qcom_q6v5_pas: Deal silently with optional px and cx regulators")
> Reported-by: Steev Klimaszewski <[email protected]>
> Signed-off-by: Manivannan Sadhasivam <[email protected]>
> ---
> drivers/remoteproc/qcom_q6v5_pas.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
> index 98f133f9bb60..5bf69ef53819 100644
> --- a/drivers/remoteproc/qcom_q6v5_pas.c
> +++ b/drivers/remoteproc/qcom_q6v5_pas.c
> @@ -362,12 +362,24 @@ static int adsp_init_clock(struct qcom_adsp *adsp)
> static int adsp_init_regulator(struct qcom_adsp *adsp)
> {
> adsp->cx_supply = devm_regulator_get_optional(adsp->dev, "cx");
> - if (IS_ERR(adsp->cx_supply))
> - return PTR_ERR(adsp->cx_supply);
> + if (IS_ERR(adsp->cx_supply)) {
> + /* Do not fail if the regulator is not found */

I agree with Abel that these comments shouldn't be necessary.

> + if (PTR_ERR(adsp->cx_supply) == -ENODEV)
> + adsp->cx_supply = NULL;
> + else
> + return PTR_ERR(adsp->cx_supply);
> + }
>
> - regulator_set_load(adsp->cx_supply, 100000);
> + if (adsp->cx_supply)
> + regulator_set_load(adsp->cx_supply, 100000);
>
> adsp->px_supply = devm_regulator_get_optional(adsp->dev, "px");
> + if (IS_ERR(adsp->px_supply)) {
> + /* Do not fail if the regulator is not found */
> + if (PTR_ERR(adsp->px_supply) == -ENODEV)
> + adsp->px_supply = NULL;

Please return the error here as for cx.

> + }
> +
> return PTR_ERR_OR_ZERO(adsp->px_supply);

And drop this abomination which just obfuscates code and return 0
explicitly in the success path.

With that fixed:

Reviewed-by: Johan Hovold <[email protected]>

Johan