Message ID | 20210511180728.23781-10-jonathan@marek.ca |
---|---|
State | Superseded |
Headers | show |
Series | CAMSS: SM8250 support (and some fixes) | expand |
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 --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);
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(-)