2 * Driver for the NXP SAA7164 PCIe bridge
4 * Copyright (c) 2010 Steven Toth <stoth@kernellabs.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 static struct saa7164_tvnorm saa7164_tvnorms
[] = {
27 .id
= V4L2_STD_NTSC_M
,
30 .id
= V4L2_STD_NTSC_M_JP
,
34 static const u32 saa7164_v4l2_ctrls
[] = {
38 /* Take the encoder configuration from the port struct and
39 * flush it to the hardware.
41 static void saa7164_vbi_configure(struct saa7164_port
*port
)
43 struct saa7164_dev
*dev
= port
->dev
;
44 dprintk(DBGLVL_VBI
, "%s()\n", __func__
);
46 port
->vbi_params
.width
= port
->width
;
47 port
->vbi_params
.height
= port
->height
;
48 port
->vbi_params
.is_50hz
=
49 (port
->encodernorm
.id
& V4L2_STD_625_50
) != 0;
51 /* Set up the DIF (enable it) for analog mode by default */
52 saa7164_api_initialize_dif(port
);
54 /* Configure the correct video standard */
56 saa7164_api_configure_dif(port
, port
->encodernorm
.id
);
60 /* Ensure the audio decoder is correct configured */
61 saa7164_api_set_audio_std(port
);
63 dprintk(DBGLVL_VBI
, "%s() ends\n", __func__
);
66 static int saa7164_vbi_buffers_dealloc(struct saa7164_port
*port
)
68 struct list_head
*c
, *n
, *p
, *q
, *l
, *v
;
69 struct saa7164_dev
*dev
= port
->dev
;
70 struct saa7164_buffer
*buf
;
71 struct saa7164_user_buffer
*ubuf
;
73 /* Remove any allocated buffers */
74 mutex_lock(&port
->dmaqueue_lock
);
76 dprintk(DBGLVL_VBI
, "%s(port=%d) dmaqueue\n", __func__
, port
->nr
);
77 list_for_each_safe(c
, n
, &port
->dmaqueue
.list
) {
78 buf
= list_entry(c
, struct saa7164_buffer
, list
);
80 saa7164_buffer_dealloc(buf
);
83 dprintk(DBGLVL_VBI
, "%s(port=%d) used\n", __func__
, port
->nr
);
84 list_for_each_safe(p
, q
, &port
->list_buf_used
.list
) {
85 ubuf
= list_entry(p
, struct saa7164_user_buffer
, list
);
87 saa7164_buffer_dealloc_user(ubuf
);
90 dprintk(DBGLVL_VBI
, "%s(port=%d) free\n", __func__
, port
->nr
);
91 list_for_each_safe(l
, v
, &port
->list_buf_free
.list
) {
92 ubuf
= list_entry(l
, struct saa7164_user_buffer
, list
);
94 saa7164_buffer_dealloc_user(ubuf
);
97 mutex_unlock(&port
->dmaqueue_lock
);
98 dprintk(DBGLVL_VBI
, "%s(port=%d) done\n", __func__
, port
->nr
);
103 /* Dynamic buffer switch at vbi start time */
104 static int saa7164_vbi_buffers_alloc(struct saa7164_port
*port
)
106 struct saa7164_dev
*dev
= port
->dev
;
107 struct saa7164_buffer
*buf
;
108 struct saa7164_user_buffer
*ubuf
;
109 struct tmHWStreamParameters
*params
= &port
->hw_streamingparams
;
110 int result
= -ENODEV
, i
;
113 dprintk(DBGLVL_VBI
, "%s()\n", __func__
);
115 /* TODO: NTSC SPECIFIC */
116 /* Init and establish defaults */
117 params
->samplesperline
= 1440;
118 params
->numberoflines
= 12;
119 params
->numberoflines
= 18;
120 params
->pitch
= 1600;
121 params
->pitch
= 1440;
122 params
->numpagetables
= 2 +
123 ((params
->numberoflines
* params
->pitch
) / PAGE_SIZE
);
124 params
->bitspersample
= 8;
125 params
->linethreshold
= 0;
126 params
->pagetablelistvirt
= NULL
;
127 params
->pagetablelistphys
= NULL
;
128 params
->numpagetableentries
= port
->hwcfg
.buffercount
;
130 /* Allocate the PCI resources, buffers (hard) */
131 for (i
= 0; i
< port
->hwcfg
.buffercount
; i
++) {
132 buf
= saa7164_buffer_alloc(port
,
133 params
->numberoflines
*
137 printk(KERN_ERR
"%s() failed "
138 "(errno = %d), unable to allocate buffer\n",
144 mutex_lock(&port
->dmaqueue_lock
);
145 list_add_tail(&buf
->list
, &port
->dmaqueue
.list
);
146 mutex_unlock(&port
->dmaqueue_lock
);
151 /* Allocate some kernel buffers for copying
154 len
= params
->numberoflines
* params
->pitch
;
156 if (vbi_buffers
< 16)
158 if (vbi_buffers
> 512)
161 for (i
= 0; i
< vbi_buffers
; i
++) {
163 ubuf
= saa7164_buffer_alloc_user(dev
, len
);
165 mutex_lock(&port
->dmaqueue_lock
);
166 list_add_tail(&ubuf
->list
, &port
->list_buf_free
.list
);
167 mutex_unlock(&port
->dmaqueue_lock
);
179 static int saa7164_vbi_initialize(struct saa7164_port
*port
)
181 saa7164_vbi_configure(port
);
185 /* -- V4L2 --------------------------------------------------------- */
186 static int vidioc_s_std(struct file
*file
, void *priv
, v4l2_std_id
*id
)
188 struct saa7164_vbi_fh
*fh
= file
->private_data
;
189 struct saa7164_port
*port
= fh
->port
;
190 struct saa7164_dev
*dev
= port
->dev
;
193 dprintk(DBGLVL_VBI
, "%s(id=0x%x)\n", __func__
, (u32
)*id
);
195 for (i
= 0; i
< ARRAY_SIZE(saa7164_tvnorms
); i
++) {
196 if (*id
& saa7164_tvnorms
[i
].id
)
199 if (i
== ARRAY_SIZE(saa7164_tvnorms
))
202 port
->encodernorm
= saa7164_tvnorms
[i
];
204 /* Update the audio decoder while is not running in
207 saa7164_api_set_audio_std(port
);
209 dprintk(DBGLVL_VBI
, "%s(id=0x%x) OK\n", __func__
, (u32
)*id
);
214 static int vidioc_enum_input(struct file
*file
, void *priv
,
215 struct v4l2_input
*i
)
219 char *inputs
[] = { "tuner", "composite", "svideo", "aux",
220 "composite 2", "svideo 2", "aux 2" };
225 strcpy(i
->name
, inputs
[i
->index
]);
228 i
->type
= V4L2_INPUT_TYPE_TUNER
;
230 i
->type
= V4L2_INPUT_TYPE_CAMERA
;
232 for (n
= 0; n
< ARRAY_SIZE(saa7164_tvnorms
); n
++)
233 i
->std
|= saa7164_tvnorms
[n
].id
;
238 static int vidioc_g_input(struct file
*file
, void *priv
, unsigned int *i
)
240 struct saa7164_vbi_fh
*fh
= file
->private_data
;
241 struct saa7164_port
*port
= fh
->port
;
242 struct saa7164_dev
*dev
= port
->dev
;
244 if (saa7164_api_get_videomux(port
) != SAA_OK
)
247 *i
= (port
->mux_input
- 1);
249 dprintk(DBGLVL_VBI
, "%s() input=%d\n", __func__
, *i
);
254 static int vidioc_s_input(struct file
*file
, void *priv
, unsigned int i
)
256 struct saa7164_vbi_fh
*fh
= file
->private_data
;
257 struct saa7164_port
*port
= fh
->port
;
258 struct saa7164_dev
*dev
= port
->dev
;
260 dprintk(DBGLVL_VBI
, "%s() input=%d\n", __func__
, i
);
265 port
->mux_input
= i
+ 1;
267 if (saa7164_api_set_videomux(port
) != SAA_OK
)
273 static int vidioc_g_tuner(struct file
*file
, void *priv
,
274 struct v4l2_tuner
*t
)
276 struct saa7164_vbi_fh
*fh
= file
->private_data
;
277 struct saa7164_port
*port
= fh
->port
;
278 struct saa7164_dev
*dev
= port
->dev
;
283 strcpy(t
->name
, "tuner");
284 t
->type
= V4L2_TUNER_ANALOG_TV
;
285 t
->capability
= V4L2_TUNER_CAP_NORM
| V4L2_TUNER_CAP_STEREO
;
287 dprintk(DBGLVL_VBI
, "VIDIOC_G_TUNER: tuner type %d\n", t
->type
);
292 static int vidioc_s_tuner(struct file
*file
, void *priv
,
293 struct v4l2_tuner
*t
)
295 /* Update the A/V core */
299 static int vidioc_g_frequency(struct file
*file
, void *priv
,
300 struct v4l2_frequency
*f
)
302 struct saa7164_vbi_fh
*fh
= file
->private_data
;
303 struct saa7164_port
*port
= fh
->port
;
305 f
->type
= V4L2_TUNER_ANALOG_TV
;
306 f
->frequency
= port
->freq
;
311 static int vidioc_s_frequency(struct file
*file
, void *priv
,
312 struct v4l2_frequency
*f
)
314 struct saa7164_vbi_fh
*fh
= file
->private_data
;
315 struct saa7164_port
*port
= fh
->port
;
316 struct saa7164_dev
*dev
= port
->dev
;
317 struct saa7164_port
*tsport
;
318 struct dvb_frontend
*fe
;
320 /* TODO: Pull this for the std */
321 struct analog_parameters params
= {
322 .mode
= V4L2_TUNER_ANALOG_TV
,
323 .audmode
= V4L2_TUNER_MODE_STEREO
,
324 .std
= port
->encodernorm
.id
,
325 .frequency
= f
->frequency
328 /* Stop the encoder */
329 dprintk(DBGLVL_VBI
, "%s() frequency=%d tuner=%d\n", __func__
,
330 f
->frequency
, f
->tuner
);
335 if (f
->type
!= V4L2_TUNER_ANALOG_TV
)
338 port
->freq
= f
->frequency
;
340 /* Update the hardware */
341 if (port
->nr
== SAA7164_PORT_VBI1
)
342 tsport
= &dev
->ports
[SAA7164_PORT_TS1
];
344 if (port
->nr
== SAA7164_PORT_VBI2
)
345 tsport
= &dev
->ports
[SAA7164_PORT_TS2
];
349 fe
= tsport
->dvb
.frontend
;
351 if (fe
&& fe
->ops
.tuner_ops
.set_analog_params
)
352 fe
->ops
.tuner_ops
.set_analog_params(fe
, ¶ms
);
354 printk(KERN_ERR
"%s() No analog tuner, aborting\n", __func__
);
356 saa7164_vbi_initialize(port
);
361 static int vidioc_g_ctrl(struct file
*file
, void *priv
,
362 struct v4l2_control
*ctl
)
364 struct saa7164_vbi_fh
*fh
= file
->private_data
;
365 struct saa7164_port
*port
= fh
->port
;
366 struct saa7164_dev
*dev
= port
->dev
;
368 dprintk(DBGLVL_VBI
, "%s(id=%d, value=%d)\n", __func__
,
369 ctl
->id
, ctl
->value
);
372 case V4L2_CID_BRIGHTNESS
:
373 ctl
->value
= port
->ctl_brightness
;
375 case V4L2_CID_CONTRAST
:
376 ctl
->value
= port
->ctl_contrast
;
378 case V4L2_CID_SATURATION
:
379 ctl
->value
= port
->ctl_saturation
;
382 ctl
->value
= port
->ctl_hue
;
384 case V4L2_CID_SHARPNESS
:
385 ctl
->value
= port
->ctl_sharpness
;
387 case V4L2_CID_AUDIO_VOLUME
:
388 ctl
->value
= port
->ctl_volume
;
397 static int vidioc_s_ctrl(struct file
*file
, void *priv
,
398 struct v4l2_control
*ctl
)
400 struct saa7164_vbi_fh
*fh
= file
->private_data
;
401 struct saa7164_port
*port
= fh
->port
;
402 struct saa7164_dev
*dev
= port
->dev
;
405 dprintk(DBGLVL_VBI
, "%s(id=%d, value=%d)\n", __func__
,
406 ctl
->id
, ctl
->value
);
409 case V4L2_CID_BRIGHTNESS
:
410 if ((ctl
->value
>= 0) && (ctl
->value
<= 255)) {
411 port
->ctl_brightness
= ctl
->value
;
412 saa7164_api_set_usercontrol(port
,
413 PU_BRIGHTNESS_CONTROL
);
417 case V4L2_CID_CONTRAST
:
418 if ((ctl
->value
>= 0) && (ctl
->value
<= 255)) {
419 port
->ctl_contrast
= ctl
->value
;
420 saa7164_api_set_usercontrol(port
, PU_CONTRAST_CONTROL
);
424 case V4L2_CID_SATURATION
:
425 if ((ctl
->value
>= 0) && (ctl
->value
<= 255)) {
426 port
->ctl_saturation
= ctl
->value
;
427 saa7164_api_set_usercontrol(port
,
428 PU_SATURATION_CONTROL
);
433 if ((ctl
->value
>= 0) && (ctl
->value
<= 255)) {
434 port
->ctl_hue
= ctl
->value
;
435 saa7164_api_set_usercontrol(port
, PU_HUE_CONTROL
);
439 case V4L2_CID_SHARPNESS
:
440 if ((ctl
->value
>= 0) && (ctl
->value
<= 255)) {
441 port
->ctl_sharpness
= ctl
->value
;
442 saa7164_api_set_usercontrol(port
, PU_SHARPNESS_CONTROL
);
446 case V4L2_CID_AUDIO_VOLUME
:
447 if ((ctl
->value
>= -83) && (ctl
->value
<= 24)) {
448 port
->ctl_volume
= ctl
->value
;
449 saa7164_api_set_audio_volume(port
, port
->ctl_volume
);
460 static int saa7164_get_ctrl(struct saa7164_port
*port
,
461 struct v4l2_ext_control
*ctrl
)
463 struct saa7164_vbi_params
*params
= &port
->vbi_params
;
466 case V4L2_CID_MPEG_STREAM_TYPE
:
467 ctrl
->value
= params
->stream_type
;
469 case V4L2_CID_MPEG_AUDIO_MUTE
:
470 ctrl
->value
= params
->ctl_mute
;
472 case V4L2_CID_MPEG_VIDEO_ASPECT
:
473 ctrl
->value
= params
->ctl_aspect
;
475 case V4L2_CID_MPEG_VIDEO_B_FRAMES
:
476 ctrl
->value
= params
->refdist
;
478 case V4L2_CID_MPEG_VIDEO_GOP_SIZE
:
479 ctrl
->value
= params
->gop_size
;
487 static int vidioc_g_ext_ctrls(struct file
*file
, void *priv
,
488 struct v4l2_ext_controls
*ctrls
)
490 struct saa7164_vbi_fh
*fh
= file
->private_data
;
491 struct saa7164_port
*port
= fh
->port
;
494 if (ctrls
->ctrl_class
== V4L2_CTRL_CLASS_MPEG
) {
495 for (i
= 0; i
< ctrls
->count
; i
++) {
496 struct v4l2_ext_control
*ctrl
= ctrls
->controls
+ i
;
498 err
= saa7164_get_ctrl(port
, ctrl
);
500 ctrls
->error_idx
= i
;
511 static int saa7164_try_ctrl(struct v4l2_ext_control
*ctrl
, int ac3
)
516 case V4L2_CID_MPEG_STREAM_TYPE
:
517 if ((ctrl
->value
== V4L2_MPEG_STREAM_TYPE_MPEG2_PS
) ||
518 (ctrl
->value
== V4L2_MPEG_STREAM_TYPE_MPEG2_TS
))
521 case V4L2_CID_MPEG_AUDIO_MUTE
:
522 if ((ctrl
->value
>= 0) &&
526 case V4L2_CID_MPEG_VIDEO_ASPECT
:
527 if ((ctrl
->value
>= V4L2_MPEG_VIDEO_ASPECT_1x1
) &&
528 (ctrl
->value
<= V4L2_MPEG_VIDEO_ASPECT_221x100
))
531 case V4L2_CID_MPEG_VIDEO_GOP_SIZE
:
532 if ((ctrl
->value
>= 0) &&
533 (ctrl
->value
<= 255))
536 case V4L2_CID_MPEG_VIDEO_B_FRAMES
:
537 if ((ctrl
->value
>= 1) &&
548 static int vidioc_try_ext_ctrls(struct file
*file
, void *priv
,
549 struct v4l2_ext_controls
*ctrls
)
553 if (ctrls
->ctrl_class
== V4L2_CTRL_CLASS_MPEG
) {
554 for (i
= 0; i
< ctrls
->count
; i
++) {
555 struct v4l2_ext_control
*ctrl
= ctrls
->controls
+ i
;
557 err
= saa7164_try_ctrl(ctrl
, 0);
559 ctrls
->error_idx
= i
;
569 static int saa7164_set_ctrl(struct saa7164_port
*port
,
570 struct v4l2_ext_control
*ctrl
)
572 struct saa7164_vbi_params
*params
= &port
->vbi_params
;
576 case V4L2_CID_MPEG_STREAM_TYPE
:
577 params
->stream_type
= ctrl
->value
;
579 case V4L2_CID_MPEG_AUDIO_MUTE
:
580 params
->ctl_mute
= ctrl
->value
;
581 ret
= saa7164_api_audio_mute(port
, params
->ctl_mute
);
583 printk(KERN_ERR
"%s() error, ret = 0x%x\n", __func__
,
588 case V4L2_CID_MPEG_VIDEO_ASPECT
:
589 params
->ctl_aspect
= ctrl
->value
;
590 ret
= saa7164_api_set_aspect_ratio(port
);
592 printk(KERN_ERR
"%s() error, ret = 0x%x\n", __func__
,
597 case V4L2_CID_MPEG_VIDEO_B_FRAMES
:
598 params
->refdist
= ctrl
->value
;
600 case V4L2_CID_MPEG_VIDEO_GOP_SIZE
:
601 params
->gop_size
= ctrl
->value
;
607 /* TODO: Update the hardware */
612 static int vidioc_s_ext_ctrls(struct file
*file
, void *priv
,
613 struct v4l2_ext_controls
*ctrls
)
615 struct saa7164_vbi_fh
*fh
= file
->private_data
;
616 struct saa7164_port
*port
= fh
->port
;
619 if (ctrls
->ctrl_class
== V4L2_CTRL_CLASS_MPEG
) {
620 for (i
= 0; i
< ctrls
->count
; i
++) {
621 struct v4l2_ext_control
*ctrl
= ctrls
->controls
+ i
;
623 err
= saa7164_try_ctrl(ctrl
, 0);
625 ctrls
->error_idx
= i
;
628 err
= saa7164_set_ctrl(port
, ctrl
);
630 ctrls
->error_idx
= i
;
641 static int vidioc_querycap(struct file
*file
, void *priv
,
642 struct v4l2_capability
*cap
)
644 struct saa7164_vbi_fh
*fh
= file
->private_data
;
645 struct saa7164_port
*port
= fh
->port
;
646 struct saa7164_dev
*dev
= port
->dev
;
648 strcpy(cap
->driver
, dev
->name
);
649 strlcpy(cap
->card
, saa7164_boards
[dev
->board
].name
,
651 sprintf(cap
->bus_info
, "PCI:%s", pci_name(dev
->pci
));
654 V4L2_CAP_VBI_CAPTURE
|
658 cap
->capabilities
|= V4L2_CAP_TUNER
;
664 static int vidioc_enum_fmt_vid_cap(struct file
*file
, void *priv
,
665 struct v4l2_fmtdesc
*f
)
670 strlcpy(f
->description
, "VBI", sizeof(f
->description
));
671 f
->pixelformat
= V4L2_PIX_FMT_MPEG
;
676 static int vidioc_g_fmt_vid_cap(struct file
*file
, void *priv
,
677 struct v4l2_format
*f
)
679 struct saa7164_vbi_fh
*fh
= file
->private_data
;
680 struct saa7164_port
*port
= fh
->port
;
681 struct saa7164_dev
*dev
= port
->dev
;
683 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_MPEG
;
684 f
->fmt
.pix
.bytesperline
= 0;
685 f
->fmt
.pix
.sizeimage
=
686 port
->ts_packet_size
* port
->ts_packet_count
;
687 f
->fmt
.pix
.colorspace
= 0;
688 f
->fmt
.pix
.width
= port
->width
;
689 f
->fmt
.pix
.height
= port
->height
;
691 dprintk(DBGLVL_VBI
, "VIDIOC_G_FMT: w: %d, h: %d\n",
692 port
->width
, port
->height
);
697 static int vidioc_try_fmt_vid_cap(struct file
*file
, void *priv
,
698 struct v4l2_format
*f
)
700 struct saa7164_vbi_fh
*fh
= file
->private_data
;
701 struct saa7164_port
*port
= fh
->port
;
702 struct saa7164_dev
*dev
= port
->dev
;
704 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_MPEG
;
705 f
->fmt
.pix
.bytesperline
= 0;
706 f
->fmt
.pix
.sizeimage
=
707 port
->ts_packet_size
* port
->ts_packet_count
;
708 f
->fmt
.pix
.colorspace
= 0;
709 dprintk(DBGLVL_VBI
, "VIDIOC_TRY_FMT: w: %d, h: %d\n",
710 port
->width
, port
->height
);
714 static int vidioc_s_fmt_vid_cap(struct file
*file
, void *priv
,
715 struct v4l2_format
*f
)
717 struct saa7164_vbi_fh
*fh
= file
->private_data
;
718 struct saa7164_port
*port
= fh
->port
;
719 struct saa7164_dev
*dev
= port
->dev
;
721 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_MPEG
;
722 f
->fmt
.pix
.bytesperline
= 0;
723 f
->fmt
.pix
.sizeimage
=
724 port
->ts_packet_size
* port
->ts_packet_count
;
725 f
->fmt
.pix
.colorspace
= 0;
727 dprintk(DBGLVL_VBI
, "VIDIOC_S_FMT: w: %d, h: %d, f: %d\n",
728 f
->fmt
.pix
.width
, f
->fmt
.pix
.height
, f
->fmt
.pix
.field
);
733 static int vidioc_log_status(struct file
*file
, void *priv
)
738 static int fill_queryctrl(struct saa7164_vbi_params
*params
,
739 struct v4l2_queryctrl
*c
)
742 case V4L2_CID_BRIGHTNESS
:
743 return v4l2_ctrl_query_fill(c
, 0x0, 0xff, 1, 127);
744 case V4L2_CID_CONTRAST
:
745 return v4l2_ctrl_query_fill(c
, 0x0, 0xff, 1, 66);
746 case V4L2_CID_SATURATION
:
747 return v4l2_ctrl_query_fill(c
, 0x0, 0xff, 1, 62);
749 return v4l2_ctrl_query_fill(c
, 0x0, 0xff, 1, 128);
750 case V4L2_CID_SHARPNESS
:
751 return v4l2_ctrl_query_fill(c
, 0x0, 0x0f, 1, 8);
752 case V4L2_CID_MPEG_AUDIO_MUTE
:
753 return v4l2_ctrl_query_fill(c
, 0x0, 0x01, 1, 0);
754 case V4L2_CID_AUDIO_VOLUME
:
755 return v4l2_ctrl_query_fill(c
, -83, 24, 1, 20);
756 case V4L2_CID_MPEG_STREAM_TYPE
:
757 return v4l2_ctrl_query_fill(c
,
758 V4L2_MPEG_STREAM_TYPE_MPEG2_PS
,
759 V4L2_MPEG_STREAM_TYPE_MPEG2_TS
,
760 1, V4L2_MPEG_STREAM_TYPE_MPEG2_PS
);
761 case V4L2_CID_MPEG_VIDEO_ASPECT
:
762 return v4l2_ctrl_query_fill(c
,
763 V4L2_MPEG_VIDEO_ASPECT_1x1
,
764 V4L2_MPEG_VIDEO_ASPECT_221x100
,
765 1, V4L2_MPEG_VIDEO_ASPECT_4x3
);
766 case V4L2_CID_MPEG_VIDEO_GOP_SIZE
:
767 return v4l2_ctrl_query_fill(c
, 1, 255, 1, 15);
768 case V4L2_CID_MPEG_VIDEO_B_FRAMES
:
769 return v4l2_ctrl_query_fill(c
,
776 static int vidioc_queryctrl(struct file
*file
, void *priv
,
777 struct v4l2_queryctrl
*c
)
779 struct saa7164_vbi_fh
*fh
= priv
;
780 struct saa7164_port
*port
= fh
->port
;
784 memset(c
, 0, sizeof(*c
));
786 next
= !!(id
& V4L2_CTRL_FLAG_NEXT_CTRL
);
787 c
->id
= id
& ~V4L2_CTRL_FLAG_NEXT_CTRL
;
789 for (i
= 0; i
< ARRAY_SIZE(saa7164_v4l2_ctrls
); i
++) {
791 if (c
->id
< saa7164_v4l2_ctrls
[i
])
792 c
->id
= saa7164_v4l2_ctrls
[i
];
797 if (c
->id
== saa7164_v4l2_ctrls
[i
])
798 return fill_queryctrl(&port
->vbi_params
, c
);
800 if (c
->id
< saa7164_v4l2_ctrls
[i
])
807 static int saa7164_vbi_stop_port(struct saa7164_port
*port
)
809 struct saa7164_dev
*dev
= port
->dev
;
812 ret
= saa7164_api_transition_port(port
, SAA_DMASTATE_STOP
);
813 if ((ret
!= SAA_OK
) && (ret
!= SAA_ERR_ALREADY_STOPPED
)) {
814 printk(KERN_ERR
"%s() stop transition failed, ret = 0x%x\n",
818 dprintk(DBGLVL_VBI
, "%s() Stopped\n", __func__
);
825 static int saa7164_vbi_acquire_port(struct saa7164_port
*port
)
827 struct saa7164_dev
*dev
= port
->dev
;
830 ret
= saa7164_api_transition_port(port
, SAA_DMASTATE_ACQUIRE
);
831 if ((ret
!= SAA_OK
) && (ret
!= SAA_ERR_ALREADY_STOPPED
)) {
832 printk(KERN_ERR
"%s() acquire transition failed, ret = 0x%x\n",
836 dprintk(DBGLVL_VBI
, "%s() Acquired\n", __func__
);
843 static int saa7164_vbi_pause_port(struct saa7164_port
*port
)
845 struct saa7164_dev
*dev
= port
->dev
;
848 ret
= saa7164_api_transition_port(port
, SAA_DMASTATE_PAUSE
);
849 if ((ret
!= SAA_OK
) && (ret
!= SAA_ERR_ALREADY_STOPPED
)) {
850 printk(KERN_ERR
"%s() pause transition failed, ret = 0x%x\n",
854 dprintk(DBGLVL_VBI
, "%s() Paused\n", __func__
);
861 /* Firmware is very windows centric, meaning you have to transition
862 * the part through AVStream / KS Windows stages, forwards or backwards.
863 * States are: stopped, acquired (h/w), paused, started.
864 * We have to leave here will all of the soft buffers on the free list,
865 * else the cfg_post() func won't have soft buffers to correctly configure.
867 static int saa7164_vbi_stop_streaming(struct saa7164_port
*port
)
869 struct saa7164_dev
*dev
= port
->dev
;
870 struct saa7164_buffer
*buf
;
871 struct saa7164_user_buffer
*ubuf
;
872 struct list_head
*c
, *n
;
875 dprintk(DBGLVL_VBI
, "%s(port=%d)\n", __func__
, port
->nr
);
877 ret
= saa7164_vbi_pause_port(port
);
878 ret
= saa7164_vbi_acquire_port(port
);
879 ret
= saa7164_vbi_stop_port(port
);
881 dprintk(DBGLVL_VBI
, "%s(port=%d) Hardware stopped\n", __func__
,
884 /* Reset the state of any allocated buffer resources */
885 mutex_lock(&port
->dmaqueue_lock
);
887 /* Reset the hard and soft buffer state */
888 list_for_each_safe(c
, n
, &port
->dmaqueue
.list
) {
889 buf
= list_entry(c
, struct saa7164_buffer
, list
);
890 buf
->flags
= SAA7164_BUFFER_FREE
;
894 list_for_each_safe(c
, n
, &port
->list_buf_used
.list
) {
895 ubuf
= list_entry(c
, struct saa7164_user_buffer
, list
);
897 list_move_tail(&ubuf
->list
, &port
->list_buf_free
.list
);
900 mutex_unlock(&port
->dmaqueue_lock
);
902 /* Free any allocated resources */
903 saa7164_vbi_buffers_dealloc(port
);
905 dprintk(DBGLVL_VBI
, "%s(port=%d) Released\n", __func__
, port
->nr
);
910 static int saa7164_vbi_start_streaming(struct saa7164_port
*port
)
912 struct saa7164_dev
*dev
= port
->dev
;
915 dprintk(DBGLVL_VBI
, "%s(port=%d)\n", __func__
, port
->nr
);
917 port
->done_first_interrupt
= 0;
919 /* allocate all of the PCIe DMA buffer resources on the fly,
920 * allowing switching between TS and PS payloads without
921 * requiring a complete driver reload.
923 saa7164_vbi_buffers_alloc(port
);
925 /* Configure the encoder with any cache values */
927 saa7164_api_set_encoder(port
);
928 saa7164_api_get_encoder(port
);
931 /* Place the empty buffers on the hardware */
932 saa7164_buffer_cfg_port(port
);
934 /* Negotiate format */
935 if (saa7164_api_set_vbi_format(port
) != SAA_OK
) {
936 printk(KERN_ERR
"%s() No supported VBI format\n", __func__
);
941 /* Acquire the hardware */
942 result
= saa7164_api_transition_port(port
, SAA_DMASTATE_ACQUIRE
);
943 if ((result
!= SAA_OK
) && (result
!= SAA_ERR_ALREADY_STOPPED
)) {
944 printk(KERN_ERR
"%s() acquire transition failed, res = 0x%x\n",
950 dprintk(DBGLVL_VBI
, "%s() Acquired\n", __func__
);
952 /* Pause the hardware */
953 result
= saa7164_api_transition_port(port
, SAA_DMASTATE_PAUSE
);
954 if ((result
!= SAA_OK
) && (result
!= SAA_ERR_ALREADY_STOPPED
)) {
955 printk(KERN_ERR
"%s() pause transition failed, res = 0x%x\n",
958 /* Stop the hardware, regardless */
959 result
= saa7164_vbi_stop_port(port
);
960 if ((result
!= SAA_OK
) && (result
!= SAA_ERR_ALREADY_STOPPED
)) {
961 printk(KERN_ERR
"%s() pause/forced stop transition "
962 "failed, res = 0x%x\n", __func__
, result
);
968 dprintk(DBGLVL_VBI
, "%s() Paused\n", __func__
);
970 /* Start the hardware */
971 result
= saa7164_api_transition_port(port
, SAA_DMASTATE_RUN
);
972 if ((result
!= SAA_OK
) && (result
!= SAA_ERR_ALREADY_STOPPED
)) {
973 printk(KERN_ERR
"%s() run transition failed, result = 0x%x\n",
976 /* Stop the hardware, regardless */
977 result
= saa7164_vbi_acquire_port(port
);
978 result
= saa7164_vbi_stop_port(port
);
979 if ((result
!= SAA_OK
) && (result
!= SAA_ERR_ALREADY_STOPPED
)) {
980 printk(KERN_ERR
"%s() run/forced stop transition "
981 "failed, res = 0x%x\n", __func__
, result
);
986 dprintk(DBGLVL_VBI
, "%s() Running\n", __func__
);
992 int saa7164_vbi_fmt(struct file
*file
, void *priv
, struct v4l2_format
*f
)
995 f
->fmt
.vbi
.samples_per_line
= 1600;
996 f
->fmt
.vbi
.samples_per_line
= 1440;
997 f
->fmt
.vbi
.sampling_rate
= 27000000;
998 f
->fmt
.vbi
.sample_format
= V4L2_PIX_FMT_GREY
;
999 f
->fmt
.vbi
.offset
= 0;
1000 f
->fmt
.vbi
.flags
= 0;
1001 f
->fmt
.vbi
.start
[0] = 10;
1002 f
->fmt
.vbi
.count
[0] = 18;
1003 f
->fmt
.vbi
.start
[1] = 263 + 10 + 1;
1004 f
->fmt
.vbi
.count
[1] = 18;
1008 static int fops_open(struct file
*file
)
1010 struct saa7164_dev
*dev
;
1011 struct saa7164_port
*port
;
1012 struct saa7164_vbi_fh
*fh
;
1014 port
= (struct saa7164_port
*)video_get_drvdata(video_devdata(file
));
1020 dprintk(DBGLVL_VBI
, "%s()\n", __func__
);
1022 /* allocate + initialize per filehandle data */
1023 fh
= kzalloc(sizeof(*fh
), GFP_KERNEL
);
1027 file
->private_data
= fh
;
1033 static int fops_release(struct file
*file
)
1035 struct saa7164_vbi_fh
*fh
= file
->private_data
;
1036 struct saa7164_port
*port
= fh
->port
;
1037 struct saa7164_dev
*dev
= port
->dev
;
1039 dprintk(DBGLVL_VBI
, "%s()\n", __func__
);
1041 /* Shut device down on last close */
1042 if (atomic_cmpxchg(&fh
->v4l_reading
, 1, 0) == 1) {
1043 if (atomic_dec_return(&port
->v4l_reader_count
) == 0) {
1044 /* stop vbi capture then cancel buffers */
1045 saa7164_vbi_stop_streaming(port
);
1049 file
->private_data
= NULL
;
1055 struct saa7164_user_buffer
*saa7164_vbi_next_buf(struct saa7164_port
*port
)
1057 struct saa7164_user_buffer
*ubuf
= NULL
;
1058 struct saa7164_dev
*dev
= port
->dev
;
1061 mutex_lock(&port
->dmaqueue_lock
);
1062 if (!list_empty(&port
->list_buf_used
.list
)) {
1063 ubuf
= list_first_entry(&port
->list_buf_used
.list
,
1064 struct saa7164_user_buffer
, list
);
1067 crc
= crc32(0, ubuf
->data
, ubuf
->actual_size
);
1068 if (crc
!= ubuf
->crc
) {
1069 printk(KERN_ERR
"%s() ubuf %p crc became invalid, was 0x%x became 0x%x\n",
1071 ubuf
, ubuf
->crc
, crc
);
1076 mutex_unlock(&port
->dmaqueue_lock
);
1078 dprintk(DBGLVL_VBI
, "%s() returns %p\n", __func__
, ubuf
);
1083 static ssize_t
fops_read(struct file
*file
, char __user
*buffer
,
1084 size_t count
, loff_t
*pos
)
1086 struct saa7164_vbi_fh
*fh
= file
->private_data
;
1087 struct saa7164_port
*port
= fh
->port
;
1088 struct saa7164_user_buffer
*ubuf
= NULL
;
1089 struct saa7164_dev
*dev
= port
->dev
;
1094 port
->last_read_msecs_diff
= port
->last_read_msecs
;
1095 port
->last_read_msecs
= jiffies_to_msecs(jiffies
);
1096 port
->last_read_msecs_diff
= port
->last_read_msecs
-
1097 port
->last_read_msecs_diff
;
1099 saa7164_histogram_update(&port
->read_interval
,
1100 port
->last_read_msecs_diff
);
1103 printk(KERN_ERR
"%s() ESPIPE\n", __func__
);
1107 if (atomic_cmpxchg(&fh
->v4l_reading
, 0, 1) == 0) {
1108 if (atomic_inc_return(&port
->v4l_reader_count
) == 1) {
1110 if (saa7164_vbi_initialize(port
) < 0) {
1111 printk(KERN_ERR
"%s() EINVAL\n", __func__
);
1115 saa7164_vbi_start_streaming(port
);
1120 /* blocking wait for buffer */
1121 if ((file
->f_flags
& O_NONBLOCK
) == 0) {
1122 if (wait_event_interruptible(port
->wait_read
,
1123 saa7164_vbi_next_buf(port
))) {
1124 printk(KERN_ERR
"%s() ERESTARTSYS\n", __func__
);
1125 return -ERESTARTSYS
;
1129 /* Pull the first buffer from the used list */
1130 ubuf
= saa7164_vbi_next_buf(port
);
1132 while ((count
> 0) && ubuf
) {
1134 /* set remaining bytes to copy */
1135 rem
= ubuf
->actual_size
- ubuf
->pos
;
1136 cnt
= rem
> count
? count
: rem
;
1138 p
= ubuf
->data
+ ubuf
->pos
;
1141 "%s() count=%d cnt=%d rem=%d buf=%p buf->pos=%d\n",
1142 __func__
, (int)count
, cnt
, rem
, ubuf
, ubuf
->pos
);
1144 if (copy_to_user(buffer
, p
, cnt
)) {
1145 printk(KERN_ERR
"%s() copy_to_user failed\n", __func__
);
1147 printk(KERN_ERR
"%s() EFAULT\n", __func__
);
1158 if (ubuf
->pos
> ubuf
->actual_size
)
1159 printk(KERN_ERR
"read() pos > actual, huh?\n");
1161 if (ubuf
->pos
== ubuf
->actual_size
) {
1163 /* finished with current buffer, take next buffer */
1165 /* Requeue the buffer on the free list */
1168 mutex_lock(&port
->dmaqueue_lock
);
1169 list_move_tail(&ubuf
->list
, &port
->list_buf_free
.list
);
1170 mutex_unlock(&port
->dmaqueue_lock
);
1173 if ((file
->f_flags
& O_NONBLOCK
) == 0) {
1174 if (wait_event_interruptible(port
->wait_read
,
1175 saa7164_vbi_next_buf(port
))) {
1179 ubuf
= saa7164_vbi_next_buf(port
);
1183 if (!ret
&& !ubuf
) {
1184 printk(KERN_ERR
"%s() EAGAIN\n", __func__
);
1191 static unsigned int fops_poll(struct file
*file
, poll_table
*wait
)
1193 struct saa7164_vbi_fh
*fh
= (struct saa7164_vbi_fh
*)file
->private_data
;
1194 struct saa7164_port
*port
= fh
->port
;
1195 struct saa7164_user_buffer
*ubuf
;
1196 unsigned int mask
= 0;
1198 port
->last_poll_msecs_diff
= port
->last_poll_msecs
;
1199 port
->last_poll_msecs
= jiffies_to_msecs(jiffies
);
1200 port
->last_poll_msecs_diff
= port
->last_poll_msecs
-
1201 port
->last_poll_msecs_diff
;
1203 saa7164_histogram_update(&port
->poll_interval
,
1204 port
->last_poll_msecs_diff
);
1206 if (!video_is_registered(port
->v4l_device
))
1209 if (atomic_cmpxchg(&fh
->v4l_reading
, 0, 1) == 0) {
1210 if (atomic_inc_return(&port
->v4l_reader_count
) == 1) {
1211 if (saa7164_vbi_initialize(port
) < 0)
1213 saa7164_vbi_start_streaming(port
);
1218 /* blocking wait for buffer */
1219 if ((file
->f_flags
& O_NONBLOCK
) == 0) {
1220 if (wait_event_interruptible(port
->wait_read
,
1221 saa7164_vbi_next_buf(port
))) {
1222 return -ERESTARTSYS
;
1226 /* Pull the first buffer from the used list */
1227 ubuf
= list_first_entry(&port
->list_buf_used
.list
,
1228 struct saa7164_user_buffer
, list
);
1231 mask
|= POLLIN
| POLLRDNORM
;
1235 static const struct v4l2_file_operations vbi_fops
= {
1236 .owner
= THIS_MODULE
,
1238 .release
= fops_release
,
1241 .unlocked_ioctl
= video_ioctl2
,
1244 static const struct v4l2_ioctl_ops vbi_ioctl_ops
= {
1245 .vidioc_s_std
= vidioc_s_std
,
1246 .vidioc_enum_input
= vidioc_enum_input
,
1247 .vidioc_g_input
= vidioc_g_input
,
1248 .vidioc_s_input
= vidioc_s_input
,
1249 .vidioc_g_tuner
= vidioc_g_tuner
,
1250 .vidioc_s_tuner
= vidioc_s_tuner
,
1251 .vidioc_g_frequency
= vidioc_g_frequency
,
1252 .vidioc_s_frequency
= vidioc_s_frequency
,
1253 .vidioc_s_ctrl
= vidioc_s_ctrl
,
1254 .vidioc_g_ctrl
= vidioc_g_ctrl
,
1255 .vidioc_querycap
= vidioc_querycap
,
1256 .vidioc_enum_fmt_vid_cap
= vidioc_enum_fmt_vid_cap
,
1257 .vidioc_g_fmt_vid_cap
= vidioc_g_fmt_vid_cap
,
1258 .vidioc_try_fmt_vid_cap
= vidioc_try_fmt_vid_cap
,
1259 .vidioc_s_fmt_vid_cap
= vidioc_s_fmt_vid_cap
,
1260 .vidioc_g_ext_ctrls
= vidioc_g_ext_ctrls
,
1261 .vidioc_s_ext_ctrls
= vidioc_s_ext_ctrls
,
1262 .vidioc_try_ext_ctrls
= vidioc_try_ext_ctrls
,
1263 .vidioc_log_status
= vidioc_log_status
,
1264 .vidioc_queryctrl
= vidioc_queryctrl
,
1266 .vidioc_g_chip_ident
= saa7164_g_chip_ident
,
1268 #ifdef CONFIG_VIDEO_ADV_DEBUG
1270 .vidioc_g_register
= saa7164_g_register
,
1271 .vidioc_s_register
= saa7164_s_register
,
1274 .vidioc_g_fmt_vbi_cap
= saa7164_vbi_fmt
,
1275 .vidioc_try_fmt_vbi_cap
= saa7164_vbi_fmt
,
1276 .vidioc_s_fmt_vbi_cap
= saa7164_vbi_fmt
,
1279 static struct video_device saa7164_vbi_template
= {
1282 .ioctl_ops
= &vbi_ioctl_ops
,
1284 .tvnorms
= SAA7164_NORMS
,
1285 .current_norm
= V4L2_STD_NTSC_M
,
1288 static struct video_device
*saa7164_vbi_alloc(
1289 struct saa7164_port
*port
,
1290 struct pci_dev
*pci
,
1291 struct video_device
*template,
1294 struct video_device
*vfd
;
1295 struct saa7164_dev
*dev
= port
->dev
;
1297 dprintk(DBGLVL_VBI
, "%s()\n", __func__
);
1299 vfd
= video_device_alloc();
1304 snprintf(vfd
->name
, sizeof(vfd
->name
), "%s %s (%s)", dev
->name
,
1305 type
, saa7164_boards
[dev
->board
].name
);
1307 vfd
->parent
= &pci
->dev
;
1308 vfd
->release
= video_device_release
;
1312 int saa7164_vbi_register(struct saa7164_port
*port
)
1314 struct saa7164_dev
*dev
= port
->dev
;
1315 int result
= -ENODEV
;
1317 dprintk(DBGLVL_VBI
, "%s()\n", __func__
);
1319 if (port
->type
!= SAA7164_MPEG_VBI
)
1322 /* Sanity check that the PCI configuration space is active */
1323 if (port
->hwcfg
.BARLocation
== 0) {
1324 printk(KERN_ERR
"%s() failed "
1325 "(errno = %d), NO PCI configuration\n",
1331 /* Establish VBI defaults here */
1333 /* Allocate and register the video device node */
1334 port
->v4l_device
= saa7164_vbi_alloc(port
,
1335 dev
->pci
, &saa7164_vbi_template
, "vbi");
1337 if (!port
->v4l_device
) {
1338 printk(KERN_INFO
"%s: can't allocate vbi device\n",
1344 video_set_drvdata(port
->v4l_device
, port
);
1345 result
= video_register_device(port
->v4l_device
,
1348 printk(KERN_INFO
"%s: can't register vbi device\n",
1350 /* TODO: We're going to leak here if we don't dealloc
1351 The buffers above. The unreg function can't deal wit it.
1356 printk(KERN_INFO
"%s: registered device vbi%d [vbi]\n",
1357 dev
->name
, port
->v4l_device
->num
);
1359 /* Configure the hardware defaults */
1366 void saa7164_vbi_unregister(struct saa7164_port
*port
)
1368 struct saa7164_dev
*dev
= port
->dev
;
1370 dprintk(DBGLVL_VBI
, "%s(port=%d)\n", __func__
, port
->nr
);
1372 if (port
->type
!= SAA7164_MPEG_VBI
)
1375 if (port
->v4l_device
) {
1376 if (port
->v4l_device
->minor
!= -1)
1377 video_unregister_device(port
->v4l_device
);
1379 video_device_release(port
->v4l_device
);
1381 port
->v4l_device
= NULL
;