Commit 8139a4d5 authored by Frank Schaefer's avatar Frank Schaefer Committed by Mauro Carvalho Chehab

[media] em28xx: move v4l2 user counting fields from struct em28xx to struct v4l2

Despite being at the common em28xx struct, those two fields are
actually taking into account only the usage inside em28xx v4l2
submodule. So, move them out of the common struct.
Signed-off-by: default avatarFrank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent f0e38230
...@@ -934,7 +934,7 @@ int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -934,7 +934,7 @@ int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count)
if (rc) if (rc)
return rc; return rc;
if (dev->streaming_users == 0) { if (v4l2->streaming_users == 0) {
/* First active streaming user, so allocate all the URBs */ /* First active streaming user, so allocate all the URBs */
/* Allocate the USB bandwidth */ /* Allocate the USB bandwidth */
...@@ -972,7 +972,7 @@ int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -972,7 +972,7 @@ int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count)
0, tuner, s_frequency, &f); 0, tuner, s_frequency, &f);
} }
dev->streaming_users++; v4l2->streaming_users++;
return rc; return rc;
} }
...@@ -980,6 +980,7 @@ int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -980,6 +980,7 @@ int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count)
static void em28xx_stop_streaming(struct vb2_queue *vq) static void em28xx_stop_streaming(struct vb2_queue *vq)
{ {
struct em28xx *dev = vb2_get_drv_priv(vq); struct em28xx *dev = vb2_get_drv_priv(vq);
struct em28xx_v4l2 *v4l2 = dev->v4l2;
struct em28xx_dmaqueue *vidq = &dev->vidq; struct em28xx_dmaqueue *vidq = &dev->vidq;
unsigned long flags = 0; unsigned long flags = 0;
...@@ -987,7 +988,7 @@ static void em28xx_stop_streaming(struct vb2_queue *vq) ...@@ -987,7 +988,7 @@ static void em28xx_stop_streaming(struct vb2_queue *vq)
res_free(dev, vq->type); res_free(dev, vq->type);
if (dev->streaming_users-- == 1) { if (v4l2->streaming_users-- == 1) {
/* Last active user, so shutdown all the URBS */ /* Last active user, so shutdown all the URBS */
em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE); em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE);
} }
...@@ -1006,6 +1007,7 @@ static void em28xx_stop_streaming(struct vb2_queue *vq) ...@@ -1006,6 +1007,7 @@ static void em28xx_stop_streaming(struct vb2_queue *vq)
void em28xx_stop_vbi_streaming(struct vb2_queue *vq) void em28xx_stop_vbi_streaming(struct vb2_queue *vq)
{ {
struct em28xx *dev = vb2_get_drv_priv(vq); struct em28xx *dev = vb2_get_drv_priv(vq);
struct em28xx_v4l2 *v4l2 = dev->v4l2;
struct em28xx_dmaqueue *vbiq = &dev->vbiq; struct em28xx_dmaqueue *vbiq = &dev->vbiq;
unsigned long flags = 0; unsigned long flags = 0;
...@@ -1013,7 +1015,7 @@ void em28xx_stop_vbi_streaming(struct vb2_queue *vq) ...@@ -1013,7 +1015,7 @@ void em28xx_stop_vbi_streaming(struct vb2_queue *vq)
res_free(dev, vq->type); res_free(dev, vq->type);
if (dev->streaming_users-- == 1) { if (v4l2->streaming_users-- == 1) {
/* Last active user, so shutdown all the URBS */ /* Last active user, so shutdown all the URBS */
em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE); em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE);
} }
...@@ -1340,8 +1342,9 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, ...@@ -1340,8 +1342,9 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_format *f) struct v4l2_format *f)
{ {
struct em28xx *dev = video_drvdata(file); struct em28xx *dev = video_drvdata(file);
struct em28xx_v4l2 *v4l2 = dev->v4l2;
if (dev->streaming_users > 0) if (v4l2->streaming_users > 0)
return -EBUSY; return -EBUSY;
vidioc_try_fmt_vid_cap(file, priv, f); vidioc_try_fmt_vid_cap(file, priv, f);
...@@ -1380,7 +1383,7 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm) ...@@ -1380,7 +1383,7 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm)
if (norm == v4l2->norm) if (norm == v4l2->norm)
return 0; return 0;
if (dev->streaming_users > 0) if (v4l2->streaming_users > 0)
return -EBUSY; return -EBUSY;
v4l2->norm = norm; v4l2->norm = norm;
...@@ -1903,7 +1906,7 @@ static int em28xx_v4l2_open(struct file *filp) ...@@ -1903,7 +1906,7 @@ static int em28xx_v4l2_open(struct file *filp)
em28xx_videodbg("open dev=%s type=%s users=%d\n", em28xx_videodbg("open dev=%s type=%s users=%d\n",
video_device_node_name(vdev), v4l2_type_names[fh_type], video_device_node_name(vdev), v4l2_type_names[fh_type],
dev->users); v4l2->users);
if (mutex_lock_interruptible(&dev->lock)) if (mutex_lock_interruptible(&dev->lock))
return -ERESTARTSYS; return -ERESTARTSYS;
...@@ -1918,7 +1921,7 @@ static int em28xx_v4l2_open(struct file *filp) ...@@ -1918,7 +1921,7 @@ static int em28xx_v4l2_open(struct file *filp)
fh->type = fh_type; fh->type = fh_type;
filp->private_data = fh; filp->private_data = fh;
if (dev->users == 0) { if (v4l2->users == 0) {
em28xx_set_mode(dev, EM28XX_ANALOG_MODE); em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
if (vdev->vfl_type != VFL_TYPE_RADIO) if (vdev->vfl_type != VFL_TYPE_RADIO)
...@@ -1938,7 +1941,7 @@ static int em28xx_v4l2_open(struct file *filp) ...@@ -1938,7 +1941,7 @@ static int em28xx_v4l2_open(struct file *filp)
kref_get(&dev->ref); kref_get(&dev->ref);
kref_get(&v4l2->ref); kref_get(&v4l2->ref);
dev->users++; v4l2->users++;
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
v4l2_fh_add(&fh->fh); v4l2_fh_add(&fh->fh);
...@@ -2047,12 +2050,12 @@ static int em28xx_v4l2_close(struct file *filp) ...@@ -2047,12 +2050,12 @@ static int em28xx_v4l2_close(struct file *filp)
struct em28xx_v4l2 *v4l2 = dev->v4l2; struct em28xx_v4l2 *v4l2 = dev->v4l2;
int errCode; int errCode;
em28xx_videodbg("users=%d\n", dev->users); em28xx_videodbg("users=%d\n", v4l2->users);
vb2_fop_release(filp); vb2_fop_release(filp);
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
if (dev->users == 1) { if (v4l2->users == 1) {
/* No sense to try to write to the device */ /* No sense to try to write to the device */
if (dev->disconnected) if (dev->disconnected)
goto exit; goto exit;
...@@ -2074,8 +2077,8 @@ static int em28xx_v4l2_close(struct file *filp) ...@@ -2074,8 +2077,8 @@ static int em28xx_v4l2_close(struct file *filp)
} }
exit: exit:
v4l2->users--;
kref_put(&v4l2->ref, em28xx_free_v4l2); kref_put(&v4l2->ref, em28xx_free_v4l2);
dev->users--;
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
kref_put(&dev->ref, em28xx_free_device); kref_put(&dev->ref, em28xx_free_device);
......
...@@ -524,6 +524,9 @@ struct em28xx_v4l2 { ...@@ -524,6 +524,9 @@ struct em28xx_v4l2 {
int sensor_yres; int sensor_yres;
int sensor_xtal; int sensor_xtal;
int users; /* user count for exclusive use */
int streaming_users; /* number of actively streaming users */
struct em28xx_fmt *format; struct em28xx_fmt *format;
v4l2_std_id norm; /* selected tv norm */ v4l2_std_id norm; /* selected tv norm */
...@@ -642,8 +645,6 @@ struct em28xx { ...@@ -642,8 +645,6 @@ struct em28xx {
struct rt_mutex i2c_bus_lock; struct rt_mutex i2c_bus_lock;
/* video for linux */ /* video for linux */
int users; /* user count for exclusive use */
int streaming_users; /* Number of actively streaming users */
int ctl_freq; /* selected frequency */ int ctl_freq; /* selected frequency */
unsigned int ctl_input; /* selected input */ unsigned int ctl_input; /* selected input */
unsigned int ctl_ainput;/* selected audio input */ unsigned int ctl_ainput;/* selected audio input */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment