1/*
2 * Zoran zr36057/zr36067 PCI controller driver, for the
3 * Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
4 * Media Labs LML33/LML33R10.
5 *
6 * Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
7 *
8 * Changes for BUZ by Wolfgang Scherr <scherr@net4you.net>
9 *
10 * Changes for DC10/DC30 by Laurent Pinchart <laurent.pinchart@skynet.be>
11 *
12 * Changes for LML33R10 by Maxim Yevtyushkin <max@linuxmedialabs.com>
13 *
14 * Changes for videodev2/v4l2 by Ronald Bultje <rbultje@ronald.bitfreak.net>
15 *
16 * Based on
17 *
18 * Miro DC10 driver
19 * Copyright (C) 1999 Wolfgang Scherr <scherr@net4you.net>
20 *
21 * Iomega Buz driver version 1.0
22 * Copyright (C) 1999 Rainer Johanni <Rainer@Johanni.de>
23 *
24 * buz.0.0.3
25 * Copyright (C) 1998 Dave Perks <dperks@ibm.net>
26 *
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)
30 *
31 *
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.
36 *
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.
41 *
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.
45 */
46
47#include <linux/init.h>
48#include <linux/module.h>
49#include <linux/delay.h>
50#include <linux/slab.h>
51#include <linux/pci.h>
52#include <linux/vmalloc.h>
53#include <linux/wait.h>
54
55#include <linux/interrupt.h>
56#include <linux/i2c.h>
57#include <linux/i2c-algo-bit.h>
58
59#include <linux/spinlock.h>
60
61#include <linux/videodev2.h>
62#include <media/v4l2-common.h>
63#include <media/v4l2-ioctl.h>
64#include <media/v4l2-event.h>
65#include "videocodec.h"
66
67#include <asm/byteorder.h>
68#include <asm/io.h>
69#include <asm/uaccess.h>
70#include <linux/proc_fs.h>
71
72#include <linux/mutex.h>
73#include "zoran.h"
74#include "zoran_device.h"
75#include "zoran_card.h"
76
77
78const struct zoran_format zoran_formats[] = {
79	{
80		.name = "15-bit RGB LE",
81		.fourcc = V4L2_PIX_FMT_RGB555,
82		.colorspace = V4L2_COLORSPACE_SRGB,
83		.depth = 15,
84		.flags = ZORAN_FORMAT_CAPTURE |
85			 ZORAN_FORMAT_OVERLAY,
86		.vfespfr = ZR36057_VFESPFR_RGB555|ZR36057_VFESPFR_ErrDif|
87			   ZR36057_VFESPFR_LittleEndian,
88	}, {
89		.name = "15-bit RGB BE",
90		.fourcc = V4L2_PIX_FMT_RGB555X,
91		.colorspace = V4L2_COLORSPACE_SRGB,
92		.depth = 15,
93		.flags = ZORAN_FORMAT_CAPTURE |
94			 ZORAN_FORMAT_OVERLAY,
95		.vfespfr = ZR36057_VFESPFR_RGB555|ZR36057_VFESPFR_ErrDif,
96	}, {
97		.name = "16-bit RGB LE",
98		.fourcc = V4L2_PIX_FMT_RGB565,
99		.colorspace = V4L2_COLORSPACE_SRGB,
100		.depth = 16,
101		.flags = ZORAN_FORMAT_CAPTURE |
102			 ZORAN_FORMAT_OVERLAY,
103		.vfespfr = ZR36057_VFESPFR_RGB565|ZR36057_VFESPFR_ErrDif|
104			   ZR36057_VFESPFR_LittleEndian,
105	}, {
106		.name = "16-bit RGB BE",
107		.fourcc = V4L2_PIX_FMT_RGB565X,
108		.colorspace = V4L2_COLORSPACE_SRGB,
109		.depth = 16,
110		.flags = ZORAN_FORMAT_CAPTURE |
111			 ZORAN_FORMAT_OVERLAY,
112		.vfespfr = ZR36057_VFESPFR_RGB565|ZR36057_VFESPFR_ErrDif,
113	}, {
114		.name = "24-bit RGB",
115		.fourcc = V4L2_PIX_FMT_BGR24,
116		.colorspace = V4L2_COLORSPACE_SRGB,
117		.depth = 24,
118		.flags = ZORAN_FORMAT_CAPTURE |
119			 ZORAN_FORMAT_OVERLAY,
120		.vfespfr = ZR36057_VFESPFR_RGB888|ZR36057_VFESPFR_Pack24,
121	}, {
122		.name = "32-bit RGB LE",
123		.fourcc = V4L2_PIX_FMT_BGR32,
124		.colorspace = V4L2_COLORSPACE_SRGB,
125		.depth = 32,
126		.flags = ZORAN_FORMAT_CAPTURE |
127			 ZORAN_FORMAT_OVERLAY,
128		.vfespfr = ZR36057_VFESPFR_RGB888|ZR36057_VFESPFR_LittleEndian,
129	}, {
130		.name = "32-bit RGB BE",
131		.fourcc = V4L2_PIX_FMT_RGB32,
132		.colorspace = V4L2_COLORSPACE_SRGB,
133		.depth = 32,
134		.flags = ZORAN_FORMAT_CAPTURE |
135			 ZORAN_FORMAT_OVERLAY,
136		.vfespfr = ZR36057_VFESPFR_RGB888,
137	}, {
138		.name = "4:2:2, packed, YUYV",
139		.fourcc = V4L2_PIX_FMT_YUYV,
140		.colorspace = V4L2_COLORSPACE_SMPTE170M,
141		.depth = 16,
142		.flags = ZORAN_FORMAT_CAPTURE |
143			 ZORAN_FORMAT_OVERLAY,
144		.vfespfr = ZR36057_VFESPFR_YUV422,
145	}, {
146		.name = "4:2:2, packed, UYVY",
147		.fourcc = V4L2_PIX_FMT_UYVY,
148		.colorspace = V4L2_COLORSPACE_SMPTE170M,
149		.depth = 16,
150		.flags = ZORAN_FORMAT_CAPTURE |
151			 ZORAN_FORMAT_OVERLAY,
152		.vfespfr = ZR36057_VFESPFR_YUV422|ZR36057_VFESPFR_LittleEndian,
153	}, {
154		.name = "Hardware-encoded Motion-JPEG",
155		.fourcc = V4L2_PIX_FMT_MJPEG,
156		.colorspace = V4L2_COLORSPACE_SMPTE170M,
157		.depth = 0,
158		.flags = ZORAN_FORMAT_CAPTURE |
159			 ZORAN_FORMAT_PLAYBACK |
160			 ZORAN_FORMAT_COMPRESSED,
161	}
162};
163#define NUM_FORMATS ARRAY_SIZE(zoran_formats)
164
165	/* small helper function for calculating buffersizes for v4l2
166	 * we calculate the nearest higher power-of-two, which
167	 * will be the recommended buffersize */
168static __u32
169zoran_v4l2_calc_bufsize (struct zoran_jpg_settings *settings)
170{
171	__u8 div = settings->VerDcm * settings->HorDcm * settings->TmpDcm;
172	__u32 num = (1024 * 512) / (div);
173	__u32 result = 2;
174
175	num--;
176	while (num) {
177		num >>= 1;
178		result <<= 1;
179	}
180
181	if (result > jpg_bufsize)
182		return jpg_bufsize;
183	if (result < 8192)
184		return 8192;
185	return result;
186}
187
188/* forward references */
189static void v4l_fbuffer_free(struct zoran_fh *fh);
190static void jpg_fbuffer_free(struct zoran_fh *fh);
191
192/* Set mapping mode */
193static void map_mode_raw(struct zoran_fh *fh)
194{
195	fh->map_mode = ZORAN_MAP_MODE_RAW;
196	fh->buffers.buffer_size = v4l_bufsize;
197	fh->buffers.num_buffers = v4l_nbufs;
198}
199static void map_mode_jpg(struct zoran_fh *fh, int play)
200{
201	fh->map_mode = play ? ZORAN_MAP_MODE_JPG_PLAY : ZORAN_MAP_MODE_JPG_REC;
202	fh->buffers.buffer_size = jpg_bufsize;
203	fh->buffers.num_buffers = jpg_nbufs;
204}
205static inline const char *mode_name(enum zoran_map_mode mode)
206{
207	return mode == ZORAN_MAP_MODE_RAW ? "V4L" : "JPG";
208}
209
210/*
211 *   Allocate the V4L grab buffers
212 *
213 *   These have to be pysically contiguous.
214 */
215
216static int v4l_fbuffer_alloc(struct zoran_fh *fh)
217{
218	struct zoran *zr = fh->zr;
219	int i, off;
220	unsigned char *mem;
221
222	for (i = 0; i < fh->buffers.num_buffers; i++) {
223		if (fh->buffers.buffer[i].v4l.fbuffer)
224			dprintk(2,
225				KERN_WARNING
226				"%s: %s - buffer %d already allocated!?\n",
227				ZR_DEVNAME(zr), __func__, i);
228
229		//udelay(20);
230		mem = kmalloc(fh->buffers.buffer_size,
231			      GFP_KERNEL | __GFP_NOWARN);
232		if (!mem) {
233			dprintk(1,
234				KERN_ERR
235				"%s: %s - kmalloc for V4L buf %d failed\n",
236				ZR_DEVNAME(zr), __func__, i);
237			v4l_fbuffer_free(fh);
238			return -ENOBUFS;
239		}
240		fh->buffers.buffer[i].v4l.fbuffer = mem;
241		fh->buffers.buffer[i].v4l.fbuffer_phys = virt_to_phys(mem);
242		fh->buffers.buffer[i].v4l.fbuffer_bus = virt_to_bus(mem);
243		for (off = 0; off < fh->buffers.buffer_size;
244		     off += PAGE_SIZE)
245			SetPageReserved(virt_to_page(mem + off));
246		dprintk(4,
247			KERN_INFO
248			"%s: %s - V4L frame %d mem 0x%lx (bus: 0x%llx)\n",
249			ZR_DEVNAME(zr), __func__, i, (unsigned long) mem,
250			(unsigned long long)virt_to_bus(mem));
251	}
252
253	fh->buffers.allocated = 1;
254
255	return 0;
256}
257
258/* free the V4L grab buffers */
259static void v4l_fbuffer_free(struct zoran_fh *fh)
260{
261	struct zoran *zr = fh->zr;
262	int i, off;
263	unsigned char *mem;
264
265	dprintk(4, KERN_INFO "%s: %s\n", ZR_DEVNAME(zr), __func__);
266
267	for (i = 0; i < fh->buffers.num_buffers; i++) {
268		if (!fh->buffers.buffer[i].v4l.fbuffer)
269			continue;
270
271		mem = fh->buffers.buffer[i].v4l.fbuffer;
272		for (off = 0; off < fh->buffers.buffer_size;
273		     off += PAGE_SIZE)
274			ClearPageReserved(virt_to_page(mem + off));
275		kfree(fh->buffers.buffer[i].v4l.fbuffer);
276		fh->buffers.buffer[i].v4l.fbuffer = NULL;
277	}
278
279	fh->buffers.allocated = 0;
280}
281
282/*
283 *   Allocate the MJPEG grab buffers.
284 *
285 *   If a Natoma chipset is present and this is a revision 1 zr36057,
286 *   each MJPEG buffer needs to be physically contiguous.
287 *   (RJ: This statement is from Dave Perks' original driver,
288 *   I could never check it because I have a zr36067)
289 *
290 *   RJ: The contents grab buffers needs never be accessed in the driver.
291 *       Therefore there is no need to allocate them with vmalloc in order
292 *       to get a contiguous virtual memory space.
293 *       I don't understand why many other drivers first allocate them with
294 *       vmalloc (which uses internally also get_zeroed_page, but delivers you
295 *       virtual addresses) and then again have to make a lot of efforts
296 *       to get the physical address.
297 *
298 *   Ben Capper:
299 *       On big-endian architectures (such as ppc) some extra steps
300 *       are needed. When reading and writing to the stat_com array
301 *       and fragment buffers, the device expects to see little-
302 *       endian values. The use of cpu_to_le32() and le32_to_cpu()
303 *       in this function (and one or two others in zoran_device.c)
304 *       ensure that these values are always stored in little-endian
305 *       form, regardless of architecture. The zr36057 does Very Bad
306 *       Things on big endian architectures if the stat_com array
307 *       and fragment buffers are not little-endian.
308 */
309
310static int jpg_fbuffer_alloc(struct zoran_fh *fh)
311{
312	struct zoran *zr = fh->zr;
313	int i, j, off;
314	u8 *mem;
315
316	for (i = 0; i < fh->buffers.num_buffers; i++) {
317		if (fh->buffers.buffer[i].jpg.frag_tab)
318			dprintk(2,
319				KERN_WARNING
320				"%s: %s - buffer %d already allocated!?\n",
321				ZR_DEVNAME(zr), __func__, i);
322
323		/* Allocate fragment table for this buffer */
324
325		mem = (void *)get_zeroed_page(GFP_KERNEL);
326		if (!mem) {
327			dprintk(1,
328				KERN_ERR
329				"%s: %s - get_zeroed_page (frag_tab) failed for buffer %d\n",
330				ZR_DEVNAME(zr), __func__, i);
331			jpg_fbuffer_free(fh);
332			return -ENOBUFS;
333		}
334		fh->buffers.buffer[i].jpg.frag_tab = (__le32 *)mem;
335		fh->buffers.buffer[i].jpg.frag_tab_bus = virt_to_bus(mem);
336
337		if (fh->buffers.need_contiguous) {
338			mem = kmalloc(fh->buffers.buffer_size, GFP_KERNEL);
339			if (mem == NULL) {
340				dprintk(1,
341					KERN_ERR
342					"%s: %s - kmalloc failed for buffer %d\n",
343					ZR_DEVNAME(zr), __func__, i);
344				jpg_fbuffer_free(fh);
345				return -ENOBUFS;
346			}
347			fh->buffers.buffer[i].jpg.frag_tab[0] =
348				cpu_to_le32(virt_to_bus(mem));
349			fh->buffers.buffer[i].jpg.frag_tab[1] =
350				cpu_to_le32((fh->buffers.buffer_size >> 1) | 1);
351			for (off = 0; off < fh->buffers.buffer_size; off += PAGE_SIZE)
352				SetPageReserved(virt_to_page(mem + off));
353		} else {
354			/* jpg_bufsize is already page aligned */
355			for (j = 0; j < fh->buffers.buffer_size / PAGE_SIZE; j++) {
356				mem = (void *)get_zeroed_page(GFP_KERNEL);
357				if (mem == NULL) {
358					dprintk(1,
359						KERN_ERR
360						"%s: %s - get_zeroed_page failed for buffer %d\n",
361						ZR_DEVNAME(zr), __func__, i);
362					jpg_fbuffer_free(fh);
363					return -ENOBUFS;
364				}
365
366				fh->buffers.buffer[i].jpg.frag_tab[2 * j] =
367					cpu_to_le32(virt_to_bus(mem));
368				fh->buffers.buffer[i].jpg.frag_tab[2 * j + 1] =
369					cpu_to_le32((PAGE_SIZE >> 2) << 1);
370				SetPageReserved(virt_to_page(mem));
371			}
372
373			fh->buffers.buffer[i].jpg.frag_tab[2 * j - 1] |= cpu_to_le32(1);
374		}
375	}
376
377	dprintk(4,
378		KERN_DEBUG "%s: %s - %d KB allocated\n",
379		ZR_DEVNAME(zr), __func__,
380		(fh->buffers.num_buffers * fh->buffers.buffer_size) >> 10);
381
382	fh->buffers.allocated = 1;
383
384	return 0;
385}
386
387/* free the MJPEG grab buffers */
388static void jpg_fbuffer_free(struct zoran_fh *fh)
389{
390	struct zoran *zr = fh->zr;
391	int i, j, off;
392	unsigned char *mem;
393	__le32 frag_tab;
394	struct zoran_buffer *buffer;
395
396	dprintk(4, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
397
398	for (i = 0, buffer = &fh->buffers.buffer[0];
399	     i < fh->buffers.num_buffers; i++, buffer++) {
400		if (!buffer->jpg.frag_tab)
401			continue;
402
403		if (fh->buffers.need_contiguous) {
404			frag_tab = buffer->jpg.frag_tab[0];
405
406			if (frag_tab) {
407				mem = bus_to_virt(le32_to_cpu(frag_tab));
408				for (off = 0; off < fh->buffers.buffer_size; off += PAGE_SIZE)
409					ClearPageReserved(virt_to_page(mem + off));
410				kfree(mem);
411				buffer->jpg.frag_tab[0] = 0;
412				buffer->jpg.frag_tab[1] = 0;
413			}
414		} else {
415			for (j = 0; j < fh->buffers.buffer_size / PAGE_SIZE; j++) {
416				frag_tab = buffer->jpg.frag_tab[2 * j];
417
418				if (!frag_tab)
419					break;
420				ClearPageReserved(virt_to_page(bus_to_virt(le32_to_cpu(frag_tab))));
421				free_page((unsigned long)bus_to_virt(le32_to_cpu(frag_tab)));
422				buffer->jpg.frag_tab[2 * j] = 0;
423				buffer->jpg.frag_tab[2 * j + 1] = 0;
424			}
425		}
426
427		free_page((unsigned long)buffer->jpg.frag_tab);
428		buffer->jpg.frag_tab = NULL;
429	}
430
431	fh->buffers.allocated = 0;
432}
433
434/*
435 *   V4L Buffer grabbing
436 */
437
438static int
439zoran_v4l_set_format (struct zoran_fh           *fh,
440		      int                        width,
441		      int                        height,
442		      const struct zoran_format *format)
443{
444	struct zoran *zr = fh->zr;
445	int bpp;
446
447	/* Check size and format of the grab wanted */
448
449	if (height < BUZ_MIN_HEIGHT || width < BUZ_MIN_WIDTH ||
450	    height > BUZ_MAX_HEIGHT || width > BUZ_MAX_WIDTH) {
451		dprintk(1,
452			KERN_ERR
453			"%s: %s - wrong frame size (%dx%d)\n",
454			ZR_DEVNAME(zr), __func__, width, height);
455		return -EINVAL;
456	}
457
458	bpp = (format->depth + 7) / 8;
459
460	/* Check against available buffer size */
461	if (height * width * bpp > fh->buffers.buffer_size) {
462		dprintk(1,
463			KERN_ERR
464			"%s: %s - video buffer size (%d kB) is too small\n",
465			ZR_DEVNAME(zr), __func__, fh->buffers.buffer_size >> 10);
466		return -EINVAL;
467	}
468
469	/* The video front end needs 4-byte alinged line sizes */
470
471	if ((bpp == 2 && (width & 1)) || (bpp == 3 && (width & 3))) {
472		dprintk(1,
473			KERN_ERR
474			"%s: %s - wrong frame alignment\n",
475			ZR_DEVNAME(zr), __func__);
476		return -EINVAL;
477	}
478
479	fh->v4l_settings.width = width;
480	fh->v4l_settings.height = height;
481	fh->v4l_settings.format = format;
482	fh->v4l_settings.bytesperline = bpp * fh->v4l_settings.width;
483
484	return 0;
485}
486
487static int zoran_v4l_queue_frame(struct zoran_fh *fh, int num)
488{
489	struct zoran *zr = fh->zr;
490	unsigned long flags;
491	int res = 0;
492
493	if (!fh->buffers.allocated) {
494		dprintk(1,
495			KERN_ERR
496			"%s: %s - buffers not yet allocated\n",
497			ZR_DEVNAME(zr), __func__);
498		res = -ENOMEM;
499	}
500
501	/* No grabbing outside the buffer range! */
502	if (num >= fh->buffers.num_buffers || num < 0) {
503		dprintk(1,
504			KERN_ERR
505			"%s: %s - buffer %d is out of range\n",
506			ZR_DEVNAME(zr), __func__, num);
507		res = -EINVAL;
508	}
509
510	spin_lock_irqsave(&zr->spinlock, flags);
511
512	if (fh->buffers.active == ZORAN_FREE) {
513		if (zr->v4l_buffers.active == ZORAN_FREE) {
514			zr->v4l_buffers = fh->buffers;
515			fh->buffers.active = ZORAN_ACTIVE;
516		} else {
517			dprintk(1,
518				KERN_ERR
519				"%s: %s - another session is already capturing\n",
520				ZR_DEVNAME(zr), __func__);
521			res = -EBUSY;
522		}
523	}
524
525	/* make sure a grab isn't going on currently with this buffer */
526	if (!res) {
527		switch (zr->v4l_buffers.buffer[num].state) {
528		default:
529		case BUZ_STATE_PEND:
530			if (zr->v4l_buffers.active == ZORAN_FREE) {
531				fh->buffers.active = ZORAN_FREE;
532				zr->v4l_buffers.allocated = 0;
533			}
534			res = -EBUSY;	/* what are you doing? */
535			break;
536		case BUZ_STATE_DONE:
537			dprintk(2,
538				KERN_WARNING
539				"%s: %s - queueing buffer %d in state DONE!?\n",
540				ZR_DEVNAME(zr), __func__, num);
541		case BUZ_STATE_USER:
542			/* since there is at least one unused buffer there's room for at least
543			 * one more pend[] entry */
544			zr->v4l_pend[zr->v4l_pend_head++ & V4L_MASK_FRAME] = num;
545			zr->v4l_buffers.buffer[num].state = BUZ_STATE_PEND;
546			zr->v4l_buffers.buffer[num].bs.length =
547			    fh->v4l_settings.bytesperline *
548			    zr->v4l_settings.height;
549			fh->buffers.buffer[num] = zr->v4l_buffers.buffer[num];
550			break;
551		}
552	}
553
554	spin_unlock_irqrestore(&zr->spinlock, flags);
555
556	if (!res && zr->v4l_buffers.active == ZORAN_FREE)
557		zr->v4l_buffers.active = fh->buffers.active;
558
559	return res;
560}
561
562/*
563 * Sync on a V4L buffer
564 */
565
566static int v4l_sync(struct zoran_fh *fh, int frame)
567{
568	struct zoran *zr = fh->zr;
569	unsigned long flags;
570
571	if (fh->buffers.active == ZORAN_FREE) {
572		dprintk(1,
573			KERN_ERR
574			"%s: %s - no grab active for this session\n",
575			ZR_DEVNAME(zr), __func__);
576		return -EINVAL;
577	}
578
579	/* check passed-in frame number */
580	if (frame >= fh->buffers.num_buffers || frame < 0) {
581		dprintk(1,
582			KERN_ERR "%s: %s - frame %d is invalid\n",
583			ZR_DEVNAME(zr), __func__, frame);
584		return -EINVAL;
585	}
586
587	/* Check if is buffer was queued at all */
588	if (zr->v4l_buffers.buffer[frame].state == BUZ_STATE_USER) {
589		dprintk(1,
590			KERN_ERR
591			"%s: %s - attempt to sync on a buffer which was not queued?\n",
592			ZR_DEVNAME(zr), __func__);
593		return -EPROTO;
594	}
595
596	mutex_unlock(&zr->lock);
597	/* wait on this buffer to get ready */
598	if (!wait_event_interruptible_timeout(zr->v4l_capq,
599		(zr->v4l_buffers.buffer[frame].state != BUZ_STATE_PEND), 10*HZ)) {
600		mutex_lock(&zr->lock);
601		return -ETIME;
602	}
603	mutex_lock(&zr->lock);
604	if (signal_pending(current))
605		return -ERESTARTSYS;
606
607	/* buffer should now be in BUZ_STATE_DONE */
608	if (zr->v4l_buffers.buffer[frame].state != BUZ_STATE_DONE)
609		dprintk(2,
610			KERN_ERR "%s: %s - internal state error\n",
611			ZR_DEVNAME(zr), __func__);
612
613	zr->v4l_buffers.buffer[frame].state = BUZ_STATE_USER;
614	fh->buffers.buffer[frame] = zr->v4l_buffers.buffer[frame];
615
616	spin_lock_irqsave(&zr->spinlock, flags);
617
618	/* Check if streaming capture has finished */
619	if (zr->v4l_pend_tail == zr->v4l_pend_head) {
620		zr36057_set_memgrab(zr, 0);
621		if (zr->v4l_buffers.active == ZORAN_ACTIVE) {
622			fh->buffers.active = zr->v4l_buffers.active = ZORAN_FREE;
623			zr->v4l_buffers.allocated = 0;
624		}
625	}
626
627	spin_unlock_irqrestore(&zr->spinlock, flags);
628
629	return 0;
630}
631
632/*
633 *   Queue a MJPEG buffer for capture/playback
634 */
635
636static int zoran_jpg_queue_frame(struct zoran_fh *fh, int num,
637				 enum zoran_codec_mode mode)
638{
639	struct zoran *zr = fh->zr;
640	unsigned long flags;
641	int res = 0;
642
643	/* Check if buffers are allocated */
644	if (!fh->buffers.allocated) {
645		dprintk(1,
646			KERN_ERR
647			"%s: %s - buffers not yet allocated\n",
648			ZR_DEVNAME(zr), __func__);
649		return -ENOMEM;
650	}
651
652	/* No grabbing outside the buffer range! */
653	if (num >= fh->buffers.num_buffers || num < 0) {
654		dprintk(1,
655			KERN_ERR
656			"%s: %s - buffer %d out of range\n",
657			ZR_DEVNAME(zr), __func__, num);
658		return -EINVAL;
659	}
660
661	/* what is the codec mode right now? */
662	if (zr->codec_mode == BUZ_MODE_IDLE) {
663		zr->jpg_settings = fh->jpg_settings;
664	} else if (zr->codec_mode != mode) {
665		/* wrong codec mode active - invalid */
666		dprintk(1,
667			KERN_ERR
668			"%s: %s - codec in wrong mode\n",
669			ZR_DEVNAME(zr), __func__);
670		return -EINVAL;
671	}
672
673	if (fh->buffers.active == ZORAN_FREE) {
674		if (zr->jpg_buffers.active == ZORAN_FREE) {
675			zr->jpg_buffers = fh->buffers;
676			fh->buffers.active = ZORAN_ACTIVE;
677		} else {
678			dprintk(1,
679				KERN_ERR
680				"%s: %s - another session is already capturing\n",
681				ZR_DEVNAME(zr), __func__);
682			res = -EBUSY;
683		}
684	}
685
686	if (!res && zr->codec_mode == BUZ_MODE_IDLE) {
687		/* Ok load up the jpeg codec */
688		zr36057_enable_jpg(zr, mode);
689	}
690
691	spin_lock_irqsave(&zr->spinlock, flags);
692
693	if (!res) {
694		switch (zr->jpg_buffers.buffer[num].state) {
695		case BUZ_STATE_DONE:
696			dprintk(2,
697				KERN_WARNING
698				"%s: %s - queing frame in BUZ_STATE_DONE state!?\n",
699				ZR_DEVNAME(zr), __func__);
700		case BUZ_STATE_USER:
701			/* since there is at least one unused buffer there's room for at
702			 *least one more pend[] entry */
703			zr->jpg_pend[zr->jpg_que_head++ & BUZ_MASK_FRAME] = num;
704			zr->jpg_buffers.buffer[num].state = BUZ_STATE_PEND;
705			fh->buffers.buffer[num] = zr->jpg_buffers.buffer[num];
706			zoran_feed_stat_com(zr);
707			break;
708		default:
709		case BUZ_STATE_DMA:
710		case BUZ_STATE_PEND:
711			if (zr->jpg_buffers.active == ZORAN_FREE) {
712				fh->buffers.active = ZORAN_FREE;
713				zr->jpg_buffers.allocated = 0;
714			}
715			res = -EBUSY;	/* what are you doing? */
716			break;
717		}
718	}
719
720	spin_unlock_irqrestore(&zr->spinlock, flags);
721
722	if (!res && zr->jpg_buffers.active == ZORAN_FREE)
723		zr->jpg_buffers.active = fh->buffers.active;
724
725	return res;
726}
727
728static int jpg_qbuf(struct zoran_fh *fh, int frame, enum zoran_codec_mode mode)
729{
730	struct zoran *zr = fh->zr;
731	int res = 0;
732
733	/* Does the user want to stop streaming? */
734	if (frame < 0) {
735		if (zr->codec_mode == mode) {
736			if (fh->buffers.active == ZORAN_FREE) {
737				dprintk(1,
738					KERN_ERR
739					"%s: %s(-1) - session not active\n",
740					ZR_DEVNAME(zr), __func__);
741				return -EINVAL;
742			}
743			fh->buffers.active = zr->jpg_buffers.active = ZORAN_FREE;
744			zr->jpg_buffers.allocated = 0;
745			zr36057_enable_jpg(zr, BUZ_MODE_IDLE);
746			return 0;
747		} else {
748			dprintk(1,
749				KERN_ERR
750				"%s: %s - stop streaming but not in streaming mode\n",
751				ZR_DEVNAME(zr), __func__);
752			return -EINVAL;
753		}
754	}
755
756	if ((res = zoran_jpg_queue_frame(fh, frame, mode)))
757		return res;
758
759	/* Start the jpeg codec when the first frame is queued  */
760	if (!res && zr->jpg_que_head == 1)
761		jpeg_start(zr);
762
763	return res;
764}
765
766/*
767 *   Sync on a MJPEG buffer
768 */
769
770static int jpg_sync(struct zoran_fh *fh, struct zoran_sync *bs)
771{
772	struct zoran *zr = fh->zr;
773	unsigned long flags;
774	int frame;
775
776	if (fh->buffers.active == ZORAN_FREE) {
777		dprintk(1,
778			KERN_ERR
779			"%s: %s - capture is not currently active\n",
780			ZR_DEVNAME(zr), __func__);
781		return -EINVAL;
782	}
783	if (zr->codec_mode != BUZ_MODE_MOTION_DECOMPRESS &&
784	    zr->codec_mode != BUZ_MODE_MOTION_COMPRESS) {
785		dprintk(1,
786			KERN_ERR
787			"%s: %s - codec not in streaming mode\n",
788			ZR_DEVNAME(zr), __func__);
789		return -EINVAL;
790	}
791	mutex_unlock(&zr->lock);
792	if (!wait_event_interruptible_timeout(zr->jpg_capq,
793			(zr->jpg_que_tail != zr->jpg_dma_tail ||
794			 zr->jpg_dma_tail == zr->jpg_dma_head),
795			10*HZ)) {
796		int isr;
797
798		btand(~ZR36057_JMC_Go_en, ZR36057_JMC);
799		udelay(1);
800		zr->codec->control(zr->codec, CODEC_G_STATUS,
801					   sizeof(isr), &isr);
802		mutex_lock(&zr->lock);
803		dprintk(1,
804			KERN_ERR
805			"%s: %s - timeout: codec isr=0x%02x\n",
806			ZR_DEVNAME(zr), __func__, isr);
807
808		return -ETIME;
809
810	}
811	mutex_lock(&zr->lock);
812	if (signal_pending(current))
813		return -ERESTARTSYS;
814
815	spin_lock_irqsave(&zr->spinlock, flags);
816
817	if (zr->jpg_dma_tail != zr->jpg_dma_head)
818		frame = zr->jpg_pend[zr->jpg_que_tail++ & BUZ_MASK_FRAME];
819	else
820		frame = zr->jpg_pend[zr->jpg_que_tail & BUZ_MASK_FRAME];
821
822	/* buffer should now be in BUZ_STATE_DONE */
823	if (zr->jpg_buffers.buffer[frame].state != BUZ_STATE_DONE)
824		dprintk(2,
825			KERN_ERR "%s: %s - internal state error\n",
826			ZR_DEVNAME(zr), __func__);
827
828	*bs = zr->jpg_buffers.buffer[frame].bs;
829	bs->frame = frame;
830	zr->jpg_buffers.buffer[frame].state = BUZ_STATE_USER;
831	fh->buffers.buffer[frame] = zr->jpg_buffers.buffer[frame];
832
833	spin_unlock_irqrestore(&zr->spinlock, flags);
834
835	return 0;
836}
837
838static void zoran_open_init_session(struct zoran_fh *fh)
839{
840	int i;
841	struct zoran *zr = fh->zr;
842
843	/* Per default, map the V4L Buffers */
844	map_mode_raw(fh);
845
846	/* take over the card's current settings */
847	fh->overlay_settings = zr->overlay_settings;
848	fh->overlay_settings.is_set = 0;
849	fh->overlay_settings.format = zr->overlay_settings.format;
850	fh->overlay_active = ZORAN_FREE;
851
852	/* v4l settings */
853	fh->v4l_settings = zr->v4l_settings;
854	/* jpg settings */
855	fh->jpg_settings = zr->jpg_settings;
856
857	/* buffers */
858	memset(&fh->buffers, 0, sizeof(fh->buffers));
859	for (i = 0; i < MAX_FRAME; i++) {
860		fh->buffers.buffer[i].state = BUZ_STATE_USER;	/* nothing going on */
861		fh->buffers.buffer[i].bs.frame = i;
862	}
863	fh->buffers.allocated = 0;
864	fh->buffers.active = ZORAN_FREE;
865}
866
867static void zoran_close_end_session(struct zoran_fh *fh)
868{
869	struct zoran *zr = fh->zr;
870
871	/* overlay */
872	if (fh->overlay_active != ZORAN_FREE) {
873		fh->overlay_active = zr->overlay_active = ZORAN_FREE;
874		zr->v4l_overlay_active = 0;
875		if (!zr->v4l_memgrab_active)
876			zr36057_overlay(zr, 0);
877		zr->overlay_mask = NULL;
878	}
879
880	if (fh->map_mode == ZORAN_MAP_MODE_RAW) {
881		/* v4l capture */
882		if (fh->buffers.active != ZORAN_FREE) {
883			unsigned long flags;
884
885			spin_lock_irqsave(&zr->spinlock, flags);
886			zr36057_set_memgrab(zr, 0);
887			zr->v4l_buffers.allocated = 0;
888			zr->v4l_buffers.active = fh->buffers.active = ZORAN_FREE;
889			spin_unlock_irqrestore(&zr->spinlock, flags);
890		}
891
892		/* v4l buffers */
893		if (fh->buffers.allocated)
894			v4l_fbuffer_free(fh);
895	} else {
896		/* jpg capture */
897		if (fh->buffers.active != ZORAN_FREE) {
898			zr36057_enable_jpg(zr, BUZ_MODE_IDLE);
899			zr->jpg_buffers.allocated = 0;
900			zr->jpg_buffers.active = fh->buffers.active = ZORAN_FREE;
901		}
902
903		/* jpg buffers */
904		if (fh->buffers.allocated)
905			jpg_fbuffer_free(fh);
906	}
907}
908
909/*
910 *   Open a zoran card. Right now the flags stuff is just playing
911 */
912
913static int zoran_open(struct file *file)
914{
915	struct zoran *zr = video_drvdata(file);
916	struct zoran_fh *fh;
917	int res, first_open = 0;
918
919	dprintk(2, KERN_INFO "%s: %s(%s, pid=[%d]), users(-)=%d\n",
920		ZR_DEVNAME(zr), __func__, current->comm, task_pid_nr(current), zr->user + 1);
921
922	mutex_lock(&zr->lock);
923
924	if (zr->user >= 2048) {
925		dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
926			ZR_DEVNAME(zr), zr->user);
927		res = -EBUSY;
928		goto fail_unlock;
929	}
930
931	/* now, create the open()-specific file_ops struct */
932	fh = kzalloc(sizeof(struct zoran_fh), GFP_KERNEL);
933	if (!fh) {
934		dprintk(1,
935			KERN_ERR
936			"%s: %s - allocation of zoran_fh failed\n",
937			ZR_DEVNAME(zr), __func__);
938		res = -ENOMEM;
939		goto fail_unlock;
940	}
941	v4l2_fh_init(&fh->fh, video_devdata(file));
942
943	/* used to be BUZ_MAX_WIDTH/HEIGHT, but that gives overflows
944	 * on norm-change! */
945	fh->overlay_mask =
946	    kmalloc(((768 + 31) / 32) * 576 * 4, GFP_KERNEL);
947	if (!fh->overlay_mask) {
948		dprintk(1,
949			KERN_ERR
950			"%s: %s - allocation of overlay_mask failed\n",
951			ZR_DEVNAME(zr), __func__);
952		res = -ENOMEM;
953		goto fail_fh;
954	}
955
956	if (zr->user++ == 0)
957		first_open = 1;
958
959	/* default setup - TODO: look at flags */
960	if (first_open) {	/* First device open */
961		zr36057_restart(zr);
962		zoran_open_init_params(zr);
963		zoran_init_hardware(zr);
964
965		btor(ZR36057_ICR_IntPinEn, ZR36057_ICR);
966	}
967
968	/* set file_ops stuff */
969	file->private_data = fh;
970	fh->zr = zr;
971	zoran_open_init_session(fh);
972	v4l2_fh_add(&fh->fh);
973	mutex_unlock(&zr->lock);
974
975	return 0;
976
977fail_fh:
978	kfree(fh);
979fail_unlock:
980	mutex_unlock(&zr->lock);
981
982	dprintk(2, KERN_INFO "%s: open failed (%d), users(-)=%d\n",
983		ZR_DEVNAME(zr), res, zr->user);
984
985	return res;
986}
987
988static int
989zoran_close(struct file  *file)
990{
991	struct zoran_fh *fh = file->private_data;
992	struct zoran *zr = fh->zr;
993
994	dprintk(2, KERN_INFO "%s: %s(%s, pid=[%d]), users(+)=%d\n",
995		ZR_DEVNAME(zr), __func__, current->comm, task_pid_nr(current), zr->user - 1);
996
997	/* kernel locks (fs/device.c), so don't do that ourselves
998	 * (prevents deadlocks) */
999	mutex_lock(&zr->lock);
1000
1001	zoran_close_end_session(fh);
1002
1003	if (zr->user-- == 1) {	/* Last process */
1004		/* Clean up JPEG process */
1005		wake_up_interruptible(&zr->jpg_capq);
1006		zr36057_enable_jpg(zr, BUZ_MODE_IDLE);
1007		zr->jpg_buffers.allocated = 0;
1008		zr->jpg_buffers.active = ZORAN_FREE;
1009
1010		/* disable interrupts */
1011		btand(~ZR36057_ICR_IntPinEn, ZR36057_ICR);
1012
1013		if (zr36067_debug > 1)
1014			print_interrupts(zr);
1015
1016		/* Overlay off */
1017		zr->v4l_overlay_active = 0;
1018		zr36057_overlay(zr, 0);
1019		zr->overlay_mask = NULL;
1020
1021		/* capture off */
1022		wake_up_interruptible(&zr->v4l_capq);
1023		zr36057_set_memgrab(zr, 0);
1024		zr->v4l_buffers.allocated = 0;
1025		zr->v4l_buffers.active = ZORAN_FREE;
1026		zoran_set_pci_master(zr, 0);
1027
1028		if (!pass_through) {	/* Switch to color bar */
1029			decoder_call(zr, video, s_stream, 0);
1030			encoder_call(zr, video, s_routing, 2, 0, 0);
1031		}
1032	}
1033	mutex_unlock(&zr->lock);
1034
1035	v4l2_fh_del(&fh->fh);
1036	v4l2_fh_exit(&fh->fh);
1037	kfree(fh->overlay_mask);
1038	kfree(fh);
1039
1040	dprintk(4, KERN_INFO "%s: %s done\n", ZR_DEVNAME(zr), __func__);
1041
1042	return 0;
1043}
1044
1045static int setup_fbuffer(struct zoran_fh *fh,
1046	       void                      *base,
1047	       const struct zoran_format *fmt,
1048	       int                        width,
1049	       int                        height,
1050	       int                        bytesperline)
1051{
1052	struct zoran *zr = fh->zr;
1053
1054	/* (Ronald) v4l/v4l2 guidelines */
1055	if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RAWIO))
1056		return -EPERM;
1057
1058	/* Don't allow frame buffer overlay if PCI or AGP is buggy, or on
1059	   ALi Magik (that needs very low latency while the card needs a
1060	   higher value always) */
1061
1062	if (pci_pci_problems & (PCIPCI_FAIL | PCIAGP_FAIL | PCIPCI_ALIMAGIK))
1063		return -ENXIO;
1064
1065	/* we need a bytesperline value, even if not given */
1066	if (!bytesperline)
1067		bytesperline = width * ((fmt->depth + 7) & ~7) / 8;
1068
1069#if 0
1070	if (zr->overlay_active) {
1071		/* dzjee... stupid users... don't even bother to turn off
1072		 * overlay before changing the memory location...
1073		 * normally, we would return errors here. However, one of
1074		 * the tools that does this is... xawtv! and since xawtv
1075		 * is used by +/- 99% of the users, we'd rather be user-
1076		 * friendly and silently do as if nothing went wrong */
1077		dprintk(3,
1078			KERN_ERR
1079			"%s: %s - forced overlay turnoff because framebuffer changed\n",
1080			ZR_DEVNAME(zr), __func__);
1081		zr36057_overlay(zr, 0);
1082	}
1083#endif
1084
1085	if (!(fmt->flags & ZORAN_FORMAT_OVERLAY)) {
1086		dprintk(1,
1087			KERN_ERR
1088			"%s: %s - no valid overlay format given\n",
1089			ZR_DEVNAME(zr), __func__);
1090		return -EINVAL;
1091	}
1092	if (height <= 0 || width <= 0 || bytesperline <= 0) {
1093		dprintk(1,
1094			KERN_ERR
1095			"%s: %s - invalid height/width/bpl value (%d|%d|%d)\n",
1096			ZR_DEVNAME(zr), __func__, width, height, bytesperline);
1097		return -EINVAL;
1098	}
1099	if (bytesperline & 3) {
1100		dprintk(1,
1101			KERN_ERR
1102			"%s: %s - bytesperline (%d) must be 4-byte aligned\n",
1103			ZR_DEVNAME(zr), __func__, bytesperline);
1104		return -EINVAL;
1105	}
1106
1107	zr->vbuf_base = (void *) ((unsigned long) base & ~3);
1108	zr->vbuf_height = height;
1109	zr->vbuf_width = width;
1110	zr->vbuf_depth = fmt->depth;
1111	zr->overlay_settings.format = fmt;
1112	zr->vbuf_bytesperline = bytesperline;
1113
1114	/* The user should set new window parameters */
1115	zr->overlay_settings.is_set = 0;
1116
1117	return 0;
1118}
1119
1120
1121static int setup_window(struct zoran_fh *fh,
1122			int x,
1123			int y,
1124			int width,
1125			int height,
1126			struct v4l2_clip __user *clips,
1127			unsigned int clipcount,
1128			void __user *bitmap)
1129{
1130	struct zoran *zr = fh->zr;
1131	struct v4l2_clip *vcp = NULL;
1132	int on, end;
1133
1134
1135	if (!zr->vbuf_base) {
1136		dprintk(1,
1137			KERN_ERR
1138			"%s: %s - frame buffer has to be set first\n",
1139			ZR_DEVNAME(zr), __func__);
1140		return -EINVAL;
1141	}
1142
1143	if (!fh->overlay_settings.format) {
1144		dprintk(1,
1145			KERN_ERR
1146			"%s: %s - no overlay format set\n",
1147			ZR_DEVNAME(zr), __func__);
1148		return -EINVAL;
1149	}
1150
1151	if (clipcount > 2048) {
1152		dprintk(1,
1153			KERN_ERR
1154			"%s: %s - invalid clipcount\n",
1155			 ZR_DEVNAME(zr), __func__);
1156		return -EINVAL;
1157	}
1158
1159	/*
1160	 * The video front end needs 4-byte alinged line sizes, we correct that
1161	 * silently here if necessary
1162	 */
1163	if (zr->vbuf_depth == 15 || zr->vbuf_depth == 16) {
1164		end = (x + width) & ~1;	/* round down */
1165		x = (x + 1) & ~1;	/* round up */
1166		width = end - x;
1167	}
1168
1169	if (zr->vbuf_depth == 24) {
1170		end = (x + width) & ~3;	/* round down */
1171		x = (x + 3) & ~3;	/* round up */
1172		width = end - x;
1173	}
1174
1175	if (width > BUZ_MAX_WIDTH)
1176		width = BUZ_MAX_WIDTH;
1177	if (height > BUZ_MAX_HEIGHT)
1178		height = BUZ_MAX_HEIGHT;
1179
1180	/* Check for invalid parameters */
1181	if (width < BUZ_MIN_WIDTH || height < BUZ_MIN_HEIGHT ||
1182	    width > BUZ_MAX_WIDTH || height > BUZ_MAX_HEIGHT) {
1183		dprintk(1,
1184			KERN_ERR
1185			"%s: %s - width = %d or height = %d invalid\n",
1186			ZR_DEVNAME(zr), __func__, width, height);
1187		return -EINVAL;
1188	}
1189
1190	fh->overlay_settings.x = x;
1191	fh->overlay_settings.y = y;
1192	fh->overlay_settings.width = width;
1193	fh->overlay_settings.height = height;
1194	fh->overlay_settings.clipcount = clipcount;
1195
1196	/*
1197	 * If an overlay is running, we have to switch it off
1198	 * and switch it on again in order to get the new settings in effect.
1199	 *
1200	 * We also want to avoid that the overlay mask is written
1201	 * when an overlay is running.
1202	 */
1203
1204	on = zr->v4l_overlay_active && !zr->v4l_memgrab_active &&
1205	    zr->overlay_active != ZORAN_FREE &&
1206	    fh->overlay_active != ZORAN_FREE;
1207	if (on)
1208		zr36057_overlay(zr, 0);
1209
1210	/*
1211	 *   Write the overlay mask if clips are wanted.
1212	 *   We prefer a bitmap.
1213	 */
1214	if (bitmap) {
1215		/* fake value - it just means we want clips */
1216		fh->overlay_settings.clipcount = 1;
1217
1218		if (copy_from_user(fh->overlay_mask, bitmap,
1219				   (width * height + 7) / 8)) {
1220			return -EFAULT;
1221		}
1222	} else if (clipcount) {
1223		/* write our own bitmap from the clips */
1224		vcp = vmalloc(sizeof(struct v4l2_clip) * (clipcount + 4));
1225		if (vcp == NULL) {
1226			dprintk(1,
1227				KERN_ERR
1228				"%s: %s - Alloc of clip mask failed\n",
1229				ZR_DEVNAME(zr), __func__);
1230			return -ENOMEM;
1231		}
1232		if (copy_from_user
1233		    (vcp, clips, sizeof(struct v4l2_clip) * clipcount)) {
1234			vfree(vcp);
1235			return -EFAULT;
1236		}
1237		write_overlay_mask(fh, vcp, clipcount);
1238		vfree(vcp);
1239	}
1240
1241	fh->overlay_settings.is_set = 1;
1242	if (fh->overlay_active != ZORAN_FREE &&
1243	    zr->overlay_active != ZORAN_FREE)
1244		zr->overlay_settings = fh->overlay_settings;
1245
1246	if (on)
1247		zr36057_overlay(zr, 1);
1248
1249	/* Make sure the changes come into effect */
1250	return wait_grab_pending(zr);
1251}
1252
1253static int setup_overlay(struct zoran_fh *fh, int on)
1254{
1255	struct zoran *zr = fh->zr;
1256
1257	/* If there is nothing to do, return immediately */
1258	if ((on && fh->overlay_active != ZORAN_FREE) ||
1259	    (!on && fh->overlay_active == ZORAN_FREE))
1260		return 0;
1261
1262	/* check whether we're touching someone else's overlay */
1263	if (on && zr->overlay_active != ZORAN_FREE &&
1264	    fh->overlay_active == ZORAN_FREE) {
1265		dprintk(1,
1266			KERN_ERR
1267			"%s: %s - overlay is already active for another session\n",
1268			ZR_DEVNAME(zr), __func__);
1269		return -EBUSY;
1270	}
1271	if (!on && zr->overlay_active != ZORAN_FREE &&
1272	    fh->overlay_active == ZORAN_FREE) {
1273		dprintk(1,
1274			KERN_ERR
1275			"%s: %s - you cannot cancel someone else's session\n",
1276			ZR_DEVNAME(zr), __func__);
1277		return -EPERM;
1278	}
1279
1280	if (on == 0) {
1281		zr->overlay_active = fh->overlay_active = ZORAN_FREE;
1282		zr->v4l_overlay_active = 0;
1283		/* When a grab is running, the video simply
1284		 * won't be switched on any more */
1285		if (!zr->v4l_memgrab_active)
1286			zr36057_overlay(zr, 0);
1287		zr->overlay_mask = NULL;
1288	} else {
1289		if (!zr->vbuf_base || !fh->overlay_settings.is_set) {
1290			dprintk(1,
1291				KERN_ERR
1292				"%s: %s - buffer or window not set\n",
1293				ZR_DEVNAME(zr), __func__);
1294			return -EINVAL;
1295		}
1296		if (!fh->overlay_settings.format) {
1297			dprintk(1,
1298				KERN_ERR
1299				"%s: %s - no overlay format set\n",
1300				ZR_DEVNAME(zr), __func__);
1301			return -EINVAL;
1302		}
1303		zr->overlay_active = fh->overlay_active = ZORAN_LOCKED;
1304		zr->v4l_overlay_active = 1;
1305		zr->overlay_mask = fh->overlay_mask;
1306		zr->overlay_settings = fh->overlay_settings;
1307		if (!zr->v4l_memgrab_active)
1308			zr36057_overlay(zr, 1);
1309		/* When a grab is running, the video will be
1310		 * switched on when grab is finished */
1311	}
1312
1313	/* Make sure the changes come into effect */
1314	return wait_grab_pending(zr);
1315}
1316
1317/* get the status of a buffer in the clients buffer queue */
1318static int zoran_v4l2_buffer_status(struct zoran_fh *fh,
1319				    struct v4l2_buffer *buf, int num)
1320{
1321	struct zoran *zr = fh->zr;
1322	unsigned long flags;
1323
1324	buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1325
1326	switch (fh->map_mode) {
1327	case ZORAN_MAP_MODE_RAW:
1328		/* check range */
1329		if (num < 0 || num >= fh->buffers.num_buffers ||
1330		    !fh->buffers.allocated) {
1331			dprintk(1,
1332				KERN_ERR
1333				"%s: %s - wrong number or buffers not allocated\n",
1334				ZR_DEVNAME(zr), __func__);
1335			return -EINVAL;
1336		}
1337
1338		spin_lock_irqsave(&zr->spinlock, flags);
1339		dprintk(3,
1340			KERN_DEBUG
1341			"%s: %s() - raw active=%c, buffer %d: state=%c, map=%c\n",
1342			ZR_DEVNAME(zr), __func__,
1343			"FAL"[fh->buffers.active], num,
1344			"UPMD"[zr->v4l_buffers.buffer[num].state],
1345			fh->buffers.buffer[num].map ? 'Y' : 'N');
1346		spin_unlock_irqrestore(&zr->spinlock, flags);
1347
1348		buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1349		buf->length = fh->buffers.buffer_size;
1350
1351		/* get buffer */
1352		buf->bytesused = fh->buffers.buffer[num].bs.length;
1353		if (fh->buffers.buffer[num].state == BUZ_STATE_DONE ||
1354		    fh->buffers.buffer[num].state == BUZ_STATE_USER) {
1355			buf->sequence = fh->buffers.buffer[num].bs.seq;
1356			buf->flags |= V4L2_BUF_FLAG_DONE;
1357			buf->timestamp = fh->buffers.buffer[num].bs.timestamp;
1358		} else {
1359			buf->flags |= V4L2_BUF_FLAG_QUEUED;
1360		}
1361
1362		if (fh->v4l_settings.height <= BUZ_MAX_HEIGHT / 2)
1363			buf->field = V4L2_FIELD_TOP;
1364		else
1365			buf->field = V4L2_FIELD_INTERLACED;
1366
1367		break;
1368
1369	case ZORAN_MAP_MODE_JPG_REC:
1370	case ZORAN_MAP_MODE_JPG_PLAY:
1371
1372		/* check range */
1373		if (num < 0 || num >= fh->buffers.num_buffers ||
1374		    !fh->buffers.allocated) {
1375			dprintk(1,
1376				KERN_ERR
1377				"%s: %s - wrong number or buffers not allocated\n",
1378				ZR_DEVNAME(zr), __func__);
1379			return -EINVAL;
1380		}
1381
1382		buf->type = (fh->map_mode == ZORAN_MAP_MODE_JPG_REC) ?
1383			      V4L2_BUF_TYPE_VIDEO_CAPTURE :
1384			      V4L2_BUF_TYPE_VIDEO_OUTPUT;
1385		buf->length = fh->buffers.buffer_size;
1386
1387		/* these variables are only written after frame has been captured */
1388		if (fh->buffers.buffer[num].state == BUZ_STATE_DONE ||
1389		    fh->buffers.buffer[num].state == BUZ_STATE_USER) {
1390			buf->sequence = fh->buffers.buffer[num].bs.seq;
1391			buf->timestamp = fh->buffers.buffer[num].bs.timestamp;
1392			buf->bytesused = fh->buffers.buffer[num].bs.length;
1393			buf->flags |= V4L2_BUF_FLAG_DONE;
1394		} else {
1395			buf->flags |= V4L2_BUF_FLAG_QUEUED;
1396		}
1397
1398		/* which fields are these? */
1399		if (fh->jpg_settings.TmpDcm != 1)
1400			buf->field = fh->jpg_settings.odd_even ?
1401				V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM;
1402		else
1403			buf->field = fh->jpg_settings.odd_even ?
1404				V4L2_FIELD_SEQ_TB : V4L2_FIELD_SEQ_BT;
1405
1406		break;
1407
1408	default:
1409
1410		dprintk(5,
1411			KERN_ERR
1412			"%s: %s - invalid buffer type|map_mode (%d|%d)\n",
1413			ZR_DEVNAME(zr), __func__, buf->type, fh->map_mode);
1414		return -EINVAL;
1415	}
1416
1417	buf->memory = V4L2_MEMORY_MMAP;
1418	buf->index = num;
1419	buf->m.offset = buf->length * num;
1420
1421	return 0;
1422}
1423
1424static int
1425zoran_set_norm (struct zoran *zr,
1426		v4l2_std_id norm)
1427{
1428	int on;
1429
1430	if (zr->v4l_buffers.active != ZORAN_FREE ||
1431	    zr->jpg_buffers.active != ZORAN_FREE) {
1432		dprintk(1,
1433			KERN_WARNING
1434			"%s: %s called while in playback/capture mode\n",
1435			ZR_DEVNAME(zr), __func__);
1436		return -EBUSY;
1437	}
1438
1439	if (!(norm & zr->card.norms)) {
1440		dprintk(1,
1441			KERN_ERR "%s: %s - unsupported norm %llx\n",
1442			ZR_DEVNAME(zr), __func__, norm);
1443		return -EINVAL;
1444	}
1445
1446	if (norm & V4L2_STD_SECAM)
1447		zr->timing = zr->card.tvn[2];
1448	else if (norm & V4L2_STD_NTSC)
1449		zr->timing = zr->card.tvn[1];
1450	else
1451		zr->timing = zr->card.tvn[0];
1452
1453	/* We switch overlay off and on since a change in the
1454	 * norm needs different VFE settings */
1455	on = zr->overlay_active && !zr->v4l_memgrab_active;
1456	if (on)
1457		zr36057_overlay(zr, 0);
1458
1459	decoder_call(zr, video, s_std, norm);
1460	encoder_call(zr, video, s_std_output, norm);
1461
1462	if (on)
1463		zr36057_overlay(zr, 1);
1464
1465	/* Make sure the changes come into effect */
1466	zr->norm = norm;
1467
1468	return 0;
1469}
1470
1471static int
1472zoran_set_input (struct zoran *zr,
1473		 int           input)
1474{
1475	if (input == zr->input) {
1476		return 0;
1477	}
1478
1479	if (zr->v4l_buffers.active != ZORAN_FREE ||
1480	    zr->jpg_buffers.active != ZORAN_FREE) {
1481		dprintk(1,
1482			KERN_WARNING
1483			"%s: %s called while in playback/capture mode\n",
1484			ZR_DEVNAME(zr), __func__);
1485		return -EBUSY;
1486	}
1487
1488	if (input < 0 || input >= zr->card.inputs) {
1489		dprintk(1,
1490			KERN_ERR
1491			"%s: %s - unnsupported input %d\n",
1492			ZR_DEVNAME(zr), __func__, input);
1493		return -EINVAL;
1494	}
1495
1496	zr->input = input;
1497
1498	decoder_call(zr, video, s_routing,
1499			zr->card.input[input].muxsel, 0, 0);
1500
1501	return 0;
1502}
1503
1504/*
1505 *   ioctl routine
1506 */
1507
1508static int zoran_querycap(struct file *file, void *__fh, struct v4l2_capability *cap)
1509{
1510	struct zoran_fh *fh = __fh;
1511	struct zoran *zr = fh->zr;
1512
1513	strncpy(cap->card, ZR_DEVNAME(zr), sizeof(cap->card)-1);
1514	strncpy(cap->driver, "zoran", sizeof(cap->driver)-1);
1515	snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s",
1516		 pci_name(zr->pci_dev));
1517	cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_CAPTURE |
1518			   V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VIDEO_OVERLAY;
1519	cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
1520	return 0;
1521}
1522
1523static int zoran_enum_fmt(struct zoran *zr, struct v4l2_fmtdesc *fmt, int flag)
1524{
1525	unsigned int num, i;
1526
1527	for (num = i = 0; i < NUM_FORMATS; i++) {
1528		if (zoran_formats[i].flags & flag && num++ == fmt->index) {
1529			strncpy(fmt->description, zoran_formats[i].name,
1530				sizeof(fmt->description) - 1);
1531			/* fmt struct pre-zeroed, so adding '\0' not needed */
1532			fmt->pixelformat = zoran_formats[i].fourcc;
1533			if (zoran_formats[i].flags & ZORAN_FORMAT_COMPRESSED)
1534				fmt->flags |= V4L2_FMT_FLAG_COMPRESSED;
1535			return 0;
1536		}
1537	}
1538	return -EINVAL;
1539}
1540
1541static int zoran_enum_fmt_vid_cap(struct file *file, void *__fh,
1542					    struct v4l2_fmtdesc *f)
1543{
1544	struct zoran_fh *fh = __fh;
1545	struct zoran *zr = fh->zr;
1546
1547	return zoran_enum_fmt(zr, f, ZORAN_FORMAT_CAPTURE);
1548}
1549
1550static int zoran_enum_fmt_vid_out(struct file *file, void *__fh,
1551					    struct v4l2_fmtdesc *f)
1552{
1553	struct zoran_fh *fh = __fh;
1554	struct zoran *zr = fh->zr;
1555
1556	return zoran_enum_fmt(zr, f, ZORAN_FORMAT_PLAYBACK);
1557}
1558
1559static int zoran_enum_fmt_vid_overlay(struct file *file, void *__fh,
1560					    struct v4l2_fmtdesc *f)
1561{
1562	struct zoran_fh *fh = __fh;
1563	struct zoran *zr = fh->zr;
1564
1565	return zoran_enum_fmt(zr, f, ZORAN_FORMAT_OVERLAY);
1566}
1567
1568static int zoran_g_fmt_vid_out(struct file *file, void *__fh,
1569					struct v4l2_format *fmt)
1570{
1571	struct zoran_fh *fh = __fh;
1572
1573	fmt->fmt.pix.width = fh->jpg_settings.img_width / fh->jpg_settings.HorDcm;
1574	fmt->fmt.pix.height = fh->jpg_settings.img_height * 2 /
1575		(fh->jpg_settings.VerDcm * fh->jpg_settings.TmpDcm);
1576	fmt->fmt.pix.sizeimage = zoran_v4l2_calc_bufsize(&fh->jpg_settings);
1577	fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
1578	if (fh->jpg_settings.TmpDcm == 1)
1579		fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
1580				V4L2_FIELD_SEQ_TB : V4L2_FIELD_SEQ_BT);
1581	else
1582		fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
1583				V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM);
1584	fmt->fmt.pix.bytesperline = 0;
1585	fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1586
1587	return 0;
1588}
1589
1590static int zoran_g_fmt_vid_cap(struct file *file, void *__fh,
1591					struct v4l2_format *fmt)
1592{
1593	struct zoran_fh *fh = __fh;
1594	struct zoran *zr = fh->zr;
1595
1596	if (fh->map_mode != ZORAN_MAP_MODE_RAW)
1597		return zoran_g_fmt_vid_out(file, fh, fmt);
1598
1599	fmt->fmt.pix.width = fh->v4l_settings.width;
1600	fmt->fmt.pix.height = fh->v4l_settings.height;
1601	fmt->fmt.pix.sizeimage = fh->v4l_settings.bytesperline *
1602					fh->v4l_settings.height;
1603	fmt->fmt.pix.pixelformat = fh->v4l_settings.format->fourcc;
1604	fmt->fmt.pix.colorspace = fh->v4l_settings.format->colorspace;
1605	fmt->fmt.pix.bytesperline = fh->v4l_settings.bytesperline;
1606	if (BUZ_MAX_HEIGHT < (fh->v4l_settings.height * 2))
1607		fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
1608	else
1609		fmt->fmt.pix.field = V4L2_FIELD_TOP;
1610	return 0;
1611}
1612
1613static int zoran_g_fmt_vid_overlay(struct file *file, void *__fh,
1614					struct v4l2_format *fmt)
1615{
1616	struct zoran_fh *fh = __fh;
1617	struct zoran *zr = fh->zr;
1618
1619	fmt->fmt.win.w.left = fh->overlay_settings.x;
1620	fmt->fmt.win.w.top = fh->overlay_settings.y;
1621	fmt->fmt.win.w.width = fh->overlay_settings.width;
1622	fmt->fmt.win.w.height = fh->overlay_settings.height;
1623	if (fh->overlay_settings.width * 2 > BUZ_MAX_HEIGHT)
1624		fmt->fmt.win.field = V4L2_FIELD_INTERLACED;
1625	else
1626		fmt->fmt.win.field = V4L2_FIELD_TOP;
1627
1628	return 0;
1629}
1630
1631static int zoran_try_fmt_vid_overlay(struct file *file, void *__fh,
1632					struct v4l2_format *fmt)
1633{
1634	struct zoran_fh *fh = __fh;
1635	struct zoran *zr = fh->zr;
1636
1637	if (fmt->fmt.win.w.width > BUZ_MAX_WIDTH)
1638		fmt->fmt.win.w.width = BUZ_MAX_WIDTH;
1639	if (fmt->fmt.win.w.width < BUZ_MIN_WIDTH)
1640		fmt->fmt.win.w.width = BUZ_MIN_WIDTH;
1641	if (fmt->fmt.win.w.height > BUZ_MAX_HEIGHT)
1642		fmt->fmt.win.w.height = BUZ_MAX_HEIGHT;
1643	if (fmt->fmt.win.w.height < BUZ_MIN_HEIGHT)
1644		fmt->fmt.win.w.height = BUZ_MIN_HEIGHT;
1645
1646	return 0;
1647}
1648
1649static int zoran_try_fmt_vid_out(struct file *file, void *__fh,
1650					struct v4l2_format *fmt)
1651{
1652	struct zoran_fh *fh = __fh;
1653	struct zoran *zr = fh->zr;
1654	struct zoran_jpg_settings settings;
1655	int res = 0;
1656
1657	if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1658		return -EINVAL;
1659
1660	settings = fh->jpg_settings;
1661
1662	/* we actually need to set 'real' parameters now */
1663	if ((fmt->fmt.pix.height * 2) > BUZ_MAX_HEIGHT)
1664		settings.TmpDcm = 1;
1665	else
1666		settings.TmpDcm = 2;
1667	settings.decimation = 0;
1668	if (fmt->fmt.pix.height <= fh->jpg_settings.img_height / 2)
1669		settings.VerDcm = 2;
1670	else
1671		settings.VerDcm = 1;
1672	if (fmt->fmt.pix.width <= fh->jpg_settings.img_width / 4)
1673		settings.HorDcm = 4;
1674	else if (fmt->fmt.pix.width <= fh->jpg_settings.img_width / 2)
1675		settings.HorDcm = 2;
1676	else
1677		settings.HorDcm = 1;
1678	if (settings.TmpDcm == 1)
1679		settings.field_per_buff = 2;
1680	else
1681		settings.field_per_buff = 1;
1682
1683	if (settings.HorDcm > 1) {
1684		settings.img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
1685		settings.img_width = (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
1686	} else {
1687		settings.img_x = 0;
1688		settings.img_width = BUZ_MAX_WIDTH;
1689	}
1690
1691	/* check */
1692	res = zoran_check_jpg_settings(zr, &settings, 1);
1693	if (res)
1694		return res;
1695
1696	/* tell the user what we actually did */
1697	fmt->fmt.pix.width = settings.img_width / settings.HorDcm;
1698	fmt->fmt.pix.height = settings.img_height * 2 /
1699		(settings.TmpDcm * settings.VerDcm);
1700	if (settings.TmpDcm == 1)
1701		fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
1702				V4L2_FIELD_SEQ_TB : V4L2_FIELD_SEQ_BT);
1703	else
1704		fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
1705				V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM);
1706
1707	fmt->fmt.pix.sizeimage = zoran_v4l2_calc_bufsize(&settings);
1708	fmt->fmt.pix.bytesperline = 0;
1709	fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1710	return res;
1711}
1712
1713static int zoran_try_fmt_vid_cap(struct file *file, void *__fh,
1714					struct v4l2_format *fmt)
1715{
1716	struct zoran_fh *fh = __fh;
1717	struct zoran *zr = fh->zr;
1718	int bpp;
1719	int i;
1720
1721	if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG)
1722		return zoran_try_fmt_vid_out(file, fh, fmt);
1723
1724	for (i = 0; i < NUM_FORMATS; i++)
1725		if (zoran_formats[i].fourcc == fmt->fmt.pix.pixelformat)
1726			break;
1727
1728	if (i == NUM_FORMATS)
1729		return -EINVAL;
1730
1731	bpp = DIV_ROUND_UP(zoran_formats[i].depth, 8);
1732	v4l_bound_align_image(
1733		&fmt->fmt.pix.width, BUZ_MIN_WIDTH, BUZ_MAX_WIDTH, bpp == 2 ? 1 : 2,
1734		&fmt->fmt.pix.height, BUZ_MIN_HEIGHT, BUZ_MAX_HEIGHT, 0, 0);
1735	return 0;
1736}
1737
1738static int zoran_s_fmt_vid_overlay(struct file *file, void *__fh,
1739					struct v4l2_format *fmt)
1740{
1741	struct zoran_fh *fh = __fh;
1742	int res;
1743
1744	dprintk(3, "x=%d, y=%d, w=%d, h=%d, cnt=%d, map=0x%p\n",
1745			fmt->fmt.win.w.left, fmt->fmt.win.w.top,
1746			fmt->fmt.win.w.width,
1747			fmt->fmt.win.w.height,
1748			fmt->fmt.win.clipcount,
1749			fmt->fmt.win.bitmap);
1750	res = setup_window(fh, fmt->fmt.win.w.left, fmt->fmt.win.w.top,
1751			   fmt->fmt.win.w.width, fmt->fmt.win.w.height,
1752			   (struct v4l2_clip __user *)fmt->fmt.win.clips,
1753			   fmt->fmt.win.clipcount, fmt->fmt.win.bitmap);
1754	return res;
1755}
1756
1757static int zoran_s_fmt_vid_out(struct file *file, void *__fh,
1758					struct v4l2_format *fmt)
1759{
1760	struct zoran_fh *fh = __fh;
1761	struct zoran *zr = fh->zr;
1762	__le32 printformat = __cpu_to_le32(fmt->fmt.pix.pixelformat);
1763	struct zoran_jpg_settings settings;
1764	int res = 0;
1765
1766	dprintk(3, "size=%dx%d, fmt=0x%x (%4.4s)\n",
1767			fmt->fmt.pix.width, fmt->fmt.pix.height,
1768			fmt->fmt.pix.pixelformat,
1769			(char *) &printformat);
1770	if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1771		return -EINVAL;
1772
1773	if (fh->buffers.allocated) {
1774		dprintk(1, KERN_ERR "%s: VIDIOC_S_FMT - cannot change capture mode\n",
1775			ZR_DEVNAME(zr));
1776		res = -EBUSY;
1777		return res;
1778	}
1779
1780	settings = fh->jpg_settings;
1781
1782	/* we actually need to set 'real' parameters now */
1783	if (fmt->fmt.pix.height * 2 > BUZ_MAX_HEIGHT)
1784		settings.TmpDcm = 1;
1785	else
1786		settings.TmpDcm = 2;
1787	settings.decimation = 0;
1788	if (fmt->fmt.pix.height <= fh->jpg_settings.img_height / 2)
1789		settings.VerDcm = 2;
1790	else
1791		settings.VerDcm = 1;
1792	if (fmt->fmt.pix.width <= fh->jpg_settings.img_width / 4)
1793		settings.HorDcm = 4;
1794	else if (fmt->fmt.pix.width <= fh->jpg_settings.img_width / 2)
1795		settings.HorDcm = 2;
1796	else
1797		settings.HorDcm = 1;
1798	if (settings.TmpDcm == 1)
1799		settings.field_per_buff = 2;
1800	else
1801		settings.field_per_buff = 1;
1802
1803	if (settings.HorDcm > 1) {
1804		settings.img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
1805		settings.img_width = (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
1806	} else {
1807		settings.img_x = 0;
1808		settings.img_width = BUZ_MAX_WIDTH;
1809	}
1810
1811	/* check */
1812	res = zoran_check_jpg_settings(zr, &settings, 0);
1813	if (res)
1814		return res;
1815
1816	/* it's ok, so set them */
1817	fh->jpg_settings = settings;
1818
1819	map_mode_jpg(fh, fmt->type == V4L2_BUF_TYPE_VIDEO_OUTPUT);
1820	fh->buffers.buffer_size = zoran_v4l2_calc_bufsize(&fh->jpg_settings);
1821
1822	/* tell the user what we actually did */
1823	fmt->fmt.pix.width = settings.img_width / settings.HorDcm;
1824	fmt->fmt.pix.height = settings.img_height * 2 /
1825		(settings.TmpDcm * settings.VerDcm);
1826	if (settings.TmpDcm == 1)
1827		fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
1828				V4L2_FIELD_SEQ_TB : V4L2_FIELD_SEQ_BT);
1829	else
1830		fmt->fmt.pix.field = (fh->jpg_settings.odd_even ?
1831				V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM);
1832	fmt->fmt.pix.bytesperline = 0;
1833	fmt->fmt.pix.sizeimage = fh->buffers.buffer_size;
1834	fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1835	return res;
1836}
1837
1838static int zoran_s_fmt_vid_cap(struct file *file, void *__fh,
1839					struct v4l2_format *fmt)
1840{
1841	struct zoran_fh *fh = __fh;
1842	struct zoran *zr = fh->zr;
1843	int i;
1844	int res = 0;
1845
1846	if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG)
1847		return zoran_s_fmt_vid_out(file, fh, fmt);
1848
1849	for (i = 0; i < NUM_FORMATS; i++)
1850		if (fmt->fmt.pix.pixelformat == zoran_formats[i].fourcc)
1851			break;
1852	if (i == NUM_FORMATS) {
1853		dprintk(1, KERN_ERR "%s: VIDIOC_S_FMT - unknown/unsupported format 0x%x\n",
1854			ZR_DEVNAME(zr), fmt->fmt.pix.pixelformat);
1855		return -EINVAL;
1856	}
1857
1858	if ((fh->map_mode != ZORAN_MAP_MODE_RAW && fh->buffers.allocated) ||
1859	    fh->buffers.active != ZORAN_FREE) {
1860		dprintk(1, KERN_ERR "%s: VIDIOC_S_FMT - cannot change capture mode\n",
1861				ZR_DEVNAME(zr));
1862		res = -EBUSY;
1863		return res;
1864	}
1865	if (fmt->fmt.pix.height > BUZ_MAX_HEIGHT)
1866		fmt->fmt.pix.height = BUZ_MAX_HEIGHT;
1867	if (fmt->fmt.pix.width > BUZ_MAX_WIDTH)
1868		fmt->fmt.pix.width = BUZ_MAX_WIDTH;
1869
1870	map_mode_raw(fh);
1871
1872	res = zoran_v4l_set_format(fh, fmt->fmt.pix.width, fmt->fmt.pix.height,
1873				   &zoran_formats[i]);
1874	if (res)
1875		return res;
1876
1877	/* tell the user the results/missing stuff */
1878	fmt->fmt.pix.bytesperline = fh->v4l_settings.bytesperline;
1879	fmt->fmt.pix.sizeimage = fh->v4l_settings.height * fh->v4l_settings.bytesperline;
1880	fmt->fmt.pix.colorspace = fh->v4l_settings.format->colorspace;
1881	if (BUZ_MAX_HEIGHT < (fh->v4l_settings.height * 2))
1882		fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
1883	else
1884		fmt->fmt.pix.field = V4L2_FIELD_TOP;
1885	return res;
1886}
1887
1888static int zoran_g_fbuf(struct file *file, void *__fh,
1889		struct v4l2_framebuffer *fb)
1890{
1891	struct zoran_fh *fh = __fh;
1892	struct zoran *zr = fh->zr;
1893
1894	memset(fb, 0, sizeof(*fb));
1895	fb->base = zr->vbuf_base;
1896	fb->fmt.width = zr->vbuf_width;
1897	fb->fmt.height = zr->vbuf_height;
1898	if (zr->overlay_settings.format)
1899		fb->fmt.pixelformat = fh->overlay_settings.format->fourcc;
1900	fb->fmt.bytesperline = zr->vbuf_bytesperline;
1901	fb->fmt.colorspace = V4L2_COLORSPACE_SRGB;
1902	fb->fmt.field = V4L2_FIELD_INTERLACED;
1903	fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
1904
1905	return 0;
1906}
1907
1908static int zoran_s_fbuf(struct file *file, void *__fh,
1909		const struct v4l2_framebuffer *fb)
1910{
1911	struct zoran_fh *fh = __fh;
1912	struct zoran *zr = fh->zr;
1913	int i, res = 0;
1914	__le32 printformat = __cpu_to_le32(fb->fmt.pixelformat);
1915
1916	for (i = 0; i < NUM_FORMATS; i++)
1917		if (zoran_formats[i].fourcc == fb->fmt.pixelformat)
1918			break;
1919	if (i == NUM_FORMATS) {
1920		dprintk(1, KERN_ERR "%s: VIDIOC_S_FBUF - format=0x%x (%4.4s) not allowed\n",
1921			ZR_DEVNAME(zr), fb->fmt.pixelformat,
1922			(char *)&printformat);
1923		return -EINVAL;
1924	}
1925
1926	res = setup_fbuffer(fh, fb->base, &zoran_formats[i], fb->fmt.width,
1927			    fb->fmt.height, fb->fmt.bytesperline);
1928
1929	return res;
1930}
1931
1932static int zoran_overlay(struct file *file, void *__fh, unsigned int on)
1933{
1934	struct zoran_fh *fh = __fh;
1935	int res;
1936
1937	res = setup_overlay(fh, on);
1938
1939	return res;
1940}
1941
1942static int zoran_streamoff(struct file *file, void *__fh, enum v4l2_buf_type type);
1943
1944static int zoran_reqbufs(struct file *file, void *__fh, struct v4l2_requestbuffers *req)
1945{
1946	struct zoran_fh *fh = __fh;
1947	struct zoran *zr = fh->zr;
1948	int res = 0;
1949
1950	if (req->memory != V4L2_MEMORY_MMAP) {
1951		dprintk(2,
1952				KERN_ERR
1953				"%s: only MEMORY_MMAP capture is supported, not %d\n",
1954				ZR_DEVNAME(zr), req->memory);
1955		return -EINVAL;
1956	}
1957
1958	if (req->count == 0)
1959		return zoran_streamoff(file, fh, req->type);
1960
1961	if (fh->buffers.allocated) {
1962		dprintk(2,
1963				KERN_ERR
1964				"%s: VIDIOC_REQBUFS - buffers already allocated\n",
1965				ZR_DEVNAME(zr));
1966		res = -EBUSY;
1967		return res;
1968	}
1969
1970	if (fh->map_mode == ZORAN_MAP_MODE_RAW &&
1971	    req->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1972		/* control user input */
1973		if (req->count < 2)
1974			req->count = 2;
1975		if (req->count > v4l_nbufs)
1976			req->count = v4l_nbufs;
1977
1978		/* The next mmap will map the V4L buffers */
1979		map_mode_raw(fh);
1980		fh->buffers.num_buffers = req->count;
1981
1982		if (v4l_fbuffer_alloc(fh)) {
1983			res = -ENOMEM;
1984			return res;
1985		}
1986	} else if (fh->map_mode == ZORAN_MAP_MODE_JPG_REC ||
1987		   fh->map_mode == ZORAN_MAP_MODE_JPG_PLAY) {
1988		/* we need to calculate size ourselves now */
1989		if (req->count < 4)
1990			req->count = 4;
1991		if (req->count > jpg_nbufs)
1992			req->count = jpg_nbufs;
1993
1994		/* The next mmap will map the MJPEG buffers */
1995		map_mode_jpg(fh, req->type == V4L2_BUF_TYPE_VIDEO_OUTPUT);
1996		fh->buffers.num_buffers = req->count;
1997		fh->buffers.buffer_size = zoran_v4l2_calc_bufsize(&fh->jpg_settings);
1998
1999		if (jpg_fbuffer_alloc(fh)) {
2000			res = -ENOMEM;
2001			return res;
2002		}
2003	} else {
2004		dprintk(1,
2005				KERN_ERR
2006				"%s: VIDIOC_REQBUFS - unknown type %d\n",
2007				ZR_DEVNAME(zr), req->type);
2008		res = -EINVAL;
2009		return res;
2010	}
2011	return res;
2012}
2013
2014static int zoran_querybuf(struct file *file, void *__fh, struct v4l2_buffer *buf)
2015{
2016	struct zoran_fh *fh = __fh;
2017	int res;
2018
2019	res = zoran_v4l2_buffer_status(fh, buf, buf->index);
2020
2021	return res;
2022}
2023
2024static int zoran_qbuf(struct file *file, void *__fh, struct v4l2_buffer *buf)
2025{
2026	struct zoran_fh *fh = __fh;
2027	struct zoran *zr = fh->zr;
2028	int res = 0, codec_mode, buf_type;
2029
2030	switch (fh->map_mode) {
2031	case ZORAN_MAP_MODE_RAW:
2032		if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
2033			dprintk(1, KERN_ERR
2034				"%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
2035				ZR_DEVNAME(zr), buf->type, fh->map_mode);
2036			res = -EINVAL;
2037			return res;
2038		}
2039
2040		res = zoran_v4l_queue_frame(fh, buf->index);
2041		if (res)
2042			return res;
2043		if (!zr->v4l_memgrab_active && fh->buffers.active == ZORAN_LOCKED)
2044			zr36057_set_memgrab(zr, 1);
2045		break;
2046
2047	case ZORAN_MAP_MODE_JPG_REC:
2048	case ZORAN_MAP_MODE_JPG_PLAY:
2049		if (fh->map_mode == ZORAN_MAP_MODE_JPG_PLAY) {
2050			buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
2051			codec_mode = BUZ_MODE_MOTION_DECOMPRESS;
2052		} else {
2053			buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2054			codec_mode = BUZ_MODE_MOTION_COMPRESS;
2055		}
2056
2057		if (buf->type != buf_type) {
2058			dprintk(1, KERN_ERR
2059				"%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
2060				ZR_DEVNAME(zr), buf->type, fh->map_mode);
2061			res = -EINVAL;
2062			return res;
2063		}
2064
2065		res = zoran_jpg_queue_frame(fh, buf->index, codec_mode);
2066		if (res != 0)
2067			return res;
2068		if (zr->codec_mode == BUZ_MODE_IDLE &&
2069		    fh->buffers.active == ZORAN_LOCKED)
2070			zr36057_enable_jpg(zr, codec_mode);
2071
2072		break;
2073
2074	default:
2075		dprintk(1, KERN_ERR
2076			"%s: VIDIOC_QBUF - unsupported type %d\n",
2077			ZR_DEVNAME(zr), buf->type);
2078		res = -EINVAL;
2079		break;
2080	}
2081	return res;
2082}
2083
2084static int zoran_dqbuf(struct file *file, void *__fh, struct v4l2_buffer *buf)
2085{
2086	struct zoran_fh *fh = __fh;
2087	struct zoran *zr = fh->zr;
2088	int res = 0, buf_type, num = -1;	/* compiler borks here (?) */
2089
2090	switch (fh->map_mode) {
2091	case ZORAN_MAP_MODE_RAW:
2092		if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
2093			dprintk(1, KERN_ERR
2094				"%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
2095				ZR_DEVNAME(zr), buf->type, fh->map_mode);
2096			res = -EINVAL;
2097			return res;
2098		}
2099
2100		num = zr->v4l_pend[zr->v4l_sync_tail & V4L_MASK_FRAME];
2101		if (file->f_flags & O_NONBLOCK &&
2102		    zr->v4l_buffers.buffer[num].state != BUZ_STATE_DONE) {
2103			res = -EAGAIN;
2104			return res;
2105		}
2106		res = v4l_sync(fh, num);
2107		if (res)
2108			return res;
2109		zr->v4l_sync_tail++;
2110		res = zoran_v4l2_buffer_status(fh, buf, num);
2111		break;
2112
2113	case ZORAN_MAP_MODE_JPG_REC:
2114	case ZORAN_MAP_MODE_JPG_PLAY:
2115	{
2116		struct zoran_sync bs;
2117
2118		if (fh->map_mode == ZORAN_MAP_MODE_JPG_PLAY)
2119			buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
2120		else
2121			buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2122
2123		if (buf->type != buf_type) {
2124			dprintk(1, KERN_ERR
2125				"%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
2126				ZR_DEVNAME(zr), buf->type, fh->map_mode);
2127			res = -EINVAL;
2128			return res;
2129		}
2130
2131		num = zr->jpg_pend[zr->jpg_que_tail & BUZ_MASK_FRAME];
2132
2133		if (file->f_flags & O_NONBLOCK &&
2134		    zr->jpg_buffers.buffer[num].state != BUZ_STATE_DONE) {
2135			res = -EAGAIN;
2136			return res;
2137		}
2138		bs.frame = 0; /* suppress compiler warning */
2139		res = jpg_sync(fh, &bs);
2140		if (res)
2141			return res;
2142		res = zoran_v4l2_buffer_status(fh, buf, bs.frame);
2143		break;
2144	}
2145
2146	default:
2147		dprintk(1, KERN_ERR
2148			"%s: VIDIOC_DQBUF - unsupported type %d\n",
2149			ZR_DEVNAME(zr), buf->type);
2150		res = -EINVAL;
2151		break;
2152	}
2153	return res;
2154}
2155
2156static int zoran_streamon(struct file *file, void *__fh, enum v4l2_buf_type type)
2157{
2158	struct zoran_fh *fh = __fh;
2159	struct zoran *zr = fh->zr;
2160	int res = 0;
2161
2162	switch (fh->map_mode) {
2163	case ZORAN_MAP_MODE_RAW:	/* raw capture */
2164		if (zr->v4l_buffers.active != ZORAN_ACTIVE ||
2165		    fh->buffers.active != ZORAN_ACTIVE) {
2166			res = -EBUSY;
2167			return res;
2168		}
2169
2170		zr->v4l_buffers.active = fh->buffers.active = ZORAN_LOCKED;
2171		zr->v4l_settings = fh->v4l_settings;
2172
2173		zr->v4l_sync_tail = zr->v4l_pend_tail;
2174		if (!zr->v4l_memgrab_active &&
2175		    zr->v4l_pend_head != zr->v4l_pend_tail) {
2176			zr36057_set_memgrab(zr, 1);
2177		}
2178		break;
2179
2180	case ZORAN_MAP_MODE_JPG_REC:
2181	case ZORAN_MAP_MODE_JPG_PLAY:
2182		/* what is the codec mode right now? */
2183		if (zr->jpg_buffers.active != ZORAN_ACTIVE ||
2184		    fh->buffers.active != ZORAN_ACTIVE) {
2185			res = -EBUSY;
2186			return res;
2187		}
2188
2189		zr->jpg_buffers.active = fh->buffers.active = ZORAN_LOCKED;
2190
2191		if (zr->jpg_que_head != zr->jpg_que_tail) {
2192			/* Start the jpeg codec when the first frame is queued  */
2193			jpeg_start(zr);
2194		}
2195		break;
2196
2197	default:
2198		dprintk(1,
2199			KERN_ERR
2200			"%s: VIDIOC_STREAMON - invalid map mode %d\n",
2201			ZR_DEVNAME(zr), fh->map_mode);
2202		res = -EINVAL;
2203		break;
2204	}
2205	return res;
2206}
2207
2208static int zoran_streamoff(struct file *file, void *__fh, enum v4l2_buf_type type)
2209{
2210	struct zoran_fh *fh = __fh;
2211	struct zoran *zr = fh->zr;
2212	int i, res = 0;
2213	unsigned long flags;
2214
2215	switch (fh->map_mode) {
2216	case ZORAN_MAP_MODE_RAW:	/* raw capture */
2217		if (fh->buffers.active == ZORAN_FREE &&
2218		    zr->v4l_buffers.active != ZORAN_FREE) {
2219			res = -EPERM;	/* stay off other's settings! */
2220			return res;
2221		}
2222		if (zr->v4l_buffers.active == ZORAN_FREE)
2223			return res;
2224
2225		spin_lock_irqsave(&zr->spinlock, flags);
2226		/* unload capture */
2227		if (zr->v4l_memgrab_active) {
2228
2229			zr36057_set_memgrab(zr, 0);
2230		}
2231
2232		for (i = 0; i < fh->buffers.num_buffers; i++)
2233			zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER;
2234		fh->buffers = zr->v4l_buffers;
2235
2236		zr->v4l_buffers.active = fh->buffers.active = ZORAN_FREE;
2237
2238		zr->v4l_grab_seq = 0;
2239		zr->v4l_pend_head = zr->v4l_pend_tail = 0;
2240		zr->v4l_sync_tail = 0;
2241
2242		spin_unlock_irqrestore(&zr->spinlock, flags);
2243
2244		break;
2245
2246	case ZORAN_MAP_MODE_JPG_REC:
2247	case ZORAN_MAP_MODE_JPG_PLAY:
2248		if (fh->buffers.active == ZORAN_FREE &&
2249		    zr->jpg_buffers.active != ZORAN_FREE) {
2250			res = -EPERM;	/* stay off other's settings! */
2251			return res;
2252		}
2253		if (zr->jpg_buffers.active == ZORAN_FREE)
2254			return res;
2255
2256		res = jpg_qbuf(fh, -1,
2257			     (fh->map_mode == ZORAN_MAP_MODE_JPG_REC) ?
2258			     BUZ_MODE_MOTION_COMPRESS :
2259			     BUZ_MODE_MOTION_DECOMPRESS);
2260		if (res)
2261			return res;
2262		break;
2263	default:
2264		dprintk(1, KERN_ERR
2265			"%s: VIDIOC_STREAMOFF - invalid map mode %d\n",
2266			ZR_DEVNAME(zr), fh->map_mode);
2267		res = -EINVAL;
2268		break;
2269	}
2270	return res;
2271}
2272static int zoran_g_std(struct file *file, void *__fh, v4l2_std_id *std)
2273{
2274	struct zoran_fh *fh = __fh;
2275	struct zoran *zr = fh->zr;
2276
2277	*std = zr->norm;
2278	return 0;
2279}
2280
2281static int zoran_s_std(struct file *file, void *__fh, v4l2_std_id std)
2282{
2283	struct zoran_fh *fh = __fh;
2284	struct zoran *zr = fh->zr;
2285	int res = 0;
2286
2287	res = zoran_set_norm(zr, std);
2288	if (res)
2289		return res;
2290
2291	res = wait_grab_pending(zr);
2292	return res;
2293}
2294
2295static int zoran_enum_input(struct file *file, void *__fh,
2296				 struct v4l2_input *inp)
2297{
2298	struct zoran_fh *fh = __fh;
2299	struct zoran *zr = fh->zr;
2300
2301	if (inp->index >= zr->card.inputs)
2302		return -EINVAL;
2303
2304	strncpy(inp->name, zr->card.input[inp->index].name,
2305		sizeof(inp->name) - 1);
2306	inp->type = V4L2_INPUT_TYPE_CAMERA;
2307	inp->std = V4L2_STD_ALL;
2308
2309	/* Get status of video decoder */
2310	decoder_call(zr, video, g_input_status, &inp->status);
2311	return 0;
2312}
2313
2314static int zoran_g_input(struct file *file, void *__fh, unsigned int *input)
2315{
2316	struct zoran_fh *fh = __fh;
2317	struct zoran *zr = fh->zr;
2318
2319	*input = zr->input;
2320
2321	return 0;
2322}
2323
2324static int zoran_s_input(struct file *file, void *__fh, unsigned int input)
2325{
2326	struct zoran_fh *fh = __fh;
2327	struct zoran *zr = fh->zr;
2328	int res;
2329
2330	res = zoran_set_input(zr, input);
2331	if (res)
2332		return res;
2333
2334	/* Make sure the changes come into effect */
2335	res = wait_grab_pending(zr);
2336	return res;
2337}
2338
2339static int zoran_enum_output(struct file *file, void *__fh,
2340				  struct v4l2_output *outp)
2341{
2342	if (outp->index != 0)
2343		return -EINVAL;
2344
2345	outp->index = 0;
2346	outp->type = V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY;
2347	strncpy(outp->name, "Autodetect", sizeof(outp->name)-1);
2348
2349	return 0;
2350}
2351
2352static int zoran_g_output(struct file *file, void *__fh, unsigned int *output)
2353{
2354	*output = 0;
2355
2356	return 0;
2357}
2358
2359static int zoran_s_output(struct file *file, void *__fh, unsigned int output)
2360{
2361	if (output != 0)
2362		return -EINVAL;
2363
2364	return 0;
2365}
2366
2367/* cropping (sub-frame capture) */
2368static int zoran_cropcap(struct file *file, void *__fh,
2369					struct v4l2_cropcap *cropcap)
2370{
2371	struct zoran_fh *fh = __fh;
2372	struct zoran *zr = fh->zr;
2373	int type = cropcap->type, res = 0;
2374
2375	memset(cropcap, 0, sizeof(*cropcap));
2376	cropcap->type = type;
2377
2378	if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
2379	    (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2380	     fh->map_mode == ZORAN_MAP_MODE_RAW)) {
2381		dprintk(1, KERN_ERR
2382			"%s: VIDIOC_CROPCAP - subcapture only supported for compressed capture\n",
2383			ZR_DEVNAME(zr));
2384		res = -EINVAL;
2385		return res;
2386	}
2387
2388	cropcap->bounds.top = cropcap->bounds.left = 0;
2389	cropcap->bounds.width = BUZ_MAX_WIDTH;
2390	cropcap->bounds.height = BUZ_MAX_HEIGHT;
2391	cropcap->defrect.top = cropcap->defrect.left = 0;
2392	cropcap->defrect.width = BUZ_MIN_WIDTH;
2393	cropcap->defrect.height = BUZ_MIN_HEIGHT;
2394	return res;
2395}
2396
2397static int zoran_g_crop(struct file *file, void *__fh, struct v4l2_crop *crop)
2398{
2399	struct zoran_fh *fh = __fh;
2400	struct zoran *zr = fh->zr;
2401	int type = crop->type, res = 0;
2402
2403	memset(crop, 0, sizeof(*crop));
2404	crop->type = type;
2405
2406	if (crop->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
2407	    (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2408	     fh->map_mode == ZORAN_MAP_MODE_RAW)) {
2409		dprintk(1,
2410			KERN_ERR
2411			"%s: VIDIOC_G_CROP - subcapture only supported for compressed capture\n",
2412			ZR_DEVNAME(zr));
2413		res = -EINVAL;
2414		return res;
2415	}
2416
2417	crop->c.top = fh->jpg_settings.img_y;
2418	crop->c.left = fh->jpg_settings.img_x;
2419	crop->c.width = fh->jpg_settings.img_width;
2420	crop->c.height = fh->jpg_settings.img_height;
2421	return res;
2422}
2423
2424static int zoran_s_crop(struct file *file, void *__fh, const struct v4l2_crop *crop)
2425{
2426	struct zoran_fh *fh = __fh;
2427	struct zoran *zr = fh->zr;
2428	int res = 0;
2429	struct zoran_jpg_settings settings;
2430
2431	settings = fh->jpg_settings;
2432
2433	if (fh->buffers.allocated) {
2434		dprintk(1, KERN_ERR
2435			"%s: VIDIOC_S_CROP - cannot change settings while active\n",
2436			ZR_DEVNAME(zr));
2437		res = -EBUSY;
2438		return res;
2439	}
2440
2441	if (crop->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
2442	    (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2443	     fh->map_mode == ZORAN_MAP_MODE_RAW)) {
2444		dprintk(1, KERN_ERR
2445			"%s: VIDIOC_G_CROP - subcapture only supported for compressed capture\n",
2446			ZR_DEVNAME(zr));
2447		res = -EINVAL;
2448		return res;
2449	}
2450
2451	/* move into a form that we understand */
2452	settings.img_x = crop->c.left;
2453	settings.img_y = crop->c.top;
2454	settings.img_width = crop->c.width;
2455	settings.img_height = crop->c.height;
2456
2457	/* check validity */
2458	res = zoran_check_jpg_settings(zr, &settings, 0);
2459	if (res)
2460		return res;
2461
2462	/* accept */
2463	fh->jpg_settings = settings;
2464	return res;
2465}
2466
2467static int zoran_g_jpegcomp(struct file *file, void *__fh,
2468					struct v4l2_jpegcompression *params)
2469{
2470	struct zoran_fh *fh = __fh;
2471	memset(params, 0, sizeof(*params));
2472
2473	params->quality = fh->jpg_settings.jpg_comp.quality;
2474	params->APPn = fh->jpg_settings.jpg_comp.APPn;
2475	memcpy(params->APP_data,
2476	       fh->jpg_settings.jpg_comp.APP_data,
2477	       fh->jpg_settings.jpg_comp.APP_len);
2478	params->APP_len = fh->jpg_settings.jpg_comp.APP_len;
2479	memcpy(params->COM_data,
2480	       fh->jpg_settings.jpg_comp.COM_data,
2481	       fh->jpg_settings.jpg_comp.COM_len);
2482	params->COM_len = fh->jpg_settings.jpg_comp.COM_len;
2483	params->jpeg_markers =
2484	    fh->jpg_settings.jpg_comp.jpeg_markers;
2485
2486	return 0;
2487}
2488
2489static int zoran_s_jpegcomp(struct file *file, void *__fh,
2490					const struct v4l2_jpegcompression *params)
2491{
2492	struct zoran_fh *fh = __fh;
2493	struct zoran *zr = fh->zr;
2494	int res = 0;
2495	struct zoran_jpg_settings settings;
2496
2497	settings = fh->jpg_settings;
2498
2499	settings.jpg_comp = *params;
2500
2501	if (fh->buffers.active != ZORAN_FREE) {
2502		dprintk(1, KERN_WARNING
2503			"%s: VIDIOC_S_JPEGCOMP called while in playback/capture mode\n",
2504			ZR_DEVNAME(zr));
2505		res = -EBUSY;
2506		return res;
2507	}
2508
2509	res = zoran_check_jpg_settings(zr, &settings, 0);
2510	if (res)
2511		return res;
2512	if (!fh->buffers.allocated)
2513		fh->buffers.buffer_size =
2514			zoran_v4l2_calc_bufsize(&fh->jpg_settings);
2515	fh->jpg_settings.jpg_comp = settings.jpg_comp;
2516	return res;
2517}
2518
2519static unsigned int
2520zoran_poll (struct file *file,
2521	    poll_table  *wait)
2522{
2523	struct zoran_fh *fh = file->private_data;
2524	struct zoran *zr = fh->zr;
2525	int res = v4l2_ctrl_poll(file, wait);
2526	int frame;
2527	unsigned long flags;
2528
2529	/* we should check whether buffers are ready to be synced on
2530	 * (w/o waits - O_NONBLOCK) here
2531	 * if ready for read (sync), return POLLIN|POLLRDNORM,
2532	 * if ready for write (sync), return POLLOUT|POLLWRNORM,
2533	 * if error, return POLLERR,
2534	 * if no buffers queued or so, return POLLNVAL
2535	 */
2536
2537	switch (fh->map_mode) {
2538	case ZORAN_MAP_MODE_RAW:
2539		poll_wait(file, &zr->v4l_capq, wait);
2540		frame = zr->v4l_pend[zr->v4l_sync_tail & V4L_MASK_FRAME];
2541
2542		spin_lock_irqsave(&zr->spinlock, flags);
2543		dprintk(3,
2544			KERN_DEBUG
2545			"%s: %s() raw - active=%c, sync_tail=%lu/%c, pend_tail=%lu, pend_head=%lu\n",
2546			ZR_DEVNAME(zr), __func__,
2547			"FAL"[fh->buffers.active], zr->v4l_sync_tail,
2548			"UPMD"[zr->v4l_buffers.buffer[frame].state],
2549			zr->v4l_pend_tail, zr->v4l_pend_head);
2550		/* Process is the one capturing? */
2551		if (fh->buffers.active != ZORAN_FREE &&
2552		    /* Buffer ready to DQBUF? */
2553		    zr->v4l_buffers.buffer[frame].state == BUZ_STATE_DONE)
2554			res |= POLLIN | POLLRDNORM;
2555		spin_unlock_irqrestore(&zr->spinlock, flags);
2556
2557		break;
2558
2559	case ZORAN_MAP_MODE_JPG_REC:
2560	case ZORAN_MAP_MODE_JPG_PLAY:
2561		poll_wait(file, &zr->jpg_capq, wait);
2562		frame = zr->jpg_pend[zr->jpg_que_tail & BUZ_MASK_FRAME];
2563
2564		spin_lock_irqsave(&zr->spinlock, flags);
2565		dprintk(3,
2566			KERN_DEBUG
2567			"%s: %s() jpg - active=%c, que_tail=%lu/%c, que_head=%lu, dma=%lu/%lu\n",
2568			ZR_DEVNAME(zr), __func__,
2569			"FAL"[fh->buffers.active], zr->jpg_que_tail,
2570			"UPMD"[zr->jpg_buffers.buffer[frame].state],
2571			zr->jpg_que_head, zr->jpg_dma_tail, zr->jpg_dma_head);
2572		if (fh->buffers.active != ZORAN_FREE &&
2573		    zr->jpg_buffers.buffer[frame].state == BUZ_STATE_DONE) {
2574			if (fh->map_mode == ZORAN_MAP_MODE_JPG_REC)
2575				res |= POLLIN | POLLRDNORM;
2576			else
2577				res |= POLLOUT | POLLWRNORM;
2578		}
2579		spin_unlock_irqrestore(&zr->spinlock, flags);
2580
2581		break;
2582
2583	default:
2584		dprintk(1,
2585			KERN_ERR
2586			"%s: %s - internal error, unknown map_mode=%d\n",
2587			ZR_DEVNAME(zr), __func__, fh->map_mode);
2588		res |= POLLERR;
2589	}
2590
2591	return res;
2592}
2593
2594
2595/*
2596 * This maps the buffers to user space.
2597 *
2598 * Depending on the state of fh->map_mode
2599 * the V4L or the MJPEG buffers are mapped
2600 * per buffer or all together
2601 *
2602 * Note that we need to connect to some
2603 * unmap signal event to unmap the de-allocate
2604 * the buffer accordingly (zoran_vm_close())
2605 */
2606
2607static void
2608zoran_vm_open (struct vm_area_struct *vma)
2609{
2610	struct zoran_mapping *map = vma->vm_private_data;
2611	atomic_inc(&map->count);
2612}
2613
2614static void
2615zoran_vm_close (struct vm_area_struct *vma)
2616{
2617	struct zoran_mapping *map = vma->vm_private_data;
2618	struct zoran_fh *fh = map->fh;
2619	struct zoran *zr = fh->zr;
2620	int i;
2621
2622	dprintk(3, KERN_INFO "%s: %s - munmap(%s)\n", ZR_DEVNAME(zr),
2623		__func__, mode_name(fh->map_mode));
2624
2625	for (i = 0; i < fh->buffers.num_buffers; i++) {
2626		if (fh->buffers.buffer[i].map == map)
2627			fh->buffers.buffer[i].map = NULL;
2628	}
2629	kfree(map);
2630
2631	/* Any buffers still mapped? */
2632	for (i = 0; i < fh->buffers.num_buffers; i++) {
2633		if (fh->buffers.buffer[i].map) {
2634			return;
2635		}
2636	}
2637
2638	dprintk(3, KERN_INFO "%s: %s - free %s buffers\n", ZR_DEVNAME(zr),
2639		__func__, mode_name(fh->map_mode));
2640
2641	if (fh->map_mode == ZORAN_MAP_MODE_RAW) {
2642		if (fh->buffers.active != ZORAN_FREE) {
2643			unsigned long flags;
2644
2645			spin_lock_irqsave(&zr->spinlock, flags);
2646			zr36057_set_memgrab(zr, 0);
2647			zr->v4l_buffers.allocated = 0;
2648			zr->v4l_buffers.active = fh->buffers.active = ZORAN_FREE;
2649			spin_unlock_irqrestore(&zr->spinlock, flags);
2650		}
2651		v4l_fbuffer_free(fh);
2652	} else {
2653		if (fh->buffers.active != ZORAN_FREE) {
2654			jpg_qbuf(fh, -1, zr->codec_mode);
2655			zr->jpg_buffers.allocated = 0;
2656			zr->jpg_buffers.active = fh->buffers.active = ZORAN_FREE;
2657		}
2658		jpg_fbuffer_free(fh);
2659	}
2660}
2661
2662static const struct vm_operations_struct zoran_vm_ops = {
2663	.open = zoran_vm_open,
2664	.close = zoran_vm_close,
2665};
2666
2667static int
2668zoran_mmap (struct file           *file,
2669	    struct vm_area_struct *vma)
2670{
2671	struct zoran_fh *fh = file->private_data;
2672	struct zoran *zr = fh->zr;
2673	unsigned long size = (vma->vm_end - vma->vm_start);
2674	unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
2675	int i, j;
2676	unsigned long page, start = vma->vm_start, todo, pos, fraglen;
2677	int first, last;
2678	struct zoran_mapping *map;
2679	int res = 0;
2680
2681	dprintk(3,
2682		KERN_INFO "%s: %s(%s) of 0x%08lx-0x%08lx (size=%lu)\n",
2683		ZR_DEVNAME(zr), __func__,
2684		mode_name(fh->map_mode), vma->vm_start, vma->vm_end, size);
2685
2686	if (!(vma->vm_flags & VM_SHARED) || !(vma->vm_flags & VM_READ) ||
2687	    !(vma->vm_flags & VM_WRITE)) {
2688		dprintk(1,
2689			KERN_ERR
2690			"%s: %s - no MAP_SHARED/PROT_{READ,WRITE} given\n",
2691			ZR_DEVNAME(zr), __func__);
2692		return -EINVAL;
2693	}
2694
2695	if (!fh->buffers.allocated) {
2696		dprintk(1,
2697			KERN_ERR
2698			"%s: %s(%s) - buffers not yet allocated\n",
2699			ZR_DEVNAME(zr), __func__, mode_name(fh->map_mode));
2700		res = -ENOMEM;
2701		return res;
2702	}
2703
2704	first = offset / fh->buffers.buffer_size;
2705	last = first - 1 + size / fh->buffers.buffer_size;
2706	if (offset % fh->buffers.buffer_size != 0 ||
2707	    size % fh->buffers.buffer_size != 0 || first < 0 ||
2708	    last < 0 || first >= fh->buffers.num_buffers ||
2709	    last >= fh->buffers.buffer_size) {
2710		dprintk(1,
2711			KERN_ERR
2712			"%s: %s(%s) - offset=%lu or size=%lu invalid for bufsize=%d and numbufs=%d\n",
2713			ZR_DEVNAME(zr), __func__, mode_name(fh->map_mode), offset, size,
2714			fh->buffers.buffer_size,
2715			fh->buffers.num_buffers);
2716		res = -EINVAL;
2717		return res;
2718	}
2719
2720	/* Check if any buffers are already mapped */
2721	for (i = first; i <= last; i++) {
2722		if (fh->buffers.buffer[i].map) {
2723			dprintk(1,
2724				KERN_ERR
2725				"%s: %s(%s) - buffer %d already mapped\n",
2726				ZR_DEVNAME(zr), __func__, mode_name(fh->map_mode), i);
2727			res = -EBUSY;
2728			return res;
2729		}
2730	}
2731
2732	/* map these buffers */
2733	map = kmalloc(sizeof(struct zoran_mapping), GFP_KERNEL);
2734	if (!map) {
2735		res = -ENOMEM;
2736		return res;
2737	}
2738	map->fh = fh;
2739	atomic_set(&map->count, 1);
2740
2741	vma->vm_ops = &zoran_vm_ops;
2742	vma->vm_flags |= VM_DONTEXPAND;
2743	vma->vm_private_data = map;
2744
2745	if (fh->map_mode == ZORAN_MAP_MODE_RAW) {
2746		for (i = first; i <= last; i++) {
2747			todo = size;
2748			if (todo > fh->buffers.buffer_size)
2749				todo = fh->buffers.buffer_size;
2750			page = fh->buffers.buffer[i].v4l.fbuffer_phys;
2751			if (remap_pfn_range(vma, start, page >> PAGE_SHIFT,
2752							todo, PAGE_SHARED)) {
2753				dprintk(1,
2754					KERN_ERR
2755					"%s: %s(V4L) - remap_pfn_range failed\n",
2756					ZR_DEVNAME(zr), __func__);
2757				res = -EAGAIN;
2758				return res;
2759			}
2760			size -= todo;
2761			start += todo;
2762			fh->buffers.buffer[i].map = map;
2763			if (size == 0)
2764				break;
2765		}
2766	} else {
2767		for (i = first; i <= last; i++) {
2768			for (j = 0;
2769			     j < fh->buffers.buffer_size / PAGE_SIZE;
2770			     j++) {
2771				fraglen =
2772				    (le32_to_cpu(fh->buffers.buffer[i].jpg.
2773				     frag_tab[2 * j + 1]) & ~1) << 1;
2774				todo = size;
2775				if (todo > fraglen)
2776					todo = fraglen;
2777				pos =
2778				    le32_to_cpu(fh->buffers.
2779				    buffer[i].jpg.frag_tab[2 * j]);
2780				/* should just be pos on i386 */
2781				page = virt_to_phys(bus_to_virt(pos))
2782								>> PAGE_SHIFT;
2783				if (remap_pfn_range(vma, start, page,
2784							todo, PAGE_SHARED)) {
2785					dprintk(1,
2786						KERN_ERR
2787						"%s: %s(V4L) - remap_pfn_range failed\n",
2788						ZR_DEVNAME(zr), __func__);
2789					res = -EAGAIN;
2790					return res;
2791				}
2792				size -= todo;
2793				start += todo;
2794				if (size == 0)
2795					break;
2796				if (le32_to_cpu(fh->buffers.buffer[i].jpg.
2797				    frag_tab[2 * j + 1]) & 1)
2798					break;	/* was last fragment */
2799			}
2800			fh->buffers.buffer[i].map = map;
2801			if (size == 0)
2802				break;
2803
2804		}
2805	}
2806	return res;
2807}
2808
2809static const struct v4l2_ioctl_ops zoran_ioctl_ops = {
2810	.vidioc_querycap    		    = zoran_querycap,
2811	.vidioc_cropcap       		    = zoran_cropcap,
2812	.vidioc_s_crop       		    = zoran_s_crop,
2813	.vidioc_g_crop       		    = zoran_g_crop,
2814	.vidioc_enum_input     		    = zoran_enum_input,
2815	.vidioc_g_input      		    = zoran_g_input,
2816	.vidioc_s_input      		    = zoran_s_input,
2817	.vidioc_enum_output    		    = zoran_enum_output,
2818	.vidioc_g_output     		    = zoran_g_output,
2819	.vidioc_s_output     		    = zoran_s_output,
2820	.vidioc_g_fbuf			    = zoran_g_fbuf,
2821	.vidioc_s_fbuf			    = zoran_s_fbuf,
2822	.vidioc_g_std 			    = zoran_g_std,
2823	.vidioc_s_std 			    = zoran_s_std,
2824	.vidioc_g_jpegcomp 		    = zoran_g_jpegcomp,
2825	.vidioc_s_jpegcomp 		    = zoran_s_jpegcomp,
2826	.vidioc_overlay			    = zoran_overlay,
2827	.vidioc_reqbufs			    = zoran_reqbufs,
2828	.vidioc_querybuf		    = zoran_querybuf,
2829	.vidioc_qbuf			    = zoran_qbuf,
2830	.vidioc_dqbuf			    = zoran_dqbuf,
2831	.vidioc_streamon		    = zoran_streamon,
2832	.vidioc_streamoff		    = zoran_streamoff,
2833	.vidioc_enum_fmt_vid_cap 	    = zoran_enum_fmt_vid_cap,
2834	.vidioc_enum_fmt_vid_out 	    = zoran_enum_fmt_vid_out,
2835	.vidioc_enum_fmt_vid_overlay 	    = zoran_enum_fmt_vid_overlay,
2836	.vidioc_g_fmt_vid_cap 		    = zoran_g_fmt_vid_cap,
2837	.vidioc_g_fmt_vid_out               = zoran_g_fmt_vid_out,
2838	.vidioc_g_fmt_vid_overlay           = zoran_g_fmt_vid_overlay,
2839	.vidioc_s_fmt_vid_cap  		    = zoran_s_fmt_vid_cap,
2840	.vidioc_s_fmt_vid_out               = zoran_s_fmt_vid_out,
2841	.vidioc_s_fmt_vid_overlay           = zoran_s_fmt_vid_overlay,
2842	.vidioc_try_fmt_vid_cap  	    = zoran_try_fmt_vid_cap,
2843	.vidioc_try_fmt_vid_out 	    = zoran_try_fmt_vid_out,
2844	.vidioc_try_fmt_vid_overlay 	    = zoran_try_fmt_vid_overlay,
2845	.vidioc_subscribe_event             = v4l2_ctrl_subscribe_event,
2846	.vidioc_unsubscribe_event           = v4l2_event_unsubscribe,
2847};
2848
2849static const struct v4l2_file_operations zoran_fops = {
2850	.owner = THIS_MODULE,
2851	.open = zoran_open,
2852	.release = zoran_close,
2853	.unlocked_ioctl = video_ioctl2,
2854	.mmap = zoran_mmap,
2855	.poll = zoran_poll,
2856};
2857
2858struct video_device zoran_template = {
2859	.name = ZORAN_NAME,
2860	.fops = &zoran_fops,
2861	.ioctl_ops = &zoran_ioctl_ops,
2862	.release = &zoran_vdev_release,
2863	.tvnorms = V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM,
2864};
2865
2866