Commit b86d1544 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] cx231xx-417: share ioctls with cx231xx-video

Share tuner, frequency, debug and input ioctls with cx231xx-video.
These are all shared resources, so no need to implement them again.

[mchehab@redhat.com: Fix merge conflict and a checkpatch issue]
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 5b8acdc5
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
#include <media/v4l2-ioctl.h> #include <media/v4l2-ioctl.h>
#include <media/cx2341x.h> #include <media/cx2341x.h>
#include <media/tuner.h>
#include <linux/usb.h> #include <linux/usb.h>
#include "cx231xx.h" #include "cx231xx.h"
...@@ -1551,68 +1552,6 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id) ...@@ -1551,68 +1552,6 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id)
return 0; return 0;
} }
static const char * const iname[] = {
[CX231XX_VMUX_COMPOSITE1] = "Composite1",
[CX231XX_VMUX_SVIDEO] = "S-Video",
[CX231XX_VMUX_TELEVISION] = "Television",
[CX231XX_VMUX_CABLE] = "Cable TV",
[CX231XX_VMUX_DVB] = "DVB",
[CX231XX_VMUX_DEBUG] = "for debug only",
};
static int vidioc_enum_input(struct file *file, void *priv,
struct v4l2_input *i)
{
struct cx231xx_fh *fh = file->private_data;
struct cx231xx *dev = fh->dev;
struct cx231xx_input *input;
int n;
dprintk(3, "enter vidioc_enum_input()i->index=%d\n", i->index);
if (i->index >= 4)
return -EINVAL;
input = &cx231xx_boards[dev->model].input[i->index];
if (input->type == 0)
return -EINVAL;
/* FIXME
* strcpy(i->name, input->name); */
n = i->index;
strcpy(i->name, iname[INPUT(n)->type]);
if (input->type == CX231XX_VMUX_TELEVISION ||
input->type == CX231XX_VMUX_CABLE)
i->type = V4L2_INPUT_TYPE_TUNER;
else
i->type = V4L2_INPUT_TYPE_CAMERA;
return 0;
}
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
{
*i = 0;
return 0;
}
static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
{
struct cx231xx_fh *fh = file->private_data;
struct cx231xx *dev = fh->dev;
dprintk(3, "enter vidioc_s_input() i=%d\n", i);
video_mux(dev, i);
if (i >= 4)
return -EINVAL;
dev->input = i;
dprintk(3, "exit vidioc_s_input()\n");
return 0;
}
static int vidioc_s_ctrl(struct file *file, void *priv, static int vidioc_s_ctrl(struct file *file, void *priv,
struct v4l2_control *ctl) struct v4l2_control *ctl)
{ {
...@@ -1831,22 +1770,12 @@ static int vidioc_queryctrl(struct file *file, void *priv, ...@@ -1831,22 +1770,12 @@ static int vidioc_queryctrl(struct file *file, void *priv,
static int mpeg_open(struct file *file) static int mpeg_open(struct file *file)
{ {
int minor = video_devdata(file)->minor; struct video_device *vdev = video_devdata(file);
struct cx231xx *h, *dev = NULL; struct cx231xx *dev = video_drvdata(file);
/*struct list_head *list;*/
struct cx231xx_fh *fh; struct cx231xx_fh *fh;
/*u32 value = 0;*/
dprintk(2, "%s()\n", __func__); dprintk(2, "%s()\n", __func__);
list_for_each_entry(h, &cx231xx_devlist, devlist) {
if (h->v4l_device->minor == minor)
dev = h;
}
if (dev == NULL)
return -ENODEV;
if (mutex_lock_interruptible(&dev->lock)) if (mutex_lock_interruptible(&dev->lock))
return -ERESTARTSYS; return -ERESTARTSYS;
...@@ -1858,7 +1787,8 @@ static int mpeg_open(struct file *file) ...@@ -1858,7 +1787,8 @@ static int mpeg_open(struct file *file)
} }
file->private_data = fh; file->private_data = fh;
fh->dev = dev; v4l2_fh_init(&fh->fh, vdev);
fh->dev = dev;
videobuf_queue_vmalloc_init(&fh->vidq, &cx231xx_qops, videobuf_queue_vmalloc_init(&fh->vidq, &cx231xx_qops,
...@@ -1880,6 +1810,7 @@ static int mpeg_open(struct file *file) ...@@ -1880,6 +1810,7 @@ static int mpeg_open(struct file *file)
cx231xx_initialize_codec(dev); cx231xx_initialize_codec(dev);
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
v4l2_fh_add(&fh->fh);
cx231xx_start_TS1(dev); cx231xx_start_TS1(dev);
return 0; return 0;
...@@ -1892,11 +1823,6 @@ static int mpeg_release(struct file *file) ...@@ -1892,11 +1823,6 @@ static int mpeg_release(struct file *file)
dprintk(3, "mpeg_release()! dev=0x%p\n", dev); dprintk(3, "mpeg_release()! dev=0x%p\n", dev);
if (!dev) {
dprintk(3, "abort!!!\n");
return 0;
}
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
cx231xx_stop_TS1(dev); cx231xx_stop_TS1(dev);
...@@ -1930,7 +1856,8 @@ static int mpeg_release(struct file *file) ...@@ -1930,7 +1856,8 @@ static int mpeg_release(struct file *file)
videobuf_read_stop(&fh->vidq); videobuf_read_stop(&fh->vidq);
videobuf_mmap_free(&fh->vidq); videobuf_mmap_free(&fh->vidq);
file->private_data = NULL; v4l2_fh_del(&fh->fh);
v4l2_fh_exit(&fh->fh);
kfree(fh); kfree(fh);
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
return 0; return 0;
...@@ -1986,9 +1913,13 @@ static struct v4l2_file_operations mpeg_fops = { ...@@ -1986,9 +1913,13 @@ static struct v4l2_file_operations mpeg_fops = {
static const struct v4l2_ioctl_ops mpeg_ioctl_ops = { static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
.vidioc_s_std = vidioc_s_std, .vidioc_s_std = vidioc_s_std,
.vidioc_g_std = vidioc_g_std, .vidioc_g_std = vidioc_g_std,
.vidioc_enum_input = vidioc_enum_input, .vidioc_g_tuner = cx231xx_g_tuner,
.vidioc_g_input = vidioc_g_input, .vidioc_s_tuner = cx231xx_s_tuner,
.vidioc_s_input = vidioc_s_input, .vidioc_g_frequency = cx231xx_g_frequency,
.vidioc_s_frequency = cx231xx_s_frequency,
.vidioc_enum_input = cx231xx_enum_input,
.vidioc_g_input = cx231xx_g_input,
.vidioc_s_input = cx231xx_s_input,
.vidioc_s_ctrl = vidioc_s_ctrl, .vidioc_s_ctrl = vidioc_s_ctrl,
.vidioc_querycap = cx231xx_querycap, .vidioc_querycap = cx231xx_querycap,
.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
...@@ -2007,10 +1938,10 @@ static const struct v4l2_ioctl_ops mpeg_ioctl_ops = { ...@@ -2007,10 +1938,10 @@ static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
.vidioc_log_status = vidioc_log_status, .vidioc_log_status = vidioc_log_status,
.vidioc_querymenu = vidioc_querymenu, .vidioc_querymenu = vidioc_querymenu,
.vidioc_queryctrl = vidioc_queryctrl, .vidioc_queryctrl = vidioc_queryctrl,
/* .vidioc_g_chip_ident = cx231xx_g_chip_ident,*/ .vidioc_g_chip_ident = cx231xx_g_chip_ident,
#ifdef CONFIG_VIDEO_ADV_DEBUG #ifdef CONFIG_VIDEO_ADV_DEBUG
/* .vidioc_g_register = cx231xx_g_register,*/ .vidioc_g_register = cx231xx_g_register,
/* .vidioc_s_register = cx231xx_s_register,*/ .vidioc_s_register = cx231xx_s_register,
#endif #endif
}; };
...@@ -2055,6 +1986,14 @@ static struct video_device *cx231xx_video_dev_alloc( ...@@ -2055,6 +1986,14 @@ static struct video_device *cx231xx_video_dev_alloc(
vfd->v4l2_dev = &dev->v4l2_dev; vfd->v4l2_dev = &dev->v4l2_dev;
vfd->lock = &dev->lock; vfd->lock = &dev->lock;
vfd->release = video_device_release; vfd->release = video_device_release;
set_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags);
video_set_drvdata(vfd, dev);
if (dev->tuner_type == TUNER_ABSENT) {
v4l2_disable_ioctl(vfd, VIDIOC_G_FREQUENCY);
v4l2_disable_ioctl(vfd, VIDIOC_S_FREQUENCY);
v4l2_disable_ioctl(vfd, VIDIOC_G_TUNER);
v4l2_disable_ioctl(vfd, VIDIOC_S_TUNER);
}
return vfd; return vfd;
......
...@@ -1036,7 +1036,7 @@ static const char *iname[] = { ...@@ -1036,7 +1036,7 @@ static const char *iname[] = {
[CX231XX_VMUX_DEBUG] = "for debug only", [CX231XX_VMUX_DEBUG] = "for debug only",
}; };
static int vidioc_enum_input(struct file *file, void *priv, int cx231xx_enum_input(struct file *file, void *priv,
struct v4l2_input *i) struct v4l2_input *i)
{ {
struct cx231xx_fh *fh = priv; struct cx231xx_fh *fh = priv;
...@@ -1076,7 +1076,7 @@ static int vidioc_enum_input(struct file *file, void *priv, ...@@ -1076,7 +1076,7 @@ static int vidioc_enum_input(struct file *file, void *priv,
return 0; return 0;
} }
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i) int cx231xx_g_input(struct file *file, void *priv, unsigned int *i)
{ {
struct cx231xx_fh *fh = priv; struct cx231xx_fh *fh = priv;
struct cx231xx *dev = fh->dev; struct cx231xx *dev = fh->dev;
...@@ -1086,7 +1086,7 @@ static int vidioc_g_input(struct file *file, void *priv, unsigned int *i) ...@@ -1086,7 +1086,7 @@ static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
return 0; return 0;
} }
static int vidioc_s_input(struct file *file, void *priv, unsigned int i) int cx231xx_s_input(struct file *file, void *priv, unsigned int i)
{ {
struct cx231xx_fh *fh = priv; struct cx231xx_fh *fh = priv;
struct cx231xx *dev = fh->dev; struct cx231xx *dev = fh->dev;
...@@ -1115,7 +1115,7 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i) ...@@ -1115,7 +1115,7 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
return 0; return 0;
} }
static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t) int cx231xx_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
{ {
struct cx231xx_fh *fh = priv; struct cx231xx_fh *fh = priv;
struct cx231xx *dev = fh->dev; struct cx231xx *dev = fh->dev;
...@@ -1139,7 +1139,7 @@ static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t) ...@@ -1139,7 +1139,7 @@ static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
return 0; return 0;
} }
static int vidioc_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t) int cx231xx_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
{ {
struct cx231xx_fh *fh = priv; struct cx231xx_fh *fh = priv;
struct cx231xx *dev = fh->dev; struct cx231xx *dev = fh->dev;
...@@ -1157,7 +1157,7 @@ static int vidioc_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t) ...@@ -1157,7 +1157,7 @@ static int vidioc_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
return 0; return 0;
} }
static int vidioc_g_frequency(struct file *file, void *priv, int cx231xx_g_frequency(struct file *file, void *priv,
struct v4l2_frequency *f) struct v4l2_frequency *f)
{ {
struct cx231xx_fh *fh = priv; struct cx231xx_fh *fh = priv;
...@@ -1171,7 +1171,7 @@ static int vidioc_g_frequency(struct file *file, void *priv, ...@@ -1171,7 +1171,7 @@ static int vidioc_g_frequency(struct file *file, void *priv,
return 0; return 0;
} }
static int vidioc_s_frequency(struct file *file, void *priv, int cx231xx_s_frequency(struct file *file, void *priv,
struct v4l2_frequency *f) struct v4l2_frequency *f)
{ {
struct cx231xx_fh *fh = priv; struct cx231xx_fh *fh = priv;
...@@ -1227,8 +1227,8 @@ static int vidioc_s_frequency(struct file *file, void *priv, ...@@ -1227,8 +1227,8 @@ static int vidioc_s_frequency(struct file *file, void *priv,
return rc; return rc;
} }
static int vidioc_g_chip_ident(struct file *file, void *fh, int vidioc_g_chip_ident(struct file *file, void *fh,
struct v4l2_dbg_chip_ident *chip) struct v4l2_dbg_chip_ident *chip)
{ {
chip->ident = V4L2_IDENT_NONE; chip->ident = V4L2_IDENT_NONE;
chip->revision = 0; chip->revision = 0;
...@@ -1255,7 +1255,7 @@ static int vidioc_g_chip_ident(struct file *file, void *fh, ...@@ -1255,7 +1255,7 @@ static int vidioc_g_chip_ident(struct file *file, void *fh,
if type == i2caddr, then <chip> is the 7-bit I2C address if type == i2caddr, then <chip> is the 7-bit I2C address
*/ */
static int vidioc_g_register(struct file *file, void *priv, int cx231xx_g_register(struct file *file, void *priv,
struct v4l2_dbg_register *reg) struct v4l2_dbg_register *reg)
{ {
struct cx231xx_fh *fh = priv; struct cx231xx_fh *fh = priv;
...@@ -1402,7 +1402,7 @@ static int vidioc_g_register(struct file *file, void *priv, ...@@ -1402,7 +1402,7 @@ static int vidioc_g_register(struct file *file, void *priv,
return ret; return ret;
} }
static int vidioc_s_register(struct file *file, void *priv, int cx231xx_s_register(struct file *file, void *priv,
struct v4l2_dbg_register *reg) struct v4l2_dbg_register *reg)
{ {
struct cx231xx_fh *fh = priv; struct cx231xx_fh *fh = priv;
...@@ -1811,7 +1811,7 @@ static int radio_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t) ...@@ -1811,7 +1811,7 @@ static int radio_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
{ {
struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev; struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev;
if (0 != t->index) if (t->index)
return -EINVAL; return -EINVAL;
call_all(dev, tuner, s_tuner, t); call_all(dev, tuner, s_tuner, t);
...@@ -2201,19 +2201,19 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = { ...@@ -2201,19 +2201,19 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = {
.vidioc_dqbuf = vidioc_dqbuf, .vidioc_dqbuf = vidioc_dqbuf,
.vidioc_s_std = vidioc_s_std, .vidioc_s_std = vidioc_s_std,
.vidioc_g_std = vidioc_g_std, .vidioc_g_std = vidioc_g_std,
.vidioc_enum_input = vidioc_enum_input, .vidioc_enum_input = cx231xx_enum_input,
.vidioc_g_input = vidioc_g_input, .vidioc_g_input = cx231xx_g_input,
.vidioc_s_input = vidioc_s_input, .vidioc_s_input = cx231xx_s_input,
.vidioc_streamon = vidioc_streamon, .vidioc_streamon = vidioc_streamon,
.vidioc_streamoff = vidioc_streamoff, .vidioc_streamoff = vidioc_streamoff,
.vidioc_g_tuner = vidioc_g_tuner, .vidioc_g_tuner = cx231xx_g_tuner,
.vidioc_s_tuner = vidioc_s_tuner, .vidioc_s_tuner = cx231xx_s_tuner,
.vidioc_g_frequency = vidioc_g_frequency, .vidioc_g_frequency = cx231xx_g_frequency,
.vidioc_s_frequency = vidioc_s_frequency, .vidioc_s_frequency = cx231xx_s_frequency,
.vidioc_g_chip_ident = vidioc_g_chip_ident, .vidioc_g_chip_ident = cx231xx_g_chip_ident,
#ifdef CONFIG_VIDEO_ADV_DEBUG #ifdef CONFIG_VIDEO_ADV_DEBUG
.vidioc_g_register = vidioc_g_register, .vidioc_g_register = cx231xx_g_register,
.vidioc_s_register = vidioc_s_register, .vidioc_s_register = cx231xx_s_register,
#endif #endif
.vidioc_subscribe_event = v4l2_ctrl_subscribe_event, .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
.vidioc_unsubscribe_event = v4l2_event_unsubscribe, .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
...@@ -2240,12 +2240,12 @@ static const struct v4l2_ioctl_ops radio_ioctl_ops = { ...@@ -2240,12 +2240,12 @@ static const struct v4l2_ioctl_ops radio_ioctl_ops = {
.vidioc_querycap = cx231xx_querycap, .vidioc_querycap = cx231xx_querycap,
.vidioc_g_tuner = radio_g_tuner, .vidioc_g_tuner = radio_g_tuner,
.vidioc_s_tuner = radio_s_tuner, .vidioc_s_tuner = radio_s_tuner,
.vidioc_g_frequency = vidioc_g_frequency, .vidioc_g_frequency = cx231xx_g_frequency,
.vidioc_s_frequency = vidioc_s_frequency, .vidioc_s_frequency = cx231xx_s_frequency,
.vidioc_g_chip_ident = vidioc_g_chip_ident, .vidioc_g_chip_ident = cx231xx_g_chip_ident,
#ifdef CONFIG_VIDEO_ADV_DEBUG #ifdef CONFIG_VIDEO_ADV_DEBUG
.vidioc_g_register = vidioc_g_register, .vidioc_g_register = cx231xx_g_register,
.vidioc_s_register = vidioc_s_register, .vidioc_s_register = cx231xx_s_register,
#endif #endif
.vidioc_subscribe_event = v4l2_ctrl_subscribe_event, .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
.vidioc_unsubscribe_event = v4l2_event_unsubscribe, .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
......
...@@ -936,6 +936,21 @@ void cx231xx_init_extension(struct cx231xx *dev); ...@@ -936,6 +936,21 @@ void cx231xx_init_extension(struct cx231xx *dev);
void cx231xx_close_extension(struct cx231xx *dev); void cx231xx_close_extension(struct cx231xx *dev);
int cx231xx_querycap(struct file *file, void *priv, int cx231xx_querycap(struct file *file, void *priv,
struct v4l2_capability *cap); struct v4l2_capability *cap);
int cx231xx_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t);
int cx231xx_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t);
int cx231xx_g_frequency(struct file *file, void *priv,
struct v4l2_frequency *f);
int cx231xx_s_frequency(struct file *file, void *priv,
struct v4l2_frequency *f);
int cx231xx_enum_input(struct file *file, void *priv,
struct v4l2_input *i);
int cx231xx_g_input(struct file *file, void *priv, unsigned int *i);
int cx231xx_s_input(struct file *file, void *priv, unsigned int i);
int cx231xx_g_chip_ident(struct file *file, void *fh, struct v4l2_dbg_chip_ident *chip);
int cx231xx_g_register(struct file *file, void *priv,
struct v4l2_dbg_register *reg);
int cx231xx_s_register(struct file *file, void *priv,
struct v4l2_dbg_register *reg);
/* Provided by cx231xx-cards.c */ /* Provided by cx231xx-cards.c */
extern void cx231xx_pre_card_setup(struct cx231xx *dev); extern void cx231xx_pre_card_setup(struct cx231xx *dev);
......
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