Commit c5af8db8 authored by Bryan O'Donoghue's avatar Bryan O'Donoghue Committed by Mauro Carvalho Chehab

media: camss: Do vfe_get/vfe_put for csid on sm8250

The sm8250 CAMSS CSID depends on the VFE it is attached to being powered on
and clocked prior to taking the CSID out of reset.

It is possible to open just the CSID subdev from libcamera and attempt to
bring the CSID block up.

If we do not first bring up the VFE the CSID will fail to come out of
reset.
Tested-by: default avatarJulian Grahsl <jgrahsl@snap.com>
Signed-off-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
Reviewed-by: default avatarRobert Foss <robert.foss@linaro.org>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 5ba38efb
...@@ -156,10 +156,18 @@ static int csid_set_clock_rates(struct csid_device *csid) ...@@ -156,10 +156,18 @@ static int csid_set_clock_rates(struct csid_device *csid)
static int csid_set_power(struct v4l2_subdev *sd, int on) static int csid_set_power(struct v4l2_subdev *sd, int on)
{ {
struct csid_device *csid = v4l2_get_subdevdata(sd); struct csid_device *csid = v4l2_get_subdevdata(sd);
struct device *dev = csid->camss->dev; struct camss *camss = csid->camss;
struct device *dev = camss->dev;
struct vfe_device *vfe = &camss->vfe[csid->id];
int ret; int ret;
if (on) { if (on) {
if (camss->version == CAMSS_8250) {
ret = vfe_get(vfe);
if (ret < 0)
return ret;
}
ret = pm_runtime_resume_and_get(dev); ret = pm_runtime_resume_and_get(dev);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -204,6 +212,8 @@ static int csid_set_power(struct v4l2_subdev *sd, int on) ...@@ -204,6 +212,8 @@ static int csid_set_power(struct v4l2_subdev *sd, int on)
camss_disable_clocks(csid->nclocks, csid->clock); camss_disable_clocks(csid->nclocks, csid->clock);
ret = csid->vdda ? regulator_disable(csid->vdda) : 0; ret = csid->vdda ? regulator_disable(csid->vdda) : 0;
pm_runtime_put_sync(dev); pm_runtime_put_sync(dev);
if (camss->version == CAMSS_8250)
vfe_put(vfe);
} }
return ret; return ret;
......
...@@ -575,7 +575,7 @@ static int vfe_check_clock_rates(struct vfe_device *vfe) ...@@ -575,7 +575,7 @@ static int vfe_check_clock_rates(struct vfe_device *vfe)
* *
* Return 0 on success or a negative error code otherwise * Return 0 on success or a negative error code otherwise
*/ */
static int vfe_get(struct vfe_device *vfe) int vfe_get(struct vfe_device *vfe)
{ {
int ret; int ret;
...@@ -637,7 +637,7 @@ static int vfe_get(struct vfe_device *vfe) ...@@ -637,7 +637,7 @@ static int vfe_get(struct vfe_device *vfe)
* vfe_put - Power down VFE module * vfe_put - Power down VFE module
* @vfe: VFE Device * @vfe: VFE Device
*/ */
static void vfe_put(struct vfe_device *vfe) void vfe_put(struct vfe_device *vfe)
{ {
mutex_lock(&vfe->power_lock); mutex_lock(&vfe->power_lock);
......
...@@ -203,4 +203,7 @@ extern const struct vfe_hw_ops vfe_ops_4_8; ...@@ -203,4 +203,7 @@ extern const struct vfe_hw_ops vfe_ops_4_8;
extern const struct vfe_hw_ops vfe_ops_170; extern const struct vfe_hw_ops vfe_ops_170;
extern const struct vfe_hw_ops vfe_ops_480; extern const struct vfe_hw_ops vfe_ops_480;
int vfe_get(struct vfe_device *vfe);
void vfe_put(struct vfe_device *vfe);
#endif /* QC_MSM_CAMSS_VFE_H */ #endif /* QC_MSM_CAMSS_VFE_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment