diff mbox series

[09/17] media: camss: csid: allow csid to work without a regulator

Message ID 20210511180728.23781-10-jonathan@marek.ca
State Superseded
Headers show
Series CAMSS: SM8250 support (and some fixes) | expand

Commit Message

Jonathan Marek May 11, 2021, 6:07 p.m. UTC
At least for titan HW, CSID don't have an associated regulator. This change
is necessary to be able to model this in the CSID resources.

Signed-off-by: Jonathan Marek <jonathan@marek.ca>
---
 drivers/media/platform/qcom/camss/camss-csid.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

Comments

Robert Foss May 20, 2021, 12:14 p.m. UTC | #1
On Tue, 11 May 2021 at 20:08, Jonathan Marek <jonathan@marek.ca> wrote:
>

> At least for titan HW, CSID don't have an associated regulator. This change

> is necessary to be able to model this in the CSID resources.

>

> Signed-off-by: Jonathan Marek <jonathan@marek.ca>

> ---

>  drivers/media/platform/qcom/camss/camss-csid.c | 17 +++++++++++------

>  1 file changed, 11 insertions(+), 6 deletions(-)

>

> diff --git a/drivers/media/platform/qcom/camss/camss-csid.c b/drivers/media/platform/qcom/camss/camss-csid.c

> index cc11fbfdae13..528674dea06c 100644

> --- a/drivers/media/platform/qcom/camss/camss-csid.c

> +++ b/drivers/media/platform/qcom/camss/camss-csid.c

> @@ -162,7 +162,7 @@ static int csid_set_power(struct v4l2_subdev *sd, int on)

>                         return ret;

>                 }

>

> -               ret = regulator_enable(csid->vdda);

> +               ret = csid->vdda ? regulator_enable(csid->vdda) : 0;

>                 if (ret < 0) {

>                         pm_runtime_put_sync(dev);

>                         return ret;

> @@ -170,14 +170,16 @@ static int csid_set_power(struct v4l2_subdev *sd, int on)

>

>                 ret = csid_set_clock_rates(csid);

>                 if (ret < 0) {

> -                       regulator_disable(csid->vdda);

> +                       if (csid->vdda)

> +                               regulator_disable(csid->vdda);

>                         pm_runtime_put_sync(dev);

>                         return ret;

>                 }

>

>                 ret = camss_enable_clocks(csid->nclocks, csid->clock, dev);

>                 if (ret < 0) {

> -                       regulator_disable(csid->vdda);

> +                       if (csid->vdda)

> +                               regulator_disable(csid->vdda);

>                         pm_runtime_put_sync(dev);

>                         return ret;

>                 }

> @@ -188,7 +190,8 @@ static int csid_set_power(struct v4l2_subdev *sd, int on)

>                 if (ret < 0) {

>                         disable_irq(csid->irq);

>                         camss_disable_clocks(csid->nclocks, csid->clock);

> -                       regulator_disable(csid->vdda);

> +                       if (csid->vdda)

> +                               regulator_disable(csid->vdda);

>                         pm_runtime_put_sync(dev);

>                         return ret;


Since this & the previous chunks of failure cleanups are growing
larger, maybe it is time to extract all of the failure cleanups into
gotos. That should probably go into a seperate patch though.

>                 }

> @@ -197,7 +200,7 @@ static int csid_set_power(struct v4l2_subdev *sd, int on)

>         } else {

>                 disable_irq(csid->irq);

>                 camss_disable_clocks(csid->nclocks, csid->clock);

> -               ret = regulator_disable(csid->vdda);

> +               ret = csid->vdda ? regulator_disable(csid->vdda) : 0;

>                 pm_runtime_put_sync(dev);

>         }

>

> @@ -634,7 +637,9 @@ int msm_csid_subdev_init(struct camss *camss, struct csid_device *csid,

>

>         /* Regulator */

>

> -       csid->vdda = devm_regulator_get(dev, res->regulator[0]);

> +       csid->vdda = NULL;

> +       if (res->regulator[0])

> +               csid->vdda = devm_regulator_get(dev, res->regulator[0]);

>         if (IS_ERR(csid->vdda)) {

>                 dev_err(dev, "could not get regulator\n");

>                 return PTR_ERR(csid->vdda);


Reviewed-by: Robert Foss <robert.foss@linaro.org>
diff mbox series

Patch

diff --git a/drivers/media/platform/qcom/camss/camss-csid.c b/drivers/media/platform/qcom/camss/camss-csid.c
index cc11fbfdae13..528674dea06c 100644
--- a/drivers/media/platform/qcom/camss/camss-csid.c
+++ b/drivers/media/platform/qcom/camss/camss-csid.c
@@ -162,7 +162,7 @@  static int csid_set_power(struct v4l2_subdev *sd, int on)
 			return ret;
 		}
 
-		ret = regulator_enable(csid->vdda);
+		ret = csid->vdda ? regulator_enable(csid->vdda) : 0;
 		if (ret < 0) {
 			pm_runtime_put_sync(dev);
 			return ret;
@@ -170,14 +170,16 @@  static int csid_set_power(struct v4l2_subdev *sd, int on)
 
 		ret = csid_set_clock_rates(csid);
 		if (ret < 0) {
-			regulator_disable(csid->vdda);
+			if (csid->vdda)
+				regulator_disable(csid->vdda);
 			pm_runtime_put_sync(dev);
 			return ret;
 		}
 
 		ret = camss_enable_clocks(csid->nclocks, csid->clock, dev);
 		if (ret < 0) {
-			regulator_disable(csid->vdda);
+			if (csid->vdda)
+				regulator_disable(csid->vdda);
 			pm_runtime_put_sync(dev);
 			return ret;
 		}
@@ -188,7 +190,8 @@  static int csid_set_power(struct v4l2_subdev *sd, int on)
 		if (ret < 0) {
 			disable_irq(csid->irq);
 			camss_disable_clocks(csid->nclocks, csid->clock);
-			regulator_disable(csid->vdda);
+			if (csid->vdda)
+				regulator_disable(csid->vdda);
 			pm_runtime_put_sync(dev);
 			return ret;
 		}
@@ -197,7 +200,7 @@  static int csid_set_power(struct v4l2_subdev *sd, int on)
 	} else {
 		disable_irq(csid->irq);
 		camss_disable_clocks(csid->nclocks, csid->clock);
-		ret = regulator_disable(csid->vdda);
+		ret = csid->vdda ? regulator_disable(csid->vdda) : 0;
 		pm_runtime_put_sync(dev);
 	}
 
@@ -634,7 +637,9 @@  int msm_csid_subdev_init(struct camss *camss, struct csid_device *csid,
 
 	/* Regulator */
 
-	csid->vdda = devm_regulator_get(dev, res->regulator[0]);
+	csid->vdda = NULL;
+	if (res->regulator[0])
+		csid->vdda = devm_regulator_get(dev, res->regulator[0]);
 	if (IS_ERR(csid->vdda)) {
 		dev_err(dev, "could not get regulator\n");
 		return PTR_ERR(csid->vdda);