Signed-off-by: Frank Schäfer <fschaefer.oss@xxxxxxxxxxxxxx> --- drivers/media/usb/em28xx/em28xx-video.c | 13 +++++++++---- drivers/media/usb/em28xx/em28xx.h | 3 ++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c index 89947db..22acb0f 100644 --- a/drivers/media/usb/em28xx/em28xx-video.c +++ b/drivers/media/usb/em28xx/em28xx-video.c @@ -1138,7 +1138,9 @@ static void em28xx_ctrl_notify(struct v4l2_ctrl *ctrl, void *priv) static int em28xx_s_ctrl(struct v4l2_ctrl *ctrl) { - struct em28xx *dev = container_of(ctrl->handler, struct em28xx, ctrl_handler); + struct em28xx_v4l2 *v4l2 = + container_of(ctrl->handler, struct em28xx_v4l2, ctrl_handler); + struct em28xx *dev = v4l2->dev; int ret = -EINVAL; switch (ctrl->id) { @@ -1849,6 +1851,7 @@ void em28xx_free_v4l2(struct kref *ref) { struct em28xx_v4l2 *v4l2 = container_of(ref, struct em28xx_v4l2, ref); + v4l2->dev->v4l2 = NULL; kfree(v4l2); } @@ -1968,7 +1971,7 @@ static int em28xx_v4l2_fini(struct em28xx *dev) video_unregister_device(dev->vdev); } - v4l2_ctrl_handler_free(&dev->ctrl_handler); + v4l2_ctrl_handler_free(&v4l2->ctrl_handler); v4l2_device_unregister(&v4l2->v4l2_dev); if (dev->clk) { @@ -2276,7 +2279,7 @@ static int em28xx_v4l2_init(struct em28xx *dev) u8 val; int ret; unsigned int maxw; - struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler; + struct v4l2_ctrl_handler *hdl; struct em28xx_v4l2 *v4l2; if (dev->is_audio_only) { @@ -2300,6 +2303,7 @@ static int em28xx_v4l2_init(struct em28xx *dev) return -ENOMEM; } kref_init(&v4l2->ref); + v4l2->dev = dev; dev->v4l2 = v4l2; ret = v4l2_device_register(&dev->udev->dev, &v4l2->v4l2_dev); @@ -2308,6 +2312,7 @@ static int em28xx_v4l2_init(struct em28xx *dev) goto err; } + hdl = &v4l2->ctrl_handler; v4l2_ctrl_handler_init(hdl, 8); v4l2->v4l2_dev.ctrl_handler = hdl; @@ -2594,7 +2599,7 @@ static int em28xx_v4l2_init(struct em28xx *dev) return 0; unregister_dev: - v4l2_ctrl_handler_free(&dev->ctrl_handler); + v4l2_ctrl_handler_free(&v4l2->ctrl_handler); v4l2_device_unregister(&v4l2->v4l2_dev); err: dev->v4l2 = NULL; diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h index b18b968..910c2d8 100644 --- a/drivers/media/usb/em28xx/em28xx.h +++ b/drivers/media/usb/em28xx/em28xx.h @@ -499,8 +499,10 @@ struct em28xx_eeprom { struct em28xx_v4l2 { struct kref ref; + struct em28xx *dev; struct v4l2_device v4l2_dev; + struct v4l2_ctrl_handler ctrl_handler; }; struct em28xx_audio { @@ -566,7 +568,6 @@ struct em28xx { unsigned int has_alsa_audio:1; unsigned int is_audio_only:1; - struct v4l2_ctrl_handler ctrl_handler; struct v4l2_clk *clk; struct em28xx_board board; -- 1.8.4.5 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html