2 * Zoran zr36057/zr36067 PCI controller driver, for the
3 * Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
4 * Media Labs LML33/LML33R10.
6 * Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
8 * Changes for BUZ by Wolfgang Scherr <scherr@net4you.net>
10 * Changes for DC10/DC30 by Laurent Pinchart <laurent.pinchart@skynet.be>
12 * Changes for LML33R10 by Maxim Yevtyushkin <max@linuxmedialabs.com>
14 * Changes for videodev2/v4l2 by Ronald Bultje <rbultje@ronald.bitfreak.net>
19 * Copyright (C) 1999 Wolfgang Scherr <scherr@net4you.net>
21 * Iomega Buz driver version 1.0
22 * Copyright (C) 1999 Rainer Johanni <Rainer@Johanni.de>
25 * Copyright (C) 1998 Dave Perks <dperks@ibm.net>
27 * bttv - Bt848 frame grabber driver
28 * Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de)
29 * & Marcus Metzler (mocm@thp.uni-koeln.de)
32 * This program is free software; you can redistribute it and/or modify
33 * it under the terms of the GNU General Public License as published by
34 * the Free Software Foundation; either version 2 of the License, or
35 * (at your option) any later version.
37 * This program is distributed in the hope that it will be useful,
38 * but WITHOUT ANY WARRANTY; without even the implied warranty of
39 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
40 * GNU General Public License for more details.
42 * You should have received a copy of the GNU General Public License
43 * along with this program; if not, write to the Free Software
44 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
47 #include <linux/version.h>
48 #include <linux/init.h>
49 #include <linux/module.h>
50 #include <linux/delay.h>
51 #include <linux/slab.h>
52 #include <linux/pci.h>
53 #include <linux/vmalloc.h>
54 #include <linux/wait.h>
56 #include <linux/interrupt.h>
57 #include <linux/i2c.h>
58 #include <linux/i2c-algo-bit.h>
60 #include <linux/spinlock.h>
62 #include <linux/videodev.h>
63 #include <media/v4l2-common.h>
64 #include <media/v4l2-ioctl.h>
65 #include "videocodec.h"
67 #include <asm/byteorder.h>
69 #include <asm/uaccess.h>
70 #include <linux/proc_fs.h>
72 #include <linux/video_decoder.h>
73 #include <linux/video_encoder.h>
74 #include <linux/mutex.h>
76 #include "zoran_device.h"
77 #include "zoran_card.h"
80 const struct zoran_format zoran_formats[] = {
82 .name = "15-bit RGB LE",
83 .fourcc = V4L2_PIX_FMT_RGB555,
84 .colorspace = V4L2_COLORSPACE_SRGB,
86 .flags = ZORAN_FORMAT_CAPTURE |
88 .vfespfr = ZR36057_VFESPFR_RGB555|ZR36057_VFESPFR_ErrDif|
89 ZR36057_VFESPFR_LittleEndian,
91 .name = "15-bit RGB BE",
92 .fourcc = V4L2_PIX_FMT_RGB555X,
93 .colorspace = V4L2_COLORSPACE_SRGB,
95 .flags = ZORAN_FORMAT_CAPTURE |
97 .vfespfr = ZR36057_VFESPFR_RGB555|ZR36057_VFESPFR_ErrDif,
99 .name = "16-bit RGB LE",
100 .fourcc = V4L2_PIX_FMT_RGB565,
101 .colorspace = V4L2_COLORSPACE_SRGB,
103 .flags = ZORAN_FORMAT_CAPTURE |
104 ZORAN_FORMAT_OVERLAY,
105 .vfespfr = ZR36057_VFESPFR_RGB565|ZR36057_VFESPFR_ErrDif|
106 ZR36057_VFESPFR_LittleEndian,
108 .name = "16-bit RGB BE",
109 .fourcc = V4L2_PIX_FMT_RGB565X,
110 .colorspace = V4L2_COLORSPACE_SRGB,
112 .flags = ZORAN_FORMAT_CAPTURE |
113 ZORAN_FORMAT_OVERLAY,
114 .vfespfr = ZR36057_VFESPFR_RGB565|ZR36057_VFESPFR_ErrDif,
116 .name = "24-bit RGB",
117 .fourcc = V4L2_PIX_FMT_BGR24,
118 .colorspace = V4L2_COLORSPACE_SRGB,
120 .flags = ZORAN_FORMAT_CAPTURE |
121 ZORAN_FORMAT_OVERLAY,
122 .vfespfr = ZR36057_VFESPFR_RGB888|ZR36057_VFESPFR_Pack24,
124 .name = "32-bit RGB LE",
125 .fourcc = V4L2_PIX_FMT_BGR32,
126 .colorspace = V4L2_COLORSPACE_SRGB,
128 .flags = ZORAN_FORMAT_CAPTURE |
129 ZORAN_FORMAT_OVERLAY,
130 .vfespfr = ZR36057_VFESPFR_RGB888|ZR36057_VFESPFR_LittleEndian,
132 .name = "32-bit RGB BE",
133 .fourcc = V4L2_PIX_FMT_RGB32,
134 .colorspace = V4L2_COLORSPACE_SRGB,
136 .flags = ZORAN_FORMAT_CAPTURE |
137 ZORAN_FORMAT_OVERLAY,
138 .vfespfr = ZR36057_VFESPFR_RGB888,
140 .name = "4:2:2, packed, YUYV",
141 .fourcc = V4L2_PIX_FMT_YUYV,
142 .colorspace = V4L2_COLORSPACE_SMPTE170M,
144 .flags = ZORAN_FORMAT_CAPTURE |
145 ZORAN_FORMAT_OVERLAY,
146 .vfespfr = ZR36057_VFESPFR_YUV422,
148 .name = "4:2:2, packed, UYVY",
149 .fourcc = V4L2_PIX_FMT_UYVY,
150 .colorspace = V4L2_COLORSPACE_SMPTE170M,
152 .flags = ZORAN_FORMAT_CAPTURE |
153 ZORAN_FORMAT_OVERLAY,
154 .vfespfr = ZR36057_VFESPFR_YUV422|ZR36057_VFESPFR_LittleEndian,
156 .name = "Hardware-encoded Motion-JPEG",
157 .fourcc = V4L2_PIX_FMT_MJPEG,
158 .colorspace = V4L2_COLORSPACE_SMPTE170M,
160 .flags = ZORAN_FORMAT_CAPTURE |
161 ZORAN_FORMAT_PLAYBACK |
162 ZORAN_FORMAT_COMPRESSED,
165 #define NUM_FORMATS ARRAY_SIZE(zoran_formats)
167 static int lock_norm; /* 0 = default 1 = Don't change TV standard (norm) */
168 module_param(lock_norm, int, 0644);
169 MODULE_PARM_DESC(lock_norm, "Prevent norm changes (1 = ignore, >1 = fail)");
171 /* small helper function for calculating buffersizes for v4l2
172 * we calculate the nearest higher power-of-two, which
173 * will be the recommended buffersize */
175 zoran_v4l2_calc_bufsize (struct zoran_jpg_settings *settings)
177 __u8 div = settings->VerDcm * settings->HorDcm * settings->TmpDcm;
178 __u32 num = (1024 * 512) / (div);
187 if (result > jpg_bufsize)
194 /* forward references */
195 static void v4l_fbuffer_free(struct file *file);
196 static void jpg_fbuffer_free(struct file *file);
199 * Allocate the V4L grab buffers
201 * These have to be pysically contiguous.
205 v4l_fbuffer_alloc (struct file *file)
207 struct zoran_fh *fh = file->private_data;
208 struct zoran *zr = fh->zr;
212 for (i = 0; i < fh->v4l_buffers.num_buffers; i++) {
213 if (fh->v4l_buffers.buffer[i].fbuffer)
216 "%s: v4l_fbuffer_alloc() - buffer %d already allocated!?\n",
220 mem = kmalloc(fh->v4l_buffers.buffer_size, GFP_KERNEL);
224 "%s: v4l_fbuffer_alloc() - kmalloc for V4L buf %d failed\n",
226 v4l_fbuffer_free(file);
229 fh->v4l_buffers.buffer[i].fbuffer = mem;
230 fh->v4l_buffers.buffer[i].fbuffer_phys =
232 fh->v4l_buffers.buffer[i].fbuffer_bus =
234 for (off = 0; off < fh->v4l_buffers.buffer_size;
236 SetPageReserved(virt_to_page(mem + off));
239 "%s: v4l_fbuffer_alloc() - V4L frame %d mem 0x%lx (bus: 0x%lx)\n",
240 ZR_DEVNAME(zr), i, (unsigned long) mem,
244 fh->v4l_buffers.allocated = 1;
249 /* free the V4L grab buffers */
251 v4l_fbuffer_free (struct file *file)
253 struct zoran_fh *fh = file->private_data;
254 struct zoran *zr = fh->zr;
258 dprintk(4, KERN_INFO "%s: v4l_fbuffer_free()\n", ZR_DEVNAME(zr));
260 for (i = 0; i < fh->v4l_buffers.num_buffers; i++) {
261 if (!fh->v4l_buffers.buffer[i].fbuffer)
264 mem = fh->v4l_buffers.buffer[i].fbuffer;
265 for (off = 0; off < fh->v4l_buffers.buffer_size;
267 ClearPageReserved(virt_to_page(mem + off));
268 kfree((void *) fh->v4l_buffers.buffer[i].fbuffer);
269 fh->v4l_buffers.buffer[i].fbuffer = NULL;
272 fh->v4l_buffers.allocated = 0;
276 * Allocate the MJPEG grab buffers.
278 * If a Natoma chipset is present and this is a revision 1 zr36057,
279 * each MJPEG buffer needs to be physically contiguous.
280 * (RJ: This statement is from Dave Perks' original driver,
281 * I could never check it because I have a zr36067)
283 * RJ: The contents grab buffers needs never be accessed in the driver.
284 * Therefore there is no need to allocate them with vmalloc in order
285 * to get a contiguous virtual memory space.
286 * I don't understand why many other drivers first allocate them with
287 * vmalloc (which uses internally also get_zeroed_page, but delivers you
288 * virtual addresses) and then again have to make a lot of efforts
289 * to get the physical address.
292 * On big-endian architectures (such as ppc) some extra steps
293 * are needed. When reading and writing to the stat_com array
294 * and fragment buffers, the device expects to see little-
295 * endian values. The use of cpu_to_le32() and le32_to_cpu()
296 * in this function (and one or two others in zoran_device.c)
297 * ensure that these values are always stored in little-endian
298 * form, regardless of architecture. The zr36057 does Very Bad
299 * Things on big endian architectures if the stat_com array
300 * and fragment buffers are not little-endian.
304 jpg_fbuffer_alloc (struct file *file)
306 struct zoran_fh *fh = file->private_data;
307 struct zoran *zr = fh->zr;
311 for (i = 0; i < fh->jpg_buffers.num_buffers; i++) {
312 if (fh->jpg_buffers.buffer[i].frag_tab)
315 "%s: jpg_fbuffer_alloc() - buffer %d already allocated!?\n",
318 /* Allocate fragment table for this buffer */
320 mem = get_zeroed_page(GFP_KERNEL);
324 "%s: jpg_fbuffer_alloc() - get_zeroed_page (frag_tab) failed for buffer %d\n",
326 jpg_fbuffer_free(file);
329 fh->jpg_buffers.buffer[i].frag_tab = (__le32 *) mem;
330 fh->jpg_buffers.buffer[i].frag_tab_bus =
331 virt_to_bus((void *) mem);
333 //if (alloc_contig) {
334 if (fh->jpg_buffers.need_contiguous) {
336 (unsigned long) kmalloc(fh->jpg_buffers.
342 "%s: jpg_fbuffer_alloc() - kmalloc failed for buffer %d\n",
344 jpg_fbuffer_free(file);
347 fh->jpg_buffers.buffer[i].frag_tab[0] =
348 cpu_to_le32(virt_to_bus((void *) mem));
349 fh->jpg_buffers.buffer[i].frag_tab[1] =
350 cpu_to_le32(((fh->jpg_buffers.buffer_size / 4) << 1) | 1);
351 for (off = 0; off < fh->jpg_buffers.buffer_size;
353 SetPageReserved(virt_to_page(mem + off));
355 /* jpg_bufsize is already page aligned */
357 j < fh->jpg_buffers.buffer_size / PAGE_SIZE;
359 mem = get_zeroed_page(GFP_KERNEL);
363 "%s: jpg_fbuffer_alloc() - get_zeroed_page failed for buffer %d\n",
365 jpg_fbuffer_free(file);
369 fh->jpg_buffers.buffer[i].frag_tab[2 * j] =
370 cpu_to_le32(virt_to_bus((void *) mem));
371 fh->jpg_buffers.buffer[i].frag_tab[2 * j +
373 cpu_to_le32((PAGE_SIZE / 4) << 1);
374 SetPageReserved(virt_to_page(mem));
377 fh->jpg_buffers.buffer[i].frag_tab[2 * j - 1] |= cpu_to_le32(1);
382 KERN_DEBUG "%s: jpg_fbuffer_alloc() - %d KB allocated\n",
384 (fh->jpg_buffers.num_buffers *
385 fh->jpg_buffers.buffer_size) >> 10);
387 fh->jpg_buffers.allocated = 1;
392 /* free the MJPEG grab buffers */
394 jpg_fbuffer_free (struct file *file)
396 struct zoran_fh *fh = file->private_data;
397 struct zoran *zr = fh->zr;
402 dprintk(4, KERN_DEBUG "%s: jpg_fbuffer_free()\n", ZR_DEVNAME(zr));
404 for (i = 0; i < fh->jpg_buffers.num_buffers; i++) {
405 if (!fh->jpg_buffers.buffer[i].frag_tab)
408 if (fh->jpg_buffers.need_contiguous) {
409 frag_tab = fh->jpg_buffers.buffer[i].frag_tab[0];
412 mem = (unsigned char *)bus_to_virt(le32_to_cpu(frag_tab));
413 for (off = 0; off < fh->jpg_buffers.buffer_size; off += PAGE_SIZE)
414 ClearPageReserved(virt_to_page(mem + off));
416 fh->jpg_buffers.buffer[i].frag_tab[0] = 0;
417 fh->jpg_buffers.buffer[i].frag_tab[1] = 0;
420 for (j = 0; j < fh->jpg_buffers.buffer_size / PAGE_SIZE; j++) {
421 frag_tab = fh->jpg_buffers.buffer[i].frag_tab[2 * j];
425 ClearPageReserved(virt_to_page(bus_to_virt(le32_to_cpu(frag_tab))));
426 free_page((unsigned long)bus_to_virt(le32_to_cpu(frag_tab)));
427 fh->jpg_buffers.buffer[i].frag_tab[2 * j] = 0;
428 fh->jpg_buffers.buffer[i].frag_tab[2 * j + 1] = 0;
432 free_page((unsigned long)fh->jpg_buffers.buffer[i].frag_tab);
433 fh->jpg_buffers.buffer[i].frag_tab = NULL;
436 fh->jpg_buffers.allocated = 0;
440 * V4L Buffer grabbing
444 zoran_v4l_set_format (struct file *file,
447 const struct zoran_format *format)
449 struct zoran_fh *fh = file->private_data;
450 struct zoran *zr = fh->zr;
453 /* Check size and format of the grab wanted */
455 if (height < BUZ_MIN_HEIGHT || width < BUZ_MIN_WIDTH ||
456 height > BUZ_MAX_HEIGHT || width > BUZ_MAX_WIDTH) {
459 "%s: v4l_set_format() - wrong frame size (%dx%d)\n",
460 ZR_DEVNAME(zr), width, height);
464 bpp = (format->depth + 7) / 8;
466 /* Check against available buffer size */
467 if (height * width * bpp > fh->v4l_buffers.buffer_size) {
470 "%s: v4l_set_format() - video buffer size (%d kB) is too small\n",
471 ZR_DEVNAME(zr), fh->v4l_buffers.buffer_size >> 10);
475 /* The video front end needs 4-byte alinged line sizes */
477 if ((bpp == 2 && (width & 1)) || (bpp == 3 && (width & 3))) {
480 "%s: v4l_set_format() - wrong frame alignment\n",
485 fh->v4l_settings.width = width;
486 fh->v4l_settings.height = height;
487 fh->v4l_settings.format = format;
488 fh->v4l_settings.bytesperline = bpp * fh->v4l_settings.width;
494 zoran_v4l_queue_frame (struct file *file,
497 struct zoran_fh *fh = file->private_data;
498 struct zoran *zr = fh->zr;
502 if (!fh->v4l_buffers.allocated) {
505 "%s: v4l_queue_frame() - buffers not yet allocated\n",
510 /* No grabbing outside the buffer range! */
511 if (num >= fh->v4l_buffers.num_buffers || num < 0) {
514 "%s: v4l_queue_frame() - buffer %d is out of range\n",
515 ZR_DEVNAME(zr), num);
519 spin_lock_irqsave(&zr->spinlock, flags);
521 if (fh->v4l_buffers.active == ZORAN_FREE) {
522 if (zr->v4l_buffers.active == ZORAN_FREE) {
523 zr->v4l_buffers = fh->v4l_buffers;
524 fh->v4l_buffers.active = ZORAN_ACTIVE;
528 "%s: v4l_queue_frame() - another session is already capturing\n",
534 /* make sure a grab isn't going on currently with this buffer */
536 switch (zr->v4l_buffers.buffer[num].state) {
539 if (zr->v4l_buffers.active == ZORAN_FREE) {
540 fh->v4l_buffers.active = ZORAN_FREE;
541 zr->v4l_buffers.allocated = 0;
543 res = -EBUSY; /* what are you doing? */
548 "%s: v4l_queue_frame() - queueing buffer %d in state DONE!?\n",
549 ZR_DEVNAME(zr), num);
551 /* since there is at least one unused buffer there's room for at least
552 * one more pend[] entry */
553 zr->v4l_pend[zr->v4l_pend_head++ &
554 V4L_MASK_FRAME] = num;
555 zr->v4l_buffers.buffer[num].state = BUZ_STATE_PEND;
556 zr->v4l_buffers.buffer[num].bs.length =
557 fh->v4l_settings.bytesperline *
558 zr->v4l_settings.height;
559 fh->v4l_buffers.buffer[num] =
560 zr->v4l_buffers.buffer[num];
565 spin_unlock_irqrestore(&zr->spinlock, flags);
567 if (!res && zr->v4l_buffers.active == ZORAN_FREE)
568 zr->v4l_buffers.active = fh->v4l_buffers.active;
574 * Sync on a V4L buffer
578 v4l_sync (struct file *file,
581 struct zoran_fh *fh = file->private_data;
582 struct zoran *zr = fh->zr;
585 if (fh->v4l_buffers.active == ZORAN_FREE) {
588 "%s: v4l_sync() - no grab active for this session\n",
593 /* check passed-in frame number */
594 if (frame >= fh->v4l_buffers.num_buffers || frame < 0) {
596 KERN_ERR "%s: v4l_sync() - frame %d is invalid\n",
597 ZR_DEVNAME(zr), frame);
601 /* Check if is buffer was queued at all */
602 if (zr->v4l_buffers.buffer[frame].state == BUZ_STATE_USER) {
605 "%s: v4l_sync() - attempt to sync on a buffer which was not queued?\n",
610 /* wait on this buffer to get ready */
611 if (!wait_event_interruptible_timeout(zr->v4l_capq,
612 (zr->v4l_buffers.buffer[frame].state != BUZ_STATE_PEND),
615 if (signal_pending(current))
618 /* buffer should now be in BUZ_STATE_DONE */
619 if (zr->v4l_buffers.buffer[frame].state != BUZ_STATE_DONE)
621 KERN_ERR "%s: v4l_sync() - internal state error\n",
624 zr->v4l_buffers.buffer[frame].state = BUZ_STATE_USER;
625 fh->v4l_buffers.buffer[frame] = zr->v4l_buffers.buffer[frame];
627 spin_lock_irqsave(&zr->spinlock, flags);
629 /* Check if streaming capture has finished */
630 if (zr->v4l_pend_tail == zr->v4l_pend_head) {
631 zr36057_set_memgrab(zr, 0);
632 if (zr->v4l_buffers.active == ZORAN_ACTIVE) {
633 fh->v4l_buffers.active = zr->v4l_buffers.active =
635 zr->v4l_buffers.allocated = 0;
639 spin_unlock_irqrestore(&zr->spinlock, flags);
645 * Queue a MJPEG buffer for capture/playback
649 zoran_jpg_queue_frame (struct file *file,
651 enum zoran_codec_mode mode)
653 struct zoran_fh *fh = file->private_data;
654 struct zoran *zr = fh->zr;
658 /* Check if buffers are allocated */
659 if (!fh->jpg_buffers.allocated) {
662 "%s: jpg_queue_frame() - buffers not yet allocated\n",
667 /* No grabbing outside the buffer range! */
668 if (num >= fh->jpg_buffers.num_buffers || num < 0) {
671 "%s: jpg_queue_frame() - buffer %d out of range\n",
672 ZR_DEVNAME(zr), num);
676 /* what is the codec mode right now? */
677 if (zr->codec_mode == BUZ_MODE_IDLE) {
678 zr->jpg_settings = fh->jpg_settings;
679 } else if (zr->codec_mode != mode) {
680 /* wrong codec mode active - invalid */
683 "%s: jpg_queue_frame() - codec in wrong mode\n",
688 if (fh->jpg_buffers.active == ZORAN_FREE) {
689 if (zr->jpg_buffers.active == ZORAN_FREE) {
690 zr->jpg_buffers = fh->jpg_buffers;
691 fh->jpg_buffers.active = ZORAN_ACTIVE;
695 "%s: jpg_queue_frame() - another session is already capturing\n",
701 if (!res && zr->codec_mode == BUZ_MODE_IDLE) {
702 /* Ok load up the jpeg codec */
703 zr36057_enable_jpg(zr, mode);
706 spin_lock_irqsave(&zr->spinlock, flags);
709 switch (zr->jpg_buffers.buffer[num].state) {
713 "%s: jpg_queue_frame() - queing frame in BUZ_STATE_DONE state!?\n",
716 /* since there is at least one unused buffer there's room for at
717 *least one more pend[] entry */
718 zr->jpg_pend[zr->jpg_que_head++ & BUZ_MASK_FRAME] =
720 zr->jpg_buffers.buffer[num].state = BUZ_STATE_PEND;
721 fh->jpg_buffers.buffer[num] =
722 zr->jpg_buffers.buffer[num];
723 zoran_feed_stat_com(zr);
728 if (zr->jpg_buffers.active == ZORAN_FREE) {
729 fh->jpg_buffers.active = ZORAN_FREE;
730 zr->jpg_buffers.allocated = 0;
732 res = -EBUSY; /* what are you doing? */
737 spin_unlock_irqrestore(&zr->spinlock, flags);
739 if (!res && zr->jpg_buffers.active == ZORAN_FREE) {
740 zr->jpg_buffers.active = fh->jpg_buffers.active;
747 jpg_qbuf (struct file *file,
749 enum zoran_codec_mode mode)
751 struct zoran_fh *fh = file->private_data;
752 struct zoran *zr = fh->zr;
755 /* Does the user want to stop streaming? */
757 if (zr->codec_mode == mode) {
758 if (fh->jpg_buffers.active == ZORAN_FREE) {
761 "%s: jpg_qbuf(-1) - session not active\n",
765 fh->jpg_buffers.active = zr->jpg_buffers.active =
767 zr->jpg_buffers.allocated = 0;
768 zr36057_enable_jpg(zr, BUZ_MODE_IDLE);
773 "%s: jpg_qbuf() - stop streaming but not in streaming mode\n",
779 if ((res = zoran_jpg_queue_frame(file, frame, mode)))
782 /* Start the jpeg codec when the first frame is queued */
783 if (!res && zr->jpg_que_head == 1)
790 * Sync on a MJPEG buffer
794 jpg_sync (struct file *file,
795 struct zoran_sync *bs)
797 struct zoran_fh *fh = file->private_data;
798 struct zoran *zr = fh->zr;
802 if (fh->jpg_buffers.active == ZORAN_FREE) {
805 "%s: jpg_sync() - capture is not currently active\n",
809 if (zr->codec_mode != BUZ_MODE_MOTION_DECOMPRESS &&
810 zr->codec_mode != BUZ_MODE_MOTION_COMPRESS) {
813 "%s: jpg_sync() - codec not in streaming mode\n",
817 if (!wait_event_interruptible_timeout(zr->jpg_capq,
818 (zr->jpg_que_tail != zr->jpg_dma_tail ||
819 zr->jpg_dma_tail == zr->jpg_dma_head),
823 btand(~ZR36057_JMC_Go_en, ZR36057_JMC);
825 zr->codec->control(zr->codec, CODEC_G_STATUS,
829 "%s: jpg_sync() - timeout: codec isr=0x%02x\n",
830 ZR_DEVNAME(zr), isr);
835 if (signal_pending(current))
838 spin_lock_irqsave(&zr->spinlock, flags);
840 if (zr->jpg_dma_tail != zr->jpg_dma_head)
841 frame = zr->jpg_pend[zr->jpg_que_tail++ & BUZ_MASK_FRAME];
843 frame = zr->jpg_pend[zr->jpg_que_tail & BUZ_MASK_FRAME];
845 /* buffer should now be in BUZ_STATE_DONE */
846 if (zr->jpg_buffers.buffer[frame].state != BUZ_STATE_DONE)
848 KERN_ERR "%s: jpg_sync() - internal state error\n",
851 *bs = zr->jpg_buffers.buffer[frame].bs;
853 zr->jpg_buffers.buffer[frame].state = BUZ_STATE_USER;
854 fh->jpg_buffers.buffer[frame] = zr->jpg_buffers.buffer[frame];
856 spin_unlock_irqrestore(&zr->spinlock, flags);
862 zoran_open_init_session (struct file *file)
865 struct zoran_fh *fh = file->private_data;
866 struct zoran *zr = fh->zr;
868 /* Per default, map the V4L Buffers */
869 fh->map_mode = ZORAN_MAP_MODE_RAW;
871 /* take over the card's current settings */
872 fh->overlay_settings = zr->overlay_settings;
873 fh->overlay_settings.is_set = 0;
874 fh->overlay_settings.format = zr->overlay_settings.format;
875 fh->overlay_active = ZORAN_FREE;
878 fh->v4l_settings = zr->v4l_settings;
881 memset(&fh->v4l_buffers, 0, sizeof(struct zoran_v4l_struct));
882 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
883 fh->v4l_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
884 fh->v4l_buffers.buffer[i].bs.frame = i;
886 fh->v4l_buffers.allocated = 0;
887 fh->v4l_buffers.active = ZORAN_FREE;
888 fh->v4l_buffers.buffer_size = v4l_bufsize;
889 fh->v4l_buffers.num_buffers = v4l_nbufs;
892 fh->jpg_settings = zr->jpg_settings;
895 memset(&fh->jpg_buffers, 0, sizeof(struct zoran_jpg_struct));
896 for (i = 0; i < BUZ_MAX_FRAME; i++) {
897 fh->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */
898 fh->jpg_buffers.buffer[i].bs.frame = i;
900 fh->jpg_buffers.need_contiguous = zr->jpg_buffers.need_contiguous;
901 fh->jpg_buffers.allocated = 0;
902 fh->jpg_buffers.active = ZORAN_FREE;
903 fh->jpg_buffers.buffer_size = jpg_bufsize;
904 fh->jpg_buffers.num_buffers = jpg_nbufs;
908 zoran_close_end_session (struct file *file)
910 struct zoran_fh *fh = file->private_data;
911 struct zoran *zr = fh->zr;
914 if (fh->overlay_active != ZORAN_FREE) {
915 fh->overlay_active = zr->overlay_active = ZORAN_FREE;
916 zr->v4l_overlay_active = 0;
917 if (!zr->v4l_memgrab_active)
918 zr36057_overlay(zr, 0);
919 zr->overlay_mask = NULL;
923 if (fh->v4l_buffers.active != ZORAN_FREE) {
926 spin_lock_irqsave(&zr->spinlock, flags);
927 zr36057_set_memgrab(zr, 0);
928 zr->v4l_buffers.allocated = 0;
929 zr->v4l_buffers.active = fh->v4l_buffers.active =
931 spin_unlock_irqrestore(&zr->spinlock, flags);
935 if (fh->v4l_buffers.allocated)
936 v4l_fbuffer_free(file);
939 if (fh->jpg_buffers.active != ZORAN_FREE) {
940 zr36057_enable_jpg(zr, BUZ_MODE_IDLE);
941 zr->jpg_buffers.allocated = 0;
942 zr->jpg_buffers.active = fh->jpg_buffers.active =
947 if (fh->jpg_buffers.allocated)
948 jpg_fbuffer_free(file);
952 * Open a zoran card. Right now the flags stuff is just playing
955 static int zoran_open(struct file *file)
957 struct zoran *zr = video_drvdata(file);
959 int res, first_open = 0;
961 dprintk(2, KERN_INFO "%s: zoran_open(%s, pid=[%d]), users(-)=%d\n",
962 ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user + 1);
966 if (zr->user >= 2048) {
967 dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
968 ZR_DEVNAME(zr), zr->user);
973 /* now, create the open()-specific file_ops struct */
974 fh = kzalloc(sizeof(struct zoran_fh), GFP_KERNEL);
978 "%s: zoran_open() - allocation of zoran_fh failed\n",
983 /* used to be BUZ_MAX_WIDTH/HEIGHT, but that gives overflows
986 kmalloc(((768 + 31) / 32) * 576 * 4, GFP_KERNEL);
987 if (!fh->overlay_mask) {
990 "%s: zoran_open() - allocation of overlay_mask failed\n",
999 /*mutex_unlock(&zr->resource_lock);*/
1001 /* default setup - TODO: look at flags */
1002 if (first_open) { /* First device open */
1003 zr36057_restart(zr);
1004 zoran_open_init_params(zr);
1005 zoran_init_hardware(zr);
1007 btor(ZR36057_ICR_IntPinEn, ZR36057_ICR);
1010 /* set file_ops stuff */
1011 file->private_data = fh;
1013 zoran_open_init_session(file);
1023 dprintk(2, KERN_INFO "%s: open failed (%d), users(-)=%d\n",
1024 ZR_DEVNAME(zr), res, zr->user);
1030 zoran_close(struct file *file)
1032 struct zoran_fh *fh = file->private_data;
1033 struct zoran *zr = fh->zr;
1035 dprintk(2, KERN_INFO "%s: zoran_close(%s, pid=[%d]), users(+)=%d\n",
1036 ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user - 1);
1038 /* kernel locks (fs/device.c), so don't do that ourselves
1039 * (prevents deadlocks) */
1040 /*mutex_lock(&zr->resource_lock);*/
1042 zoran_close_end_session(file);
1044 if (zr->user-- == 1) { /* Last process */
1045 /* Clean up JPEG process */
1046 wake_up_interruptible(&zr->jpg_capq);
1047 zr36057_enable_jpg(zr, BUZ_MODE_IDLE);
1048 zr->jpg_buffers.allocated = 0;
1049 zr->jpg_buffers.active = ZORAN_FREE;
1051 /* disable interrupts */
1052 btand(~ZR36057_ICR_IntPinEn, ZR36057_ICR);
1054 if (zr36067_debug > 1)
1055 print_interrupts(zr);
1058 zr->v4l_overlay_active = 0;
1059 zr36057_overlay(zr, 0);
1060 zr->overlay_mask = NULL;
1063 wake_up_interruptible(&zr->v4l_capq);
1064 zr36057_set_memgrab(zr, 0);
1065 zr->v4l_buffers.allocated = 0;
1066 zr->v4l_buffers.active = ZORAN_FREE;
1067 zoran_set_pci_master(zr, 0);
1069 if (!pass_through) { /* Switch to color bar */
1070 struct v4l2_routing route = { 2, 0 };
1072 decoder_call(zr, video, s_stream, 0);
1073 encoder_call(zr, video, s_routing, &route);
1077 file->private_data = NULL;
1078 kfree(fh->overlay_mask);
1081 dprintk(4, KERN_INFO "%s: zoran_close() done\n", ZR_DEVNAME(zr));
1088 zoran_read (struct file *file,
1093 /* we simply don't support read() (yet)... */
1099 zoran_write (struct file *file,
1100 const char __user *data,
1104 /* ...and the same goes for write() */
1110 setup_fbuffer (struct file *file,
1112 const struct zoran_format *fmt,
1117 struct zoran_fh *fh = file->private_data;
1118 struct zoran *zr = fh->zr;
1120 /* (Ronald) v4l/v4l2 guidelines */
1121 if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RAWIO))
1124 /* Don't allow frame buffer overlay if PCI or AGP is buggy, or on
1125 ALi Magik (that needs very low latency while the card needs a
1126 higher value always) */
1128 if (pci_pci_problems & (PCIPCI_FAIL | PCIAGP_FAIL | PCIPCI_ALIMAGIK))
1131 /* we need a bytesperline value, even if not given */
1133 bytesperline = width * ((fmt->depth + 7) & ~7) / 8;
1136 if (zr->overlay_active) {
1137 /* dzjee... stupid users... don't even bother to turn off
1138 * overlay before changing the memory location...
1139 * normally, we would return errors here. However, one of
1140 * the tools that does this is... xawtv! and since xawtv
1141 * is used by +/- 99% of the users, we'd rather be user-
1142 * friendly and silently do as if nothing went wrong */
1145 "%s: setup_fbuffer() - forced overlay turnoff because framebuffer changed\n",
1147 zr36057_overlay(zr, 0);
1151 if (!(fmt->flags & ZORAN_FORMAT_OVERLAY)) {
1154 "%s: setup_fbuffer() - no valid overlay format given\n",
1158 if (height <= 0 || width <= 0 || bytesperline <= 0) {
1161 "%s: setup_fbuffer() - invalid height/width/bpl value (%d|%d|%d)\n",
1162 ZR_DEVNAME(zr), width, height, bytesperline);
1165 if (bytesperline & 3) {
1168 "%s: setup_fbuffer() - bytesperline (%d) must be 4-byte aligned\n",
1169 ZR_DEVNAME(zr), bytesperline);
1173 zr->buffer.base = (void *) ((unsigned long) base & ~3);
1174 zr->buffer.height = height;
1175 zr->buffer.width = width;
1176 zr->buffer.depth = fmt->depth;
1177 zr->overlay_settings.format = fmt;
1178 zr->buffer.bytesperline = bytesperline;
1180 /* The user should set new window parameters */
1181 zr->overlay_settings.is_set = 0;
1188 setup_window (struct file *file,
1193 struct video_clip __user *clips,
1195 void __user *bitmap)
1197 struct zoran_fh *fh = file->private_data;
1198 struct zoran *zr = fh->zr;
1199 struct video_clip *vcp = NULL;
1203 if (!zr->buffer.base) {
1206 "%s: setup_window() - frame buffer has to be set first\n",
1211 if (!fh->overlay_settings.format) {
1214 "%s: setup_window() - no overlay format set\n",
1220 * The video front end needs 4-byte alinged line sizes, we correct that
1221 * silently here if necessary
1223 if (zr->buffer.depth == 15 || zr->buffer.depth == 16) {
1224 end = (x + width) & ~1; /* round down */
1225 x = (x + 1) & ~1; /* round up */
1229 if (zr->buffer.depth == 24) {
1230 end = (x + width) & ~3; /* round down */
1231 x = (x + 3) & ~3; /* round up */
1235 if (width > BUZ_MAX_WIDTH)
1236 width = BUZ_MAX_WIDTH;
1237 if (height > BUZ_MAX_HEIGHT)
1238 height = BUZ_MAX_HEIGHT;
1240 /* Check for vaild parameters */
1241 if (width < BUZ_MIN_WIDTH || height < BUZ_MIN_HEIGHT ||
1242 width > BUZ_MAX_WIDTH || height > BUZ_MAX_HEIGHT) {
1245 "%s: setup_window() - width = %d or height = %d invalid\n",
1246 ZR_DEVNAME(zr), width, height);
1250 fh->overlay_settings.x = x;
1251 fh->overlay_settings.y = y;
1252 fh->overlay_settings.width = width;
1253 fh->overlay_settings.height = height;
1254 fh->overlay_settings.clipcount = clipcount;
1257 * If an overlay is running, we have to switch it off
1258 * and switch it on again in order to get the new settings in effect.
1260 * We also want to avoid that the overlay mask is written
1261 * when an overlay is running.
1264 on = zr->v4l_overlay_active && !zr->v4l_memgrab_active &&
1265 zr->overlay_active != ZORAN_FREE &&
1266 fh->overlay_active != ZORAN_FREE;
1268 zr36057_overlay(zr, 0);
1271 * Write the overlay mask if clips are wanted.
1272 * We prefer a bitmap.
1275 /* fake value - it just means we want clips */
1276 fh->overlay_settings.clipcount = 1;
1278 if (copy_from_user(fh->overlay_mask, bitmap,
1279 (width * height + 7) / 8)) {
1282 } else if (clipcount > 0) {
1283 /* write our own bitmap from the clips */
1284 vcp = vmalloc(sizeof(struct video_clip) * (clipcount + 4));
1288 "%s: setup_window() - Alloc of clip mask failed\n",
1293 (vcp, clips, sizeof(struct video_clip) * clipcount)) {
1297 write_overlay_mask(file, vcp, clipcount);
1301 fh->overlay_settings.is_set = 1;
1302 if (fh->overlay_active != ZORAN_FREE &&
1303 zr->overlay_active != ZORAN_FREE)
1304 zr->overlay_settings = fh->overlay_settings;
1307 zr36057_overlay(zr, 1);
1309 /* Make sure the changes come into effect */
1310 return wait_grab_pending(zr);
1314 setup_overlay (struct file *file,
1317 struct zoran_fh *fh = file->private_data;
1318 struct zoran *zr = fh->zr;
1320 /* If there is nothing to do, return immediatly */
1321 if ((on && fh->overlay_active != ZORAN_FREE) ||
1322 (!on && fh->overlay_active == ZORAN_FREE))
1325 /* check whether we're touching someone else's overlay */
1326 if (on && zr->overlay_active != ZORAN_FREE &&
1327 fh->overlay_active == ZORAN_FREE) {
1330 "%s: setup_overlay() - overlay is already active for another session\n",
1334 if (!on && zr->overlay_active != ZORAN_FREE &&
1335 fh->overlay_active == ZORAN_FREE) {
1338 "%s: setup_overlay() - you cannot cancel someone else's session\n",
1344 zr->overlay_active = fh->overlay_active = ZORAN_FREE;
1345 zr->v4l_overlay_active = 0;
1346 /* When a grab is running, the video simply
1347 * won't be switched on any more */
1348 if (!zr->v4l_memgrab_active)
1349 zr36057_overlay(zr, 0);
1350 zr->overlay_mask = NULL;
1352 if (!zr->buffer.base || !fh->overlay_settings.is_set) {
1355 "%s: setup_overlay() - buffer or window not set\n",
1359 if (!fh->overlay_settings.format) {
1362 "%s: setup_overlay() - no overlay format set\n",
1366 zr->overlay_active = fh->overlay_active = ZORAN_LOCKED;
1367 zr->v4l_overlay_active = 1;
1368 zr->overlay_mask = fh->overlay_mask;
1369 zr->overlay_settings = fh->overlay_settings;
1370 if (!zr->v4l_memgrab_active)
1371 zr36057_overlay(zr, 1);
1372 /* When a grab is running, the video will be
1373 * switched on when grab is finished */
1376 /* Make sure the changes come into effect */
1377 return wait_grab_pending(zr);
1380 /* get the status of a buffer in the clients buffer queue */
1382 zoran_v4l2_buffer_status (struct file *file,
1383 struct v4l2_buffer *buf,
1386 struct zoran_fh *fh = file->private_data;
1387 struct zoran *zr = fh->zr;
1389 buf->flags = V4L2_BUF_FLAG_MAPPED;
1391 switch (fh->map_mode) {
1392 case ZORAN_MAP_MODE_RAW:
1395 if (num < 0 || num >= fh->v4l_buffers.num_buffers ||
1396 !fh->v4l_buffers.allocated) {
1399 "%s: v4l2_buffer_status() - wrong number or buffers not allocated\n",
1404 buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1405 buf->length = fh->v4l_buffers.buffer_size;
1408 buf->bytesused = fh->v4l_buffers.buffer[num].bs.length;
1409 if (fh->v4l_buffers.buffer[num].state == BUZ_STATE_DONE ||
1410 fh->v4l_buffers.buffer[num].state == BUZ_STATE_USER) {
1411 buf->sequence = fh->v4l_buffers.buffer[num].bs.seq;
1412 buf->flags |= V4L2_BUF_FLAG_DONE;
1414 fh->v4l_buffers.buffer[num].bs.timestamp;
1416 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1419 if (fh->v4l_settings.height <= BUZ_MAX_HEIGHT / 2)
1420 buf->field = V4L2_FIELD_TOP;
1422 buf->field = V4L2_FIELD_INTERLACED;
1426 case ZORAN_MAP_MODE_JPG_REC:
1427 case ZORAN_MAP_MODE_JPG_PLAY:
1430 if (num < 0 || num >= fh->jpg_buffers.num_buffers ||
1431 !fh->jpg_buffers.allocated) {
1434 "%s: v4l2_buffer_status() - wrong number or buffers not allocated\n",
1439 buf->type = (fh->map_mode == ZORAN_MAP_MODE_JPG_REC) ?
1440 V4L2_BUF_TYPE_VIDEO_CAPTURE :
1441 V4L2_BUF_TYPE_VIDEO_OUTPUT;
1442 buf->length = fh->jpg_buffers.buffer_size;
1444 /* these variables are only written after frame has been captured */
1445 if (fh->jpg_buffers.buffer[num].state == BUZ_STATE_DONE ||
1446 fh->jpg_buffers.buffer[num].state == BUZ_STATE_USER) {
1447 buf->sequence = fh->jpg_buffers.buffer[num].bs.seq;
1449 fh->jpg_buffers.buffer[num].bs.timestamp;
1451 fh->jpg_buffers.buffer[num].bs.length;
1452 buf->flags |= V4L2_BUF_FLAG_DONE;
1454 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1457 /* which fields are these? */
1458 if (fh->jpg_settings.TmpDcm != 1)
1461 odd_even ? V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM;
1465 odd_even ? V4L2_FIELD_SEQ_TB :
1474 "%s: v4l2_buffer_status() - invalid buffer type|map_mode (%d|%d)\n",
1475 ZR_DEVNAME(zr), buf->type, fh->map_mode);
1479 buf->memory = V4L2_MEMORY_MMAP;
1481 buf->m.offset = buf->length * num;
1487 zoran_set_norm (struct zoran *zr,
1492 if (zr->v4l_buffers.active != ZORAN_FREE ||
1493 zr->jpg_buffers.active != ZORAN_FREE) {
1496 "%s: set_norm() called while in playback/capture mode\n",
1501 if (lock_norm && norm != zr->norm) {
1502 if (lock_norm > 1) {
1505 "%s: set_norm() - TV standard is locked, can not switch norm\n",
1511 "%s: set_norm() - TV standard is locked, norm was not changed\n",
1517 if (!(norm & zr->card.norms)) {
1519 KERN_ERR "%s: set_norm() - unsupported norm %llx\n",
1520 ZR_DEVNAME(zr), norm);
1524 if (norm == V4L2_STD_ALL) {
1526 v4l2_std_id std = 0;
1528 decoder_call(zr, video, querystd, &std);
1529 decoder_s_std(zr, std);
1531 /* let changes come into effect */
1534 decoder_call(zr, video, g_input_status, &status);
1535 if (status & V4L2_IN_ST_NO_SIGNAL) {
1538 "%s: set_norm() - no norm detected\n",
1541 decoder_s_std(zr, zr->norm);
1547 if (norm & V4L2_STD_SECAM)
1548 zr->timing = zr->card.tvn[2];
1549 else if (norm & V4L2_STD_NTSC)
1550 zr->timing = zr->card.tvn[1];
1552 zr->timing = zr->card.tvn[0];
1554 /* We switch overlay off and on since a change in the
1555 * norm needs different VFE settings */
1556 on = zr->overlay_active && !zr->v4l_memgrab_active;
1558 zr36057_overlay(zr, 0);
1560 decoder_s_std(zr, norm);
1561 encoder_call(zr, video, s_std_output, norm);
1564 zr36057_overlay(zr, 1);
1566 /* Make sure the changes come into effect */
1573 zoran_set_input (struct zoran *zr,
1576 struct v4l2_routing route = { 0, 0 };
1578 if (input == zr->input) {
1582 if (zr->v4l_buffers.active != ZORAN_FREE ||
1583 zr->jpg_buffers.active != ZORAN_FREE) {
1586 "%s: set_input() called while in playback/capture mode\n",
1591 if (input < 0 || input >= zr->card.inputs) {
1594 "%s: set_input() - unnsupported input %d\n",
1595 ZR_DEVNAME(zr), input);
1599 route.input = zr->card.input[input].muxsel;
1602 decoder_s_routing(zr, &route);
1611 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1612 static long zoran_default(struct file *file, void *__fh, int cmd, void *arg)
1614 struct zoran_fh *fh = __fh;
1615 struct zoran *zr = fh->zr;
1616 struct zoran_jpg_settings settings;
1619 case BUZIOC_G_PARAMS:
1621 struct zoran_params *bparams = arg;
1623 dprintk(3, KERN_DEBUG "%s: BUZIOC_G_PARAMS\n", ZR_DEVNAME(zr));
1625 memset(bparams, 0, sizeof(struct zoran_params));
1626 bparams->major_version = MAJOR_VERSION;
1627 bparams->minor_version = MINOR_VERSION;
1629 mutex_lock(&zr->resource_lock);
1631 if (zr->norm & V4L2_STD_NTSC)
1632 bparams->norm = VIDEO_MODE_NTSC;
1633 else if (zr->norm & V4L2_STD_PAL)
1634 bparams->norm = VIDEO_MODE_PAL;
1636 bparams->norm = VIDEO_MODE_SECAM;
1638 bparams->input = zr->input;
1640 bparams->decimation = fh->jpg_settings.decimation;
1641 bparams->HorDcm = fh->jpg_settings.HorDcm;
1642 bparams->VerDcm = fh->jpg_settings.VerDcm;
1643 bparams->TmpDcm = fh->jpg_settings.TmpDcm;
1644 bparams->field_per_buff = fh->jpg_settings.field_per_buff;
1645 bparams->img_x = fh->jpg_settings.img_x;
1646 bparams->img_y = fh->jpg_settings.img_y;
1647 bparams->img_width = fh->jpg_settings.img_width;
1648 bparams->img_height = fh->jpg_settings.img_height;
1649 bparams->odd_even = fh->jpg_settings.odd_even;
1651 bparams->quality = fh->jpg_settings.jpg_comp.quality;
1652 bparams->APPn = fh->jpg_settings.jpg_comp.APPn;
1653 bparams->APP_len = fh->jpg_settings.jpg_comp.APP_len;
1654 memcpy(bparams->APP_data,
1655 fh->jpg_settings.jpg_comp.APP_data,
1656 sizeof(bparams->APP_data));
1657 bparams->COM_len = zr->jpg_settings.jpg_comp.COM_len;
1658 memcpy(bparams->COM_data,
1659 fh->jpg_settings.jpg_comp.COM_data,
1660 sizeof(bparams->COM_data));
1661 bparams->jpeg_markers =
1662 fh->jpg_settings.jpg_comp.jpeg_markers;
1664 mutex_unlock(&zr->resource_lock);
1666 bparams->VFIFO_FB = 0;
1671 case BUZIOC_S_PARAMS:
1673 struct zoran_params *bparams = arg;
1676 dprintk(3, KERN_DEBUG "%s: BUZIOC_S_PARAMS\n", ZR_DEVNAME(zr));
1678 settings.decimation = bparams->decimation;
1679 settings.HorDcm = bparams->HorDcm;
1680 settings.VerDcm = bparams->VerDcm;
1681 settings.TmpDcm = bparams->TmpDcm;
1682 settings.field_per_buff = bparams->field_per_buff;
1683 settings.img_x = bparams->img_x;
1684 settings.img_y = bparams->img_y;
1685 settings.img_width = bparams->img_width;
1686 settings.img_height = bparams->img_height;
1687 settings.odd_even = bparams->odd_even;
1689 settings.jpg_comp.quality = bparams->quality;
1690 settings.jpg_comp.APPn = bparams->APPn;
1691 settings.jpg_comp.APP_len = bparams->APP_len;
1692 memcpy(settings.jpg_comp.APP_data, bparams->APP_data,
1693 sizeof(bparams->APP_data));
1694 settings.jpg_comp.COM_len = bparams->COM_len;
1695 memcpy(settings.jpg_comp.COM_data, bparams->COM_data,
1696 sizeof(bparams->COM_data));
1697 settings.jpg_comp.jpeg_markers = bparams->jpeg_markers;
1699 mutex_lock(&zr->resource_lock);
1701 if (zr->codec_mode != BUZ_MODE_IDLE) {
1704 "%s: BUZIOC_S_PARAMS called, but Buz in capture/playback mode\n",
1707 goto sparams_unlock_and_return;
1710 /* Check the params first before overwriting our
1712 if (zoran_check_jpg_settings(zr, &settings, 0)) {
1714 goto sparams_unlock_and_return;
1717 fh->jpg_settings = settings;
1718 sparams_unlock_and_return:
1719 mutex_unlock(&zr->resource_lock);
1724 case BUZIOC_REQBUFS:
1726 struct zoran_requestbuffers *breq = arg;
1731 "%s: BUZIOC_REQBUFS - count=%lu, size=%lu\n",
1732 ZR_DEVNAME(zr), breq->count, breq->size);
1734 /* Enforce reasonable lower and upper limits */
1735 if (breq->count < 4)
1736 breq->count = 4; /* Could be choosen smaller */
1737 if (breq->count > jpg_nbufs)
1738 breq->count = jpg_nbufs;
1739 breq->size = PAGE_ALIGN(breq->size);
1740 if (breq->size < 8192)
1741 breq->size = 8192; /* Arbitrary */
1742 /* breq->size is limited by 1 page for the stat_com
1743 * tables to a Maximum of 2 MB */
1744 if (breq->size > jpg_bufsize)
1745 breq->size = jpg_bufsize;
1747 mutex_lock(&zr->resource_lock);
1749 if (fh->jpg_buffers.allocated || fh->v4l_buffers.allocated) {
1752 "%s: BUZIOC_REQBUFS - buffers already allocated\n",
1755 goto jpgreqbuf_unlock_and_return;
1758 fh->jpg_buffers.num_buffers = breq->count;
1759 fh->jpg_buffers.buffer_size = breq->size;
1761 if (jpg_fbuffer_alloc(file)) {
1763 goto jpgreqbuf_unlock_and_return;
1766 /* The next mmap will map the MJPEG buffers - could
1767 * also be *_PLAY, but it doesn't matter here */
1768 fh->map_mode = ZORAN_MAP_MODE_JPG_REC;
1769 jpgreqbuf_unlock_and_return:
1770 mutex_unlock(&zr->resource_lock);
1775 case BUZIOC_QBUF_CAPT:
1777 int *frame = arg, res;
1779 dprintk(3, KERN_DEBUG "%s: BUZIOC_QBUF_CAPT - frame=%d\n",
1780 ZR_DEVNAME(zr), *frame);
1782 mutex_lock(&zr->resource_lock);
1783 res = jpg_qbuf(file, *frame, BUZ_MODE_MOTION_COMPRESS);
1784 mutex_unlock(&zr->resource_lock);
1789 case BUZIOC_QBUF_PLAY:
1791 int *frame = arg, res;
1793 dprintk(3, KERN_DEBUG "%s: BUZIOC_QBUF_PLAY - frame=%d\n",
1794 ZR_DEVNAME(zr), *frame);
1796 mutex_lock(&zr->resource_lock);
1797 res = jpg_qbuf(file, *frame, BUZ_MODE_MOTION_DECOMPRESS);
1798 mutex_unlock(&zr->resource_lock);
1805 struct zoran_sync *bsync = arg;
1808 dprintk(3, KERN_DEBUG "%s: BUZIOC_SYNC\n", ZR_DEVNAME(zr));
1810 mutex_lock(&zr->resource_lock);
1811 res = jpg_sync(file, bsync);
1812 mutex_unlock(&zr->resource_lock);
1817 case BUZIOC_G_STATUS:
1819 struct zoran_status *bstat = arg;
1820 struct v4l2_routing route = { 0, 0 };
1821 int status = 0, res = 0;
1824 dprintk(3, KERN_DEBUG "%s: BUZIOC_G_STATUS\n", ZR_DEVNAME(zr));
1826 if (zr->codec_mode != BUZ_MODE_IDLE) {
1829 "%s: BUZIOC_G_STATUS called but Buz in capture/playback mode\n",
1834 route.input = zr->card.input[bstat->input].muxsel;
1836 mutex_lock(&zr->resource_lock);
1838 if (zr->codec_mode != BUZ_MODE_IDLE) {
1841 "%s: BUZIOC_G_STATUS called, but Buz in capture/playback mode\n",
1844 goto gstat_unlock_and_return;
1847 decoder_s_routing(zr, &route);
1849 /* sleep 1 second */
1852 /* Get status of video decoder */
1853 decoder_call(zr, video, querystd, &norm);
1854 decoder_call(zr, video, g_input_status, &status);
1856 /* restore previous input and norm */
1857 route.input = zr->card.input[zr->input].muxsel;
1858 decoder_s_routing(zr, &route);
1859 gstat_unlock_and_return:
1860 mutex_unlock(&zr->resource_lock);
1864 (status & V4L2_IN_ST_NO_SIGNAL) ? 0 : 1;
1865 if (norm & V4L2_STD_NTSC)
1866 bstat->norm = VIDEO_MODE_NTSC;
1867 else if (norm & V4L2_STD_SECAM)
1868 bstat->norm = VIDEO_MODE_SECAM;
1870 bstat->norm = VIDEO_MODE_PAL;
1873 (status & V4L2_IN_ST_NO_COLOR) ? 0 : 1;
1884 static int zoran_vidiocgmbuf(struct file *file, void *__fh, struct video_mbuf *vmbuf)
1886 struct zoran_fh *fh = __fh;
1887 struct zoran *zr = fh->zr;
1891 fh->v4l_buffers.num_buffers *
1892 fh->v4l_buffers.buffer_size;
1893 vmbuf->frames = fh->v4l_buffers.num_buffers;
1894 for (i = 0; i < vmbuf->frames; i++) {
1896 i * fh->v4l_buffers.buffer_size;
1899 mutex_lock(&zr->resource_lock);
1901 if (fh->jpg_buffers.allocated || fh->v4l_buffers.allocated) {
1904 "%s: VIDIOCGMBUF - buffers already allocated\n",
1907 goto v4l1reqbuf_unlock_and_return;
1910 if (v4l_fbuffer_alloc(file)) {
1912 goto v4l1reqbuf_unlock_and_return;
1915 /* The next mmap will map the V4L buffers */
1916 fh->map_mode = ZORAN_MAP_MODE_RAW;
1917 v4l1reqbuf_unlock_and_return:
1918 mutex_unlock(&zr->resource_lock);
1924 static int zoran_querycap(struct file *file, void *__fh, struct v4l2_capability *cap)
1926 struct zoran_fh *fh = __fh;
1927 struct zoran *zr = fh->zr;
1929 memset(cap, 0, sizeof(*cap));
1930 strncpy(cap->card, ZR_DEVNAME(zr), sizeof(cap->card)-1);
1931 strncpy(cap->driver, "zoran", sizeof(cap->driver)-1);
1932 snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s",
1933 pci_name(zr->pci_dev));
1934 cap->version = KERNEL_VERSION(MAJOR_VERSION, MINOR_VERSION,
1936 cap->capabilities = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_CAPTURE |
1937 V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VIDEO_OVERLAY;
1941 static int zoran_enum_fmt(struct zoran *zr, struct v4l2_fmtdesc *fmt, int flag)
1945 for (i = 0; i < NUM_FORMATS; i++) {
1946 if (zoran_formats[i].flags & flag)
1948 if (num == fmt->index)
1951 if (fmt->index < 0 /* late, but not too late */ || i == NUM_FORMATS)
1954 strncpy(fmt->description, zoran_formats[i].name, sizeof(fmt->description)-1);
1955 fmt->pixelformat = zoran_formats[i].fourcc;
1956 if (zoran_formats[i].flags & ZORAN_FORMAT_COMPRESSED)
1957 fmt->flags |= V4L2_FMT_FLAG_COMPRESSED;
1961 static int zoran_enum_fmt_vid_cap(struct file *file, void *__fh,
1962 struct v4l2_fmtdesc *f)
1964 struct zoran_fh *fh = __fh;
1965 struct zoran *zr = fh->zr;
1967 return zoran_enum_fmt(zr, f, ZORAN_FORMAT_CAPTURE);
1970 static int zoran_enum_fmt_vid_out(struct file *file, void *__fh,
1971 struct v4l2_fmtdesc *f)
1973 struct zoran_fh *fh = __fh;
1974 struct zoran *zr = fh->zr;
1976 return zoran_enum_fmt(zr, f, ZORAN_FORMAT_PLAYBACK);
1979 static int zoran_enum_fmt_vid_overlay(struct file *file, void *__fh,
1980 struct v4l2_fmtdesc *f)
1982 struct zoran_fh *fh = __fh;
1983 struct zoran *zr = fh->zr;
1985 return zoran_enum_fmt(zr, f, ZORAN_FORMAT_OVERLAY);
1988 static int zoran_g_fmt_vid_out(struct file *file, void *__fh,
1989 struct v4l2_format *fmt)
1991 struct zoran_fh *fh = __fh;
1992 struct zoran *zr = fh->zr;
1994 mutex_lock(&zr->resource_lock);
1996 fmt->fmt.pix.width = fh->jpg_settings.img_width / fh->jpg_settings.HorDcm;
1997 fmt->fmt.pix.height = fh->jpg_settings.img_height * 2 /
1998 (fh->jpg_settings.VerDcm * fh->jpg_settings.TmpDcm);
1999 fmt->fmt.pix.sizeimage = zoran_v4l2_calc_bufsize(&fh->jpg_settings);
2000 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
2001 if (fh->jpg_settings.TmpDcm == 1)
2002 fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
2003 V4L2_FIELD_SEQ_TB : V4L2_FIELD_SEQ_BT);
2005 fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
2006 V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM);
2007 fmt->fmt.pix.bytesperline = 0;
2008 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
2010 mutex_unlock(&zr->resource_lock);
2014 static int zoran_g_fmt_vid_cap(struct file *file, void *__fh,
2015 struct v4l2_format *fmt)
2017 struct zoran_fh *fh = __fh;
2018 struct zoran *zr = fh->zr;
2020 if (fh->map_mode != ZORAN_MAP_MODE_RAW)
2021 return zoran_g_fmt_vid_out(file, fh, fmt);
2023 mutex_lock(&zr->resource_lock);
2024 fmt->fmt.pix.width = fh->v4l_settings.width;
2025 fmt->fmt.pix.height = fh->v4l_settings.height;
2026 fmt->fmt.pix.sizeimage = fh->v4l_settings.bytesperline *
2027 fh->v4l_settings.height;
2028 fmt->fmt.pix.pixelformat = fh->v4l_settings.format->fourcc;
2029 fmt->fmt.pix.colorspace = fh->v4l_settings.format->colorspace;
2030 fmt->fmt.pix.bytesperline = fh->v4l_settings.bytesperline;
2031 if (BUZ_MAX_HEIGHT < (fh->v4l_settings.height * 2))
2032 fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
2034 fmt->fmt.pix.field = V4L2_FIELD_TOP;
2035 mutex_unlock(&zr->resource_lock);
2039 static int zoran_g_fmt_vid_overlay(struct file *file, void *__fh,
2040 struct v4l2_format *fmt)
2042 struct zoran_fh *fh = __fh;
2043 struct zoran *zr = fh->zr;
2045 mutex_lock(&zr->resource_lock);
2047 fmt->fmt.win.w.left = fh->overlay_settings.x;
2048 fmt->fmt.win.w.top = fh->overlay_settings.y;
2049 fmt->fmt.win.w.width = fh->overlay_settings.width;
2050 fmt->fmt.win.w.height = fh->overlay_settings.height;
2051 if (fh->overlay_settings.width * 2 > BUZ_MAX_HEIGHT)
2052 fmt->fmt.win.field = V4L2_FIELD_INTERLACED;
2054 fmt->fmt.win.field = V4L2_FIELD_TOP;
2056 mutex_unlock(&zr->resource_lock);
2060 static int zoran_try_fmt_vid_overlay(struct file *file, void *__fh,
2061 struct v4l2_format *fmt)
2063 struct zoran_fh *fh = __fh;
2064 struct zoran *zr = fh->zr;
2066 mutex_lock(&zr->resource_lock);
2068 if (fmt->fmt.win.w.width > BUZ_MAX_WIDTH)
2069 fmt->fmt.win.w.width = BUZ_MAX_WIDTH;
2070 if (fmt->fmt.win.w.width < BUZ_MIN_WIDTH)
2071 fmt->fmt.win.w.width = BUZ_MIN_WIDTH;
2072 if (fmt->fmt.win.w.height > BUZ_MAX_HEIGHT)
2073 fmt->fmt.win.w.height = BUZ_MAX_HEIGHT;
2074 if (fmt->fmt.win.w.height < BUZ_MIN_HEIGHT)
2075 fmt->fmt.win.w.height = BUZ_MIN_HEIGHT;
2077 mutex_unlock(&zr->resource_lock);
2081 static int zoran_try_fmt_vid_out(struct file *file, void *__fh,
2082 struct v4l2_format *fmt)
2084 struct zoran_fh *fh = __fh;
2085 struct zoran *zr = fh->zr;
2086 struct zoran_jpg_settings settings;
2089 if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
2092 mutex_lock(&zr->resource_lock);
2093 settings = fh->jpg_settings;
2095 /* we actually need to set 'real' parameters now */
2096 if ((fmt->fmt.pix.height * 2) > BUZ_MAX_HEIGHT)
2097 settings.TmpDcm = 1;
2099 settings.TmpDcm = 2;
2100 settings.decimation = 0;
2101 if (fmt->fmt.pix.height <= fh->jpg_settings.img_height / 2)
2102 settings.VerDcm = 2;
2104 settings.VerDcm = 1;
2105 if (fmt->fmt.pix.width <= fh->jpg_settings.img_width / 4)
2106 settings.HorDcm = 4;
2107 else if (fmt->fmt.pix.width <= fh->jpg_settings.img_width / 2)
2108 settings.HorDcm = 2;
2110 settings.HorDcm = 1;
2111 if (settings.TmpDcm == 1)
2112 settings.field_per_buff = 2;
2114 settings.field_per_buff = 1;
2116 if (settings.HorDcm > 1) {
2117 settings.img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
2118 settings.img_width = (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
2121 settings.img_width = BUZ_MAX_WIDTH;
2125 res = zoran_check_jpg_settings(zr, &settings, 1);
2127 goto tryfmt_unlock_and_return;
2129 /* tell the user what we actually did */
2130 fmt->fmt.pix.width = settings.img_width / settings.HorDcm;
2131 fmt->fmt.pix.height = settings.img_height * 2 /
2132 (settings.TmpDcm * settings.VerDcm);
2133 if (settings.TmpDcm == 1)
2134 fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
2135 V4L2_FIELD_SEQ_TB : V4L2_FIELD_SEQ_BT);
2137 fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
2138 V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM);
2140 fmt->fmt.pix.sizeimage = zoran_v4l2_calc_bufsize(&settings);
2141 fmt->fmt.pix.bytesperline = 0;
2142 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
2143 tryfmt_unlock_and_return:
2144 mutex_unlock(&zr->resource_lock);
2148 static int zoran_try_fmt_vid_cap(struct file *file, void *__fh,
2149 struct v4l2_format *fmt)
2151 struct zoran_fh *fh = __fh;
2152 struct zoran *zr = fh->zr;
2156 if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG)
2157 return zoran_try_fmt_vid_out(file, fh, fmt);
2159 mutex_lock(&zr->resource_lock);
2161 for (i = 0; i < NUM_FORMATS; i++)
2162 if (zoran_formats[i].fourcc == fmt->fmt.pix.pixelformat)
2165 if (i == NUM_FORMATS) {
2166 mutex_unlock(&zr->resource_lock);
2170 bpp = (zoran_formats[i].depth + 7) / 8;
2171 fmt->fmt.pix.width &= ~((bpp == 2) ? 1 : 3);
2172 if (fmt->fmt.pix.width > BUZ_MAX_WIDTH)
2173 fmt->fmt.pix.width = BUZ_MAX_WIDTH;
2174 if (fmt->fmt.pix.width < BUZ_MIN_WIDTH)
2175 fmt->fmt.pix.width = BUZ_MIN_WIDTH;
2176 if (fmt->fmt.pix.height > BUZ_MAX_HEIGHT)
2177 fmt->fmt.pix.height = BUZ_MAX_HEIGHT;
2178 if (fmt->fmt.pix.height < BUZ_MIN_HEIGHT)
2179 fmt->fmt.pix.height = BUZ_MIN_HEIGHT;
2180 mutex_unlock(&zr->resource_lock);
2185 static int zoran_s_fmt_vid_overlay(struct file *file, void *__fh,
2186 struct v4l2_format *fmt)
2188 struct zoran_fh *fh = __fh;
2189 struct zoran *zr = fh->zr;
2192 dprintk(3, "x=%d, y=%d, w=%d, h=%d, cnt=%d, map=0x%p\n",
2193 fmt->fmt.win.w.left, fmt->fmt.win.w.top,
2194 fmt->fmt.win.w.width,
2195 fmt->fmt.win.w.height,
2196 fmt->fmt.win.clipcount,
2197 fmt->fmt.win.bitmap);
2198 mutex_lock(&zr->resource_lock);
2199 res = setup_window(file, fmt->fmt.win.w.left,
2201 fmt->fmt.win.w.width,
2202 fmt->fmt.win.w.height,
2203 (struct video_clip __user *)
2205 fmt->fmt.win.clipcount,
2206 fmt->fmt.win.bitmap);
2207 mutex_unlock(&zr->resource_lock);
2211 static int zoran_s_fmt_vid_out(struct file *file, void *__fh,
2212 struct v4l2_format *fmt)
2214 struct zoran_fh *fh = __fh;
2215 struct zoran *zr = fh->zr;
2216 __le32 printformat = __cpu_to_le32(fmt->fmt.pix.pixelformat);
2217 struct zoran_jpg_settings settings;
2220 dprintk(3, "size=%dx%d, fmt=0x%x (%4.4s)\n",
2221 fmt->fmt.pix.width, fmt->fmt.pix.height,
2222 fmt->fmt.pix.pixelformat,
2223 (char *) &printformat);
2224 if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
2227 mutex_lock(&zr->resource_lock);
2229 settings = fh->jpg_settings;
2231 if (fh->v4l_buffers.allocated || fh->jpg_buffers.allocated) {
2232 dprintk(1, KERN_ERR "%s: VIDIOC_S_FMT - cannot change capture mode\n",
2235 goto sfmtjpg_unlock_and_return;
2238 /* we actually need to set 'real' parameters now */
2239 if (fmt->fmt.pix.height * 2 > BUZ_MAX_HEIGHT)
2240 settings.TmpDcm = 1;
2242 settings.TmpDcm = 2;
2243 settings.decimation = 0;
2244 if (fmt->fmt.pix.height <= fh->jpg_settings.img_height / 2)
2245 settings.VerDcm = 2;
2247 settings.VerDcm = 1;
2248 if (fmt->fmt.pix.width <= fh->jpg_settings.img_width / 4)
2249 settings.HorDcm = 4;
2250 else if (fmt->fmt.pix.width <= fh->jpg_settings.img_width / 2)
2251 settings.HorDcm = 2;
2253 settings.HorDcm = 1;
2254 if (settings.TmpDcm == 1)
2255 settings.field_per_buff = 2;
2257 settings.field_per_buff = 1;
2259 if (settings.HorDcm > 1) {
2260 settings.img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
2261 settings.img_width = (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
2264 settings.img_width = BUZ_MAX_WIDTH;
2268 res = zoran_check_jpg_settings(zr, &settings, 0);
2270 goto sfmtjpg_unlock_and_return;
2272 /* it's ok, so set them */
2273 fh->jpg_settings = settings;
2275 /* tell the user what we actually did */
2276 fmt->fmt.pix.width = settings.img_width / settings.HorDcm;
2277 fmt->fmt.pix.height = settings.img_height * 2 /
2278 (settings.TmpDcm * settings.VerDcm);
2279 if (settings.TmpDcm == 1)
2280 fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
2281 V4L2_FIELD_SEQ_TB : V4L2_FIELD_SEQ_BT);
2283 fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
2284 V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM);
2285 fh->jpg_buffers.buffer_size = zoran_v4l2_calc_bufsize(&fh->jpg_settings);
2286 fmt->fmt.pix.bytesperline = 0;
2287 fmt->fmt.pix.sizeimage = fh->jpg_buffers.buffer_size;
2288 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
2290 /* we hereby abuse this variable to show that
2291 * we're gonna do mjpeg capture */
2292 fh->map_mode = (fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) ?
2293 ZORAN_MAP_MODE_JPG_REC : ZORAN_MAP_MODE_JPG_PLAY;
2294 sfmtjpg_unlock_and_return:
2295 mutex_unlock(&zr->resource_lock);
2299 static int zoran_s_fmt_vid_cap(struct file *file, void *__fh,
2300 struct v4l2_format *fmt)
2302 struct zoran_fh *fh = __fh;
2303 struct zoran *zr = fh->zr;
2307 if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG)
2308 return zoran_s_fmt_vid_out(file, fh, fmt);
2310 for (i = 0; i < NUM_FORMATS; i++)
2311 if (fmt->fmt.pix.pixelformat == zoran_formats[i].fourcc)
2313 if (i == NUM_FORMATS) {
2314 dprintk(1, KERN_ERR "%s: VIDIOC_S_FMT - unknown/unsupported format 0x%x\n",
2315 ZR_DEVNAME(zr), fmt->fmt.pix.pixelformat);
2318 mutex_lock(&zr->resource_lock);
2319 if (fh->jpg_buffers.allocated ||
2320 (fh->v4l_buffers.allocated && fh->v4l_buffers.active != ZORAN_FREE)) {
2321 dprintk(1, KERN_ERR "%s: VIDIOC_S_FMT - cannot change capture mode\n",
2324 goto sfmtv4l_unlock_and_return;
2326 if (fmt->fmt.pix.height > BUZ_MAX_HEIGHT)
2327 fmt->fmt.pix.height = BUZ_MAX_HEIGHT;
2328 if (fmt->fmt.pix.width > BUZ_MAX_WIDTH)
2329 fmt->fmt.pix.width = BUZ_MAX_WIDTH;
2331 res = zoran_v4l_set_format(file, fmt->fmt.pix.width,
2332 fmt->fmt.pix.height, &zoran_formats[i]);
2334 goto sfmtv4l_unlock_and_return;
2336 /* tell the user the
2337 * results/missing stuff */
2338 fmt->fmt.pix.bytesperline = fh->v4l_settings.bytesperline;
2339 fmt->fmt.pix.sizeimage = fh->v4l_settings.height * fh->v4l_settings.bytesperline;
2340 fmt->fmt.pix.colorspace = fh->v4l_settings.format->colorspace;
2341 if (BUZ_MAX_HEIGHT < (fh->v4l_settings.height * 2))
2342 fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
2344 fmt->fmt.pix.field = V4L2_FIELD_TOP;
2346 fh->map_mode = ZORAN_MAP_MODE_RAW;
2347 sfmtv4l_unlock_and_return:
2348 mutex_unlock(&zr->resource_lock);
2352 static int zoran_g_fbuf(struct file *file, void *__fh,
2353 struct v4l2_framebuffer *fb)
2355 struct zoran_fh *fh = __fh;
2356 struct zoran *zr = fh->zr;
2358 memset(fb, 0, sizeof(*fb));
2359 mutex_lock(&zr->resource_lock);
2360 fb->base = zr->buffer.base;
2361 fb->fmt.width = zr->buffer.width;
2362 fb->fmt.height = zr->buffer.height;
2363 if (zr->overlay_settings.format)
2364 fb->fmt.pixelformat = fh->overlay_settings.format->fourcc;
2365 fb->fmt.bytesperline = zr->buffer.bytesperline;
2366 mutex_unlock(&zr->resource_lock);
2367 fb->fmt.colorspace = V4L2_COLORSPACE_SRGB;
2368 fb->fmt.field = V4L2_FIELD_INTERLACED;
2369 fb->flags = V4L2_FBUF_FLAG_OVERLAY;
2370 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2375 static int zoran_s_fbuf(struct file *file, void *__fh,
2376 struct v4l2_framebuffer *fb)
2378 struct zoran_fh *fh = __fh;
2379 struct zoran *zr = fh->zr;
2381 __le32 printformat = __cpu_to_le32(fb->fmt.pixelformat);
2383 for (i = 0; i < NUM_FORMATS; i++)
2384 if (zoran_formats[i].fourcc == fb->fmt.pixelformat)
2386 if (i == NUM_FORMATS) {
2387 dprintk(1, KERN_ERR "%s: VIDIOC_S_FBUF - format=0x%x (%4.4s) not allowed\n",
2388 ZR_DEVNAME(zr), fb->fmt.pixelformat,
2389 (char *)&printformat);
2393 mutex_lock(&zr->resource_lock);
2394 res = setup_fbuffer(file, fb->base, &zoran_formats[i],
2395 fb->fmt.width, fb->fmt.height,
2396 fb->fmt.bytesperline);
2397 mutex_unlock(&zr->resource_lock);
2402 static int zoran_overlay(struct file *file, void *__fh, unsigned int on)
2404 struct zoran_fh *fh = __fh;
2405 struct zoran *zr = fh->zr;
2408 mutex_lock(&zr->resource_lock);
2409 res = setup_overlay(file, on);
2410 mutex_unlock(&zr->resource_lock);
2415 static int zoran_streamoff(struct file *file, void *__fh, enum v4l2_buf_type type);
2417 static int zoran_reqbufs(struct file *file, void *__fh, struct v4l2_requestbuffers *req)
2419 struct zoran_fh *fh = __fh;
2420 struct zoran *zr = fh->zr;
2423 if (req->memory != V4L2_MEMORY_MMAP) {
2426 "%s: only MEMORY_MMAP capture is supported, not %d\n",
2427 ZR_DEVNAME(zr), req->memory);
2431 if (req->count == 0)
2432 return zoran_streamoff(file, fh, req->type);
2434 mutex_lock(&zr->resource_lock);
2435 if (fh->v4l_buffers.allocated || fh->jpg_buffers.allocated) {
2438 "%s: VIDIOC_REQBUFS - buffers already allocated\n",
2441 goto v4l2reqbuf_unlock_and_return;
2444 if (fh->map_mode == ZORAN_MAP_MODE_RAW &&
2445 req->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
2447 /* control user input */
2450 if (req->count > v4l_nbufs)
2451 req->count = v4l_nbufs;
2452 fh->v4l_buffers.num_buffers = req->count;
2454 if (v4l_fbuffer_alloc(file)) {
2456 goto v4l2reqbuf_unlock_and_return;
2459 /* The next mmap will map the V4L buffers */
2460 fh->map_mode = ZORAN_MAP_MODE_RAW;
2462 } else if (fh->map_mode == ZORAN_MAP_MODE_JPG_REC ||
2463 fh->map_mode == ZORAN_MAP_MODE_JPG_PLAY) {
2465 /* we need to calculate size ourselves now */
2468 if (req->count > jpg_nbufs)
2469 req->count = jpg_nbufs;
2470 fh->jpg_buffers.num_buffers = req->count;
2471 fh->jpg_buffers.buffer_size =
2472 zoran_v4l2_calc_bufsize(&fh->jpg_settings);
2474 if (jpg_fbuffer_alloc(file)) {
2476 goto v4l2reqbuf_unlock_and_return;
2479 /* The next mmap will map the MJPEG buffers */
2480 if (req->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
2481 fh->map_mode = ZORAN_MAP_MODE_JPG_REC;
2483 fh->map_mode = ZORAN_MAP_MODE_JPG_PLAY;
2488 "%s: VIDIOC_REQBUFS - unknown type %d\n",
2489 ZR_DEVNAME(zr), req->type);
2491 goto v4l2reqbuf_unlock_and_return;
2493 v4l2reqbuf_unlock_and_return:
2494 mutex_unlock(&zr->resource_lock);
2499 static int zoran_querybuf(struct file *file, void *__fh, struct v4l2_buffer *buf)
2501 struct zoran_fh *fh = __fh;
2502 struct zoran *zr = fh->zr;
2503 __u32 type = buf->type;
2504 int index = buf->index, res;
2506 memset(buf, 0, sizeof(*buf));
2510 mutex_lock(&zr->resource_lock);
2511 res = zoran_v4l2_buffer_status(file, buf, buf->index);
2512 mutex_unlock(&zr->resource_lock);
2517 static int zoran_qbuf(struct file *file, void *__fh, struct v4l2_buffer *buf)
2519 struct zoran_fh *fh = __fh;
2520 struct zoran *zr = fh->zr;
2521 int res = 0, codec_mode, buf_type;
2523 mutex_lock(&zr->resource_lock);
2525 switch (fh->map_mode) {
2526 case ZORAN_MAP_MODE_RAW:
2527 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
2529 "%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
2530 ZR_DEVNAME(zr), buf->type, fh->map_mode);
2532 goto qbuf_unlock_and_return;
2535 res = zoran_v4l_queue_frame(file, buf->index);
2537 goto qbuf_unlock_and_return;
2538 if (!zr->v4l_memgrab_active &&
2539 fh->v4l_buffers.active == ZORAN_LOCKED)
2540 zr36057_set_memgrab(zr, 1);
2543 case ZORAN_MAP_MODE_JPG_REC:
2544 case ZORAN_MAP_MODE_JPG_PLAY:
2545 if (fh->map_mode == ZORAN_MAP_MODE_JPG_PLAY) {
2546 buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
2547 codec_mode = BUZ_MODE_MOTION_DECOMPRESS;
2549 buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2550 codec_mode = BUZ_MODE_MOTION_COMPRESS;
2553 if (buf->type != buf_type) {
2555 "%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
2556 ZR_DEVNAME(zr), buf->type, fh->map_mode);
2558 goto qbuf_unlock_and_return;
2561 res = zoran_jpg_queue_frame(file, buf->index,
2564 goto qbuf_unlock_and_return;
2565 if (zr->codec_mode == BUZ_MODE_IDLE &&
2566 fh->jpg_buffers.active == ZORAN_LOCKED) {
2567 zr36057_enable_jpg(zr, codec_mode);
2573 "%s: VIDIOC_QBUF - unsupported type %d\n",
2574 ZR_DEVNAME(zr), buf->type);
2578 qbuf_unlock_and_return:
2579 mutex_unlock(&zr->resource_lock);
2584 static int zoran_dqbuf(struct file *file, void *__fh, struct v4l2_buffer *buf)
2586 struct zoran_fh *fh = __fh;
2587 struct zoran *zr = fh->zr;
2588 int res = 0, buf_type, num = -1; /* compiler borks here (?) */
2590 mutex_lock(&zr->resource_lock);
2592 switch (fh->map_mode) {
2593 case ZORAN_MAP_MODE_RAW:
2594 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
2596 "%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
2597 ZR_DEVNAME(zr), buf->type, fh->map_mode);
2599 goto dqbuf_unlock_and_return;
2602 num = zr->v4l_pend[zr->v4l_sync_tail & V4L_MASK_FRAME];
2603 if (file->f_flags & O_NONBLOCK &&
2604 zr->v4l_buffers.buffer[num].state != BUZ_STATE_DONE) {
2606 goto dqbuf_unlock_and_return;
2608 res = v4l_sync(file, num);
2610 goto dqbuf_unlock_and_return;
2611 zr->v4l_sync_tail++;
2612 res = zoran_v4l2_buffer_status(file, buf, num);
2615 case ZORAN_MAP_MODE_JPG_REC:
2616 case ZORAN_MAP_MODE_JPG_PLAY:
2618 struct zoran_sync bs;
2620 if (fh->map_mode == ZORAN_MAP_MODE_JPG_PLAY)
2621 buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
2623 buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2625 if (buf->type != buf_type) {
2627 "%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
2628 ZR_DEVNAME(zr), buf->type, fh->map_mode);
2630 goto dqbuf_unlock_and_return;
2633 num = zr->jpg_pend[zr->jpg_que_tail & BUZ_MASK_FRAME];
2635 if (file->f_flags & O_NONBLOCK &&
2636 zr->jpg_buffers.buffer[num].state != BUZ_STATE_DONE) {
2638 goto dqbuf_unlock_and_return;
2640 res = jpg_sync(file, &bs);
2642 goto dqbuf_unlock_and_return;
2643 res = zoran_v4l2_buffer_status(file, buf, bs.frame);
2649 "%s: VIDIOC_DQBUF - unsupported type %d\n",
2650 ZR_DEVNAME(zr), buf->type);
2654 dqbuf_unlock_and_return:
2655 mutex_unlock(&zr->resource_lock);
2660 static int zoran_streamon(struct file *file, void *__fh, enum v4l2_buf_type type)
2662 struct zoran_fh *fh = __fh;
2663 struct zoran *zr = fh->zr;
2666 mutex_lock(&zr->resource_lock);
2668 switch (fh->map_mode) {
2669 case ZORAN_MAP_MODE_RAW: /* raw capture */
2670 if (zr->v4l_buffers.active != ZORAN_ACTIVE ||
2671 fh->v4l_buffers.active != ZORAN_ACTIVE) {
2673 goto strmon_unlock_and_return;
2676 zr->v4l_buffers.active = fh->v4l_buffers.active = ZORAN_LOCKED;
2677 zr->v4l_settings = fh->v4l_settings;
2679 zr->v4l_sync_tail = zr->v4l_pend_tail;
2680 if (!zr->v4l_memgrab_active &&
2681 zr->v4l_pend_head != zr->v4l_pend_tail) {
2682 zr36057_set_memgrab(zr, 1);
2686 case ZORAN_MAP_MODE_JPG_REC:
2687 case ZORAN_MAP_MODE_JPG_PLAY:
2688 /* what is the codec mode right now? */
2689 if (zr->jpg_buffers.active != ZORAN_ACTIVE ||
2690 fh->jpg_buffers.active != ZORAN_ACTIVE) {
2692 goto strmon_unlock_and_return;
2695 zr->jpg_buffers.active = fh->jpg_buffers.active = ZORAN_LOCKED;
2697 if (zr->jpg_que_head != zr->jpg_que_tail) {
2698 /* Start the jpeg codec when the first frame is queued */
2706 "%s: VIDIOC_STREAMON - invalid map mode %d\n",
2707 ZR_DEVNAME(zr), fh->map_mode);
2711 strmon_unlock_and_return:
2712 mutex_unlock(&zr->resource_lock);
2717 static int zoran_streamoff(struct file *file, void *__fh, enum v4l2_buf_type type)
2719 struct zoran_fh *fh = __fh;
2720 struct zoran *zr = fh->zr;
2723 mutex_lock(&zr->resource_lock);
2725 switch (fh->map_mode) {
2726 case ZORAN_MAP_MODE_RAW: /* raw capture */
2727 if (fh->v4l_buffers.active == ZORAN_FREE &&
2728 zr->v4l_buffers.active != ZORAN_FREE) {
2729 res = -EPERM; /* stay off other's settings! */
2730 goto strmoff_unlock_and_return;
2732 if (zr->v4l_buffers.active == ZORAN_FREE)
2733 goto strmoff_unlock_and_return;
2735 /* unload capture */
2736 if (zr->v4l_memgrab_active) {
2737 unsigned long flags;
2739 spin_lock_irqsave(&zr->spinlock, flags);
2740 zr36057_set_memgrab(zr, 0);
2741 spin_unlock_irqrestore(&zr->spinlock, flags);
2744 for (i = 0; i < fh->v4l_buffers.num_buffers; i++)
2745 zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER;
2746 fh->v4l_buffers = zr->v4l_buffers;
2748 zr->v4l_buffers.active = fh->v4l_buffers.active = ZORAN_FREE;
2750 zr->v4l_grab_seq = 0;
2751 zr->v4l_pend_head = zr->v4l_pend_tail = 0;
2752 zr->v4l_sync_tail = 0;
2756 case ZORAN_MAP_MODE_JPG_REC:
2757 case ZORAN_MAP_MODE_JPG_PLAY:
2758 if (fh->jpg_buffers.active == ZORAN_FREE &&
2759 zr->jpg_buffers.active != ZORAN_FREE) {
2760 res = -EPERM; /* stay off other's settings! */
2761 goto strmoff_unlock_and_return;
2763 if (zr->jpg_buffers.active == ZORAN_FREE)
2764 goto strmoff_unlock_and_return;
2766 res = jpg_qbuf(file, -1,
2767 (fh->map_mode == ZORAN_MAP_MODE_JPG_REC) ?
2768 BUZ_MODE_MOTION_COMPRESS :
2769 BUZ_MODE_MOTION_DECOMPRESS);
2771 goto strmoff_unlock_and_return;
2775 "%s: VIDIOC_STREAMOFF - invalid map mode %d\n",
2776 ZR_DEVNAME(zr), fh->map_mode);
2780 strmoff_unlock_and_return:
2781 mutex_unlock(&zr->resource_lock);
2786 static int zoran_queryctrl(struct file *file, void *__fh,
2787 struct v4l2_queryctrl *ctrl)
2789 struct zoran_fh *fh = __fh;
2790 struct zoran *zr = fh->zr;
2792 /* we only support hue/saturation/contrast/brightness */
2793 if (ctrl->id < V4L2_CID_BRIGHTNESS ||
2794 ctrl->id > V4L2_CID_HUE)
2797 decoder_call(zr, core, queryctrl, ctrl);
2802 static int zoran_g_ctrl(struct file *file, void *__fh, struct v4l2_control *ctrl)
2804 struct zoran_fh *fh = __fh;
2805 struct zoran *zr = fh->zr;
2807 /* we only support hue/saturation/contrast/brightness */
2808 if (ctrl->id < V4L2_CID_BRIGHTNESS ||
2809 ctrl->id > V4L2_CID_HUE)
2812 mutex_lock(&zr->resource_lock);
2813 decoder_call(zr, core, g_ctrl, ctrl);
2814 mutex_unlock(&zr->resource_lock);
2819 static int zoran_s_ctrl(struct file *file, void *__fh, struct v4l2_control *ctrl)
2821 struct zoran_fh *fh = __fh;
2822 struct zoran *zr = fh->zr;
2824 /* we only support hue/saturation/contrast/brightness */
2825 if (ctrl->id < V4L2_CID_BRIGHTNESS ||
2826 ctrl->id > V4L2_CID_HUE)
2829 mutex_lock(&zr->resource_lock);
2830 decoder_call(zr, core, s_ctrl, ctrl);
2831 mutex_unlock(&zr->resource_lock);
2836 static int zoran_g_std(struct file *file, void *__fh, v4l2_std_id *std)
2838 struct zoran_fh *fh = __fh;
2839 struct zoran *zr = fh->zr;
2841 mutex_lock(&zr->resource_lock);
2843 mutex_unlock(&zr->resource_lock);
2847 static int zoran_s_std(struct file *file, void *__fh, v4l2_std_id *std)
2849 struct zoran_fh *fh = __fh;
2850 struct zoran *zr = fh->zr;
2853 mutex_lock(&zr->resource_lock);
2854 res = zoran_set_norm(zr, *std);
2856 goto sstd_unlock_and_return;
2858 res = wait_grab_pending(zr);
2859 sstd_unlock_and_return:
2860 mutex_unlock(&zr->resource_lock);
2864 static int zoran_enum_input(struct file *file, void *__fh,
2865 struct v4l2_input *inp)
2867 struct zoran_fh *fh = __fh;
2868 struct zoran *zr = fh->zr;
2870 if (inp->index < 0 || inp->index >= zr->card.inputs)
2873 int id = inp->index;
2874 memset(inp, 0, sizeof(*inp));
2878 strncpy(inp->name, zr->card.input[inp->index].name,
2879 sizeof(inp->name) - 1);
2880 inp->type = V4L2_INPUT_TYPE_CAMERA;
2881 inp->std = V4L2_STD_ALL;
2883 /* Get status of video decoder */
2884 mutex_lock(&zr->resource_lock);
2885 decoder_call(zr, video, g_input_status, &inp->status);
2886 mutex_unlock(&zr->resource_lock);
2890 static int zoran_g_input(struct file *file, void *__fh, unsigned int *input)
2892 struct zoran_fh *fh = __fh;
2893 struct zoran *zr = fh->zr;
2895 mutex_lock(&zr->resource_lock);
2897 mutex_unlock(&zr->resource_lock);
2902 static int zoran_s_input(struct file *file, void *__fh, unsigned int input)
2904 struct zoran_fh *fh = __fh;
2905 struct zoran *zr = fh->zr;
2908 mutex_lock(&zr->resource_lock);
2909 res = zoran_set_input(zr, input);
2911 goto sinput_unlock_and_return;
2913 /* Make sure the changes come into effect */
2914 res = wait_grab_pending(zr);
2915 sinput_unlock_and_return:
2916 mutex_unlock(&zr->resource_lock);
2920 static int zoran_enum_output(struct file *file, void *__fh,
2921 struct v4l2_output *outp)
2923 if (outp->index != 0)
2926 memset(outp, 0, sizeof(*outp));
2928 outp->type = V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY;
2929 strncpy(outp->name, "Autodetect", sizeof(outp->name)-1);
2934 static int zoran_g_output(struct file *file, void *__fh, unsigned int *output)
2941 static int zoran_s_output(struct file *file, void *__fh, unsigned int output)
2949 /* cropping (sub-frame capture) */
2950 static int zoran_cropcap(struct file *file, void *__fh,
2951 struct v4l2_cropcap *cropcap)
2953 struct zoran_fh *fh = __fh;
2954 struct zoran *zr = fh->zr;
2955 int type = cropcap->type, res = 0;
2957 memset(cropcap, 0, sizeof(*cropcap));
2958 cropcap->type = type;
2960 mutex_lock(&zr->resource_lock);
2962 if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
2963 (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2964 fh->map_mode == ZORAN_MAP_MODE_RAW)) {
2966 "%s: VIDIOC_CROPCAP - subcapture only supported for compressed capture\n",
2969 goto cropcap_unlock_and_return;
2972 cropcap->bounds.top = cropcap->bounds.left = 0;
2973 cropcap->bounds.width = BUZ_MAX_WIDTH;
2974 cropcap->bounds.height = BUZ_MAX_HEIGHT;
2975 cropcap->defrect.top = cropcap->defrect.left = 0;
2976 cropcap->defrect.width = BUZ_MIN_WIDTH;
2977 cropcap->defrect.height = BUZ_MIN_HEIGHT;
2978 cropcap_unlock_and_return:
2979 mutex_unlock(&zr->resource_lock);
2983 static int zoran_g_crop(struct file *file, void *__fh, struct v4l2_crop *crop)
2985 struct zoran_fh *fh = __fh;
2986 struct zoran *zr = fh->zr;
2987 int type = crop->type, res = 0;
2989 memset(crop, 0, sizeof(*crop));
2992 mutex_lock(&zr->resource_lock);
2994 if (crop->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
2995 (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2996 fh->map_mode == ZORAN_MAP_MODE_RAW)) {
2999 "%s: VIDIOC_G_CROP - subcapture only supported for compressed capture\n",
3002 goto gcrop_unlock_and_return;
3005 crop->c.top = fh->jpg_settings.img_y;
3006 crop->c.left = fh->jpg_settings.img_x;
3007 crop->c.width = fh->jpg_settings.img_width;
3008 crop->c.height = fh->jpg_settings.img_height;
3010 gcrop_unlock_and_return:
3011 mutex_unlock(&zr->resource_lock);
3016 static int zoran_s_crop(struct file *file, void *__fh, struct v4l2_crop *crop)
3018 struct zoran_fh *fh = __fh;
3019 struct zoran *zr = fh->zr;
3021 struct zoran_jpg_settings settings;
3023 settings = fh->jpg_settings;
3025 mutex_lock(&zr->resource_lock);
3027 if (fh->jpg_buffers.allocated || fh->v4l_buffers.allocated) {
3029 "%s: VIDIOC_S_CROP - cannot change settings while active\n",
3032 goto scrop_unlock_and_return;
3035 if (crop->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
3036 (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
3037 fh->map_mode == ZORAN_MAP_MODE_RAW)) {
3039 "%s: VIDIOC_G_CROP - subcapture only supported for compressed capture\n",
3042 goto scrop_unlock_and_return;
3045 /* move into a form that we understand */
3046 settings.img_x = crop->c.left;
3047 settings.img_y = crop->c.top;
3048 settings.img_width = crop->c.width;
3049 settings.img_height = crop->c.height;
3051 /* check validity */
3052 res = zoran_check_jpg_settings(zr, &settings, 0);
3054 goto scrop_unlock_and_return;
3057 fh->jpg_settings = settings;
3059 scrop_unlock_and_return:
3060 mutex_unlock(&zr->resource_lock);
3064 static int zoran_g_jpegcomp(struct file *file, void *__fh,
3065 struct v4l2_jpegcompression *params)
3067 struct zoran_fh *fh = __fh;
3068 struct zoran *zr = fh->zr;
3069 memset(params, 0, sizeof(*params));
3071 mutex_lock(&zr->resource_lock);
3073 params->quality = fh->jpg_settings.jpg_comp.quality;
3074 params->APPn = fh->jpg_settings.jpg_comp.APPn;
3075 memcpy(params->APP_data,
3076 fh->jpg_settings.jpg_comp.APP_data,
3077 fh->jpg_settings.jpg_comp.APP_len);
3078 params->APP_len = fh->jpg_settings.jpg_comp.APP_len;
3079 memcpy(params->COM_data,
3080 fh->jpg_settings.jpg_comp.COM_data,
3081 fh->jpg_settings.jpg_comp.COM_len);
3082 params->COM_len = fh->jpg_settings.jpg_comp.COM_len;
3083 params->jpeg_markers =
3084 fh->jpg_settings.jpg_comp.jpeg_markers;
3086 mutex_unlock(&zr->resource_lock);
3091 static int zoran_s_jpegcomp(struct file *file, void *__fh,
3092 struct v4l2_jpegcompression *params)
3094 struct zoran_fh *fh = __fh;
3095 struct zoran *zr = fh->zr;
3097 struct zoran_jpg_settings settings;
3099 settings = fh->jpg_settings;
3101 settings.jpg_comp = *params;
3103 mutex_lock(&zr->resource_lock);
3105 if (fh->v4l_buffers.active != ZORAN_FREE ||
3106 fh->jpg_buffers.active != ZORAN_FREE) {
3107 dprintk(1, KERN_WARNING
3108 "%s: VIDIOC_S_JPEGCOMP called while in playback/capture mode\n",
3111 goto sjpegc_unlock_and_return;
3114 res = zoran_check_jpg_settings(zr, &settings, 0);
3116 goto sjpegc_unlock_and_return;
3117 if (!fh->jpg_buffers.allocated)
3118 fh->jpg_buffers.buffer_size =
3119 zoran_v4l2_calc_bufsize(&fh->jpg_settings);
3120 fh->jpg_settings.jpg_comp = *params = settings.jpg_comp;
3121 sjpegc_unlock_and_return:
3122 mutex_unlock(&zr->resource_lock);
3128 zoran_poll (struct file *file,
3131 struct zoran_fh *fh = file->private_data;
3132 struct zoran *zr = fh->zr;
3134 unsigned long flags;
3136 /* we should check whether buffers are ready to be synced on
3137 * (w/o waits - O_NONBLOCK) here
3138 * if ready for read (sync), return POLLIN|POLLRDNORM,
3139 * if ready for write (sync), return POLLOUT|POLLWRNORM,
3140 * if error, return POLLERR,
3141 * if no buffers queued or so, return POLLNVAL
3144 mutex_lock(&zr->resource_lock);
3146 switch (fh->map_mode) {
3147 case ZORAN_MAP_MODE_RAW:
3148 poll_wait(file, &zr->v4l_capq, wait);
3149 frame = zr->v4l_pend[zr->v4l_sync_tail & V4L_MASK_FRAME];
3151 spin_lock_irqsave(&zr->spinlock, flags);
3154 "%s: %s() raw - active=%c, sync_tail=%lu/%c, pend_tail=%lu, pend_head=%lu\n",
3155 ZR_DEVNAME(zr), __func__,
3156 "FAL"[fh->v4l_buffers.active], zr->v4l_sync_tail,
3157 "UPMD"[zr->v4l_buffers.buffer[frame].state],
3158 zr->v4l_pend_tail, zr->v4l_pend_head);
3159 /* Process is the one capturing? */
3160 if (fh->v4l_buffers.active != ZORAN_FREE &&
3161 /* Buffer ready to DQBUF? */
3162 zr->v4l_buffers.buffer[frame].state == BUZ_STATE_DONE)
3163 res = POLLIN | POLLRDNORM;
3164 spin_unlock_irqrestore(&zr->spinlock, flags);
3168 case ZORAN_MAP_MODE_JPG_REC:
3169 case ZORAN_MAP_MODE_JPG_PLAY:
3170 poll_wait(file, &zr->jpg_capq, wait);
3171 frame = zr->jpg_pend[zr->jpg_que_tail & BUZ_MASK_FRAME];
3173 spin_lock_irqsave(&zr->spinlock, flags);
3176 "%s: %s() jpg - active=%c, que_tail=%lu/%c, que_head=%lu, dma=%lu/%lu\n",
3177 ZR_DEVNAME(zr), __func__,
3178 "FAL"[fh->jpg_buffers.active], zr->jpg_que_tail,
3179 "UPMD"[zr->jpg_buffers.buffer[frame].state],
3180 zr->jpg_que_head, zr->jpg_dma_tail, zr->jpg_dma_head);
3181 if (fh->jpg_buffers.active != ZORAN_FREE &&
3182 zr->jpg_buffers.buffer[frame].state == BUZ_STATE_DONE) {
3183 if (fh->map_mode == ZORAN_MAP_MODE_JPG_REC)
3184 res = POLLIN | POLLRDNORM;
3186 res = POLLOUT | POLLWRNORM;
3188 spin_unlock_irqrestore(&zr->spinlock, flags);
3195 "%s: zoran_poll() - internal error, unknown map_mode=%d\n",
3196 ZR_DEVNAME(zr), fh->map_mode);
3200 mutex_unlock(&zr->resource_lock);
3207 * This maps the buffers to user space.
3209 * Depending on the state of fh->map_mode
3210 * the V4L or the MJPEG buffers are mapped
3211 * per buffer or all together
3213 * Note that we need to connect to some
3214 * unmap signal event to unmap the de-allocate
3215 * the buffer accordingly (zoran_vm_close())
3219 zoran_vm_open (struct vm_area_struct *vma)
3221 struct zoran_mapping *map = vma->vm_private_data;
3227 zoran_vm_close (struct vm_area_struct *vma)
3229 struct zoran_mapping *map = vma->vm_private_data;
3230 struct file *file = map->file;
3231 struct zoran_fh *fh = file->private_data;
3232 struct zoran *zr = fh->zr;
3236 if (map->count == 0) {
3237 switch (fh->map_mode) {
3238 case ZORAN_MAP_MODE_JPG_REC:
3239 case ZORAN_MAP_MODE_JPG_PLAY:
3241 dprintk(3, KERN_INFO "%s: munmap(MJPEG)\n",
3244 for (i = 0; i < fh->jpg_buffers.num_buffers; i++) {
3245 if (fh->jpg_buffers.buffer[i].map == map) {
3246 fh->jpg_buffers.buffer[i].map =
3252 for (i = 0; i < fh->jpg_buffers.num_buffers; i++)
3253 if (fh->jpg_buffers.buffer[i].map)
3255 if (i == fh->jpg_buffers.num_buffers) {
3256 mutex_lock(&zr->resource_lock);
3258 if (fh->jpg_buffers.active != ZORAN_FREE) {
3259 jpg_qbuf(file, -1, zr->codec_mode);
3260 zr->jpg_buffers.allocated = 0;
3261 zr->jpg_buffers.active =
3262 fh->jpg_buffers.active =
3265 jpg_fbuffer_free(file);
3266 mutex_unlock(&zr->resource_lock);
3271 case ZORAN_MAP_MODE_RAW:
3273 dprintk(3, KERN_INFO "%s: munmap(V4L)\n",
3276 for (i = 0; i < fh->v4l_buffers.num_buffers; i++) {
3277 if (fh->v4l_buffers.buffer[i].map == map) {
3279 fh->v4l_buffers.buffer[i].map =
3285 for (i = 0; i < fh->v4l_buffers.num_buffers; i++)
3286 if (fh->v4l_buffers.buffer[i].map)
3288 if (i == fh->v4l_buffers.num_buffers) {
3289 mutex_lock(&zr->resource_lock);
3291 if (fh->v4l_buffers.active != ZORAN_FREE) {
3292 unsigned long flags;
3294 spin_lock_irqsave(&zr->spinlock, flags);
3295 zr36057_set_memgrab(zr, 0);
3296 zr->v4l_buffers.allocated = 0;
3297 zr->v4l_buffers.active =
3298 fh->v4l_buffers.active =
3300 spin_unlock_irqrestore(&zr->spinlock, flags);
3302 v4l_fbuffer_free(file);
3303 mutex_unlock(&zr->resource_lock);
3310 "%s: munmap() - internal error - unknown map mode %d\n",
3311 ZR_DEVNAME(zr), fh->map_mode);
3318 static struct vm_operations_struct zoran_vm_ops = {
3319 .open = zoran_vm_open,
3320 .close = zoran_vm_close,
3324 zoran_mmap (struct file *file,
3325 struct vm_area_struct *vma)
3327 struct zoran_fh *fh = file->private_data;
3328 struct zoran *zr = fh->zr;
3329 unsigned long size = (vma->vm_end - vma->vm_start);
3330 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
3332 unsigned long page, start = vma->vm_start, todo, pos, fraglen;
3334 struct zoran_mapping *map;
3338 KERN_INFO "%s: mmap(%s) of 0x%08lx-0x%08lx (size=%lu)\n",
3340 fh->map_mode == ZORAN_MAP_MODE_RAW ? "V4L" : "MJPEG",
3341 vma->vm_start, vma->vm_end, size);
3343 if (!(vma->vm_flags & VM_SHARED) || !(vma->vm_flags & VM_READ) ||
3344 !(vma->vm_flags & VM_WRITE)) {
3347 "%s: mmap() - no MAP_SHARED/PROT_{READ,WRITE} given\n",
3352 switch (fh->map_mode) {
3354 case ZORAN_MAP_MODE_JPG_REC:
3355 case ZORAN_MAP_MODE_JPG_PLAY:
3358 mutex_lock(&zr->resource_lock);
3360 /* Map the MJPEG buffers */
3361 if (!fh->jpg_buffers.allocated) {
3364 "%s: zoran_mmap(MJPEG) - buffers not yet allocated\n",
3367 goto jpg_mmap_unlock_and_return;
3370 first = offset / fh->jpg_buffers.buffer_size;
3371 last = first - 1 + size / fh->jpg_buffers.buffer_size;
3372 if (offset % fh->jpg_buffers.buffer_size != 0 ||
3373 size % fh->jpg_buffers.buffer_size != 0 || first < 0 ||
3374 last < 0 || first >= fh->jpg_buffers.num_buffers ||
3375 last >= fh->jpg_buffers.num_buffers) {
3378 "%s: mmap(MJPEG) - offset=%lu or size=%lu invalid for bufsize=%d and numbufs=%d\n",
3379 ZR_DEVNAME(zr), offset, size,
3380 fh->jpg_buffers.buffer_size,
3381 fh->jpg_buffers.num_buffers);
3383 goto jpg_mmap_unlock_and_return;
3385 for (i = first; i <= last; i++) {
3386 if (fh->jpg_buffers.buffer[i].map) {
3389 "%s: mmap(MJPEG) - buffer %d already mapped\n",
3392 goto jpg_mmap_unlock_and_return;
3396 /* map these buffers (v4l_buffers[i]) */
3397 map = kmalloc(sizeof(struct zoran_mapping), GFP_KERNEL);
3400 goto jpg_mmap_unlock_and_return;
3405 vma->vm_ops = &zoran_vm_ops;
3406 vma->vm_flags |= VM_DONTEXPAND;
3407 vma->vm_private_data = map;
3409 for (i = first; i <= last; i++) {
3411 j < fh->jpg_buffers.buffer_size / PAGE_SIZE;
3414 (le32_to_cpu(fh->jpg_buffers.buffer[i].
3415 frag_tab[2 * j + 1]) & ~1) << 1;
3420 le32_to_cpu(fh->jpg_buffers.
3421 buffer[i].frag_tab[2 * j]);
3422 /* should just be pos on i386 */
3423 page = virt_to_phys(bus_to_virt(pos))
3425 if (remap_pfn_range(vma, start, page,
3426 todo, PAGE_SHARED)) {
3429 "%s: zoran_mmap(V4L) - remap_pfn_range failed\n",
3432 goto jpg_mmap_unlock_and_return;
3438 if (le32_to_cpu(fh->jpg_buffers.buffer[i].
3439 frag_tab[2 * j + 1]) & 1)
3440 break; /* was last fragment */
3442 fh->jpg_buffers.buffer[i].map = map;
3447 jpg_mmap_unlock_and_return:
3448 mutex_unlock(&zr->resource_lock);
3452 case ZORAN_MAP_MODE_RAW:
3454 mutex_lock(&zr->resource_lock);
3456 /* Map the V4L buffers */
3457 if (!fh->v4l_buffers.allocated) {
3460 "%s: zoran_mmap(V4L) - buffers not yet allocated\n",
3463 goto v4l_mmap_unlock_and_return;
3466 first = offset / fh->v4l_buffers.buffer_size;
3467 last = first - 1 + size / fh->v4l_buffers.buffer_size;
3468 if (offset % fh->v4l_buffers.buffer_size != 0 ||
3469 size % fh->v4l_buffers.buffer_size != 0 || first < 0 ||
3470 last < 0 || first >= fh->v4l_buffers.num_buffers ||
3471 last >= fh->v4l_buffers.buffer_size) {
3474 "%s: mmap(V4L) - offset=%lu or size=%lu invalid for bufsize=%d and numbufs=%d\n",
3475 ZR_DEVNAME(zr), offset, size,
3476 fh->v4l_buffers.buffer_size,
3477 fh->v4l_buffers.num_buffers);
3479 goto v4l_mmap_unlock_and_return;
3481 for (i = first; i <= last; i++) {
3482 if (fh->v4l_buffers.buffer[i].map) {
3485 "%s: mmap(V4L) - buffer %d already mapped\n",
3488 goto v4l_mmap_unlock_and_return;
3492 /* map these buffers (v4l_buffers[i]) */
3493 map = kmalloc(sizeof(struct zoran_mapping), GFP_KERNEL);
3496 goto v4l_mmap_unlock_and_return;
3501 vma->vm_ops = &zoran_vm_ops;
3502 vma->vm_flags |= VM_DONTEXPAND;
3503 vma->vm_private_data = map;
3505 for (i = first; i <= last; i++) {
3507 if (todo > fh->v4l_buffers.buffer_size)
3508 todo = fh->v4l_buffers.buffer_size;
3509 page = fh->v4l_buffers.buffer[i].fbuffer_phys;
3510 if (remap_pfn_range(vma, start, page >> PAGE_SHIFT,
3511 todo, PAGE_SHARED)) {
3514 "%s: zoran_mmap(V4L)i - remap_pfn_range failed\n",
3517 goto v4l_mmap_unlock_and_return;
3521 fh->v4l_buffers.buffer[i].map = map;
3525 v4l_mmap_unlock_and_return:
3526 mutex_unlock(&zr->resource_lock);
3533 "%s: zoran_mmap() - internal error - unknown map mode %d\n",
3534 ZR_DEVNAME(zr), fh->map_mode);
3541 static const struct v4l2_ioctl_ops zoran_ioctl_ops = {
3542 .vidioc_querycap = zoran_querycap,
3543 .vidioc_cropcap = zoran_cropcap,
3544 .vidioc_s_crop = zoran_s_crop,
3545 .vidioc_g_crop = zoran_g_crop,
3546 .vidioc_enum_input = zoran_enum_input,
3547 .vidioc_g_input = zoran_g_input,
3548 .vidioc_s_input = zoran_s_input,
3549 .vidioc_enum_output = zoran_enum_output,
3550 .vidioc_g_output = zoran_g_output,
3551 .vidioc_s_output = zoran_s_output,
3552 .vidioc_g_fbuf = zoran_g_fbuf,
3553 .vidioc_s_fbuf = zoran_s_fbuf,
3554 .vidioc_g_std = zoran_g_std,
3555 .vidioc_s_std = zoran_s_std,
3556 .vidioc_g_jpegcomp = zoran_g_jpegcomp,
3557 .vidioc_s_jpegcomp = zoran_s_jpegcomp,
3558 .vidioc_overlay = zoran_overlay,
3559 .vidioc_reqbufs = zoran_reqbufs,
3560 .vidioc_querybuf = zoran_querybuf,
3561 .vidioc_qbuf = zoran_qbuf,
3562 .vidioc_dqbuf = zoran_dqbuf,
3563 .vidioc_streamon = zoran_streamon,
3564 .vidioc_streamoff = zoran_streamoff,
3565 .vidioc_enum_fmt_vid_cap = zoran_enum_fmt_vid_cap,
3566 .vidioc_enum_fmt_vid_out = zoran_enum_fmt_vid_out,
3567 .vidioc_enum_fmt_vid_overlay = zoran_enum_fmt_vid_overlay,
3568 .vidioc_g_fmt_vid_cap = zoran_g_fmt_vid_cap,
3569 .vidioc_g_fmt_vid_out = zoran_g_fmt_vid_out,
3570 .vidioc_g_fmt_vid_overlay = zoran_g_fmt_vid_overlay,
3571 .vidioc_s_fmt_vid_cap = zoran_s_fmt_vid_cap,
3572 .vidioc_s_fmt_vid_out = zoran_s_fmt_vid_out,
3573 .vidioc_s_fmt_vid_overlay = zoran_s_fmt_vid_overlay,
3574 .vidioc_try_fmt_vid_cap = zoran_try_fmt_vid_cap,
3575 .vidioc_try_fmt_vid_out = zoran_try_fmt_vid_out,
3576 .vidioc_try_fmt_vid_overlay = zoran_try_fmt_vid_overlay,
3577 .vidioc_queryctrl = zoran_queryctrl,
3578 .vidioc_s_ctrl = zoran_s_ctrl,
3579 .vidioc_g_ctrl = zoran_g_ctrl,
3580 #ifdef CONFIG_VIDEO_V4L1_COMPAT
3581 .vidioc_default = zoran_default,
3582 .vidiocgmbuf = zoran_vidiocgmbuf,
3586 static const struct v4l2_file_operations zoran_fops = {
3587 .owner = THIS_MODULE,
3589 .release = zoran_close,
3590 .ioctl = video_ioctl2,
3592 .write = zoran_write,
3597 struct video_device zoran_template __devinitdata = {
3599 .fops = &zoran_fops,
3600 .ioctl_ops = &zoran_ioctl_ops,
3601 .release = &zoran_vdev_release,
3602 .tvnorms = V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM,