Skip to content

Commit

Permalink
[media] V4L: soc-camera: protect hosts during probing from overzealou…
Browse files Browse the repository at this point in the history
…s user-space

If multiple clients are registered on a single camera host interface,
the user-space hot-plug software can try to access the one, that probed
first, before probing of the second one has completed. This can be
handled by individual host drivers, but it is even better to hold back
the user-space until all the probing on this host has completed. This
fixes a race on ecovec with two clients registered on the CEU1 host, which
otherwise triggers a BUG() in sh_mobile_ceu_remove_device().

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Guennadi Liakhovetski authored and Mauro Carvalho Chehab committed Apr 26, 2012
1 parent e631f57 commit 2f9a0c8
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 3 deletions.
8 changes: 6 additions & 2 deletions drivers/media/video/soc_camera.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,10 @@ static int soc_camera_open(struct file *file)
if (icl->reset)
icl->reset(icd->pdev);

/* Don't mess with the host during probe */
mutex_lock(&ici->host_lock);
ret = ici->ops->add(icd);
mutex_unlock(&ici->host_lock);
if (ret < 0) {
dev_err(icd->pdev, "Couldn't activate the camera: %d\n", ret);
goto eiciadd;
Expand Down Expand Up @@ -956,7 +959,7 @@ static void scan_add_host(struct soc_camera_host *ici)
{
struct soc_camera_device *icd;

mutex_lock(&list_lock);
mutex_lock(&ici->host_lock);

list_for_each_entry(icd, &devices, list) {
if (icd->iface == ici->nr) {
Expand All @@ -967,7 +970,7 @@ static void scan_add_host(struct soc_camera_host *ici)
}
}

mutex_unlock(&list_lock);
mutex_unlock(&ici->host_lock);
}

#ifdef CONFIG_I2C_BOARDINFO
Expand Down Expand Up @@ -1313,6 +1316,7 @@ int soc_camera_host_register(struct soc_camera_host *ici)
list_add_tail(&ici->list, &hosts);
mutex_unlock(&list_lock);

mutex_init(&ici->host_lock);
scan_add_host(ici);

return 0;
Expand Down
3 changes: 2 additions & 1 deletion include/media/soc_camera.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ struct soc_camera_device {
struct soc_camera_host {
struct v4l2_device v4l2_dev;
struct list_head list;
unsigned char nr; /* Host number */
struct mutex host_lock; /* Protect during probing */
unsigned char nr; /* Host number */
void *priv;
const char *drv_name;
struct soc_camera_host_ops *ops;
Expand Down

0 comments on commit 2f9a0c8

Please sign in to comment.