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

From: Robert Foss
Date: Thu May 20 2021 - 08:51:49 EST


On Tue, 11 May 2021 at 20:08, Jonathan Marek <jonathan@xxxxxxxx> 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@xxxxxxxx>
> ---
> 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@xxxxxxxxxx>