On 3/13/24 08:25, Sakari Ailus wrote:
With enable_streams and disable_streams, the driver for a device where
streams are not independently started and stopped needs to maintain state
information on streams that have been requested to be started. Do that
now.
In the future, a helper function in the framework is a desirable way to do
this instead.
Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>
Reviewed-by: Julien Massot <julien.massot@xxxxxxxxxxxxx>
---
drivers/media/i2c/ov2740.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c
index 44c6724a102c..df57f0096e98 100644
--- a/drivers/media/i2c/ov2740.c
+++ b/drivers/media/i2c/ov2740.c
@@ -539,6 +539,9 @@ struct ov2740 {
/* True if the device has been identified */
bool identified;
+
+ /* Track streaming state */
+ u8 streaming;
};
static inline struct ov2740 *to_ov2740(struct v4l2_subdev *subdev)
@@ -929,6 +932,11 @@ static int ov2740_enable_streams(struct v4l2_subdev *sd,
int link_freq_index;
int ret;
+ if (ov2740->streaming) {
+ ov2740->streaming |= streams_mask;
+ return 0;
+ }
+
ret = pm_runtime_resume_and_get(&client->dev);
if (ret < 0)
return ret;
@@ -975,6 +983,8 @@ static int ov2740_enable_streams(struct v4l2_subdev *sd,
goto out_pm_put;
}
+ ov2740->streaming |= streams_mask;
+
return 0;
out_pm_put:
@@ -991,6 +1001,10 @@ static int ov2740_disable_streams(struct v4l2_subdev *sd,
struct ov2740 *ov2740 = to_ov2740(sd);
int ret;
+ ov2740->streaming &= ~streams_mask;
+ if (ov2740->streaming)
+ return 0;
+
ret = ov2740_write_reg(ov2740, OV2740_REG_MODE_SELECT, 1,
OV2740_MODE_STANDBY);
--
Julien Massot
Senior Software Engineer
Collabora Ltd.
Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, UK
Registered in England & Wales, no. 5513718