3 * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "saa7134-reg.h"
23 #include <linux/init.h>
24 #include <linux/list.h>
25 #include <linux/module.h>
26 #include <linux/kernel.h>
27 #include <linux/delay.h>
29 #include <media/v4l2-common.h>
30 #include <media/v4l2-event.h>
32 /* ------------------------------------------------------------------ */
34 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
35 MODULE_LICENSE("GPL");
37 static unsigned int empress_nr
[] = {[0 ... (SAA7134_MAXBOARDS
- 1)] = UNSET
};
39 module_param_array(empress_nr
, int, NULL
, 0444);
40 MODULE_PARM_DESC(empress_nr
,"ts device number");
42 /* ------------------------------------------------------------------ */
44 static int start_streaming(struct vb2_queue
*vq
, unsigned int count
)
46 struct saa7134_dmaqueue
*dmaq
= vq
->drv_priv
;
47 struct saa7134_dev
*dev
= dmaq
->dev
;
48 u32 leading_null_bytes
= 0;
51 err
= saa7134_ts_start_streaming(vq
, count
);
55 /* If more cards start to need this, then this
56 should probably be added to the card definitions. */
58 case SAA7134_BOARD_BEHOLD_M6
:
59 case SAA7134_BOARD_BEHOLD_M63
:
60 case SAA7134_BOARD_BEHOLD_M6_EXTRA
:
61 leading_null_bytes
= 1;
64 saa_call_all(dev
, core
, init
, leading_null_bytes
);
66 saa_writeb(SAA7134_AUDIO_MUTE_CTRL
,
67 saa_readb(SAA7134_AUDIO_MUTE_CTRL
) & ~(1 << 6));
68 dev
->empress_started
= 1;
72 static void stop_streaming(struct vb2_queue
*vq
)
74 struct saa7134_dmaqueue
*dmaq
= vq
->drv_priv
;
75 struct saa7134_dev
*dev
= dmaq
->dev
;
77 saa7134_ts_stop_streaming(vq
);
78 saa_writeb(SAA7134_SPECIAL_MODE
, 0x00);
80 saa_writeb(SAA7134_SPECIAL_MODE
, 0x01);
83 saa_writeb(SAA7134_AUDIO_MUTE_CTRL
,
84 saa_readb(SAA7134_AUDIO_MUTE_CTRL
) | (1 << 6));
85 dev
->empress_started
= 0;
88 static const struct vb2_ops saa7134_empress_qops
= {
89 .queue_setup
= saa7134_ts_queue_setup
,
90 .buf_init
= saa7134_ts_buffer_init
,
91 .buf_prepare
= saa7134_ts_buffer_prepare
,
92 .buf_queue
= saa7134_vb2_buffer_queue
,
93 .wait_prepare
= vb2_ops_wait_prepare
,
94 .wait_finish
= vb2_ops_wait_finish
,
95 .start_streaming
= start_streaming
,
96 .stop_streaming
= stop_streaming
,
99 /* ------------------------------------------------------------------ */
101 static int empress_enum_fmt_vid_cap(struct file
*file
, void *priv
,
102 struct v4l2_fmtdesc
*f
)
107 strlcpy(f
->description
, "MPEG TS", sizeof(f
->description
));
108 f
->pixelformat
= V4L2_PIX_FMT_MPEG
;
109 f
->flags
= V4L2_FMT_FLAG_COMPRESSED
;
113 static int empress_g_fmt_vid_cap(struct file
*file
, void *priv
,
114 struct v4l2_format
*f
)
116 struct saa7134_dev
*dev
= video_drvdata(file
);
117 struct v4l2_subdev_format fmt
= {
118 .which
= V4L2_SUBDEV_FORMAT_ACTIVE
,
120 struct v4l2_mbus_framefmt
*mbus_fmt
= &fmt
.format
;
122 saa_call_all(dev
, pad
, get_fmt
, NULL
, &fmt
);
124 v4l2_fill_pix_format(&f
->fmt
.pix
, mbus_fmt
);
125 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_MPEG
;
126 f
->fmt
.pix
.sizeimage
= TS_PACKET_SIZE
* dev
->ts
.nr_packets
;
127 f
->fmt
.pix
.bytesperline
= 0;
132 static int empress_s_fmt_vid_cap(struct file
*file
, void *priv
,
133 struct v4l2_format
*f
)
135 struct saa7134_dev
*dev
= video_drvdata(file
);
136 struct v4l2_subdev_format format
= {
137 .which
= V4L2_SUBDEV_FORMAT_ACTIVE
,
140 v4l2_fill_mbus_format(&format
.format
, &f
->fmt
.pix
, MEDIA_BUS_FMT_FIXED
);
141 saa_call_all(dev
, pad
, set_fmt
, NULL
, &format
);
142 v4l2_fill_pix_format(&f
->fmt
.pix
, &format
.format
);
144 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_MPEG
;
145 f
->fmt
.pix
.sizeimage
= TS_PACKET_SIZE
* dev
->ts
.nr_packets
;
146 f
->fmt
.pix
.bytesperline
= 0;
151 static int empress_try_fmt_vid_cap(struct file
*file
, void *priv
,
152 struct v4l2_format
*f
)
154 struct saa7134_dev
*dev
= video_drvdata(file
);
155 struct v4l2_subdev_pad_config pad_cfg
;
156 struct v4l2_subdev_format format
= {
157 .which
= V4L2_SUBDEV_FORMAT_TRY
,
160 v4l2_fill_mbus_format(&format
.format
, &f
->fmt
.pix
, MEDIA_BUS_FMT_FIXED
);
161 saa_call_all(dev
, pad
, set_fmt
, &pad_cfg
, &format
);
162 v4l2_fill_pix_format(&f
->fmt
.pix
, &format
.format
);
164 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_MPEG
;
165 f
->fmt
.pix
.sizeimage
= TS_PACKET_SIZE
* dev
->ts
.nr_packets
;
166 f
->fmt
.pix
.bytesperline
= 0;
171 static const struct v4l2_file_operations ts_fops
=
173 .owner
= THIS_MODULE
,
174 .open
= v4l2_fh_open
,
175 .release
= vb2_fop_release
,
176 .read
= vb2_fop_read
,
177 .poll
= vb2_fop_poll
,
178 .mmap
= vb2_fop_mmap
,
179 .unlocked_ioctl
= video_ioctl2
,
182 static const struct v4l2_ioctl_ops ts_ioctl_ops
= {
183 .vidioc_querycap
= saa7134_querycap
,
184 .vidioc_enum_fmt_vid_cap
= empress_enum_fmt_vid_cap
,
185 .vidioc_try_fmt_vid_cap
= empress_try_fmt_vid_cap
,
186 .vidioc_s_fmt_vid_cap
= empress_s_fmt_vid_cap
,
187 .vidioc_g_fmt_vid_cap
= empress_g_fmt_vid_cap
,
188 .vidioc_reqbufs
= vb2_ioctl_reqbufs
,
189 .vidioc_querybuf
= vb2_ioctl_querybuf
,
190 .vidioc_qbuf
= vb2_ioctl_qbuf
,
191 .vidioc_dqbuf
= vb2_ioctl_dqbuf
,
192 .vidioc_expbuf
= vb2_ioctl_expbuf
,
193 .vidioc_streamon
= vb2_ioctl_streamon
,
194 .vidioc_streamoff
= vb2_ioctl_streamoff
,
195 .vidioc_g_frequency
= saa7134_g_frequency
,
196 .vidioc_s_frequency
= saa7134_s_frequency
,
197 .vidioc_g_tuner
= saa7134_g_tuner
,
198 .vidioc_s_tuner
= saa7134_s_tuner
,
199 .vidioc_enum_input
= saa7134_enum_input
,
200 .vidioc_g_input
= saa7134_g_input
,
201 .vidioc_s_input
= saa7134_s_input
,
202 .vidioc_s_std
= saa7134_s_std
,
203 .vidioc_g_std
= saa7134_g_std
,
204 .vidioc_querystd
= saa7134_querystd
,
205 .vidioc_log_status
= v4l2_ctrl_log_status
,
206 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
207 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
210 /* ----------------------------------------------------------- */
212 static struct video_device saa7134_empress_template
= {
213 .name
= "saa7134-empress",
215 .ioctl_ops
= &ts_ioctl_ops
,
217 .tvnorms
= SAA7134_NORMS
,
220 static void empress_signal_update(struct work_struct
*work
)
222 struct saa7134_dev
* dev
=
223 container_of(work
, struct saa7134_dev
, empress_workqueue
);
226 pr_debug("no video signal\n");
228 pr_debug("video signal acquired\n");
232 static void empress_signal_change(struct saa7134_dev
*dev
)
234 schedule_work(&dev
->empress_workqueue
);
237 static bool empress_ctrl_filter(const struct v4l2_ctrl
*ctrl
)
240 case V4L2_CID_BRIGHTNESS
:
242 case V4L2_CID_CONTRAST
:
243 case V4L2_CID_SATURATION
:
244 case V4L2_CID_AUDIO_MUTE
:
245 case V4L2_CID_AUDIO_VOLUME
:
246 case V4L2_CID_PRIVATE_INVERT
:
247 case V4L2_CID_PRIVATE_AUTOMUTE
:
254 static int empress_init(struct saa7134_dev
*dev
)
256 struct v4l2_ctrl_handler
*hdl
= &dev
->empress_ctrl_handler
;
260 pr_debug("%s: %s\n", dev
->name
, __func__
);
261 dev
->empress_dev
= video_device_alloc();
262 if (NULL
== dev
->empress_dev
)
264 *(dev
->empress_dev
) = saa7134_empress_template
;
265 dev
->empress_dev
->v4l2_dev
= &dev
->v4l2_dev
;
266 dev
->empress_dev
->release
= video_device_release
;
267 dev
->empress_dev
->lock
= &dev
->lock
;
268 snprintf(dev
->empress_dev
->name
, sizeof(dev
->empress_dev
->name
),
269 "%s empress (%s)", dev
->name
,
270 saa7134_boards
[dev
->board
].name
);
271 v4l2_ctrl_handler_init(hdl
, 21);
272 v4l2_ctrl_add_handler(hdl
, &dev
->ctrl_handler
, empress_ctrl_filter
);
274 v4l2_ctrl_add_handler(hdl
, dev
->empress_sd
->ctrl_handler
, NULL
);
276 video_device_release(dev
->empress_dev
);
279 dev
->empress_dev
->ctrl_handler
= hdl
;
281 INIT_WORK(&dev
->empress_workqueue
, empress_signal_update
);
283 q
= &dev
->empress_vbq
;
284 q
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
286 * Do not add VB2_USERPTR: the saa7134 DMA engine cannot handle
287 * transfers that do not start at the beginning of a page. A USERPTR
288 * can start anywhere in a page, so USERPTR support is a no-go.
290 q
->io_modes
= VB2_MMAP
| VB2_DMABUF
| VB2_READ
;
291 q
->drv_priv
= &dev
->ts_q
;
292 q
->ops
= &saa7134_empress_qops
;
293 q
->gfp_flags
= GFP_DMA32
;
294 q
->mem_ops
= &vb2_dma_sg_memops
;
295 q
->buf_struct_size
= sizeof(struct saa7134_buf
);
296 q
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
297 q
->lock
= &dev
->lock
;
298 q
->dev
= &dev
->pci
->dev
;
299 err
= vb2_queue_init(q
);
302 dev
->empress_dev
->queue
= q
;
304 video_set_drvdata(dev
->empress_dev
, dev
);
305 err
= video_register_device(dev
->empress_dev
,VFL_TYPE_GRABBER
,
306 empress_nr
[dev
->nr
]);
308 pr_info("%s: can't register video device\n",
310 video_device_release(dev
->empress_dev
);
311 dev
->empress_dev
= NULL
;
314 pr_info("%s: registered device %s [mpeg]\n",
315 dev
->name
, video_device_node_name(dev
->empress_dev
));
317 empress_signal_update(&dev
->empress_workqueue
);
321 static int empress_fini(struct saa7134_dev
*dev
)
323 pr_debug("%s: %s\n", dev
->name
, __func__
);
325 if (NULL
== dev
->empress_dev
)
327 flush_work(&dev
->empress_workqueue
);
328 video_unregister_device(dev
->empress_dev
);
329 vb2_queue_release(&dev
->empress_vbq
);
330 v4l2_ctrl_handler_free(&dev
->empress_ctrl_handler
);
331 dev
->empress_dev
= NULL
;
335 static struct saa7134_mpeg_ops empress_ops
= {
336 .type
= SAA7134_MPEG_EMPRESS
,
337 .init
= empress_init
,
338 .fini
= empress_fini
,
339 .signal_change
= empress_signal_change
,
342 static int __init
empress_register(void)
344 return saa7134_ts_register(&empress_ops
);
347 static void __exit
empress_unregister(void)
349 saa7134_ts_unregister(&empress_ops
);
352 module_init(empress_register
);
353 module_exit(empress_unregister
);