2021-06-08 22:41:24

by Jonathan Marek

[permalink] [raw]
Subject: [PATCH 09/17] media: camss: csid: allow csid to work without a regulator

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 <[email protected]>
Reviewed-by: Robert Foss <[email protected]>
---
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 cc11fbfdae132..528674dea06ca 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);
--
2.26.1


2021-06-10 08:04:54

by Robert Foss

[permalink] [raw]
Subject: Re: [PATCH 09/17] media: camss: csid: allow csid to work without a regulator

Hey Jonathan,

On Wed, 9 Jun 2021 at 00:37, Jonathan Marek <[email protected]> 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 <[email protected]>
> Reviewed-by: Robert Foss <[email protected]>
> ---
> 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 cc11fbfdae132..528674dea06ca 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);
> --
> 2.26.1
>

This patch does not seem to apply on upstream-media/master.