Commit 8c85454a authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

V4L/DVB (6736): Fix some errors at the video_ioctl2 conversion

parent 90bdc145
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -834,6 +834,7 @@ static struct video_device *vdev_init(struct saa7134_dev *dev,
	vfd->minor   = -1;
	vfd->dev     = &dev->pci->dev;
	vfd->release = video_device_release;
	vfd->debug   = video_debug;
	snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
		 dev->name, type, saa7134_boards[dev->board].name);
	return vfd;
+216 −172
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@

/* ------------------------------------------------------------------ */

static unsigned int video_debug   = 0;
unsigned int video_debug;
static unsigned int gbuffers      = 8;
static unsigned int noninterlaced = 0;
static unsigned int gbufsize      = 720*576*4;
@@ -54,7 +54,7 @@ module_param_string(secam, secam, sizeof(secam), 0644);
MODULE_PARM_DESC(secam, "force SECAM variant, either DK,L or Lc");


#define dprintk(fmt, arg...)	if (video_debug) \
#define dprintk(fmt, arg...)	if (video_debug&0x04) \
	printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg)

/* ------------------------------------------------------------------ */
@@ -217,6 +217,12 @@ static struct saa7134_format formats[] = {
		.vbi_v_start_1 = 273,	\
		.src_timing    = 7

#define SAA7134_NORMS	\
		V4L2_STD_PAL    | V4L2_STD_PAL_N | \
		V4L2_STD_PAL_Nc | V4L2_STD_SECAM | \
		V4L2_STD_NTSC   | V4L2_STD_PAL_M | \
		V4L2_STD_PAL_60

static struct saa7134_tvnorm tvnorms[] = {
	{
		.name          = "PAL", /* autodetect */
@@ -542,7 +548,6 @@ void res_free(struct saa7134_dev *dev, struct saa7134_fh *fh, unsigned int bits)

static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
{

	dprintk("set tv norm = %s\n",norm->name);
	dev->tvnorm = norm;

@@ -561,7 +566,6 @@ static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
	dev->crop_current = dev->crop_defrect;

	saa7134_set_tvnorm_hw(dev);

}

static void video_mux(struct saa7134_dev *dev, int input)
@@ -1177,11 +1181,18 @@ static int vidioc_s_ctrl(struct file *file, void *f,
	struct saa7134_dev *dev = fh->dev;
	unsigned long flags;
	int restart_overlay = 0;
	int err = -EINVAL;

	err = v4l2_prio_check(&dev->prio, &fh->prio);
	if (0 != err)
		return err;

	mutex_lock(&dev->lock);

	ctrl = ctrl_by_id(c->id);
	if (NULL == ctrl)
		return -EINVAL;
		goto error;

	dprintk("set_control name=%s val=%d\n",ctrl->name,c->value);
	switch (ctrl->type) {
	case V4L2_CTRL_TYPE_BOOLEAN:
@@ -1261,8 +1272,7 @@ static int vidioc_s_ctrl(struct file *file, void *f,
		break;
	}
	default:
		mutex_unlock(&dev->lock);
		return -EINVAL;
		goto error;
	}
	if (restart_overlay && fh && res_check(fh, RESOURCE_OVERLAY)) {
		spin_lock_irqsave(&dev->slock,flags);
@@ -1270,8 +1280,11 @@ static int vidioc_s_ctrl(struct file *file, void *f,
		start_preview(dev,fh);
		spin_unlock_irqrestore(&dev->slock,flags);
	}
	err = 0;

error:
	mutex_unlock(&dev->lock);
	return 0;
	return err;
}

/* ------------------------------------------------------------------ */
@@ -1494,8 +1507,11 @@ static int video_mmap(struct file *file, struct vm_area_struct * vma)

/* ------------------------------------------------------------------ */

static void saa7134_vbi_fmt(struct saa7134_dev *dev, struct v4l2_format *f)
static int vidioc_try_get_set_fmt_vbi(struct file *file, void *priv,
						struct v4l2_format *f)
{
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;
	struct saa7134_tvnorm *norm = dev->tvnorm;

	f->fmt.vbi.sampling_rate = 6750000 * 4;
@@ -1508,17 +1524,14 @@ static void saa7134_vbi_fmt(struct saa7134_dev *dev, struct v4l2_format *f)
	f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
	f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */

	return 0;
}

static int vidioc_g_fmt_cap(struct file *file, void *priv,
				struct v4l2_format *f)
{
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;

	switch (f->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
		memset(&f->fmt.pix,0,sizeof(f->fmt.pix));
	f->fmt.pix.width        = fh->width;
	f->fmt.pix.height       = fh->height;
	f->fmt.pix.field        = fh->cap.field;
@@ -1528,19 +1541,20 @@ static int vidioc_g_fmt_cap(struct file *file, void *priv,
	f->fmt.pix.sizeimage =
		f->fmt.pix.height * f->fmt.pix.bytesperline;
	return 0;
	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
}

static int vidioc_g_fmt_overlay(struct file *file, void *priv,
				struct v4l2_format *f)
{
	struct saa7134_fh *fh = priv;

	if (saa7134_no_overlay > 0) {
			printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
		printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
		return -EINVAL;
	}
	f->fmt.win = fh->win;

	return 0;
	case V4L2_BUF_TYPE_VBI_CAPTURE:
		saa7134_vbi_fmt(dev,f);
		return 0;
	default:
		return -EINVAL;
	}
}

static int vidioc_try_fmt_cap(struct file *file, void *priv,
@@ -1548,11 +1562,6 @@ static int vidioc_try_fmt_cap(struct file *file, void *priv,
{
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;
	int err;

	switch (f->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	{
	struct saa7134_format *fmt;
	enum v4l2_field field;
	unsigned int maxw, maxh;
@@ -1598,33 +1607,27 @@ static int vidioc_try_fmt_cap(struct file *file, void *priv,

	return 0;
}
	case V4L2_BUF_TYPE_VIDEO_OVERLAY:

static int vidioc_try_fmt_overlay(struct file *file, void *priv,
						struct v4l2_format *f)
{
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;

	if (saa7134_no_overlay > 0) {
			printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
			return -EINVAL;
		}
		err = verify_preview(dev,&f->fmt.win);
		if (0 != err)
			return err;
		return 0;
	case V4L2_BUF_TYPE_VBI_CAPTURE:
		saa7134_vbi_fmt(dev,f);
		return 0;
	default:
		printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
		return -EINVAL;
	}

	return verify_preview(dev, &f->fmt.win);
}

static int vidioc_s_fmt_cap(struct file *file, void *priv,
					struct v4l2_format *f)
{
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;
	unsigned long flags;
	int err;

	switch (f->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	err = vidioc_try_fmt_cap(file, priv, f);
	if (0 != err)
		return err;
@@ -1634,9 +1637,18 @@ static int vidioc_s_fmt_cap(struct file *file, void *priv,
	fh->height    = f->fmt.pix.height;
	fh->cap.field = f->fmt.pix.field;
	return 0;
	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
}

static int vidioc_s_fmt_overlay(struct file *file, void *priv,
					struct v4l2_format *f)
{
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;
	int err;
	unsigned int flags;

	if (saa7134_no_overlay > 0) {
			printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
		printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
		return -EINVAL;
	}
	err = verify_preview(dev, &f->fmt.win);
@@ -1644,10 +1656,13 @@ static int vidioc_s_fmt_cap(struct file *file, void *priv,
		return err;

	mutex_lock(&dev->lock);

	fh->win    = f->fmt.win;
	fh->nclips = f->fmt.win.clipcount;

	if (fh->nclips > 8)
		fh->nclips = 8;

	if (copy_from_user(fh->clips, f->fmt.win.clips,
			   sizeof(struct v4l2_clip)*fh->nclips)) {
		mutex_unlock(&dev->lock);
@@ -1660,14 +1675,9 @@ static int vidioc_s_fmt_cap(struct file *file, void *priv,
		start_preview(dev, fh);
		spin_unlock_irqrestore(&dev->slock, flags);
	}

	mutex_unlock(&dev->lock);
	return 0;
	case V4L2_BUF_TYPE_VBI_CAPTURE:
		saa7134_vbi_fmt(dev,f);
		return 0;
	default:
		return -EINVAL;
	}
}

static int vidioc_queryctrl(struct file *file, void *priv,
@@ -1715,8 +1725,7 @@ static int vidioc_enum_input(struct file *file, void *priv,
		if (0 != (v2 & 0x0e))
			i->status |= V4L2_IN_ST_MACROVISION;
	}
	for (n = 0; n < TVNORMS; n++)
		i->std |= tvnorms[n].id;
	i->std = SAA7134_NORMS;
	return 0;
}

@@ -1733,6 +1742,11 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
{
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;
	int err;

	err = v4l2_prio_check(&dev->prio, &fh->prio);
	if (0 != err)
		return err;

	if (i < 0  ||  i >= SAA7134_INPUT_MAX)
		return -EINVAL;
@@ -1752,7 +1766,6 @@ static int vidioc_querycap(struct file *file, void *priv,

	unsigned int tuner_type = dev->tuner_type;

	memset(cap, 0, sizeof(*cap));
	strcpy(cap->driver, "saa7134");
	strlcpy(cap->card, saa7134_boards[dev->board].name,
		sizeof(cap->card));
@@ -1779,16 +1792,23 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * id)
	unsigned long flags;
	unsigned int i;
	v4l2_std_id fixup;
	int err;

	err = v4l2_prio_check(&dev->prio, &fh->prio);
	if (0 != err)
		return err;

	for (i = 0; i < TVNORMS; i++)
		if (*id == tvnorms[i].id)
			break;

	if (i == TVNORMS)
		for (i = 0; i < TVNORMS; i++)
			if (*id & tvnorms[i].id)
				break;
	if (i == TVNORMS)
		return -EINVAL;

	if ((*id & V4L2_STD_SECAM) && (secam[0] != '-')) {
		if (secam[0] == 'L' || secam[0] == 'l') {
			if (secam[1] == 'C' || secam[1] == 'c')
@@ -1805,6 +1825,9 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * id)
			if (fixup == tvnorms[i].id)
				break;
	}

	*id = tvnorms[i].id;

	mutex_lock(&dev->lock);
	if (res_check(fh, RESOURCE_OVERLAY)) {
		spin_lock_irqsave(&dev->slock, flags);
@@ -1818,6 +1841,7 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * id)
		spin_unlock_irqrestore(&dev->slock, flags);
	} else
		set_tvnorm(dev, &tvnorms[i]);

	saa7134_tvaudio_do_scan(dev);
	mutex_unlock(&dev->lock);
	return 0;
@@ -1930,7 +1954,11 @@ static int vidioc_s_tuner(struct file *file, void *priv,
{
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;
	int rx, mode;
	int rx, mode, err;

	err = v4l2_prio_check(&dev->prio, &fh->prio);
	if (0 != err)
		return err;

	mode = dev->thread.mode;
	if (UNSET == mode) {
@@ -1939,6 +1967,7 @@ static int vidioc_s_tuner(struct file *file, void *priv,
	}
	if (mode != t->audmode)
		dev->thread.mode = t->audmode;

	return 0;
}

@@ -1948,9 +1977,9 @@ static int vidioc_g_frequency(struct file *file, void *priv,
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;

	memset(f, 0, sizeof(*f));
	f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
	f->frequency = dev->ctl_freq;

	return 0;
}

@@ -1959,6 +1988,11 @@ static int vidioc_s_frequency(struct file *file, void *priv,
{
	struct saa7134_fh *fh = priv;
	struct saa7134_dev *dev = fh->dev;
	int err;

	err = v4l2_prio_check(&dev->prio, &fh->prio);
	if (0 != err)
		return err;

	if (0 != f->tuner)
		return -EINVAL;
@@ -1978,7 +2012,6 @@ static int vidioc_s_frequency(struct file *file, void *priv,

static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
{
	memset(a, 0, sizeof(*a));
	strcpy(a->name, "audio");
	return 0;
}
@@ -2009,42 +2042,45 @@ static int vidioc_s_priority(struct file *file, void *f,
static int vidioc_enum_fmt_cap(struct file *file, void  *priv,
					struct v4l2_fmtdesc *f)
{
	enum v4l2_buf_type type;
	unsigned int index;

	index = f->index;
	type  = f->type;
	switch (type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
		if (saa7134_no_overlay > 0)
	if (f->index >= FORMATS)
		return -EINVAL;

		if (index >= FORMATS)
	strlcpy(f->description, formats[f->index].name,
		sizeof(f->description));

	f->pixelformat = formats[f->index].fourcc;

	return 0;
}

static int vidioc_enum_fmt_overlay(struct file *file, void  *priv,
					struct v4l2_fmtdesc *f)
{
	if (saa7134_no_overlay > 0) {
		printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
		return -EINVAL;
	}

		if (f->type == V4L2_BUF_TYPE_VIDEO_OVERLAY &&
		    formats[index].planar)
	if ((f->index >= FORMATS) || formats[f->index].planar)
		return -EINVAL;
		memset(f, 0, sizeof(*f));
		f->index = index;
		f->type  = type;
		strlcpy(f->description, formats[index].name,

	strlcpy(f->description, formats[f->index].name,
		sizeof(f->description));
		f->pixelformat = formats[index].fourcc;
		break;
	case V4L2_BUF_TYPE_VBI_CAPTURE:
		if (0 != index)

	f->pixelformat = formats[f->index].fourcc;

	return 0;
}

static int vidioc_enum_fmt_vbi(struct file *file, void  *priv,
					struct v4l2_fmtdesc *f)
{
	if (0 != f->index)
		return -EINVAL;
		memset(f, 0, sizeof(*f));
		f->index = index;
		f->type  = type;

	f->pixelformat = V4L2_PIX_FMT_GREY;
	strcpy(f->description, "vbi data");
		break;
	default:
		return -EINVAL;
	}

	return 0;
}

@@ -2180,7 +2216,6 @@ static int vidioc_streamoff(struct file *file, void *priv,
static int vidioc_g_parm(struct file *file, void *fh,
				struct v4l2_streamparm *parm)
{
	memset(parm, 0, sizeof(*parm));
	return 0;
}

@@ -2190,7 +2225,6 @@ static int radio_querycap(struct file *file, void *priv,
	struct saa7134_fh *fh = file->private_data;
	struct saa7134_dev *dev = fh->dev;

	memset(cap, 0, sizeof(*cap));
	strcpy(cap->driver, "saa7134");
	strlcpy(cap->card, saa7134_boards[dev->board].name, sizeof(cap->card));
	sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
@@ -2329,6 +2363,14 @@ struct video_device saa7134_video_template =
	.vidioc_g_fmt_cap		= vidioc_g_fmt_cap,
	.vidioc_try_fmt_cap		= vidioc_try_fmt_cap,
	.vidioc_s_fmt_cap		= vidioc_s_fmt_cap,
	.vidioc_enum_fmt_overlay	= vidioc_enum_fmt_overlay,
	.vidioc_g_fmt_overlay		= vidioc_g_fmt_overlay,
	.vidioc_try_fmt_overlay		= vidioc_try_fmt_overlay,
	.vidioc_s_fmt_overlay		= vidioc_s_fmt_overlay,
	.vidioc_enum_fmt_vbi		= vidioc_enum_fmt_vbi,
	.vidioc_g_fmt_vbi		= vidioc_try_get_set_fmt_vbi,
	.vidioc_try_fmt_vbi		= vidioc_try_get_set_fmt_vbi,
	.vidioc_s_fmt_vbi		= vidioc_try_get_set_fmt_vbi,
	.vidioc_g_audio			= vidioc_g_audio,
	.vidioc_s_audio			= vidioc_s_audio,
	.vidioc_cropcap			= vidioc_cropcap,
@@ -2360,6 +2402,8 @@ struct video_device saa7134_video_template =
	.vidioc_g_parm			= vidioc_g_parm,
	.vidioc_g_frequency		= vidioc_g_frequency,
	.vidioc_s_frequency		= vidioc_s_frequency,
	.tvnorms			= SAA7134_NORMS,
	.current_norm			= V4L2_STD_PAL,
};

struct video_device saa7134_vbi_template =
+1 −0
Original line number Diff line number Diff line
@@ -625,6 +625,7 @@ void saa7134_i2c_call_clients(struct saa7134_dev *dev,
/* ----------------------------------------------------------- */
/* saa7134-video.c                                             */

extern unsigned int video_debug;
extern struct video_device saa7134_video_template;
extern struct video_device saa7134_radio_template;