aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>2021-10-16 20:16:38 +0100
committerBryan O'Donoghue <bryan.odonoghue@linaro.org>2021-11-09 11:21:21 +0000
commit0729bc1a4d13256c815c58659f57243f39a74195 (patch)
treef117487eef6b1746ae5360587e48ff9ccc14485c
parent0b3194472757578fd9221af3e6b3f24d8fab68fe (diff)
media: camss: Do vfe_get/vfe_put for csid on sm8250sm8250-camss-upstream-0
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. Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
-rw-r--r--drivers/media/platform/qcom/camss/camss-csid.c12
-rw-r--r--drivers/media/platform/qcom/camss/camss-vfe.c4
-rw-r--r--drivers/media/platform/qcom/camss/camss-vfe.h3
3 files changed, 16 insertions, 3 deletions
diff --git a/drivers/media/platform/qcom/camss/camss-csid.c b/drivers/media/platform/qcom/camss/camss-csid.c
index 9ef6fbbeeddf..e6835b92695b 100644
--- a/drivers/media/platform/qcom/camss/camss-csid.c
+++ b/drivers/media/platform/qcom/camss/camss-csid.c
@@ -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)
{
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;
if (on) {
+ if (camss->version == CAMSS_8250) {
+ ret = vfe_get(vfe);
+ if (ret < 0)
+ return ret;
+ }
+
ret = pm_runtime_resume_and_get(dev);
if (ret < 0)
return ret;
@@ -204,6 +212,8 @@ static int csid_set_power(struct v4l2_subdev *sd, int on)
camss_disable_clocks(csid->nclocks, csid->clock);
ret = csid->vdda ? regulator_disable(csid->vdda) : 0;
pm_runtime_put_sync(dev);
+ if (camss->version == CAMSS_8250)
+ vfe_put(vfe);
}
return ret;
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c
index a104d43880c5..2a989b1da710 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe.c
@@ -559,7 +559,7 @@ static int vfe_check_clock_rates(struct vfe_device *vfe)
*
* 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;
@@ -619,7 +619,7 @@ error_pm_domain:
* vfe_put - Power down VFE module
* @vfe: VFE Device
*/
-static void vfe_put(struct vfe_device *vfe)
+void vfe_put(struct vfe_device *vfe)
{
mutex_lock(&vfe->power_lock);
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/platform/qcom/camss/camss-vfe.h
index e80b482885d4..f0faec918d0d 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.h
+++ b/drivers/media/platform/qcom/camss/camss-vfe.h
@@ -187,4 +187,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_480;
+int vfe_get(struct vfe_device *vfe);
+void vfe_put(struct vfe_device *vfe);
+
#endif /* QC_MSM_CAMSS_VFE_H */