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>