Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] sh_mobile_csi2: fix module reloading

If the camera host driver (sh_mobile_ceu_camera.c) is unloaded and then
reloaded, probe will fail, because camera client .set_bus_param() and
.query_bus_param() methods have been set to NULL. Fix this by caching
the original pointers and restoring them on driver-unbind.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Guennadi Liakhovetski and committed by
Mauro Carvalho Chehab
cb743930 c8dd7078

+8 -2
+8 -2
drivers/media/video/sh_mobile_csi2.c
··· 38 38 void __iomem *base; 39 39 struct platform_device *pdev; 40 40 struct sh_csi2_client_config *client; 41 + unsigned long (*query_bus_param)(struct soc_camera_device *); 42 + int (*set_bus_param)(struct soc_camera_device *, unsigned long); 41 43 }; 42 44 43 45 static int sh_csi2_try_fmt(struct v4l2_subdev *sd, ··· 218 216 219 217 priv->client = pdata->clients + i; 220 218 219 + priv->set_bus_param = icd->ops->set_bus_param; 220 + priv->query_bus_param = icd->ops->query_bus_param; 221 221 icd->ops->set_bus_param = sh_csi2_set_bus_param; 222 222 icd->ops->query_bus_param = sh_csi2_query_bus_param; 223 223 ··· 231 227 priv->client = NULL; 232 228 233 229 /* Driver is about to be unbound */ 234 - icd->ops->set_bus_param = NULL; 235 - icd->ops->query_bus_param = NULL; 230 + icd->ops->set_bus_param = priv->set_bus_param; 231 + icd->ops->query_bus_param = priv->query_bus_param; 232 + priv->set_bus_param = NULL; 233 + priv->query_bus_param = NULL; 236 234 237 235 v4l2_device_unregister_subdev(&priv->subdev); 238 236