On Sat May 17 13:40:58 2025 +0200, Hans de Goede wrote: > Switch to using the sub-device state lock and properly call > v4l2_subdev_init_finalize() / v4l2_subdev_cleanup() on probe() / > remove(). > > Signed-off-by: Hans de Goede <ha...@kernel.org> > Reviewed-by: Andy Shevchenko <a...@kernel.org> > Link: https://lore.kernel.org/r/20250517114106.43494-16-ha...@kernel.org > Signed-off-by: Mauro Carvalho Chehab <mchehab+hua...@kernel.org>
Patch committed. Thanks, Mauro Carvalho Chehab drivers/staging/media/atomisp/i2c/atomisp-gc0310.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) --- diff --git a/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c b/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c index 2f1f5022e2ac..baf9355ade4d 100644 --- a/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c +++ b/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c @@ -86,8 +86,6 @@ struct gc0310_device { struct v4l2_subdev sd; struct media_pad pad; - /* Protect against concurrent changes to controls */ - struct mutex input_lock; struct regmap *regmap; struct gpio_desc *reset; @@ -466,11 +464,9 @@ static int gc0310_enable_streams(struct v4l2_subdev *sd, struct i2c_client *client = v4l2_get_subdevdata(sd); int ret; - mutex_lock(&sensor->input_lock); - ret = pm_runtime_resume_and_get(&client->dev); if (ret) - goto error_unlock; + return ret; ret = regmap_multi_reg_write(sensor->regmap, gc0310_reset_register, @@ -501,8 +497,6 @@ error_power_down: if (ret) pm_runtime_put(&client->dev); -error_unlock: - mutex_unlock(&sensor->input_lock); return ret; } @@ -514,8 +508,6 @@ static int gc0310_disable_streams(struct v4l2_subdev *sd, struct i2c_client *client = v4l2_get_subdevdata(sd); int ret = 0; - mutex_lock(&sensor->input_lock); - cci_write(sensor->regmap, GC0310_RESET_RELATED_REG, GC0310_REGISTER_PAGE_3, &ret); cci_write(sensor->regmap, GC0310_SW_STREAM_REG, @@ -524,7 +516,6 @@ static int gc0310_disable_streams(struct v4l2_subdev *sd, GC0310_REGISTER_PAGE_0, &ret); pm_runtime_put(&client->dev); - mutex_unlock(&sensor->input_lock); return ret; } @@ -615,7 +606,6 @@ static int gc0310_init_controls(struct gc0310_device *sensor) v4l2_ctrl_handler_init(hdl, 8); /* Use the same lock for controls as for everything else */ - hdl->lock = &sensor->input_lock; sensor->sd.ctrl_handler = hdl; exp_max = GC0310_NATIVE_HEIGHT + GC0310_V_BLANK_DEFAULT; @@ -669,9 +659,9 @@ static void gc0310_remove(struct i2c_client *client) dev_dbg(&client->dev, "gc0310_remove...\n"); v4l2_async_unregister_subdev(sd); + v4l2_subdev_cleanup(sd); media_entity_cleanup(&sensor->sd.entity); v4l2_ctrl_handler_free(&sensor->ctrls.handler); - mutex_destroy(&sensor->input_lock); pm_runtime_disable(&client->dev); } @@ -754,7 +744,6 @@ static int gc0310_probe(struct i2c_client *client) "getting powerdown GPIO\n"); } - mutex_init(&sensor->input_lock); v4l2_i2c_subdev_init(&sensor->sd, client, &gc0310_ops); gc0310_fill_format(&sensor->mode.fmt); @@ -789,6 +778,13 @@ static int gc0310_probe(struct i2c_client *client) return ret; } + sensor->sd.state_lock = sensor->ctrls.handler.lock; + ret = v4l2_subdev_init_finalize(&sensor->sd); + if (ret) { + gc0310_remove(client); + return ret; + } + ret = v4l2_async_register_subdev_sensor(&sensor->sd); if (ret) { gc0310_remove(client);