1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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>
55
56#include <linux/interrupt.h>
57#include <linux/i2c.h>
58#include <linux/i2c-algo-bit.h>
59
60#include <linux/spinlock.h>
61#define MAP_NR(x) virt_to_page(x)
62#define ZORAN_VID_TYPE ( \
63 VID_TYPE_CAPTURE | \
64 VID_TYPE_OVERLAY | \
65 VID_TYPE_CLIPPING | \
66 VID_TYPE_FRAMERAM | \
67 VID_TYPE_SCALES | \
68 VID_TYPE_MJPEG_DECODER | \
69 VID_TYPE_MJPEG_ENCODER \
70 )
71
72#include <linux/videodev.h>
73#include <media/v4l2-common.h>
74#include <media/v4l2-ioctl.h>
75#include "videocodec.h"
76
77#include <asm/byteorder.h>
78#include <asm/io.h>
79#include <asm/uaccess.h>
80#include <linux/proc_fs.h>
81
82#include <linux/video_decoder.h>
83#include <linux/video_encoder.h>
84#include <linux/mutex.h>
85#include "zoran.h"
86#include "zoran_device.h"
87#include "zoran_card.h"
88
89
90
91#define ZORAN_V4L2_VID_FLAGS ( \
92 V4L2_CAP_STREAMING |\
93 V4L2_CAP_VIDEO_CAPTURE |\
94 V4L2_CAP_VIDEO_OUTPUT |\
95 V4L2_CAP_VIDEO_OVERLAY \
96 )
97
98
99#if defined(CONFIG_VIDEO_V4L1_COMPAT)
100#define ZFMT(pal, fcc, cs) \
101 .palette = (pal), .fourcc = (fcc), .colorspace = (cs)
102#else
103#define ZFMT(pal, fcc, cs) \
104 .fourcc = (fcc), .colorspace = (cs)
105#endif
106
107const struct zoran_format zoran_formats[] = {
108 {
109 .name = "15-bit RGB LE",
110 ZFMT(VIDEO_PALETTE_RGB555,
111 V4L2_PIX_FMT_RGB555, V4L2_COLORSPACE_SRGB),
112 .depth = 15,
113 .flags = ZORAN_FORMAT_CAPTURE |
114 ZORAN_FORMAT_OVERLAY,
115 .vfespfr = ZR36057_VFESPFR_RGB555|ZR36057_VFESPFR_ErrDif|
116 ZR36057_VFESPFR_LittleEndian,
117 }, {
118 .name = "15-bit RGB BE",
119 ZFMT(-1,
120 V4L2_PIX_FMT_RGB555X, V4L2_COLORSPACE_SRGB),
121 .depth = 15,
122 .flags = ZORAN_FORMAT_CAPTURE |
123 ZORAN_FORMAT_OVERLAY,
124 .vfespfr = ZR36057_VFESPFR_RGB555|ZR36057_VFESPFR_ErrDif,
125 }, {
126 .name = "16-bit RGB LE",
127 ZFMT(VIDEO_PALETTE_RGB565,
128 V4L2_PIX_FMT_RGB565, V4L2_COLORSPACE_SRGB),
129 .depth = 16,
130 .flags = ZORAN_FORMAT_CAPTURE |
131 ZORAN_FORMAT_OVERLAY,
132 .vfespfr = ZR36057_VFESPFR_RGB565|ZR36057_VFESPFR_ErrDif|
133 ZR36057_VFESPFR_LittleEndian,
134 }, {
135 .name = "16-bit RGB BE",
136 ZFMT(-1,
137 V4L2_PIX_FMT_RGB565X, V4L2_COLORSPACE_SRGB),
138 .depth = 16,
139 .flags = ZORAN_FORMAT_CAPTURE |
140 ZORAN_FORMAT_OVERLAY,
141 .vfespfr = ZR36057_VFESPFR_RGB565|ZR36057_VFESPFR_ErrDif,
142 }, {
143 .name = "24-bit RGB",
144 ZFMT(VIDEO_PALETTE_RGB24,
145 V4L2_PIX_FMT_BGR24, V4L2_COLORSPACE_SRGB),
146 .depth = 24,
147 .flags = ZORAN_FORMAT_CAPTURE |
148 ZORAN_FORMAT_OVERLAY,
149 .vfespfr = ZR36057_VFESPFR_RGB888|ZR36057_VFESPFR_Pack24,
150 }, {
151 .name = "32-bit RGB LE",
152 ZFMT(VIDEO_PALETTE_RGB32,
153 V4L2_PIX_FMT_BGR32, V4L2_COLORSPACE_SRGB),
154 .depth = 32,
155 .flags = ZORAN_FORMAT_CAPTURE |
156 ZORAN_FORMAT_OVERLAY,
157 .vfespfr = ZR36057_VFESPFR_RGB888|ZR36057_VFESPFR_LittleEndian,
158 }, {
159 .name = "32-bit RGB BE",
160 ZFMT(-1,
161 V4L2_PIX_FMT_RGB32, V4L2_COLORSPACE_SRGB),
162 .depth = 32,
163 .flags = ZORAN_FORMAT_CAPTURE |
164 ZORAN_FORMAT_OVERLAY,
165 .vfespfr = ZR36057_VFESPFR_RGB888,
166 }, {
167 .name = "4:2:2, packed, YUYV",
168 ZFMT(VIDEO_PALETTE_YUV422,
169 V4L2_PIX_FMT_YUYV, V4L2_COLORSPACE_SMPTE170M),
170 .depth = 16,
171 .flags = ZORAN_FORMAT_CAPTURE |
172 ZORAN_FORMAT_OVERLAY,
173 .vfespfr = ZR36057_VFESPFR_YUV422,
174 }, {
175 .name = "4:2:2, packed, UYVY",
176 ZFMT(VIDEO_PALETTE_UYVY,
177 V4L2_PIX_FMT_UYVY, V4L2_COLORSPACE_SMPTE170M),
178 .depth = 16,
179 .flags = ZORAN_FORMAT_CAPTURE |
180 ZORAN_FORMAT_OVERLAY,
181 .vfespfr = ZR36057_VFESPFR_YUV422|ZR36057_VFESPFR_LittleEndian,
182 }, {
183 .name = "Hardware-encoded Motion-JPEG",
184 ZFMT(-1,
185 V4L2_PIX_FMT_MJPEG, V4L2_COLORSPACE_SMPTE170M),
186 .depth = 0,
187 .flags = ZORAN_FORMAT_CAPTURE |
188 ZORAN_FORMAT_PLAYBACK |
189 ZORAN_FORMAT_COMPRESSED,
190 }
191};
192#define NUM_FORMATS ARRAY_SIZE(zoran_formats)
193
194
195
196
197extern int v4l_nbufs;
198extern int v4l_bufsize;
199extern int jpg_nbufs;
200extern int jpg_bufsize;
201extern int pass_through;
202
203static int lock_norm;
204module_param(lock_norm, int, 0644);
205MODULE_PARM_DESC(lock_norm, "Prevent norm changes (1 = ignore, >1 = fail)");
206
207
208
209
210static __u32
211zoran_v4l2_calc_bufsize (struct zoran_jpg_settings *settings)
212{
213 __u8 div = settings->VerDcm * settings->HorDcm * settings->TmpDcm;
214 __u32 num = (1024 * 512) / (div);
215 __u32 result = 2;
216
217 num--;
218 while (num) {
219 num >>= 1;
220 result <<= 1;
221 }
222
223 if (result > jpg_bufsize)
224 return jpg_bufsize;
225 if (result < 8192)
226 return 8192;
227 return result;
228}
229
230
231static void v4l_fbuffer_free(struct file *file);
232static void jpg_fbuffer_free(struct file *file);
233
234
235
236
237
238
239
240
241
242
243
244
245static unsigned long
246get_high_mem (unsigned long size)
247{
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262 volatile unsigned char __iomem *mem;
263 unsigned char c;
264 unsigned long hi_mem_ph;
265 unsigned long i;
266
267
268
269 hi_mem_ph = virt_to_phys(high_memory);
270
271 mem = ioremap(hi_mem_ph, size);
272 if (!mem) {
273 dprintk(1,
274 KERN_ERR "%s: get_high_mem() - ioremap failed\n",
275 ZORAN_NAME);
276 return 0;
277 }
278
279 for (i = 0; i < size; i++) {
280
281 c = i & 0xff;
282 writeb(c, mem + i);
283 if (readb(mem + i) != c)
284 break;
285 c = 255 - c;
286 writeb(c, mem + i);
287 if (readb(mem + i) != c)
288 break;
289 writeb(0, mem + i);
290
291
292 if ((i & 0x3ffff) == 0x3ffff)
293 schedule();
294 }
295
296 iounmap(mem);
297
298 if (i != size) {
299 dprintk(1,
300 KERN_ERR
301 "%s: get_high_mem() - requested %lu, avail %lu\n",
302 ZORAN_NAME, size, i);
303 return 0;
304 }
305
306 return hi_mem_ph;
307}
308
309static int
310v4l_fbuffer_alloc (struct file *file)
311{
312 struct zoran_fh *fh = file->private_data;
313 struct zoran *zr = fh->zr;
314 int i, off;
315 unsigned char *mem;
316 unsigned long pmem = 0;
317
318
319 if (fh->v4l_buffers.ready_to_be_freed) {
320 v4l_fbuffer_free(file);
321 }
322
323 for (i = 0; i < fh->v4l_buffers.num_buffers; i++) {
324 if (fh->v4l_buffers.buffer[i].fbuffer)
325 dprintk(2,
326 KERN_WARNING
327 "%s: v4l_fbuffer_alloc() - buffer %d allready allocated!?\n",
328 ZR_DEVNAME(zr), i);
329
330
331 if (fh->v4l_buffers.buffer_size <= MAX_KMALLOC_MEM) {
332
333
334 mem = kmalloc(fh->v4l_buffers.buffer_size, GFP_KERNEL);
335 if (!mem) {
336 dprintk(1,
337 KERN_ERR
338 "%s: v4l_fbuffer_alloc() - kmalloc for V4L buf %d failed\n",
339 ZR_DEVNAME(zr), i);
340 v4l_fbuffer_free(file);
341 return -ENOBUFS;
342 }
343 fh->v4l_buffers.buffer[i].fbuffer = mem;
344 fh->v4l_buffers.buffer[i].fbuffer_phys =
345 virt_to_phys(mem);
346 fh->v4l_buffers.buffer[i].fbuffer_bus =
347 virt_to_bus(mem);
348 for (off = 0; off < fh->v4l_buffers.buffer_size;
349 off += PAGE_SIZE)
350 SetPageReserved(MAP_NR(mem + off));
351 dprintk(4,
352 KERN_INFO
353 "%s: v4l_fbuffer_alloc() - V4L frame %d mem 0x%lx (bus: 0x%lx)\n",
354 ZR_DEVNAME(zr), i, (unsigned long) mem,
355 virt_to_bus(mem));
356 } else {
357
358
359
360
361
362
363
364
365
366
367
368
369 if (i == 0) {
370 int size =
371 fh->v4l_buffers.num_buffers *
372 fh->v4l_buffers.buffer_size;
373
374 pmem = get_high_mem(size);
375 if (pmem == 0) {
376 dprintk(1,
377 KERN_ERR
378 "%s: v4l_fbuffer_alloc() - get_high_mem (size = %d KB) for V4L bufs failed\n",
379 ZR_DEVNAME(zr), size >> 10);
380 return -ENOBUFS;
381 }
382 fh->v4l_buffers.buffer[0].fbuffer = NULL;
383 fh->v4l_buffers.buffer[0].fbuffer_phys = pmem;
384 fh->v4l_buffers.buffer[0].fbuffer_bus = pmem;
385 dprintk(4,
386 KERN_INFO
387 "%s: v4l_fbuffer_alloc() - using %d KB high memory\n",
388 ZR_DEVNAME(zr), size >> 10);
389 } else {
390 fh->v4l_buffers.buffer[i].fbuffer = NULL;
391 fh->v4l_buffers.buffer[i].fbuffer_phys =
392 pmem + i * fh->v4l_buffers.buffer_size;
393 fh->v4l_buffers.buffer[i].fbuffer_bus =
394 pmem + i * fh->v4l_buffers.buffer_size;
395 }
396 }
397 }
398
399 fh->v4l_buffers.allocated = 1;
400
401 return 0;
402}
403
404
405static void
406v4l_fbuffer_free (struct file *file)
407{
408 struct zoran_fh *fh = file->private_data;
409 struct zoran *zr = fh->zr;
410 int i, off;
411 unsigned char *mem;
412
413 dprintk(4, KERN_INFO "%s: v4l_fbuffer_free()\n", ZR_DEVNAME(zr));
414
415 for (i = 0; i < fh->v4l_buffers.num_buffers; i++) {
416 if (!fh->v4l_buffers.buffer[i].fbuffer)
417 continue;
418
419 if (fh->v4l_buffers.buffer_size <= MAX_KMALLOC_MEM) {
420 mem = fh->v4l_buffers.buffer[i].fbuffer;
421 for (off = 0; off < fh->v4l_buffers.buffer_size;
422 off += PAGE_SIZE)
423 ClearPageReserved(MAP_NR(mem + off));
424 kfree((void *) fh->v4l_buffers.buffer[i].fbuffer);
425 }
426 fh->v4l_buffers.buffer[i].fbuffer = NULL;
427 }
428
429 fh->v4l_buffers.allocated = 0;
430 fh->v4l_buffers.ready_to_be_freed = 0;
431}
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467static int
468jpg_fbuffer_alloc (struct file *file)
469{
470 struct zoran_fh *fh = file->private_data;
471 struct zoran *zr = fh->zr;
472 int i, j, off;
473 unsigned long mem;
474
475
476 if (fh->jpg_buffers.ready_to_be_freed) {
477 jpg_fbuffer_free(file);
478 }
479
480 for (i = 0; i < fh->jpg_buffers.num_buffers; i++) {
481 if (fh->jpg_buffers.buffer[i].frag_tab)
482 dprintk(2,
483 KERN_WARNING
484 "%s: jpg_fbuffer_alloc() - buffer %d allready allocated!?\n",
485 ZR_DEVNAME(zr), i);
486
487
488
489 mem = get_zeroed_page(GFP_KERNEL);
490 if (mem == 0) {
491 dprintk(1,
492 KERN_ERR
493 "%s: jpg_fbuffer_alloc() - get_zeroed_page (frag_tab) failed for buffer %d\n",
494 ZR_DEVNAME(zr), i);
495 jpg_fbuffer_free(file);
496 return -ENOBUFS;
497 }
498 fh->jpg_buffers.buffer[i].frag_tab = (__le32 *) mem;
499 fh->jpg_buffers.buffer[i].frag_tab_bus =
500 virt_to_bus((void *) mem);
501
502
503 if (fh->jpg_buffers.need_contiguous) {
504 mem =
505 (unsigned long) kmalloc(fh->jpg_buffers.
506 buffer_size,
507 GFP_KERNEL);
508 if (mem == 0) {
509 dprintk(1,
510 KERN_ERR
511 "%s: jpg_fbuffer_alloc() - kmalloc failed for buffer %d\n",
512 ZR_DEVNAME(zr), i);
513 jpg_fbuffer_free(file);
514 return -ENOBUFS;
515 }
516 fh->jpg_buffers.buffer[i].frag_tab[0] =
517 cpu_to_le32(virt_to_bus((void *) mem));
518 fh->jpg_buffers.buffer[i].frag_tab[1] =
519 cpu_to_le32(((fh->jpg_buffers.buffer_size / 4) << 1) | 1);
520 for (off = 0; off < fh->jpg_buffers.buffer_size;
521 off += PAGE_SIZE)
522 SetPageReserved(MAP_NR(mem + off));
523 } else {
524
525 for (j = 0;
526 j < fh->jpg_buffers.buffer_size / PAGE_SIZE;
527 j++) {
528 mem = get_zeroed_page(GFP_KERNEL);
529 if (mem == 0) {
530 dprintk(1,
531 KERN_ERR
532 "%s: jpg_fbuffer_alloc() - get_zeroed_page failed for buffer %d\n",
533 ZR_DEVNAME(zr), i);
534 jpg_fbuffer_free(file);
535 return -ENOBUFS;
536 }
537
538 fh->jpg_buffers.buffer[i].frag_tab[2 * j] =
539 cpu_to_le32(virt_to_bus((void *) mem));
540 fh->jpg_buffers.buffer[i].frag_tab[2 * j +
541 1] =
542 cpu_to_le32((PAGE_SIZE / 4) << 1);
543 SetPageReserved(MAP_NR(mem));
544 }
545
546 fh->jpg_buffers.buffer[i].frag_tab[2 * j - 1] |= cpu_to_le32(1);
547 }
548 }
549
550 dprintk(4,
551 KERN_DEBUG "%s: jpg_fbuffer_alloc() - %d KB allocated\n",
552 ZR_DEVNAME(zr),
553 (fh->jpg_buffers.num_buffers *
554 fh->jpg_buffers.buffer_size) >> 10);
555
556 fh->jpg_buffers.allocated = 1;
557
558 return 0;
559}
560
561
562static void
563jpg_fbuffer_free (struct file *file)
564{
565 struct zoran_fh *fh = file->private_data;
566 struct zoran *zr = fh->zr;
567 int i, j, off;
568 unsigned char *mem;
569
570 dprintk(4, KERN_DEBUG "%s: jpg_fbuffer_free()\n", ZR_DEVNAME(zr));
571
572 for (i = 0; i < fh->jpg_buffers.num_buffers; i++) {
573 if (!fh->jpg_buffers.buffer[i].frag_tab)
574 continue;
575
576
577 if (fh->jpg_buffers.need_contiguous) {
578 if (fh->jpg_buffers.buffer[i].frag_tab[0]) {
579 mem = (unsigned char *) bus_to_virt(le32_to_cpu(
580 fh->jpg_buffers.buffer[i].frag_tab[0]));
581 for (off = 0;
582 off < fh->jpg_buffers.buffer_size;
583 off += PAGE_SIZE)
584 ClearPageReserved(MAP_NR
585 (mem + off));
586 kfree(mem);
587 fh->jpg_buffers.buffer[i].frag_tab[0] = 0;
588 fh->jpg_buffers.buffer[i].frag_tab[1] = 0;
589 }
590 } else {
591 for (j = 0;
592 j < fh->jpg_buffers.buffer_size / PAGE_SIZE;
593 j++) {
594 if (!fh->jpg_buffers.buffer[i].
595 frag_tab[2 * j])
596 break;
597 ClearPageReserved(MAP_NR
598 (bus_to_virt
599 (le32_to_cpu
600 (fh->jpg_buffers.
601 buffer[i].frag_tab[2 *
602 j]))));
603 free_page((unsigned long)
604 bus_to_virt
605 (le32_to_cpu
606 (fh->jpg_buffers.
607 buffer[i].
608 frag_tab[2 * j])));
609 fh->jpg_buffers.buffer[i].frag_tab[2 * j] =
610 0;
611 fh->jpg_buffers.buffer[i].frag_tab[2 * j +
612 1] = 0;
613 }
614 }
615
616 free_page((unsigned long) fh->jpg_buffers.buffer[i].
617 frag_tab);
618 fh->jpg_buffers.buffer[i].frag_tab = NULL;
619 }
620
621 fh->jpg_buffers.allocated = 0;
622 fh->jpg_buffers.ready_to_be_freed = 0;
623}
624
625
626
627
628
629static int
630zoran_v4l_set_format (struct file *file,
631 int width,
632 int height,
633 const struct zoran_format *format)
634{
635 struct zoran_fh *fh = file->private_data;
636 struct zoran *zr = fh->zr;
637 int bpp;
638
639
640
641 if (height < BUZ_MIN_HEIGHT || width < BUZ_MIN_WIDTH ||
642 height > BUZ_MAX_HEIGHT || width > BUZ_MAX_WIDTH) {
643 dprintk(1,
644 KERN_ERR
645 "%s: v4l_set_format() - wrong frame size (%dx%d)\n",
646 ZR_DEVNAME(zr), width, height);
647 return -EINVAL;
648 }
649
650 bpp = (format->depth + 7) / 8;
651
652
653 if (height * width * bpp > fh->v4l_buffers.buffer_size) {
654 dprintk(1,
655 KERN_ERR
656 "%s: v4l_set_format() - video buffer size (%d kB) is too small\n",
657 ZR_DEVNAME(zr), fh->v4l_buffers.buffer_size >> 10);
658 return -EINVAL;
659 }
660
661
662
663 if ((bpp == 2 && (width & 1)) || (bpp == 3 && (width & 3))) {
664 dprintk(1,
665 KERN_ERR
666 "%s: v4l_set_format() - wrong frame alingment\n",
667 ZR_DEVNAME(zr));
668 return -EINVAL;
669 }
670
671 fh->v4l_settings.width = width;
672 fh->v4l_settings.height = height;
673 fh->v4l_settings.format = format;
674 fh->v4l_settings.bytesperline = bpp * fh->v4l_settings.width;
675
676 return 0;
677}
678
679static int
680zoran_v4l_queue_frame (struct file *file,
681 int num)
682{
683 struct zoran_fh *fh = file->private_data;
684 struct zoran *zr = fh->zr;
685 unsigned long flags;
686 int res = 0;
687
688 if (!fh->v4l_buffers.allocated) {
689 dprintk(1,
690 KERN_ERR
691 "%s: v4l_queue_frame() - buffers not yet allocated\n",
692 ZR_DEVNAME(zr));
693 res = -ENOMEM;
694 }
695
696
697 if (num >= fh->v4l_buffers.num_buffers || num < 0) {
698 dprintk(1,
699 KERN_ERR
700 "%s: v4l_queue_frame() - buffer %d is out of range\n",
701 ZR_DEVNAME(zr), num);
702 res = -EINVAL;
703 }
704
705 spin_lock_irqsave(&zr->spinlock, flags);
706
707 if (fh->v4l_buffers.active == ZORAN_FREE) {
708 if (zr->v4l_buffers.active == ZORAN_FREE) {
709 zr->v4l_buffers = fh->v4l_buffers;
710 fh->v4l_buffers.active = ZORAN_ACTIVE;
711 } else {
712 dprintk(1,
713 KERN_ERR
714 "%s: v4l_queue_frame() - another session is already capturing\n",
715 ZR_DEVNAME(zr));
716 res = -EBUSY;
717 }
718 }
719
720
721 if (!res) {
722 switch (zr->v4l_buffers.buffer[num].state) {
723 default:
724 case BUZ_STATE_PEND:
725 if (zr->v4l_buffers.active == ZORAN_FREE) {
726 fh->v4l_buffers.active = ZORAN_FREE;
727 zr->v4l_buffers.allocated = 0;
728 }
729 res = -EBUSY;
730 break;
731 case BUZ_STATE_DONE:
732 dprintk(2,
733 KERN_WARNING
734 "%s: v4l_queue_frame() - queueing buffer %d in state DONE!?\n",
735 ZR_DEVNAME(zr), num);
736 case BUZ_STATE_USER:
737
738
739 zr->v4l_pend[zr->v4l_pend_head++ &
740 V4L_MASK_FRAME] = num;
741 zr->v4l_buffers.buffer[num].state = BUZ_STATE_PEND;
742 zr->v4l_buffers.buffer[num].bs.length =
743 fh->v4l_settings.bytesperline *
744 zr->v4l_settings.height;
745 fh->v4l_buffers.buffer[num] =
746 zr->v4l_buffers.buffer[num];
747 break;
748 }
749 }
750
751 spin_unlock_irqrestore(&zr->spinlock, flags);
752
753 if (!res && zr->v4l_buffers.active == ZORAN_FREE)
754 zr->v4l_buffers.active = fh->v4l_buffers.active;
755
756 return res;
757}
758
759static int
760v4l_grab (struct file *file,
761 struct video_mmap *mp)
762{
763 struct zoran_fh *fh = file->private_data;
764 struct zoran *zr = fh->zr;
765 int res = 0, i;
766
767 for (i = 0; i < NUM_FORMATS; i++) {
768 if (zoran_formats[i].palette == mp->format &&
769 zoran_formats[i].flags & ZORAN_FORMAT_CAPTURE &&
770 !(zoran_formats[i].flags & ZORAN_FORMAT_COMPRESSED))
771 break;
772 }
773 if (i == NUM_FORMATS || zoran_formats[i].depth == 0) {
774 dprintk(1,
775 KERN_ERR
776 "%s: v4l_grab() - wrong bytes-per-pixel format\n",
777 ZR_DEVNAME(zr));
778 return -EINVAL;
779 }
780
781
782
783
784
785
786
787 if (zr->v4l_memgrab_active &&
788 (zr->v4l_settings.width != mp->width ||
789 zr->v4l_settings.height != mp->height ||
790 zr->v4l_settings.format->palette != mp->format)) {
791 res = wait_grab_pending(zr);
792 if (res)
793 return res;
794 }
795 if ((res = zoran_v4l_set_format(file,
796 mp->width,
797 mp->height,
798 &zoran_formats[i])))
799 return res;
800 zr->v4l_settings = fh->v4l_settings;
801
802
803 if ((res = zoran_v4l_queue_frame(file, mp->frame))) {
804 fh->v4l_buffers.active = ZORAN_FREE;
805 return res;
806 }
807
808
809 if (!res && !zr->v4l_memgrab_active)
810 zr36057_set_memgrab(zr, 1);
811
812
813
814 return res;
815}
816
817
818
819
820
821static int
822v4l_sync (struct file *file,
823 int frame)
824{
825 struct zoran_fh *fh = file->private_data;
826 struct zoran *zr = fh->zr;
827 unsigned long flags;
828
829 if (fh->v4l_buffers.active == ZORAN_FREE) {
830 dprintk(1,
831 KERN_ERR
832 "%s: v4l_sync() - no grab active for this session\n",
833 ZR_DEVNAME(zr));
834 return -EINVAL;
835 }
836
837
838 if (frame >= fh->v4l_buffers.num_buffers || frame < 0) {
839 dprintk(1,
840 KERN_ERR "%s: v4l_sync() - frame %d is invalid\n",
841 ZR_DEVNAME(zr), frame);
842 return -EINVAL;
843 }
844
845
846 if (zr->v4l_buffers.buffer[frame].state == BUZ_STATE_USER) {
847 dprintk(1,
848 KERN_ERR
849 "%s: v4l_sync() - attempt to sync on a buffer which was not queued?\n",
850 ZR_DEVNAME(zr));
851 return -EPROTO;
852 }
853
854
855 if (!wait_event_interruptible_timeout(zr->v4l_capq,
856 (zr->v4l_buffers.buffer[frame].state != BUZ_STATE_PEND),
857 10*HZ))
858 return -ETIME;
859 if (signal_pending(current))
860 return -ERESTARTSYS;
861
862
863 if (zr->v4l_buffers.buffer[frame].state != BUZ_STATE_DONE)
864 dprintk(2,
865 KERN_ERR "%s: v4l_sync() - internal state error\n",
866 ZR_DEVNAME(zr));
867
868 zr->v4l_buffers.buffer[frame].state = BUZ_STATE_USER;
869 fh->v4l_buffers.buffer[frame] = zr->v4l_buffers.buffer[frame];
870
871 spin_lock_irqsave(&zr->spinlock, flags);
872
873
874 if (zr->v4l_pend_tail == zr->v4l_pend_head) {
875 zr36057_set_memgrab(zr, 0);
876 if (zr->v4l_buffers.active == ZORAN_ACTIVE) {
877 fh->v4l_buffers.active = zr->v4l_buffers.active =
878 ZORAN_FREE;
879 zr->v4l_buffers.allocated = 0;
880 }
881 }
882
883 spin_unlock_irqrestore(&zr->spinlock, flags);
884
885 return 0;
886}
887
888
889
890
891
892static int
893zoran_jpg_queue_frame (struct file *file,
894 int num,
895 enum zoran_codec_mode mode)
896{
897 struct zoran_fh *fh = file->private_data;
898 struct zoran *zr = fh->zr;
899 unsigned long flags;
900 int res = 0;
901
902
903 if (!fh->jpg_buffers.allocated) {
904 dprintk(1,
905 KERN_ERR
906 "%s: jpg_queue_frame() - buffers not yet allocated\n",
907 ZR_DEVNAME(zr));
908 return -ENOMEM;
909 }
910
911
912 if (num >= fh->jpg_buffers.num_buffers || num < 0) {
913 dprintk(1,
914 KERN_ERR
915 "%s: jpg_queue_frame() - buffer %d out of range\n",
916 ZR_DEVNAME(zr), num);
917 return -EINVAL;
918 }
919
920
921 if (zr->codec_mode == BUZ_MODE_IDLE) {
922 zr->jpg_settings = fh->jpg_settings;
923 } else if (zr->codec_mode != mode) {
924
925 dprintk(1,
926 KERN_ERR
927 "%s: jpg_queue_frame() - codec in wrong mode\n",
928 ZR_DEVNAME(zr));
929 return -EINVAL;
930 }
931
932 if (fh->jpg_buffers.active == ZORAN_FREE) {
933 if (zr->jpg_buffers.active == ZORAN_FREE) {
934 zr->jpg_buffers = fh->jpg_buffers;
935 fh->jpg_buffers.active = ZORAN_ACTIVE;
936 } else {
937 dprintk(1,
938 KERN_ERR
939 "%s: jpg_queue_frame() - another session is already capturing\n",
940 ZR_DEVNAME(zr));
941 res = -EBUSY;
942 }
943 }
944
945 if (!res && zr->codec_mode == BUZ_MODE_IDLE) {
946
947 zr36057_enable_jpg(zr, mode);
948 }
949
950 spin_lock_irqsave(&zr->spinlock, flags);
951
952 if (!res) {
953 switch (zr->jpg_buffers.buffer[num].state) {
954 case BUZ_STATE_DONE:
955 dprintk(2,
956 KERN_WARNING
957 "%s: jpg_queue_frame() - queing frame in BUZ_STATE_DONE state!?\n",
958 ZR_DEVNAME(zr));
959 case BUZ_STATE_USER:
960
961
962 zr->jpg_pend[zr->jpg_que_head++ & BUZ_MASK_FRAME] =
963 num;
964 zr->jpg_buffers.buffer[num].state = BUZ_STATE_PEND;
965 fh->jpg_buffers.buffer[num] =
966 zr->jpg_buffers.buffer[num];
967 zoran_feed_stat_com(zr);
968 break;
969 default:
970 case BUZ_STATE_DMA:
971 case BUZ_STATE_PEND:
972 if (zr->jpg_buffers.active == ZORAN_FREE) {
973 fh->jpg_buffers.active = ZORAN_FREE;
974 zr->jpg_buffers.allocated = 0;
975 }
976 res = -EBUSY;
977 break;
978 }
979 }
980
981 spin_unlock_irqrestore(&zr->spinlock, flags);
982
983 if (!res && zr->jpg_buffers.active == ZORAN_FREE) {
984 zr->jpg_buffers.active = fh->jpg_buffers.active;
985 }
986
987 return res;
988}
989
990static int
991jpg_qbuf (struct file *file,
992 int frame,
993 enum zoran_codec_mode mode)
994{
995 struct zoran_fh *fh = file->private_data;
996 struct zoran *zr = fh->zr;
997 int res = 0;
998
999
1000 if (frame < 0) {
1001 if (zr->codec_mode == mode) {
1002 if (fh->jpg_buffers.active == ZORAN_FREE) {
1003 dprintk(1,
1004 KERN_ERR
1005 "%s: jpg_qbuf(-1) - session not active\n",
1006 ZR_DEVNAME(zr));
1007 return -EINVAL;
1008 }
1009 fh->jpg_buffers.active = zr->jpg_buffers.active =
1010 ZORAN_FREE;
1011 zr->jpg_buffers.allocated = 0;
1012 zr36057_enable_jpg(zr, BUZ_MODE_IDLE);
1013 return 0;
1014 } else {
1015 dprintk(1,
1016 KERN_ERR
1017 "%s: jpg_qbuf() - stop streaming but not in streaming mode\n",
1018 ZR_DEVNAME(zr));
1019 return -EINVAL;
1020 }
1021 }
1022
1023 if ((res = zoran_jpg_queue_frame(file, frame, mode)))
1024 return res;
1025
1026
1027 if (!res && zr->jpg_que_head == 1)
1028 jpeg_start(zr);
1029
1030 return res;
1031}
1032
1033
1034
1035
1036
1037static int
1038jpg_sync (struct file *file,
1039 struct zoran_sync *bs)
1040{
1041 struct zoran_fh *fh = file->private_data;
1042 struct zoran *zr = fh->zr;
1043 unsigned long flags;
1044 int frame;
1045
1046 if (fh->jpg_buffers.active == ZORAN_FREE) {
1047 dprintk(1,
1048 KERN_ERR
1049 "%s: jpg_sync() - capture is not currently active\n",
1050 ZR_DEVNAME(zr));
1051 return -EINVAL;
1052 }
1053 if (zr->codec_mode != BUZ_MODE_MOTION_DECOMPRESS &&
1054 zr->codec_mode != BUZ_MODE_MOTION_COMPRESS) {
1055 dprintk(1,
1056 KERN_ERR
1057 "%s: jpg_sync() - codec not in streaming mode\n",
1058 ZR_DEVNAME(zr));
1059 return -EINVAL;
1060 }
1061 if (!wait_event_interruptible_timeout(zr->jpg_capq,
1062 (zr->jpg_que_tail != zr->jpg_dma_tail ||
1063 zr->jpg_dma_tail == zr->jpg_dma_head),
1064 10*HZ)) {
1065 int isr;
1066
1067 btand(~ZR36057_JMC_Go_en, ZR36057_JMC);
1068 udelay(1);
1069 zr->codec->control(zr->codec, CODEC_G_STATUS,
1070 sizeof(isr), &isr);
1071 dprintk(1,
1072 KERN_ERR
1073 "%s: jpg_sync() - timeout: codec isr=0x%02x\n",
1074 ZR_DEVNAME(zr), isr);
1075
1076 return -ETIME;
1077
1078 }
1079 if (signal_pending(current))
1080 return -ERESTARTSYS;
1081
1082 spin_lock_irqsave(&zr->spinlock, flags);
1083
1084 if (zr->jpg_dma_tail != zr->jpg_dma_head)
1085 frame = zr->jpg_pend[zr->jpg_que_tail++ & BUZ_MASK_FRAME];
1086 else
1087 frame = zr->jpg_pend[zr->jpg_que_tail & BUZ_MASK_FRAME];
1088
1089
1090 if (zr->jpg_buffers.buffer[frame].state != BUZ_STATE_DONE)
1091 dprintk(2,
1092 KERN_ERR "%s: jpg_sync() - internal state error\n",
1093 ZR_DEVNAME(zr));
1094
1095 *bs = zr->jpg_buffers.buffer[frame].bs;
1096 bs->frame = frame;
1097 zr->jpg_buffers.buffer[frame].state = BUZ_STATE_USER;
1098 fh->jpg_buffers.buffer[frame] = zr->jpg_buffers.buffer[frame];
1099
1100 spin_unlock_irqrestore(&zr->spinlock, flags);
1101
1102 return 0;
1103}
1104
1105static void
1106zoran_open_init_session (struct file *file)
1107{
1108 int i;
1109 struct zoran_fh *fh = file->private_data;
1110 struct zoran *zr = fh->zr;
1111
1112
1113 fh->map_mode = ZORAN_MAP_MODE_RAW;
1114
1115
1116 fh->overlay_settings = zr->overlay_settings;
1117 fh->overlay_settings.is_set = 0;
1118 fh->overlay_settings.format = zr->overlay_settings.format;
1119 fh->overlay_active = ZORAN_FREE;
1120
1121
1122 fh->v4l_settings = zr->v4l_settings;
1123
1124
1125 memset(&fh->v4l_buffers, 0, sizeof(struct zoran_v4l_struct));
1126 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
1127 fh->v4l_buffers.buffer[i].state = BUZ_STATE_USER;
1128 fh->v4l_buffers.buffer[i].bs.frame = i;
1129 }
1130 fh->v4l_buffers.allocated = 0;
1131 fh->v4l_buffers.ready_to_be_freed = 0;
1132 fh->v4l_buffers.active = ZORAN_FREE;
1133 fh->v4l_buffers.buffer_size = v4l_bufsize;
1134 fh->v4l_buffers.num_buffers = v4l_nbufs;
1135
1136
1137 fh->jpg_settings = zr->jpg_settings;
1138
1139
1140 memset(&fh->jpg_buffers, 0, sizeof(struct zoran_jpg_struct));
1141 for (i = 0; i < BUZ_MAX_FRAME; i++) {
1142 fh->jpg_buffers.buffer[i].state = BUZ_STATE_USER;
1143 fh->jpg_buffers.buffer[i].bs.frame = i;
1144 }
1145 fh->jpg_buffers.need_contiguous = zr->jpg_buffers.need_contiguous;
1146 fh->jpg_buffers.allocated = 0;
1147 fh->jpg_buffers.ready_to_be_freed = 0;
1148 fh->jpg_buffers.active = ZORAN_FREE;
1149 fh->jpg_buffers.buffer_size = jpg_bufsize;
1150 fh->jpg_buffers.num_buffers = jpg_nbufs;
1151}
1152
1153static void
1154zoran_close_end_session (struct file *file)
1155{
1156 struct zoran_fh *fh = file->private_data;
1157 struct zoran *zr = fh->zr;
1158
1159
1160 if (fh->overlay_active != ZORAN_FREE) {
1161 fh->overlay_active = zr->overlay_active = ZORAN_FREE;
1162 zr->v4l_overlay_active = 0;
1163 if (!zr->v4l_memgrab_active)
1164 zr36057_overlay(zr, 0);
1165 zr->overlay_mask = NULL;
1166 }
1167
1168
1169 if (fh->v4l_buffers.active != ZORAN_FREE) {
1170 unsigned long flags;
1171
1172 spin_lock_irqsave(&zr->spinlock, flags);
1173 zr36057_set_memgrab(zr, 0);
1174 zr->v4l_buffers.allocated = 0;
1175 zr->v4l_buffers.active = fh->v4l_buffers.active =
1176 ZORAN_FREE;
1177 spin_unlock_irqrestore(&zr->spinlock, flags);
1178 }
1179
1180
1181 if (fh->v4l_buffers.allocated ||
1182 fh->v4l_buffers.ready_to_be_freed) {
1183 v4l_fbuffer_free(file);
1184 }
1185
1186
1187 if (fh->jpg_buffers.active != ZORAN_FREE) {
1188 zr36057_enable_jpg(zr, BUZ_MODE_IDLE);
1189 zr->jpg_buffers.allocated = 0;
1190 zr->jpg_buffers.active = fh->jpg_buffers.active =
1191 ZORAN_FREE;
1192 }
1193
1194
1195 if (fh->jpg_buffers.allocated ||
1196 fh->jpg_buffers.ready_to_be_freed) {
1197 jpg_fbuffer_free(file);
1198 }
1199}
1200
1201
1202
1203
1204
1205static int
1206zoran_open (struct inode *inode,
1207 struct file *file)
1208{
1209 unsigned int minor = iminor(inode);
1210 struct zoran *zr = NULL;
1211 struct zoran_fh *fh;
1212 int i, res, first_open = 0, have_module_locks = 0;
1213
1214
1215 for (i = 0; i < zoran_num; i++) {
1216 if (zoran[i]->video_dev->minor == minor) {
1217 zr = zoran[i];
1218 break;
1219 }
1220 }
1221
1222 if (!zr) {
1223 dprintk(1, KERN_ERR "%s: device not found!\n", ZORAN_NAME);
1224 res = -ENODEV;
1225 goto open_unlock_and_return;
1226 }
1227
1228
1229
1230
1231
1232 if (!zr->decoder) {
1233 dprintk(1,
1234 KERN_ERR "%s: no TV decoder loaded for device!\n",
1235 ZR_DEVNAME(zr));
1236 res = -EIO;
1237 goto open_unlock_and_return;
1238 }
1239
1240
1241 if (!try_module_get(THIS_MODULE)) {
1242 dprintk(1,
1243 KERN_ERR
1244 "%s: failed to acquire my own lock! PANIC!\n",
1245 ZR_DEVNAME(zr));
1246 res = -ENODEV;
1247 goto open_unlock_and_return;
1248 }
1249 if (!try_module_get(zr->decoder->driver->driver.owner)) {
1250 dprintk(1,
1251 KERN_ERR
1252 "%s: failed to grab ownership of i2c decoder\n",
1253 ZR_DEVNAME(zr));
1254 res = -EIO;
1255 module_put(THIS_MODULE);
1256 goto open_unlock_and_return;
1257 }
1258 if (zr->encoder &&
1259 !try_module_get(zr->encoder->driver->driver.owner)) {
1260 dprintk(1,
1261 KERN_ERR
1262 "%s: failed to grab ownership of i2c encoder\n",
1263 ZR_DEVNAME(zr));
1264 res = -EIO;
1265 module_put(zr->decoder->driver->driver.owner);
1266 module_put(THIS_MODULE);
1267 goto open_unlock_and_return;
1268 }
1269
1270 have_module_locks = 1;
1271
1272 if (zr->user >= 2048) {
1273 dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
1274 ZR_DEVNAME(zr), zr->user);
1275 res = -EBUSY;
1276 goto open_unlock_and_return;
1277 }
1278
1279 dprintk(1, KERN_INFO "%s: zoran_open(%s, pid=[%d]), users(-)=%d\n",
1280 ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user);
1281
1282
1283 fh = kzalloc(sizeof(struct zoran_fh), GFP_KERNEL);
1284 if (!fh) {
1285 dprintk(1,
1286 KERN_ERR
1287 "%s: zoran_open() - allocation of zoran_fh failed\n",
1288 ZR_DEVNAME(zr));
1289 res = -ENOMEM;
1290 goto open_unlock_and_return;
1291 }
1292
1293
1294 fh->overlay_mask =
1295 kmalloc(((768 + 31) / 32) * 576 * 4, GFP_KERNEL);
1296 if (!fh->overlay_mask) {
1297 dprintk(1,
1298 KERN_ERR
1299 "%s: zoran_open() - allocation of overlay_mask failed\n",
1300 ZR_DEVNAME(zr));
1301 kfree(fh);
1302 res = -ENOMEM;
1303 goto open_unlock_and_return;
1304 }
1305
1306 if (zr->user++ == 0)
1307 first_open = 1;
1308
1309
1310
1311
1312 if (first_open) {
1313 zr36057_restart(zr);
1314 zoran_open_init_params(zr);
1315 zoran_init_hardware(zr);
1316
1317 btor(ZR36057_ICR_IntPinEn, ZR36057_ICR);
1318 }
1319
1320
1321 file->private_data = fh;
1322 fh->zr = zr;
1323 zoran_open_init_session(file);
1324
1325 return 0;
1326
1327open_unlock_and_return:
1328
1329 if (have_module_locks) {
1330 module_put(zr->decoder->driver->driver.owner);
1331 if (zr->encoder) {
1332 module_put(zr->encoder->driver->driver.owner);
1333 }
1334 module_put(THIS_MODULE);
1335 }
1336
1337
1338 if (zr) {
1339
1340 }
1341
1342 return res;
1343}
1344
1345static int
1346zoran_close (struct inode *inode,
1347 struct file *file)
1348{
1349 struct zoran_fh *fh = file->private_data;
1350 struct zoran *zr = fh->zr;
1351
1352 dprintk(1, KERN_INFO "%s: zoran_close(%s, pid=[%d]), users(+)=%d\n",
1353 ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user);
1354
1355
1356
1357
1358
1359 zoran_close_end_session(file);
1360
1361 if (zr->user-- == 1) {
1362
1363 wake_up_interruptible(&zr->jpg_capq);
1364 zr36057_enable_jpg(zr, BUZ_MODE_IDLE);
1365 zr->jpg_buffers.allocated = 0;
1366 zr->jpg_buffers.active = ZORAN_FREE;
1367
1368
1369 btand(~ZR36057_ICR_IntPinEn, ZR36057_ICR);
1370
1371 if (zr36067_debug > 1)
1372 print_interrupts(zr);
1373
1374
1375 zr->v4l_overlay_active = 0;
1376 zr36057_overlay(zr, 0);
1377 zr->overlay_mask = NULL;
1378
1379
1380 wake_up_interruptible(&zr->v4l_capq);
1381 zr36057_set_memgrab(zr, 0);
1382 zr->v4l_buffers.allocated = 0;
1383 zr->v4l_buffers.active = ZORAN_FREE;
1384 zoran_set_pci_master(zr, 0);
1385
1386 if (!pass_through) {
1387 int zero = 0, two = 2;
1388 decoder_command(zr, DECODER_ENABLE_OUTPUT, &zero);
1389 encoder_command(zr, ENCODER_SET_INPUT, &two);
1390 }
1391 }
1392
1393 file->private_data = NULL;
1394 kfree(fh->overlay_mask);
1395 kfree(fh);
1396
1397
1398 module_put(zr->decoder->driver->driver.owner);
1399 if (zr->encoder) {
1400 module_put(zr->encoder->driver->driver.owner);
1401 }
1402 module_put(THIS_MODULE);
1403
1404
1405
1406 dprintk(4, KERN_INFO "%s: zoran_close() done\n", ZR_DEVNAME(zr));
1407
1408 return 0;
1409}
1410
1411
1412static ssize_t
1413zoran_read (struct file *file,
1414 char __user *data,
1415 size_t count,
1416 loff_t *ppos)
1417{
1418
1419
1420 return -EINVAL;
1421}
1422
1423static ssize_t
1424zoran_write (struct file *file,
1425 const char __user *data,
1426 size_t count,
1427 loff_t *ppos)
1428{
1429
1430
1431 return -EINVAL;
1432}
1433
1434static int
1435setup_fbuffer (struct file *file,
1436 void *base,
1437 const struct zoran_format *fmt,
1438 int width,
1439 int height,
1440 int bytesperline)
1441{
1442 struct zoran_fh *fh = file->private_data;
1443 struct zoran *zr = fh->zr;
1444
1445
1446 if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RAWIO))
1447 return -EPERM;
1448
1449
1450
1451
1452
1453 if (pci_pci_problems & (PCIPCI_FAIL | PCIAGP_FAIL | PCIPCI_ALIMAGIK))
1454 return -ENXIO;
1455
1456
1457 if (!bytesperline)
1458 bytesperline = width * ((fmt->depth + 7) & ~7) / 8;
1459
1460#if 0
1461 if (zr->overlay_active) {
1462
1463
1464
1465
1466
1467
1468 dprintk(3,
1469 KERN_ERR
1470 "%s: setup_fbuffer() - forced overlay turnoff because framebuffer changed\n",
1471 ZR_DEVNAME(zr));
1472 zr36057_overlay(zr, 0);
1473 }
1474#endif
1475
1476 if (!(fmt->flags & ZORAN_FORMAT_OVERLAY)) {
1477 dprintk(1,
1478 KERN_ERR
1479 "%s: setup_fbuffer() - no valid overlay format given\n",
1480 ZR_DEVNAME(zr));
1481 return -EINVAL;
1482 }
1483 if (height <= 0 || width <= 0 || bytesperline <= 0) {
1484 dprintk(1,
1485 KERN_ERR
1486 "%s: setup_fbuffer() - invalid height/width/bpl value (%d|%d|%d)\n",
1487 ZR_DEVNAME(zr), width, height, bytesperline);
1488 return -EINVAL;
1489 }
1490 if (bytesperline & 3) {
1491 dprintk(1,
1492 KERN_ERR
1493 "%s: setup_fbuffer() - bytesperline (%d) must be 4-byte aligned\n",
1494 ZR_DEVNAME(zr), bytesperline);
1495 return -EINVAL;
1496 }
1497
1498 zr->buffer.base = (void *) ((unsigned long) base & ~3);
1499 zr->buffer.height = height;
1500 zr->buffer.width = width;
1501 zr->buffer.depth = fmt->depth;
1502 zr->overlay_settings.format = fmt;
1503 zr->buffer.bytesperline = bytesperline;
1504
1505
1506 zr->overlay_settings.is_set = 0;
1507
1508 return 0;
1509}
1510
1511
1512static int
1513setup_window (struct file *file,
1514 int x,
1515 int y,
1516 int width,
1517 int height,
1518 struct video_clip __user *clips,
1519 int clipcount,
1520 void __user *bitmap)
1521{
1522 struct zoran_fh *fh = file->private_data;
1523 struct zoran *zr = fh->zr;
1524 struct video_clip *vcp = NULL;
1525 int on, end;
1526
1527
1528 if (!zr->buffer.base) {
1529 dprintk(1,
1530 KERN_ERR
1531 "%s: setup_window() - frame buffer has to be set first\n",
1532 ZR_DEVNAME(zr));
1533 return -EINVAL;
1534 }
1535
1536 if (!fh->overlay_settings.format) {
1537 dprintk(1,
1538 KERN_ERR
1539 "%s: setup_window() - no overlay format set\n",
1540 ZR_DEVNAME(zr));
1541 return -EINVAL;
1542 }
1543
1544
1545
1546
1547
1548 if (zr->buffer.depth == 15 || zr->buffer.depth == 16) {
1549 end = (x + width) & ~1;
1550 x = (x + 1) & ~1;
1551 width = end - x;
1552 }
1553
1554 if (zr->buffer.depth == 24) {
1555 end = (x + width) & ~3;
1556 x = (x + 3) & ~3;
1557 width = end - x;
1558 }
1559
1560 if (width > BUZ_MAX_WIDTH)
1561 width = BUZ_MAX_WIDTH;
1562 if (height > BUZ_MAX_HEIGHT)
1563 height = BUZ_MAX_HEIGHT;
1564
1565
1566 if (width < BUZ_MIN_WIDTH || height < BUZ_MIN_HEIGHT ||
1567 width > BUZ_MAX_WIDTH || height > BUZ_MAX_HEIGHT) {
1568 dprintk(1,
1569 KERN_ERR
1570 "%s: setup_window() - width = %d or height = %d invalid\n",
1571 ZR_DEVNAME(zr), width, height);
1572 return -EINVAL;
1573 }
1574
1575 fh->overlay_settings.x = x;
1576 fh->overlay_settings.y = y;
1577 fh->overlay_settings.width = width;
1578 fh->overlay_settings.height = height;
1579 fh->overlay_settings.clipcount = clipcount;
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589 on = zr->v4l_overlay_active && !zr->v4l_memgrab_active &&
1590 zr->overlay_active != ZORAN_FREE &&
1591 fh->overlay_active != ZORAN_FREE;
1592 if (on)
1593 zr36057_overlay(zr, 0);
1594
1595
1596
1597
1598
1599 if (bitmap) {
1600
1601 fh->overlay_settings.clipcount = 1;
1602
1603 if (copy_from_user(fh->overlay_mask, bitmap,
1604 (width * height + 7) / 8)) {
1605 return -EFAULT;
1606 }
1607 } else if (clipcount > 0) {
1608
1609 vcp = vmalloc(sizeof(struct video_clip) * (clipcount + 4));
1610 if (vcp == NULL) {
1611 dprintk(1,
1612 KERN_ERR
1613 "%s: setup_window() - Alloc of clip mask failed\n",
1614 ZR_DEVNAME(zr));
1615 return -ENOMEM;
1616 }
1617 if (copy_from_user
1618 (vcp, clips, sizeof(struct video_clip) * clipcount)) {
1619 vfree(vcp);
1620 return -EFAULT;
1621 }
1622 write_overlay_mask(file, vcp, clipcount);
1623 vfree(vcp);
1624 }
1625
1626 fh->overlay_settings.is_set = 1;
1627 if (fh->overlay_active != ZORAN_FREE &&
1628 zr->overlay_active != ZORAN_FREE)
1629 zr->overlay_settings = fh->overlay_settings;
1630
1631 if (on)
1632 zr36057_overlay(zr, 1);
1633
1634
1635 return wait_grab_pending(zr);
1636}
1637
1638static int
1639setup_overlay (struct file *file,
1640 int on)
1641{
1642 struct zoran_fh *fh = file->private_data;
1643 struct zoran *zr = fh->zr;
1644
1645
1646 if ((on && fh->overlay_active != ZORAN_FREE) ||
1647 (!on && fh->overlay_active == ZORAN_FREE))
1648 return 0;
1649
1650
1651 if (on && zr->overlay_active != ZORAN_FREE &&
1652 fh->overlay_active == ZORAN_FREE) {
1653 dprintk(1,
1654 KERN_ERR
1655 "%s: setup_overlay() - overlay is already active for another session\n",
1656 ZR_DEVNAME(zr));
1657 return -EBUSY;
1658 }
1659 if (!on && zr->overlay_active != ZORAN_FREE &&
1660 fh->overlay_active == ZORAN_FREE) {
1661 dprintk(1,
1662 KERN_ERR
1663 "%s: setup_overlay() - you cannot cancel someone else's session\n",
1664 ZR_DEVNAME(zr));
1665 return -EPERM;
1666 }
1667
1668 if (on == 0) {
1669 zr->overlay_active = fh->overlay_active = ZORAN_FREE;
1670 zr->v4l_overlay_active = 0;
1671
1672
1673 if (!zr->v4l_memgrab_active)
1674 zr36057_overlay(zr, 0);
1675 zr->overlay_mask = NULL;
1676 } else {
1677 if (!zr->buffer.base || !fh->overlay_settings.is_set) {
1678 dprintk(1,
1679 KERN_ERR
1680 "%s: setup_overlay() - buffer or window not set\n",
1681 ZR_DEVNAME(zr));
1682 return -EINVAL;
1683 }
1684 if (!fh->overlay_settings.format) {
1685 dprintk(1,
1686 KERN_ERR
1687 "%s: setup_overlay() - no overlay format set\n",
1688 ZR_DEVNAME(zr));
1689 return -EINVAL;
1690 }
1691 zr->overlay_active = fh->overlay_active = ZORAN_LOCKED;
1692 zr->v4l_overlay_active = 1;
1693 zr->overlay_mask = fh->overlay_mask;
1694 zr->overlay_settings = fh->overlay_settings;
1695 if (!zr->v4l_memgrab_active)
1696 zr36057_overlay(zr, 1);
1697
1698
1699 }
1700
1701
1702 return wait_grab_pending(zr);
1703}
1704
1705
1706static int
1707zoran_v4l2_buffer_status (struct file *file,
1708 struct v4l2_buffer *buf,
1709 int num)
1710{
1711 struct zoran_fh *fh = file->private_data;
1712 struct zoran *zr = fh->zr;
1713
1714 buf->flags = V4L2_BUF_FLAG_MAPPED;
1715
1716 switch (fh->map_mode) {
1717 case ZORAN_MAP_MODE_RAW:
1718
1719
1720 if (num < 0 || num >= fh->v4l_buffers.num_buffers ||
1721 !fh->v4l_buffers.allocated) {
1722 dprintk(1,
1723 KERN_ERR
1724 "%s: v4l2_buffer_status() - wrong number or buffers not allocated\n",
1725 ZR_DEVNAME(zr));
1726 return -EINVAL;
1727 }
1728
1729 buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1730 buf->length = fh->v4l_buffers.buffer_size;
1731
1732
1733 buf->bytesused = fh->v4l_buffers.buffer[num].bs.length;
1734 if (fh->v4l_buffers.buffer[num].state == BUZ_STATE_DONE ||
1735 fh->v4l_buffers.buffer[num].state == BUZ_STATE_USER) {
1736 buf->sequence = fh->v4l_buffers.buffer[num].bs.seq;
1737 buf->flags |= V4L2_BUF_FLAG_DONE;
1738 buf->timestamp =
1739 fh->v4l_buffers.buffer[num].bs.timestamp;
1740 } else {
1741 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1742 }
1743
1744 if (fh->v4l_settings.height <= BUZ_MAX_HEIGHT / 2)
1745 buf->field = V4L2_FIELD_TOP;
1746 else
1747 buf->field = V4L2_FIELD_INTERLACED;
1748
1749 break;
1750
1751 case ZORAN_MAP_MODE_JPG_REC:
1752 case ZORAN_MAP_MODE_JPG_PLAY:
1753
1754
1755 if (num < 0 || num >= fh->jpg_buffers.num_buffers ||
1756 !fh->jpg_buffers.allocated) {
1757 dprintk(1,
1758 KERN_ERR
1759 "%s: v4l2_buffer_status() - wrong number or buffers not allocated\n",
1760 ZR_DEVNAME(zr));
1761 return -EINVAL;
1762 }
1763
1764 buf->type = (fh->map_mode == ZORAN_MAP_MODE_JPG_REC) ?
1765 V4L2_BUF_TYPE_VIDEO_CAPTURE :
1766 V4L2_BUF_TYPE_VIDEO_OUTPUT;
1767 buf->length = fh->jpg_buffers.buffer_size;
1768
1769
1770 if (fh->jpg_buffers.buffer[num].state == BUZ_STATE_DONE ||
1771 fh->jpg_buffers.buffer[num].state == BUZ_STATE_USER) {
1772 buf->sequence = fh->jpg_buffers.buffer[num].bs.seq;
1773 buf->timestamp =
1774 fh->jpg_buffers.buffer[num].bs.timestamp;
1775 buf->bytesused =
1776 fh->jpg_buffers.buffer[num].bs.length;
1777 buf->flags |= V4L2_BUF_FLAG_DONE;
1778 } else {
1779 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1780 }
1781
1782
1783 if (fh->jpg_settings.TmpDcm != 1)
1784 buf->field =
1785 fh->jpg_settings.
1786 odd_even ? V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM;
1787 else
1788 buf->field =
1789 fh->jpg_settings.
1790 odd_even ? V4L2_FIELD_SEQ_TB :
1791 V4L2_FIELD_SEQ_BT;
1792
1793 break;
1794
1795 default:
1796
1797 dprintk(5,
1798 KERN_ERR
1799 "%s: v4l2_buffer_status() - invalid buffer type|map_mode (%d|%d)\n",
1800 ZR_DEVNAME(zr), buf->type, fh->map_mode);
1801 return -EINVAL;
1802 }
1803
1804 buf->memory = V4L2_MEMORY_MMAP;
1805 buf->index = num;
1806 buf->m.offset = buf->length * num;
1807
1808 return 0;
1809}
1810
1811static int
1812zoran_set_norm (struct zoran *zr,
1813 int norm)
1814{
1815 int norm_encoder, on;
1816
1817 if (zr->v4l_buffers.active != ZORAN_FREE ||
1818 zr->jpg_buffers.active != ZORAN_FREE) {
1819 dprintk(1,
1820 KERN_WARNING
1821 "%s: set_norm() called while in playback/capture mode\n",
1822 ZR_DEVNAME(zr));
1823 return -EBUSY;
1824 }
1825
1826 if (lock_norm && norm != zr->norm) {
1827 if (lock_norm > 1) {
1828 dprintk(1,
1829 KERN_WARNING
1830 "%s: set_norm() - TV standard is locked, can not switch norm\n",
1831 ZR_DEVNAME(zr));
1832 return -EPERM;
1833 } else {
1834 dprintk(1,
1835 KERN_WARNING
1836 "%s: set_norm() - TV standard is locked, norm was not changed\n",
1837 ZR_DEVNAME(zr));
1838 norm = zr->norm;
1839 }
1840 }
1841
1842 if (norm != VIDEO_MODE_AUTO &&
1843 (norm < 0 || norm >= zr->card.norms ||
1844 !zr->card.tvn[norm])) {
1845 dprintk(1,
1846 KERN_ERR "%s: set_norm() - unsupported norm %d\n",
1847 ZR_DEVNAME(zr), norm);
1848 return -EINVAL;
1849 }
1850
1851 if (norm == VIDEO_MODE_AUTO) {
1852 int status;
1853
1854
1855 struct video_decoder_capability caps;
1856 decoder_command(zr, DECODER_GET_CAPABILITIES, &caps);
1857 if (!(caps.flags & VIDEO_DECODER_AUTO)) {
1858 dprintk(1, KERN_ERR "%s: norm=auto unsupported\n",
1859 ZR_DEVNAME(zr));
1860 return -EINVAL;
1861 }
1862
1863 decoder_command(zr, DECODER_SET_NORM, &norm);
1864
1865
1866 ssleep(2);
1867
1868 decoder_command(zr, DECODER_GET_STATUS, &status);
1869 if (!(status & DECODER_STATUS_GOOD)) {
1870 dprintk(1,
1871 KERN_ERR
1872 "%s: set_norm() - no norm detected\n",
1873 ZR_DEVNAME(zr));
1874
1875 decoder_command(zr, DECODER_SET_NORM, &zr->norm);
1876 return -EIO;
1877 }
1878
1879 if (status & DECODER_STATUS_NTSC)
1880 norm = VIDEO_MODE_NTSC;
1881 else if (status & DECODER_STATUS_SECAM)
1882 norm = VIDEO_MODE_SECAM;
1883 else
1884 norm = VIDEO_MODE_PAL;
1885 }
1886 zr->timing = zr->card.tvn[norm];
1887 norm_encoder = norm;
1888
1889
1890
1891 on = zr->overlay_active && !zr->v4l_memgrab_active;
1892 if (on)
1893 zr36057_overlay(zr, 0);
1894
1895 decoder_command(zr, DECODER_SET_NORM, &norm);
1896 encoder_command(zr, ENCODER_SET_NORM, &norm_encoder);
1897
1898 if (on)
1899 zr36057_overlay(zr, 1);
1900
1901
1902 zr->norm = norm;
1903
1904 return 0;
1905}
1906
1907static int
1908zoran_set_input (struct zoran *zr,
1909 int input)
1910{
1911 int realinput;
1912
1913 if (input == zr->input) {
1914 return 0;
1915 }
1916
1917 if (zr->v4l_buffers.active != ZORAN_FREE ||
1918 zr->jpg_buffers.active != ZORAN_FREE) {
1919 dprintk(1,
1920 KERN_WARNING
1921 "%s: set_input() called while in playback/capture mode\n",
1922 ZR_DEVNAME(zr));
1923 return -EBUSY;
1924 }
1925
1926 if (input < 0 || input >= zr->card.inputs) {
1927 dprintk(1,
1928 KERN_ERR
1929 "%s: set_input() - unnsupported input %d\n",
1930 ZR_DEVNAME(zr), input);
1931 return -EINVAL;
1932 }
1933
1934 realinput = zr->card.input[input].muxsel;
1935 zr->input = input;
1936
1937 decoder_command(zr, DECODER_SET_INPUT, &realinput);
1938
1939 return 0;
1940}
1941
1942
1943
1944
1945
1946static int
1947zoran_do_ioctl (struct inode *inode,
1948 struct file *file,
1949 unsigned int cmd,
1950 void *arg)
1951{
1952 struct zoran_fh *fh = file->private_data;
1953 struct zoran *zr = fh->zr;
1954
1955 struct zoran_jpg_settings settings;
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970 if (mutex_trylock(&zr->resource_lock)) {
1971
1972 if (fh->jpg_buffers.ready_to_be_freed)
1973 jpg_fbuffer_free(file);
1974 if (fh->v4l_buffers.ready_to_be_freed)
1975 v4l_fbuffer_free(file);
1976
1977 mutex_unlock(&zr->resource_lock);
1978 }
1979
1980 switch (cmd) {
1981
1982 case VIDIOCGCAP:
1983 {
1984 struct video_capability *vcap = arg;
1985
1986 dprintk(3, KERN_DEBUG "%s: VIDIOCGCAP\n", ZR_DEVNAME(zr));
1987
1988 memset(vcap, 0, sizeof(struct video_capability));
1989 strncpy(vcap->name, ZR_DEVNAME(zr), sizeof(vcap->name)-1);
1990 vcap->type = ZORAN_VID_TYPE;
1991
1992 vcap->channels = zr->card.inputs;
1993 vcap->audios = 0;
1994 mutex_lock(&zr->resource_lock);
1995 vcap->maxwidth = BUZ_MAX_WIDTH;
1996 vcap->maxheight = BUZ_MAX_HEIGHT;
1997 vcap->minwidth = BUZ_MIN_WIDTH;
1998 vcap->minheight = BUZ_MIN_HEIGHT;
1999 mutex_unlock(&zr->resource_lock);
2000
2001 return 0;
2002 }
2003 break;
2004
2005 case VIDIOCGCHAN:
2006 {
2007 struct video_channel *vchan = arg;
2008 int channel = vchan->channel;
2009
2010 dprintk(3, KERN_DEBUG "%s: VIDIOCGCHAN - channel=%d\n",
2011 ZR_DEVNAME(zr), vchan->channel);
2012
2013 memset(vchan, 0, sizeof(struct video_channel));
2014 if (channel > zr->card.inputs || channel < 0) {
2015 dprintk(1,
2016 KERN_ERR
2017 "%s: VIDIOCGCHAN on not existing channel %d\n",
2018 ZR_DEVNAME(zr), channel);
2019 return -EINVAL;
2020 }
2021
2022 strcpy(vchan->name, zr->card.input[channel].name);
2023
2024 vchan->tuners = 0;
2025 vchan->flags = 0;
2026 vchan->type = VIDEO_TYPE_CAMERA;
2027 mutex_lock(&zr->resource_lock);
2028 vchan->norm = zr->norm;
2029 mutex_unlock(&zr->resource_lock);
2030 vchan->channel = channel;
2031
2032 return 0;
2033 }
2034 break;
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046 case VIDIOCSCHAN:
2047 {
2048 struct video_channel *vchan = arg;
2049 int res;
2050
2051 dprintk(3,
2052 KERN_DEBUG
2053 "%s: VIDIOCSCHAN - channel=%d, norm=%d\n",
2054 ZR_DEVNAME(zr), vchan->channel, vchan->norm);
2055
2056 mutex_lock(&zr->resource_lock);
2057 if ((res = zoran_set_input(zr, vchan->channel)))
2058 goto schan_unlock_and_return;
2059 if ((res = zoran_set_norm(zr, vchan->norm)))
2060 goto schan_unlock_and_return;
2061
2062
2063 res = wait_grab_pending(zr);
2064 schan_unlock_and_return:
2065 mutex_unlock(&zr->resource_lock);
2066 return res;
2067 }
2068 break;
2069
2070 case VIDIOCGPICT:
2071 {
2072 struct video_picture *vpict = arg;
2073
2074 dprintk(3, KERN_DEBUG "%s: VIDIOCGPICT\n", ZR_DEVNAME(zr));
2075
2076 memset(vpict, 0, sizeof(struct video_picture));
2077 mutex_lock(&zr->resource_lock);
2078 vpict->hue = zr->hue;
2079 vpict->brightness = zr->brightness;
2080 vpict->contrast = zr->contrast;
2081 vpict->colour = zr->saturation;
2082 if (fh->overlay_settings.format) {
2083 vpict->depth = fh->overlay_settings.format->depth;
2084 vpict->palette = fh->overlay_settings.format->palette;
2085 } else {
2086 vpict->depth = 0;
2087 }
2088 mutex_unlock(&zr->resource_lock);
2089
2090 return 0;
2091 }
2092 break;
2093
2094 case VIDIOCSPICT:
2095 {
2096 struct video_picture *vpict = arg;
2097 int i;
2098
2099 dprintk(3,
2100 KERN_DEBUG
2101 "%s: VIDIOCSPICT - bri=%d, hue=%d, col=%d, con=%d, dep=%d, pal=%d\n",
2102 ZR_DEVNAME(zr), vpict->brightness, vpict->hue,
2103 vpict->colour, vpict->contrast, vpict->depth,
2104 vpict->palette);
2105
2106 for (i = 0; i < NUM_FORMATS; i++) {
2107 const struct zoran_format *fmt = &zoran_formats[i];
2108
2109 if (fmt->palette != -1 &&
2110 fmt->flags & ZORAN_FORMAT_OVERLAY &&
2111 fmt->palette == vpict->palette &&
2112 fmt->depth == vpict->depth)
2113 break;
2114 }
2115 if (i == NUM_FORMATS) {
2116 dprintk(1,
2117 KERN_ERR
2118 "%s: VIDIOCSPICT - Invalid palette %d\n",
2119 ZR_DEVNAME(zr), vpict->palette);
2120 return -EINVAL;
2121 }
2122
2123 mutex_lock(&zr->resource_lock);
2124
2125 decoder_command(zr, DECODER_SET_PICTURE, vpict);
2126
2127 zr->hue = vpict->hue;
2128 zr->contrast = vpict->contrast;
2129 zr->saturation = vpict->colour;
2130 zr->brightness = vpict->brightness;
2131
2132 fh->overlay_settings.format = &zoran_formats[i];
2133
2134 mutex_unlock(&zr->resource_lock);
2135
2136 return 0;
2137 }
2138 break;
2139
2140 case VIDIOCCAPTURE:
2141 {
2142 int *on = arg, res;
2143
2144 dprintk(3, KERN_DEBUG "%s: VIDIOCCAPTURE - on=%d\n",
2145 ZR_DEVNAME(zr), *on);
2146
2147 mutex_lock(&zr->resource_lock);
2148 res = setup_overlay(file, *on);
2149 mutex_unlock(&zr->resource_lock);
2150
2151 return res;
2152 }
2153 break;
2154
2155 case VIDIOCGWIN:
2156 {
2157 struct video_window *vwin = arg;
2158
2159 dprintk(3, KERN_DEBUG "%s: VIDIOCGWIN\n", ZR_DEVNAME(zr));
2160
2161 memset(vwin, 0, sizeof(struct video_window));
2162 mutex_lock(&zr->resource_lock);
2163 vwin->x = fh->overlay_settings.x;
2164 vwin->y = fh->overlay_settings.y;
2165 vwin->width = fh->overlay_settings.width;
2166 vwin->height = fh->overlay_settings.height;
2167 mutex_unlock(&zr->resource_lock);
2168 vwin->clipcount = 0;
2169 return 0;
2170 }
2171 break;
2172
2173 case VIDIOCSWIN:
2174 {
2175 struct video_window *vwin = arg;
2176 int res;
2177
2178 dprintk(3,
2179 KERN_DEBUG
2180 "%s: VIDIOCSWIN - x=%d, y=%d, w=%d, h=%d, clipcount=%d\n",
2181 ZR_DEVNAME(zr), vwin->x, vwin->y, vwin->width,
2182 vwin->height, vwin->clipcount);
2183
2184 mutex_lock(&zr->resource_lock);
2185 res =
2186 setup_window(file, vwin->x, vwin->y, vwin->width,
2187 vwin->height, vwin->clips,
2188 vwin->clipcount, NULL);
2189 mutex_unlock(&zr->resource_lock);
2190
2191 return res;
2192 }
2193 break;
2194
2195 case VIDIOCGFBUF:
2196 {
2197 struct video_buffer *vbuf = arg;
2198
2199 dprintk(3, KERN_DEBUG "%s: VIDIOCGFBUF\n", ZR_DEVNAME(zr));
2200
2201 mutex_lock(&zr->resource_lock);
2202 *vbuf = zr->buffer;
2203 mutex_unlock(&zr->resource_lock);
2204 return 0;
2205 }
2206 break;
2207
2208 case VIDIOCSFBUF:
2209 {
2210 struct video_buffer *vbuf = arg;
2211 int i, res = 0;
2212
2213 dprintk(3,
2214 KERN_DEBUG
2215 "%s: VIDIOCSFBUF - base=%p, w=%d, h=%d, depth=%d, bpl=%d\n",
2216 ZR_DEVNAME(zr), vbuf->base, vbuf->width,
2217 vbuf->height, vbuf->depth, vbuf->bytesperline);
2218
2219 for (i = 0; i < NUM_FORMATS; i++)
2220 if (zoran_formats[i].depth == vbuf->depth)
2221 break;
2222 if (i == NUM_FORMATS) {
2223 dprintk(1,
2224 KERN_ERR
2225 "%s: VIDIOCSFBUF - invalid fbuf depth %d\n",
2226 ZR_DEVNAME(zr), vbuf->depth);
2227 return -EINVAL;
2228 }
2229
2230 mutex_lock(&zr->resource_lock);
2231 res =
2232 setup_fbuffer(file, vbuf->base, &zoran_formats[i],
2233 vbuf->width, vbuf->height,
2234 vbuf->bytesperline);
2235 mutex_unlock(&zr->resource_lock);
2236
2237 return res;
2238 }
2239 break;
2240
2241 case VIDIOCSYNC:
2242 {
2243 int *frame = arg, res;
2244
2245 dprintk(3, KERN_DEBUG "%s: VIDIOCSYNC - frame=%d\n",
2246 ZR_DEVNAME(zr), *frame);
2247
2248 mutex_lock(&zr->resource_lock);
2249 res = v4l_sync(file, *frame);
2250 mutex_unlock(&zr->resource_lock);
2251 if (!res)
2252 zr->v4l_sync_tail++;
2253 return res;
2254 }
2255 break;
2256
2257 case VIDIOCMCAPTURE:
2258 {
2259 struct video_mmap *vmap = arg;
2260 int res;
2261
2262 dprintk(3,
2263 KERN_DEBUG
2264 "%s: VIDIOCMCAPTURE - frame=%d, geom=%dx%d, fmt=%d\n",
2265 ZR_DEVNAME(zr), vmap->frame, vmap->width, vmap->height,
2266 vmap->format);
2267
2268 mutex_lock(&zr->resource_lock);
2269 res = v4l_grab(file, vmap);
2270 mutex_unlock(&zr->resource_lock);
2271 return res;
2272 }
2273 break;
2274
2275 case VIDIOCGMBUF:
2276 {
2277 struct video_mbuf *vmbuf = arg;
2278 int i, res = 0;
2279
2280 dprintk(3, KERN_DEBUG "%s: VIDIOCGMBUF\n", ZR_DEVNAME(zr));
2281
2282 vmbuf->size =
2283 fh->v4l_buffers.num_buffers *
2284 fh->v4l_buffers.buffer_size;
2285 vmbuf->frames = fh->v4l_buffers.num_buffers;
2286 for (i = 0; i < vmbuf->frames; i++) {
2287 vmbuf->offsets[i] =
2288 i * fh->v4l_buffers.buffer_size;
2289 }
2290
2291 mutex_lock(&zr->resource_lock);
2292
2293 if (fh->jpg_buffers.allocated || fh->v4l_buffers.allocated) {
2294 dprintk(1,
2295 KERN_ERR
2296 "%s: VIDIOCGMBUF - buffers already allocated\n",
2297 ZR_DEVNAME(zr));
2298 res = -EINVAL;
2299 goto v4l1reqbuf_unlock_and_return;
2300 }
2301
2302 if (v4l_fbuffer_alloc(file)) {
2303 res = -ENOMEM;
2304 goto v4l1reqbuf_unlock_and_return;
2305 }
2306
2307
2308 fh->map_mode = ZORAN_MAP_MODE_RAW;
2309 v4l1reqbuf_unlock_and_return:
2310 mutex_unlock(&zr->resource_lock);
2311
2312 return res;
2313 }
2314 break;
2315
2316 case VIDIOCGUNIT:
2317 {
2318 struct video_unit *vunit = arg;
2319
2320 dprintk(3, KERN_DEBUG "%s: VIDIOCGUNIT\n", ZR_DEVNAME(zr));
2321
2322 vunit->video = zr->video_dev->minor;
2323 vunit->vbi = VIDEO_NO_UNIT;
2324 vunit->radio = VIDEO_NO_UNIT;
2325 vunit->audio = VIDEO_NO_UNIT;
2326 vunit->teletext = VIDEO_NO_UNIT;
2327
2328 return 0;
2329 }
2330 break;
2331
2332
2333
2334
2335
2336
2337
2338 case VIDIOCGCAPTURE:
2339 {
2340 dprintk(3, KERN_ERR "%s: VIDIOCGCAPTURE not supported\n",
2341 ZR_DEVNAME(zr));
2342 return -EINVAL;
2343 }
2344 break;
2345
2346 case VIDIOCSCAPTURE:
2347 {
2348 dprintk(3, KERN_ERR "%s: VIDIOCSCAPTURE not supported\n",
2349 ZR_DEVNAME(zr));
2350 return -EINVAL;
2351 }
2352 break;
2353
2354 case BUZIOC_G_PARAMS:
2355 {
2356 struct zoran_params *bparams = arg;
2357
2358 dprintk(3, KERN_DEBUG "%s: BUZIOC_G_PARAMS\n", ZR_DEVNAME(zr));
2359
2360 memset(bparams, 0, sizeof(struct zoran_params));
2361 bparams->major_version = MAJOR_VERSION;
2362 bparams->minor_version = MINOR_VERSION;
2363
2364 mutex_lock(&zr->resource_lock);
2365
2366 bparams->norm = zr->norm;
2367 bparams->input = zr->input;
2368
2369 bparams->decimation = fh->jpg_settings.decimation;
2370 bparams->HorDcm = fh->jpg_settings.HorDcm;
2371 bparams->VerDcm = fh->jpg_settings.VerDcm;
2372 bparams->TmpDcm = fh->jpg_settings.TmpDcm;
2373 bparams->field_per_buff = fh->jpg_settings.field_per_buff;
2374 bparams->img_x = fh->jpg_settings.img_x;
2375 bparams->img_y = fh->jpg_settings.img_y;
2376 bparams->img_width = fh->jpg_settings.img_width;
2377 bparams->img_height = fh->jpg_settings.img_height;
2378 bparams->odd_even = fh->jpg_settings.odd_even;
2379
2380 bparams->quality = fh->jpg_settings.jpg_comp.quality;
2381 bparams->APPn = fh->jpg_settings.jpg_comp.APPn;
2382 bparams->APP_len = fh->jpg_settings.jpg_comp.APP_len;
2383 memcpy(bparams->APP_data,
2384 fh->jpg_settings.jpg_comp.APP_data,
2385 sizeof(bparams->APP_data));
2386 bparams->COM_len = zr->jpg_settings.jpg_comp.COM_len;
2387 memcpy(bparams->COM_data,
2388 fh->jpg_settings.jpg_comp.COM_data,
2389 sizeof(bparams->COM_data));
2390 bparams->jpeg_markers =
2391 fh->jpg_settings.jpg_comp.jpeg_markers;
2392
2393 mutex_unlock(&zr->resource_lock);
2394
2395 bparams->VFIFO_FB = 0;
2396
2397 return 0;
2398 }
2399 break;
2400
2401 case BUZIOC_S_PARAMS:
2402 {
2403 struct zoran_params *bparams = arg;
2404 int res = 0;
2405
2406 dprintk(3, KERN_DEBUG "%s: BUZIOC_S_PARAMS\n", ZR_DEVNAME(zr));
2407
2408 settings.decimation = bparams->decimation;
2409 settings.HorDcm = bparams->HorDcm;
2410 settings.VerDcm = bparams->VerDcm;
2411 settings.TmpDcm = bparams->TmpDcm;
2412 settings.field_per_buff = bparams->field_per_buff;
2413 settings.img_x = bparams->img_x;
2414 settings.img_y = bparams->img_y;
2415 settings.img_width = bparams->img_width;
2416 settings.img_height = bparams->img_height;
2417 settings.odd_even = bparams->odd_even;
2418
2419 settings.jpg_comp.quality = bparams->quality;
2420 settings.jpg_comp.APPn = bparams->APPn;
2421 settings.jpg_comp.APP_len = bparams->APP_len;
2422 memcpy(settings.jpg_comp.APP_data, bparams->APP_data,
2423 sizeof(bparams->APP_data));
2424 settings.jpg_comp.COM_len = bparams->COM_len;
2425 memcpy(settings.jpg_comp.COM_data, bparams->COM_data,
2426 sizeof(bparams->COM_data));
2427 settings.jpg_comp.jpeg_markers = bparams->jpeg_markers;
2428
2429 mutex_lock(&zr->resource_lock);
2430
2431 if (zr->codec_mode != BUZ_MODE_IDLE) {
2432 dprintk(1,
2433 KERN_ERR
2434 "%s: BUZIOC_S_PARAMS called, but Buz in capture/playback mode\n",
2435 ZR_DEVNAME(zr));
2436 res = -EINVAL;
2437 goto sparams_unlock_and_return;
2438 }
2439
2440
2441
2442 if (zoran_check_jpg_settings(zr, &settings)) {
2443 res = -EINVAL;
2444 goto sparams_unlock_and_return;
2445 }
2446
2447 fh->jpg_settings = settings;
2448 sparams_unlock_and_return:
2449 mutex_unlock(&zr->resource_lock);
2450
2451 return res;
2452 }
2453 break;
2454
2455 case BUZIOC_REQBUFS:
2456 {
2457 struct zoran_requestbuffers *breq = arg;
2458 int res = 0;
2459
2460 dprintk(3,
2461 KERN_DEBUG
2462 "%s: BUZIOC_REQBUFS - count=%lu, size=%lu\n",
2463 ZR_DEVNAME(zr), breq->count, breq->size);
2464
2465
2466 if (breq->count < 4)
2467 breq->count = 4;
2468 if (breq->count > jpg_nbufs)
2469 breq->count = jpg_nbufs;
2470 breq->size = PAGE_ALIGN(breq->size);
2471 if (breq->size < 8192)
2472 breq->size = 8192;
2473
2474
2475 if (breq->size > jpg_bufsize)
2476 breq->size = jpg_bufsize;
2477 if (fh->jpg_buffers.need_contiguous &&
2478 breq->size > MAX_KMALLOC_MEM)
2479 breq->size = MAX_KMALLOC_MEM;
2480
2481 mutex_lock(&zr->resource_lock);
2482
2483 if (fh->jpg_buffers.allocated || fh->v4l_buffers.allocated) {
2484 dprintk(1,
2485 KERN_ERR
2486 "%s: BUZIOC_REQBUFS - buffers allready allocated\n",
2487 ZR_DEVNAME(zr));
2488 res = -EBUSY;
2489 goto jpgreqbuf_unlock_and_return;
2490 }
2491
2492 fh->jpg_buffers.num_buffers = breq->count;
2493 fh->jpg_buffers.buffer_size = breq->size;
2494
2495 if (jpg_fbuffer_alloc(file)) {
2496 res = -ENOMEM;
2497 goto jpgreqbuf_unlock_and_return;
2498 }
2499
2500
2501
2502 fh->map_mode = ZORAN_MAP_MODE_JPG_REC;
2503 jpgreqbuf_unlock_and_return:
2504 mutex_unlock(&zr->resource_lock);
2505
2506 return res;
2507 }
2508 break;
2509
2510 case BUZIOC_QBUF_CAPT:
2511 {
2512 int *frame = arg, res;
2513
2514 dprintk(3, KERN_DEBUG "%s: BUZIOC_QBUF_CAPT - frame=%d\n",
2515 ZR_DEVNAME(zr), *frame);
2516
2517 mutex_lock(&zr->resource_lock);
2518 res = jpg_qbuf(file, *frame, BUZ_MODE_MOTION_COMPRESS);
2519 mutex_unlock(&zr->resource_lock);
2520
2521 return res;
2522 }
2523 break;
2524
2525 case BUZIOC_QBUF_PLAY:
2526 {
2527 int *frame = arg, res;
2528
2529 dprintk(3, KERN_DEBUG "%s: BUZIOC_QBUF_PLAY - frame=%d\n",
2530 ZR_DEVNAME(zr), *frame);
2531
2532 mutex_lock(&zr->resource_lock);
2533 res = jpg_qbuf(file, *frame, BUZ_MODE_MOTION_DECOMPRESS);
2534 mutex_unlock(&zr->resource_lock);
2535
2536 return res;
2537 }
2538 break;
2539
2540 case BUZIOC_SYNC:
2541 {
2542 struct zoran_sync *bsync = arg;
2543 int res;
2544
2545 dprintk(3, KERN_DEBUG "%s: BUZIOC_SYNC\n", ZR_DEVNAME(zr));
2546
2547 mutex_lock(&zr->resource_lock);
2548 res = jpg_sync(file, bsync);
2549 mutex_unlock(&zr->resource_lock);
2550
2551 return res;
2552 }
2553 break;
2554
2555 case BUZIOC_G_STATUS:
2556 {
2557 struct zoran_status *bstat = arg;
2558 int norm, input, status, res = 0;
2559
2560 dprintk(3, KERN_DEBUG "%s: BUZIOC_G_STATUS\n", ZR_DEVNAME(zr));
2561
2562 if (zr->codec_mode != BUZ_MODE_IDLE) {
2563 dprintk(1,
2564 KERN_ERR
2565 "%s: BUZIOC_G_STATUS called but Buz in capture/playback mode\n",
2566 ZR_DEVNAME(zr));
2567 return -EINVAL;
2568 }
2569
2570 input = zr->card.input[bstat->input].muxsel;
2571 norm = VIDEO_MODE_AUTO;
2572
2573 mutex_lock(&zr->resource_lock);
2574
2575 if (zr->codec_mode != BUZ_MODE_IDLE) {
2576 dprintk(1,
2577 KERN_ERR
2578 "%s: BUZIOC_G_STATUS called, but Buz in capture/playback mode\n",
2579 ZR_DEVNAME(zr));
2580 res = -EINVAL;
2581 goto gstat_unlock_and_return;
2582 }
2583
2584 decoder_command(zr, DECODER_SET_INPUT, &input);
2585 decoder_command(zr, DECODER_SET_NORM, &norm);
2586
2587
2588 ssleep(1);
2589
2590
2591 decoder_command(zr, DECODER_GET_STATUS, &status);
2592
2593
2594 input = zr->card.input[zr->input].muxsel;
2595 decoder_command(zr, DECODER_SET_INPUT, &input);
2596 decoder_command(zr, DECODER_SET_NORM, &zr->norm);
2597 gstat_unlock_and_return:
2598 mutex_unlock(&zr->resource_lock);
2599
2600 if (!res) {
2601 bstat->signal =
2602 (status & DECODER_STATUS_GOOD) ? 1 : 0;
2603 if (status & DECODER_STATUS_NTSC)
2604 bstat->norm = VIDEO_MODE_NTSC;
2605 else if (status & DECODER_STATUS_SECAM)
2606 bstat->norm = VIDEO_MODE_SECAM;
2607 else
2608 bstat->norm = VIDEO_MODE_PAL;
2609
2610 bstat->color =
2611 (status & DECODER_STATUS_COLOR) ? 1 : 0;
2612 }
2613
2614 return res;
2615 }
2616 break;
2617
2618
2619
2620
2621
2622 case VIDIOC_QUERYCAP:
2623 {
2624 struct v4l2_capability *cap = arg;
2625
2626 dprintk(3, KERN_DEBUG "%s: VIDIOC_QUERYCAP\n", ZR_DEVNAME(zr));
2627
2628 memset(cap, 0, sizeof(*cap));
2629 strncpy(cap->card, ZR_DEVNAME(zr), sizeof(cap->card)-1);
2630 strncpy(cap->driver, "zoran", sizeof(cap->driver)-1);
2631 snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s",
2632 pci_name(zr->pci_dev));
2633 cap->version =
2634 KERNEL_VERSION(MAJOR_VERSION, MINOR_VERSION,
2635 RELEASE_VERSION);
2636 cap->capabilities = ZORAN_V4L2_VID_FLAGS;
2637
2638 return 0;
2639 }
2640 break;
2641
2642 case VIDIOC_ENUM_FMT:
2643 {
2644 struct v4l2_fmtdesc *fmt = arg;
2645 int index = fmt->index, num = -1, i, flag = 0, type =
2646 fmt->type;
2647
2648 dprintk(3, KERN_DEBUG "%s: VIDIOC_ENUM_FMT - index=%d\n",
2649 ZR_DEVNAME(zr), fmt->index);
2650
2651 switch (fmt->type) {
2652 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2653 flag = ZORAN_FORMAT_CAPTURE;
2654 break;
2655 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
2656 flag = ZORAN_FORMAT_PLAYBACK;
2657 break;
2658 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2659 flag = ZORAN_FORMAT_OVERLAY;
2660 break;
2661 default:
2662 dprintk(1,
2663 KERN_ERR
2664 "%s: VIDIOC_ENUM_FMT - unknown type %d\n",
2665 ZR_DEVNAME(zr), fmt->type);
2666 return -EINVAL;
2667 }
2668
2669 for (i = 0; i < NUM_FORMATS; i++) {
2670 if (zoran_formats[i].flags & flag)
2671 num++;
2672 if (num == fmt->index)
2673 break;
2674 }
2675 if (fmt->index < 0 ||
2676 i == NUM_FORMATS)
2677 return -EINVAL;
2678
2679 memset(fmt, 0, sizeof(*fmt));
2680 fmt->index = index;
2681 fmt->type = type;
2682 strncpy(fmt->description, zoran_formats[i].name, sizeof(fmt->description)-1);
2683 fmt->pixelformat = zoran_formats[i].fourcc;
2684 if (zoran_formats[i].flags & ZORAN_FORMAT_COMPRESSED)
2685 fmt->flags |= V4L2_FMT_FLAG_COMPRESSED;
2686
2687 return 0;
2688 }
2689 break;
2690
2691 case VIDIOC_G_FMT:
2692 {
2693 struct v4l2_format *fmt = arg;
2694 int type = fmt->type;
2695
2696 dprintk(5, KERN_DEBUG "%s: VIDIOC_G_FMT\n", ZR_DEVNAME(zr));
2697
2698 memset(fmt, 0, sizeof(*fmt));
2699 fmt->type = type;
2700
2701 switch (fmt->type) {
2702 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2703
2704 mutex_lock(&zr->resource_lock);
2705
2706 fmt->fmt.win.w.left = fh->overlay_settings.x;
2707 fmt->fmt.win.w.top = fh->overlay_settings.y;
2708 fmt->fmt.win.w.width = fh->overlay_settings.width;
2709 fmt->fmt.win.w.height =
2710 fh->overlay_settings.height;
2711 if (fh->overlay_settings.width * 2 >
2712 BUZ_MAX_HEIGHT)
2713 fmt->fmt.win.field = V4L2_FIELD_INTERLACED;
2714 else
2715 fmt->fmt.win.field = V4L2_FIELD_TOP;
2716
2717 mutex_unlock(&zr->resource_lock);
2718
2719 break;
2720
2721 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2722 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
2723
2724 mutex_lock(&zr->resource_lock);
2725
2726 if (fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2727 fh->map_mode == ZORAN_MAP_MODE_RAW) {
2728
2729 fmt->fmt.pix.width =
2730 fh->v4l_settings.width;
2731 fmt->fmt.pix.height =
2732 fh->v4l_settings.height;
2733 fmt->fmt.pix.sizeimage =
2734 fh->v4l_settings.bytesperline *
2735 fh->v4l_settings.height;
2736 fmt->fmt.pix.pixelformat =
2737 fh->v4l_settings.format->fourcc;
2738 fmt->fmt.pix.colorspace =
2739 fh->v4l_settings.format->colorspace;
2740 fmt->fmt.pix.bytesperline =
2741 fh->v4l_settings.bytesperline;
2742 if (BUZ_MAX_HEIGHT <
2743 (fh->v4l_settings.height * 2))
2744 fmt->fmt.pix.field =
2745 V4L2_FIELD_INTERLACED;
2746 else
2747 fmt->fmt.pix.field =
2748 V4L2_FIELD_TOP;
2749
2750 } else {
2751
2752 fmt->fmt.pix.width =
2753 fh->jpg_settings.img_width /
2754 fh->jpg_settings.HorDcm;
2755 fmt->fmt.pix.height =
2756 fh->jpg_settings.img_height /
2757 (fh->jpg_settings.VerDcm *
2758 fh->jpg_settings.TmpDcm);
2759 fmt->fmt.pix.sizeimage =
2760 zoran_v4l2_calc_bufsize(&fh->
2761 jpg_settings);
2762 fmt->fmt.pix.pixelformat =
2763 V4L2_PIX_FMT_MJPEG;
2764 if (fh->jpg_settings.TmpDcm == 1)
2765 fmt->fmt.pix.field =
2766 (fh->jpg_settings.
2767 odd_even ? V4L2_FIELD_SEQ_BT :
2768 V4L2_FIELD_SEQ_BT);
2769 else
2770 fmt->fmt.pix.field =
2771 (fh->jpg_settings.
2772 odd_even ? V4L2_FIELD_TOP :
2773 V4L2_FIELD_BOTTOM);
2774
2775 fmt->fmt.pix.bytesperline = 0;
2776 fmt->fmt.pix.colorspace =
2777 V4L2_COLORSPACE_SMPTE170M;
2778 }
2779
2780 mutex_unlock(&zr->resource_lock);
2781
2782 break;
2783
2784 default:
2785 dprintk(1,
2786 KERN_ERR
2787 "%s: VIDIOC_G_FMT - unsupported type %d\n",
2788 ZR_DEVNAME(zr), fmt->type);
2789 return -EINVAL;
2790 }
2791 return 0;
2792 }
2793 break;
2794
2795 case VIDIOC_S_FMT:
2796 {
2797 struct v4l2_format *fmt = arg;
2798 int i, res = 0;
2799 __le32 printformat;
2800
2801 dprintk(3, KERN_DEBUG "%s: VIDIOC_S_FMT - type=%d, ",
2802 ZR_DEVNAME(zr), fmt->type);
2803
2804 switch (fmt->type) {
2805 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2806
2807 dprintk(3, "x=%d, y=%d, w=%d, h=%d, cnt=%d, map=0x%p\n",
2808 fmt->fmt.win.w.left, fmt->fmt.win.w.top,
2809 fmt->fmt.win.w.width,
2810 fmt->fmt.win.w.height,
2811 fmt->fmt.win.clipcount,
2812 fmt->fmt.win.bitmap);
2813 mutex_lock(&zr->resource_lock);
2814 res =
2815 setup_window(file, fmt->fmt.win.w.left,
2816 fmt->fmt.win.w.top,
2817 fmt->fmt.win.w.width,
2818 fmt->fmt.win.w.height,
2819 (struct video_clip __user *)
2820 fmt->fmt.win.clips,
2821 fmt->fmt.win.clipcount,
2822 fmt->fmt.win.bitmap);
2823 mutex_unlock(&zr->resource_lock);
2824 return res;
2825 break;
2826
2827 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2828 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
2829
2830 printformat =
2831 __cpu_to_le32(fmt->fmt.pix.pixelformat);
2832 dprintk(3, "size=%dx%d, fmt=0x%x (%4.4s)\n",
2833 fmt->fmt.pix.width, fmt->fmt.pix.height,
2834 fmt->fmt.pix.pixelformat,
2835 (char *) &printformat);
2836
2837
2838 if (!
2839 (fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2840 (fmt->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
2841 fmt->fmt.pix.pixelformat ==
2842 V4L2_PIX_FMT_MJPEG))) {
2843 dprintk(1,
2844 KERN_ERR
2845 "%s: VIDIOC_S_FMT - unknown type %d/0x%x(%4.4s) combination\n",
2846 ZR_DEVNAME(zr), fmt->type,
2847 fmt->fmt.pix.pixelformat,
2848 (char *) &printformat);
2849 return -EINVAL;
2850 }
2851
2852 if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG) {
2853 mutex_lock(&zr->resource_lock);
2854
2855 settings = fh->jpg_settings;
2856
2857 if (fh->v4l_buffers.allocated ||
2858 fh->jpg_buffers.allocated) {
2859 dprintk(1,
2860 KERN_ERR
2861 "%s: VIDIOC_S_FMT - cannot change capture mode\n",
2862 ZR_DEVNAME(zr));
2863 res = -EBUSY;
2864 goto sfmtjpg_unlock_and_return;
2865 }
2866
2867
2868 if ((fmt->fmt.pix.height * 2) >
2869 BUZ_MAX_HEIGHT)
2870 settings.TmpDcm = 1;
2871 else
2872 settings.TmpDcm = 2;
2873 settings.decimation = 0;
2874 if (fmt->fmt.pix.height <=
2875 fh->jpg_settings.img_height / 2)
2876 settings.VerDcm = 2;
2877 else
2878 settings.VerDcm = 1;
2879 if (fmt->fmt.pix.width <=
2880 fh->jpg_settings.img_width / 4)
2881 settings.HorDcm = 4;
2882 else if (fmt->fmt.pix.width <=
2883 fh->jpg_settings.img_width / 2)
2884 settings.HorDcm = 2;
2885 else
2886 settings.HorDcm = 1;
2887 if (settings.TmpDcm == 1)
2888 settings.field_per_buff = 2;
2889 else
2890 settings.field_per_buff = 1;
2891
2892
2893 if ((res =
2894 zoran_check_jpg_settings(zr,
2895 &settings)))
2896 goto sfmtjpg_unlock_and_return;
2897
2898
2899 fh->jpg_settings = settings;
2900
2901
2902 fmt->fmt.pix.width =
2903 settings.img_width / settings.HorDcm;
2904 fmt->fmt.pix.height =
2905 settings.img_height * 2 /
2906 (settings.TmpDcm * settings.VerDcm);
2907 if (settings.TmpDcm == 1)
2908 fmt->fmt.pix.field =
2909 (fh->jpg_settings.
2910 odd_even ? V4L2_FIELD_SEQ_TB :
2911 V4L2_FIELD_SEQ_BT);
2912 else
2913 fmt->fmt.pix.field =
2914 (fh->jpg_settings.
2915 odd_even ? V4L2_FIELD_TOP :
2916 V4L2_FIELD_BOTTOM);
2917 fh->jpg_buffers.buffer_size =
2918 zoran_v4l2_calc_bufsize(&fh->
2919 jpg_settings);
2920 fmt->fmt.pix.bytesperline = 0;
2921 fmt->fmt.pix.sizeimage =
2922 fh->jpg_buffers.buffer_size;
2923
2924
2925
2926 fh->map_mode =
2927 (fmt->type ==
2928 V4L2_BUF_TYPE_VIDEO_CAPTURE) ?
2929 ZORAN_MAP_MODE_JPG_REC :
2930 ZORAN_MAP_MODE_JPG_PLAY;
2931 sfmtjpg_unlock_and_return:
2932 mutex_unlock(&zr->resource_lock);
2933 } else {
2934 for (i = 0; i < NUM_FORMATS; i++)
2935 if (fmt->fmt.pix.pixelformat ==
2936 zoran_formats[i].fourcc)
2937 break;
2938 if (i == NUM_FORMATS) {
2939 dprintk(1,
2940 KERN_ERR
2941 "%s: VIDIOC_S_FMT - unknown/unsupported format 0x%x (%4.4s)\n",
2942 ZR_DEVNAME(zr),
2943 fmt->fmt.pix.pixelformat,
2944 (char *) &printformat);
2945 return -EINVAL;
2946 }
2947 mutex_lock(&zr->resource_lock);
2948 if (fh->jpg_buffers.allocated ||
2949 (fh->v4l_buffers.allocated &&
2950 fh->v4l_buffers.active !=
2951 ZORAN_FREE)) {
2952 dprintk(1,
2953 KERN_ERR
2954 "%s: VIDIOC_S_FMT - cannot change capture mode\n",
2955 ZR_DEVNAME(zr));
2956 res = -EBUSY;
2957 goto sfmtv4l_unlock_and_return;
2958 }
2959 if (fmt->fmt.pix.height > BUZ_MAX_HEIGHT)
2960 fmt->fmt.pix.height =
2961 BUZ_MAX_HEIGHT;
2962 if (fmt->fmt.pix.width > BUZ_MAX_WIDTH)
2963 fmt->fmt.pix.width = BUZ_MAX_WIDTH;
2964
2965 if ((res =
2966 zoran_v4l_set_format(file,
2967 fmt->fmt.pix.
2968 width,
2969 fmt->fmt.pix.
2970 height,
2971 &zoran_formats
2972 [i])))
2973 goto sfmtv4l_unlock_and_return;
2974
2975
2976
2977 fmt->fmt.pix.bytesperline =
2978 fh->v4l_settings.bytesperline;
2979 fmt->fmt.pix.sizeimage =
2980 fh->v4l_settings.height *
2981 fh->v4l_settings.bytesperline;
2982 if (BUZ_MAX_HEIGHT <
2983 (fh->v4l_settings.height * 2))
2984 fmt->fmt.pix.field =
2985 V4L2_FIELD_INTERLACED;
2986 else
2987 fmt->fmt.pix.field =
2988 V4L2_FIELD_TOP;
2989
2990 fh->map_mode = ZORAN_MAP_MODE_RAW;
2991 sfmtv4l_unlock_and_return:
2992 mutex_unlock(&zr->resource_lock);
2993 }
2994
2995 break;
2996
2997 default:
2998 dprintk(3, "unsupported\n");
2999 dprintk(1,
3000 KERN_ERR
3001 "%s: VIDIOC_S_FMT - unsupported type %d\n",
3002 ZR_DEVNAME(zr), fmt->type);
3003 return -EINVAL;
3004 }
3005
3006 return res;
3007 }
3008 break;
3009
3010 case VIDIOC_G_FBUF:
3011 {
3012 struct v4l2_framebuffer *fb = arg;
3013
3014 dprintk(3, KERN_DEBUG "%s: VIDIOC_G_FBUF\n", ZR_DEVNAME(zr));
3015
3016 memset(fb, 0, sizeof(*fb));
3017 mutex_lock(&zr->resource_lock);
3018 fb->base = zr->buffer.base;
3019 fb->fmt.width = zr->buffer.width;
3020 fb->fmt.height = zr->buffer.height;
3021 if (zr->overlay_settings.format) {
3022 fb->fmt.pixelformat =
3023 fh->overlay_settings.format->fourcc;
3024 }
3025 fb->fmt.bytesperline = zr->buffer.bytesperline;
3026 mutex_unlock(&zr->resource_lock);
3027 fb->fmt.colorspace = V4L2_COLORSPACE_SRGB;
3028 fb->fmt.field = V4L2_FIELD_INTERLACED;
3029 fb->flags = V4L2_FBUF_FLAG_OVERLAY;
3030 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
3031
3032 return 0;
3033 }
3034 break;
3035
3036 case VIDIOC_S_FBUF:
3037 {
3038 int i, res = 0;
3039 struct v4l2_framebuffer *fb = arg;
3040 __le32 printformat = __cpu_to_le32(fb->fmt.pixelformat);
3041
3042 dprintk(3,
3043 KERN_DEBUG
3044 "%s: VIDIOC_S_FBUF - base=0x%p, size=%dx%d, bpl=%d, fmt=0x%x (%4.4s)\n",
3045 ZR_DEVNAME(zr), fb->base, fb->fmt.width, fb->fmt.height,
3046 fb->fmt.bytesperline, fb->fmt.pixelformat,
3047 (char *) &printformat);
3048
3049 for (i = 0; i < NUM_FORMATS; i++)
3050 if (zoran_formats[i].fourcc == fb->fmt.pixelformat)
3051 break;
3052 if (i == NUM_FORMATS) {
3053 dprintk(1,
3054 KERN_ERR
3055 "%s: VIDIOC_S_FBUF - format=0x%x (%4.4s) not allowed\n",
3056 ZR_DEVNAME(zr), fb->fmt.pixelformat,
3057 (char *) &printformat);
3058 return -EINVAL;
3059 }
3060
3061 mutex_lock(&zr->resource_lock);
3062 res =
3063 setup_fbuffer(file, fb->base, &zoran_formats[i],
3064 fb->fmt.width, fb->fmt.height,
3065 fb->fmt.bytesperline);
3066 mutex_unlock(&zr->resource_lock);
3067
3068 return res;
3069 }
3070 break;
3071
3072 case VIDIOC_OVERLAY:
3073 {
3074 int *on = arg, res;
3075
3076 dprintk(3, KERN_DEBUG "%s: VIDIOC_PREVIEW - on=%d\n",
3077 ZR_DEVNAME(zr), *on);
3078
3079 mutex_lock(&zr->resource_lock);
3080 res = setup_overlay(file, *on);
3081 mutex_unlock(&zr->resource_lock);
3082
3083 return res;
3084 }
3085 break;
3086
3087 case VIDIOC_REQBUFS:
3088 {
3089 struct v4l2_requestbuffers *req = arg;
3090 int res = 0;
3091
3092 dprintk(3, KERN_DEBUG "%s: VIDIOC_REQBUFS - type=%d\n",
3093 ZR_DEVNAME(zr), req->type);
3094
3095 if (req->memory != V4L2_MEMORY_MMAP) {
3096 dprintk(1,
3097 KERN_ERR
3098 "%s: only MEMORY_MMAP capture is supported, not %d\n",
3099 ZR_DEVNAME(zr), req->memory);
3100 return -EINVAL;
3101 }
3102
3103 mutex_lock(&zr->resource_lock);
3104
3105 if (fh->v4l_buffers.allocated || fh->jpg_buffers.allocated) {
3106 dprintk(1,
3107 KERN_ERR
3108 "%s: VIDIOC_REQBUFS - buffers allready allocated\n",
3109 ZR_DEVNAME(zr));
3110 res = -EBUSY;
3111 goto v4l2reqbuf_unlock_and_return;
3112 }
3113
3114 if (fh->map_mode == ZORAN_MAP_MODE_RAW &&
3115 req->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
3116
3117
3118 if (req->count < 2)
3119 req->count = 2;
3120 if (req->count > v4l_nbufs)
3121 req->count = v4l_nbufs;
3122 fh->v4l_buffers.num_buffers = req->count;
3123
3124 if (v4l_fbuffer_alloc(file)) {
3125 res = -ENOMEM;
3126 goto v4l2reqbuf_unlock_and_return;
3127 }
3128
3129
3130 fh->map_mode = ZORAN_MAP_MODE_RAW;
3131
3132 } else if (fh->map_mode == ZORAN_MAP_MODE_JPG_REC ||
3133 fh->map_mode == ZORAN_MAP_MODE_JPG_PLAY) {
3134
3135
3136 if (req->count < 4)
3137 req->count = 4;
3138 if (req->count > jpg_nbufs)
3139 req->count = jpg_nbufs;
3140 fh->jpg_buffers.num_buffers = req->count;
3141 fh->jpg_buffers.buffer_size =
3142 zoran_v4l2_calc_bufsize(&fh->jpg_settings);
3143
3144 if (jpg_fbuffer_alloc(file)) {
3145 res = -ENOMEM;
3146 goto v4l2reqbuf_unlock_and_return;
3147 }
3148
3149
3150 if (req->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
3151 fh->map_mode = ZORAN_MAP_MODE_JPG_REC;
3152 else
3153 fh->map_mode = ZORAN_MAP_MODE_JPG_PLAY;
3154
3155 } else {
3156 dprintk(1,
3157 KERN_ERR
3158 "%s: VIDIOC_REQBUFS - unknown type %d\n",
3159 ZR_DEVNAME(zr), req->type);
3160 res = -EINVAL;
3161 goto v4l2reqbuf_unlock_and_return;
3162 }
3163 v4l2reqbuf_unlock_and_return:
3164 mutex_unlock(&zr->resource_lock);
3165
3166 return 0;
3167 }
3168 break;
3169
3170 case VIDIOC_QUERYBUF:
3171 {
3172 struct v4l2_buffer *buf = arg;
3173 __u32 type = buf->type;
3174 int index = buf->index, res;
3175
3176 dprintk(3,
3177 KERN_DEBUG
3178 "%s: VIDIOC_QUERYBUF - index=%d, type=%d\n",
3179 ZR_DEVNAME(zr), buf->index, buf->type);
3180
3181 memset(buf, 0, sizeof(*buf));
3182 buf->type = type;
3183 buf->index = index;
3184
3185 mutex_lock(&zr->resource_lock);
3186 res = zoran_v4l2_buffer_status(file, buf, buf->index);
3187 mutex_unlock(&zr->resource_lock);
3188
3189 return res;
3190 }
3191 break;
3192
3193 case VIDIOC_QBUF:
3194 {
3195 struct v4l2_buffer *buf = arg;
3196 int res = 0, codec_mode, buf_type;
3197
3198 dprintk(3,
3199 KERN_DEBUG "%s: VIDIOC_QBUF - type=%d, index=%d\n",
3200 ZR_DEVNAME(zr), buf->type, buf->index);
3201
3202 mutex_lock(&zr->resource_lock);
3203
3204 switch (fh->map_mode) {
3205 case ZORAN_MAP_MODE_RAW:
3206 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
3207 dprintk(1,
3208 KERN_ERR
3209 "%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
3210 ZR_DEVNAME(zr), buf->type, fh->map_mode);
3211 res = -EINVAL;
3212 goto qbuf_unlock_and_return;
3213 }
3214
3215 res = zoran_v4l_queue_frame(file, buf->index);
3216 if (res)
3217 goto qbuf_unlock_and_return;
3218 if (!zr->v4l_memgrab_active &&
3219 fh->v4l_buffers.active == ZORAN_LOCKED)
3220 zr36057_set_memgrab(zr, 1);
3221 break;
3222
3223 case ZORAN_MAP_MODE_JPG_REC:
3224 case ZORAN_MAP_MODE_JPG_PLAY:
3225 if (fh->map_mode == ZORAN_MAP_MODE_JPG_PLAY) {
3226 buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
3227 codec_mode = BUZ_MODE_MOTION_DECOMPRESS;
3228 } else {
3229 buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3230 codec_mode = BUZ_MODE_MOTION_COMPRESS;
3231 }
3232
3233 if (buf->type != buf_type) {
3234 dprintk(1,
3235 KERN_ERR
3236 "%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
3237 ZR_DEVNAME(zr), buf->type, fh->map_mode);
3238 res = -EINVAL;
3239 goto qbuf_unlock_and_return;
3240 }
3241
3242 res =
3243 zoran_jpg_queue_frame(file, buf->index,
3244 codec_mode);
3245 if (res != 0)
3246 goto qbuf_unlock_and_return;
3247 if (zr->codec_mode == BUZ_MODE_IDLE &&
3248 fh->jpg_buffers.active == ZORAN_LOCKED) {
3249 zr36057_enable_jpg(zr, codec_mode);
3250 }
3251 break;
3252
3253 default:
3254 dprintk(1,
3255 KERN_ERR
3256 "%s: VIDIOC_QBUF - unsupported type %d\n",
3257 ZR_DEVNAME(zr), buf->type);
3258 res = -EINVAL;
3259 goto qbuf_unlock_and_return;
3260 }
3261 qbuf_unlock_and_return:
3262 mutex_unlock(&zr->resource_lock);
3263
3264 return res;
3265 }
3266 break;
3267
3268 case VIDIOC_DQBUF:
3269 {
3270 struct v4l2_buffer *buf = arg;
3271 int res = 0, buf_type, num = -1;
3272
3273 dprintk(3, KERN_DEBUG "%s: VIDIOC_DQBUF - type=%d\n",
3274 ZR_DEVNAME(zr), buf->type);
3275
3276 mutex_lock(&zr->resource_lock);
3277
3278 switch (fh->map_mode) {
3279 case ZORAN_MAP_MODE_RAW:
3280 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
3281 dprintk(1,
3282 KERN_ERR
3283 "%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
3284 ZR_DEVNAME(zr), buf->type, fh->map_mode);
3285 res = -EINVAL;
3286 goto dqbuf_unlock_and_return;
3287 }
3288
3289 num = zr->v4l_pend[zr->v4l_sync_tail & V4L_MASK_FRAME];
3290 if (file->f_flags & O_NONBLOCK &&
3291 zr->v4l_buffers.buffer[num].state !=
3292 BUZ_STATE_DONE) {
3293 res = -EAGAIN;
3294 goto dqbuf_unlock_and_return;
3295 }
3296 res = v4l_sync(file, num);
3297 if (res)
3298 goto dqbuf_unlock_and_return;
3299 else
3300 zr->v4l_sync_tail++;
3301 res = zoran_v4l2_buffer_status(file, buf, num);
3302 break;
3303
3304 case ZORAN_MAP_MODE_JPG_REC:
3305 case ZORAN_MAP_MODE_JPG_PLAY:
3306 {
3307 struct zoran_sync bs;
3308
3309 if (fh->map_mode == ZORAN_MAP_MODE_JPG_PLAY)
3310 buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
3311 else
3312 buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3313
3314 if (buf->type != buf_type) {
3315 dprintk(1,
3316 KERN_ERR
3317 "%s: VIDIOC_QBUF - invalid buf->type=%d for map_mode=%d\n",
3318 ZR_DEVNAME(zr), buf->type, fh->map_mode);
3319 res = -EINVAL;
3320 goto dqbuf_unlock_and_return;
3321 }
3322
3323 num =
3324 zr->jpg_pend[zr->
3325 jpg_que_tail & BUZ_MASK_FRAME];
3326
3327 if (file->f_flags & O_NONBLOCK &&
3328 zr->jpg_buffers.buffer[num].state !=
3329 BUZ_STATE_DONE) {
3330 res = -EAGAIN;
3331 goto dqbuf_unlock_and_return;
3332 }
3333 res = jpg_sync(file, &bs);
3334 if (res)
3335 goto dqbuf_unlock_and_return;
3336 res =
3337 zoran_v4l2_buffer_status(file, buf, bs.frame);
3338 break;
3339 }
3340
3341 default:
3342 dprintk(1,
3343 KERN_ERR
3344 "%s: VIDIOC_DQBUF - unsupported type %d\n",
3345 ZR_DEVNAME(zr), buf->type);
3346 res = -EINVAL;
3347 goto dqbuf_unlock_and_return;
3348 }
3349 dqbuf_unlock_and_return:
3350 mutex_unlock(&zr->resource_lock);
3351
3352 return res;
3353 }
3354 break;
3355
3356 case VIDIOC_STREAMON:
3357 {
3358 int res = 0;
3359
3360 dprintk(3, KERN_DEBUG "%s: VIDIOC_STREAMON\n", ZR_DEVNAME(zr));
3361
3362 mutex_lock(&zr->resource_lock);
3363
3364 switch (fh->map_mode) {
3365 case ZORAN_MAP_MODE_RAW:
3366 if (zr->v4l_buffers.active != ZORAN_ACTIVE ||
3367 fh->v4l_buffers.active != ZORAN_ACTIVE) {
3368 res = -EBUSY;
3369 goto strmon_unlock_and_return;
3370 }
3371
3372 zr->v4l_buffers.active = fh->v4l_buffers.active =
3373 ZORAN_LOCKED;
3374 zr->v4l_settings = fh->v4l_settings;
3375
3376 zr->v4l_sync_tail = zr->v4l_pend_tail;
3377 if (!zr->v4l_memgrab_active &&
3378 zr->v4l_pend_head != zr->v4l_pend_tail) {
3379 zr36057_set_memgrab(zr, 1);
3380 }
3381 break;
3382
3383 case ZORAN_MAP_MODE_JPG_REC:
3384 case ZORAN_MAP_MODE_JPG_PLAY:
3385
3386 if (zr->jpg_buffers.active != ZORAN_ACTIVE ||
3387 fh->jpg_buffers.active != ZORAN_ACTIVE) {
3388 res = -EBUSY;
3389 goto strmon_unlock_and_return;
3390 }
3391
3392 zr->jpg_buffers.active = fh->jpg_buffers.active =
3393 ZORAN_LOCKED;
3394
3395 if (zr->jpg_que_head != zr->jpg_que_tail) {
3396
3397 jpeg_start(zr);
3398 }
3399
3400 break;
3401 default:
3402 dprintk(1,
3403 KERN_ERR
3404 "%s: VIDIOC_STREAMON - invalid map mode %d\n",
3405 ZR_DEVNAME(zr), fh->map_mode);
3406 res = -EINVAL;
3407 goto strmon_unlock_and_return;
3408 }
3409 strmon_unlock_and_return:
3410 mutex_unlock(&zr->resource_lock);
3411
3412 return res;
3413 }
3414 break;
3415
3416 case VIDIOC_STREAMOFF:
3417 {
3418 int i, res = 0;
3419
3420 dprintk(3, KERN_DEBUG "%s: VIDIOC_STREAMOFF\n", ZR_DEVNAME(zr));
3421
3422 mutex_lock(&zr->resource_lock);
3423
3424 switch (fh->map_mode) {
3425 case ZORAN_MAP_MODE_RAW:
3426 if (fh->v4l_buffers.active == ZORAN_FREE &&
3427 zr->v4l_buffers.active != ZORAN_FREE) {
3428 res = -EPERM;
3429 goto strmoff_unlock_and_return;
3430 }
3431 if (zr->v4l_buffers.active == ZORAN_FREE)
3432 goto strmoff_unlock_and_return;
3433
3434
3435 if (zr->v4l_memgrab_active) {
3436 unsigned long flags;
3437
3438 spin_lock_irqsave(&zr->spinlock, flags);
3439 zr36057_set_memgrab(zr, 0);
3440 spin_unlock_irqrestore(&zr->spinlock, flags);
3441 }
3442
3443 for (i = 0; i < fh->v4l_buffers.num_buffers; i++)
3444 zr->v4l_buffers.buffer[i].state =
3445 BUZ_STATE_USER;
3446 fh->v4l_buffers = zr->v4l_buffers;
3447
3448 zr->v4l_buffers.active = fh->v4l_buffers.active =
3449 ZORAN_FREE;
3450
3451 zr->v4l_grab_seq = 0;
3452 zr->v4l_pend_head = zr->v4l_pend_tail = 0;
3453 zr->v4l_sync_tail = 0;
3454
3455 break;
3456
3457 case ZORAN_MAP_MODE_JPG_REC:
3458 case ZORAN_MAP_MODE_JPG_PLAY:
3459 if (fh->jpg_buffers.active == ZORAN_FREE &&
3460 zr->jpg_buffers.active != ZORAN_FREE) {
3461 res = -EPERM;
3462 goto strmoff_unlock_and_return;
3463 }
3464 if (zr->jpg_buffers.active == ZORAN_FREE)
3465 goto strmoff_unlock_and_return;
3466
3467 res =
3468 jpg_qbuf(file, -1,
3469 (fh->map_mode ==
3470 ZORAN_MAP_MODE_JPG_REC) ?
3471 BUZ_MODE_MOTION_COMPRESS :
3472 BUZ_MODE_MOTION_DECOMPRESS);
3473 if (res)
3474 goto strmoff_unlock_and_return;
3475 break;
3476 default:
3477 dprintk(1,
3478 KERN_ERR
3479 "%s: VIDIOC_STREAMOFF - invalid map mode %d\n",
3480 ZR_DEVNAME(zr), fh->map_mode);
3481 res = -EINVAL;
3482 goto strmoff_unlock_and_return;
3483 }
3484 strmoff_unlock_and_return:
3485 mutex_unlock(&zr->resource_lock);
3486
3487 return res;
3488 }
3489 break;
3490
3491 case VIDIOC_QUERYCTRL:
3492 {
3493 struct v4l2_queryctrl *ctrl = arg;
3494
3495 dprintk(3, KERN_DEBUG "%s: VIDIOC_QUERYCTRL - id=%d\n",
3496 ZR_DEVNAME(zr), ctrl->id);
3497
3498
3499 if (ctrl->id < V4L2_CID_BRIGHTNESS ||
3500 ctrl->id > V4L2_CID_HUE)
3501 return -EINVAL;
3502 else {
3503 int id = ctrl->id;
3504 memset(ctrl, 0, sizeof(*ctrl));
3505 ctrl->id = id;
3506 }
3507
3508 switch (ctrl->id) {
3509 case V4L2_CID_BRIGHTNESS:
3510 strncpy(ctrl->name, "Brightness", sizeof(ctrl->name)-1);
3511 break;
3512 case V4L2_CID_CONTRAST:
3513 strncpy(ctrl->name, "Contrast", sizeof(ctrl->name)-1);
3514 break;
3515 case V4L2_CID_SATURATION:
3516 strncpy(ctrl->name, "Saturation", sizeof(ctrl->name)-1);
3517 break;
3518 case V4L2_CID_HUE:
3519 strncpy(ctrl->name, "Hue", sizeof(ctrl->name)-1);
3520 break;
3521 }
3522
3523 ctrl->minimum = 0;
3524 ctrl->maximum = 65535;
3525 ctrl->step = 1;
3526 ctrl->default_value = 32768;
3527 ctrl->type = V4L2_CTRL_TYPE_INTEGER;
3528
3529 return 0;
3530 }
3531 break;
3532
3533 case VIDIOC_G_CTRL:
3534 {
3535 struct v4l2_control *ctrl = arg;
3536
3537 dprintk(3, KERN_DEBUG "%s: VIDIOC_G_CTRL - id=%d\n",
3538 ZR_DEVNAME(zr), ctrl->id);
3539
3540
3541 if (ctrl->id < V4L2_CID_BRIGHTNESS ||
3542 ctrl->id > V4L2_CID_HUE)
3543 return -EINVAL;
3544
3545 mutex_lock(&zr->resource_lock);
3546 switch (ctrl->id) {
3547 case V4L2_CID_BRIGHTNESS:
3548 ctrl->value = zr->brightness;
3549 break;
3550 case V4L2_CID_CONTRAST:
3551 ctrl->value = zr->contrast;
3552 break;
3553 case V4L2_CID_SATURATION:
3554 ctrl->value = zr->saturation;
3555 break;
3556 case V4L2_CID_HUE:
3557 ctrl->value = zr->hue;
3558 break;
3559 }
3560 mutex_unlock(&zr->resource_lock);
3561
3562 return 0;
3563 }
3564 break;
3565
3566 case VIDIOC_S_CTRL:
3567 {
3568 struct v4l2_control *ctrl = arg;
3569 struct video_picture pict;
3570
3571 dprintk(3, KERN_DEBUG "%s: VIDIOC_S_CTRL - id=%d\n",
3572 ZR_DEVNAME(zr), ctrl->id);
3573
3574
3575 if (ctrl->id < V4L2_CID_BRIGHTNESS ||
3576 ctrl->id > V4L2_CID_HUE)
3577 return -EINVAL;
3578
3579 if (ctrl->value < 0 || ctrl->value > 65535) {
3580 dprintk(1,
3581 KERN_ERR
3582 "%s: VIDIOC_S_CTRL - invalid value %d for id=%d\n",
3583 ZR_DEVNAME(zr), ctrl->value, ctrl->id);
3584 return -EINVAL;
3585 }
3586
3587 mutex_lock(&zr->resource_lock);
3588 switch (ctrl->id) {
3589 case V4L2_CID_BRIGHTNESS:
3590 zr->brightness = ctrl->value;
3591 break;
3592 case V4L2_CID_CONTRAST:
3593 zr->contrast = ctrl->value;
3594 break;
3595 case V4L2_CID_SATURATION:
3596 zr->saturation = ctrl->value;
3597 break;
3598 case V4L2_CID_HUE:
3599 zr->hue = ctrl->value;
3600 break;
3601 }
3602 pict.brightness = zr->brightness;
3603 pict.contrast = zr->contrast;
3604 pict.colour = zr->saturation;
3605 pict.hue = zr->hue;
3606
3607 decoder_command(zr, DECODER_SET_PICTURE, &pict);
3608
3609 mutex_unlock(&zr->resource_lock);
3610
3611 return 0;
3612 }
3613 break;
3614
3615 case VIDIOC_ENUMSTD:
3616 {
3617 struct v4l2_standard *std = arg;
3618
3619 dprintk(3, KERN_DEBUG "%s: VIDIOC_ENUMSTD - index=%d\n",
3620 ZR_DEVNAME(zr), std->index);
3621
3622 if (std->index < 0 || std->index >= (zr->card.norms + 1))
3623 return -EINVAL;
3624 else {
3625 int id = std->index;
3626 memset(std, 0, sizeof(*std));
3627 std->index = id;
3628 }
3629
3630 if (std->index == zr->card.norms) {
3631
3632 struct video_decoder_capability caps;
3633 decoder_command(zr, DECODER_GET_CAPABILITIES,
3634 &caps);
3635 if (caps.flags & VIDEO_DECODER_AUTO) {
3636 std->id = V4L2_STD_ALL;
3637 strncpy(std->name, "Autodetect", sizeof(std->name)-1);
3638 return 0;
3639 } else
3640 return -EINVAL;
3641 }
3642 switch (std->index) {
3643 case 0:
3644 std->id = V4L2_STD_PAL;
3645 strncpy(std->name, "PAL", sizeof(std->name)-1);
3646 std->frameperiod.numerator = 1;
3647 std->frameperiod.denominator = 25;
3648 std->framelines = zr->card.tvn[0]->Ht;
3649 break;
3650 case 1:
3651 std->id = V4L2_STD_NTSC;
3652 strncpy(std->name, "NTSC", sizeof(std->name)-1);
3653 std->frameperiod.numerator = 1001;
3654 std->frameperiod.denominator = 30000;
3655 std->framelines = zr->card.tvn[1]->Ht;
3656 break;
3657 case 2:
3658 std->id = V4L2_STD_SECAM;
3659 strncpy(std->name, "SECAM", sizeof(std->name)-1);
3660 std->frameperiod.numerator = 1;
3661 std->frameperiod.denominator = 25;
3662 std->framelines = zr->card.tvn[2]->Ht;
3663 break;
3664 }
3665
3666 return 0;
3667 }
3668 break;
3669
3670 case VIDIOC_G_STD:
3671 {
3672 v4l2_std_id *std = arg;
3673 int norm;
3674
3675 dprintk(3, KERN_DEBUG "%s: VIDIOC_G_STD\n", ZR_DEVNAME(zr));
3676
3677 mutex_lock(&zr->resource_lock);
3678 norm = zr->norm;
3679 mutex_unlock(&zr->resource_lock);
3680
3681 switch (norm) {
3682 case VIDEO_MODE_PAL:
3683 *std = V4L2_STD_PAL;
3684 break;
3685 case VIDEO_MODE_NTSC:
3686 *std = V4L2_STD_NTSC;
3687 break;
3688 case VIDEO_MODE_SECAM:
3689 *std = V4L2_STD_SECAM;
3690 break;
3691 }
3692
3693 return 0;
3694 }
3695 break;
3696
3697 case VIDIOC_S_STD:
3698 {
3699 int norm = -1, res = 0;
3700 v4l2_std_id *std = arg;
3701
3702 dprintk(3, KERN_DEBUG "%s: VIDIOC_S_STD - norm=0x%llx\n",
3703 ZR_DEVNAME(zr), (unsigned long long)*std);
3704
3705 if ((*std & V4L2_STD_PAL) && !(*std & ~V4L2_STD_PAL))
3706 norm = VIDEO_MODE_PAL;
3707 else if ((*std & V4L2_STD_NTSC) && !(*std & ~V4L2_STD_NTSC))
3708 norm = VIDEO_MODE_NTSC;
3709 else if ((*std & V4L2_STD_SECAM) && !(*std & ~V4L2_STD_SECAM))
3710 norm = VIDEO_MODE_SECAM;
3711 else if (*std == V4L2_STD_ALL)
3712 norm = VIDEO_MODE_AUTO;
3713 else {
3714 dprintk(1,
3715 KERN_ERR
3716 "%s: VIDIOC_S_STD - invalid norm 0x%llx\n",
3717 ZR_DEVNAME(zr), (unsigned long long)*std);
3718 return -EINVAL;
3719 }
3720
3721 mutex_lock(&zr->resource_lock);
3722 if ((res = zoran_set_norm(zr, norm)))
3723 goto sstd_unlock_and_return;
3724
3725 res = wait_grab_pending(zr);
3726 sstd_unlock_and_return:
3727 mutex_unlock(&zr->resource_lock);
3728 return res;
3729 }
3730 break;
3731
3732 case VIDIOC_ENUMINPUT:
3733 {
3734 struct v4l2_input *inp = arg;
3735 int status;
3736
3737 dprintk(3, KERN_DEBUG "%s: VIDIOC_ENUMINPUT - index=%d\n",
3738 ZR_DEVNAME(zr), inp->index);
3739
3740 if (inp->index < 0 || inp->index >= zr->card.inputs)
3741 return -EINVAL;
3742 else {
3743 int id = inp->index;
3744 memset(inp, 0, sizeof(*inp));
3745 inp->index = id;
3746 }
3747
3748 strncpy(inp->name, zr->card.input[inp->index].name,
3749 sizeof(inp->name) - 1);
3750 inp->type = V4L2_INPUT_TYPE_CAMERA;
3751 inp->std = V4L2_STD_ALL;
3752
3753
3754 mutex_lock(&zr->resource_lock);
3755 decoder_command(zr, DECODER_GET_STATUS, &status);
3756 mutex_unlock(&zr->resource_lock);
3757
3758 if (!(status & DECODER_STATUS_GOOD)) {
3759 inp->status |= V4L2_IN_ST_NO_POWER;
3760 inp->status |= V4L2_IN_ST_NO_SIGNAL;
3761 }
3762 if (!(status & DECODER_STATUS_COLOR))
3763 inp->status |= V4L2_IN_ST_NO_COLOR;
3764
3765 return 0;
3766 }
3767 break;
3768
3769 case VIDIOC_G_INPUT:
3770 {
3771 int *input = arg;
3772
3773 dprintk(3, KERN_DEBUG "%s: VIDIOC_G_INPUT\n", ZR_DEVNAME(zr));
3774
3775 mutex_lock(&zr->resource_lock);
3776 *input = zr->input;
3777 mutex_unlock(&zr->resource_lock);
3778
3779 return 0;
3780 }
3781 break;
3782
3783 case VIDIOC_S_INPUT:
3784 {
3785 int *input = arg, res = 0;
3786
3787 dprintk(3, KERN_DEBUG "%s: VIDIOC_S_INPUT - input=%d\n",
3788 ZR_DEVNAME(zr), *input);
3789
3790 mutex_lock(&zr->resource_lock);
3791 if ((res = zoran_set_input(zr, *input)))
3792 goto sinput_unlock_and_return;
3793
3794
3795 res = wait_grab_pending(zr);
3796 sinput_unlock_and_return:
3797 mutex_unlock(&zr->resource_lock);
3798 return res;
3799 }
3800 break;
3801
3802 case VIDIOC_ENUMOUTPUT:
3803 {
3804 struct v4l2_output *outp = arg;
3805
3806 dprintk(3, KERN_DEBUG "%s: VIDIOC_ENUMOUTPUT - index=%d\n",
3807 ZR_DEVNAME(zr), outp->index);
3808
3809 if (outp->index != 0)
3810 return -EINVAL;
3811
3812 memset(outp, 0, sizeof(*outp));
3813 outp->index = 0;
3814 outp->type = V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY;
3815 strncpy(outp->name, "Autodetect", sizeof(outp->name)-1);
3816
3817 return 0;
3818 }
3819 break;
3820
3821 case VIDIOC_G_OUTPUT:
3822 {
3823 int *output = arg;
3824
3825 dprintk(3, KERN_DEBUG "%s: VIDIOC_G_OUTPUT\n", ZR_DEVNAME(zr));
3826
3827 *output = 0;
3828
3829 return 0;
3830 }
3831 break;
3832
3833 case VIDIOC_S_OUTPUT:
3834 {
3835 int *output = arg;
3836
3837 dprintk(3, KERN_DEBUG "%s: VIDIOC_S_OUTPUT - output=%d\n",
3838 ZR_DEVNAME(zr), *output);
3839
3840 if (*output != 0)
3841 return -EINVAL;
3842
3843 return 0;
3844 }
3845 break;
3846
3847
3848 case VIDIOC_CROPCAP:
3849 {
3850 struct v4l2_cropcap *cropcap = arg;
3851 int type = cropcap->type, res = 0;
3852
3853 dprintk(3, KERN_ERR "%s: VIDIOC_CROPCAP - type=%d\n",
3854 ZR_DEVNAME(zr), cropcap->type);
3855
3856 memset(cropcap, 0, sizeof(*cropcap));
3857 cropcap->type = type;
3858
3859 mutex_lock(&zr->resource_lock);
3860
3861 if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
3862 (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
3863 fh->map_mode == ZORAN_MAP_MODE_RAW)) {
3864 dprintk(1,
3865 KERN_ERR
3866 "%s: VIDIOC_CROPCAP - subcapture only supported for compressed capture\n",
3867 ZR_DEVNAME(zr));
3868 res = -EINVAL;
3869 goto cropcap_unlock_and_return;
3870 }
3871
3872 cropcap->bounds.top = cropcap->bounds.left = 0;
3873 cropcap->bounds.width = BUZ_MAX_WIDTH;
3874 cropcap->bounds.height = BUZ_MAX_HEIGHT;
3875 cropcap->defrect.top = cropcap->defrect.left = 0;
3876 cropcap->defrect.width = BUZ_MIN_WIDTH;
3877 cropcap->defrect.height = BUZ_MIN_HEIGHT;
3878 cropcap_unlock_and_return:
3879 mutex_unlock(&zr->resource_lock);
3880 return res;
3881 }
3882 break;
3883
3884 case VIDIOC_G_CROP:
3885 {
3886 struct v4l2_crop *crop = arg;
3887 int type = crop->type, res = 0;
3888
3889 dprintk(3, KERN_ERR "%s: VIDIOC_G_CROP - type=%d\n",
3890 ZR_DEVNAME(zr), crop->type);
3891
3892 memset(crop, 0, sizeof(*crop));
3893 crop->type = type;
3894
3895 mutex_lock(&zr->resource_lock);
3896
3897 if (crop->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
3898 (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
3899 fh->map_mode == ZORAN_MAP_MODE_RAW)) {
3900 dprintk(1,
3901 KERN_ERR
3902 "%s: VIDIOC_G_CROP - subcapture only supported for compressed capture\n",
3903 ZR_DEVNAME(zr));
3904 res = -EINVAL;
3905 goto gcrop_unlock_and_return;
3906 }
3907
3908 crop->c.top = fh->jpg_settings.img_y;
3909 crop->c.left = fh->jpg_settings.img_x;
3910 crop->c.width = fh->jpg_settings.img_width;
3911 crop->c.height = fh->jpg_settings.img_height;
3912
3913 gcrop_unlock_and_return:
3914 mutex_unlock(&zr->resource_lock);
3915
3916 return res;
3917 }
3918 break;
3919
3920 case VIDIOC_S_CROP:
3921 {
3922 struct v4l2_crop *crop = arg;
3923 int res = 0;
3924
3925 settings = fh->jpg_settings;
3926
3927 dprintk(3,
3928 KERN_ERR
3929 "%s: VIDIOC_S_CROP - type=%d, x=%d,y=%d,w=%d,h=%d\n",
3930 ZR_DEVNAME(zr), crop->type, crop->c.left, crop->c.top,
3931 crop->c.width, crop->c.height);
3932
3933 mutex_lock(&zr->resource_lock);
3934
3935 if (fh->jpg_buffers.allocated || fh->v4l_buffers.allocated) {
3936 dprintk(1,
3937 KERN_ERR
3938 "%s: VIDIOC_S_CROP - cannot change settings while active\n",
3939 ZR_DEVNAME(zr));
3940 res = -EBUSY;
3941 goto scrop_unlock_and_return;
3942 }
3943
3944 if (crop->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
3945 (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
3946 fh->map_mode == ZORAN_MAP_MODE_RAW)) {
3947 dprintk(1,
3948 KERN_ERR
3949 "%s: VIDIOC_G_CROP - subcapture only supported for compressed capture\n",
3950 ZR_DEVNAME(zr));
3951 res = -EINVAL;
3952 goto scrop_unlock_and_return;
3953 }
3954
3955
3956 settings.img_x = crop->c.left;
3957 settings.img_y = crop->c.top;
3958 settings.img_width = crop->c.width;
3959 settings.img_height = crop->c.height;
3960
3961
3962 if ((res = zoran_check_jpg_settings(zr, &settings)))
3963 goto scrop_unlock_and_return;
3964
3965
3966 fh->jpg_settings = settings;
3967
3968 scrop_unlock_and_return:
3969 mutex_unlock(&zr->resource_lock);
3970 return res;
3971 }
3972 break;
3973
3974 case VIDIOC_G_JPEGCOMP:
3975 {
3976 struct v4l2_jpegcompression *params = arg;
3977
3978 dprintk(3, KERN_DEBUG "%s: VIDIOC_G_JPEGCOMP\n",
3979 ZR_DEVNAME(zr));
3980
3981 memset(params, 0, sizeof(*params));
3982
3983 mutex_lock(&zr->resource_lock);
3984
3985 params->quality = fh->jpg_settings.jpg_comp.quality;
3986 params->APPn = fh->jpg_settings.jpg_comp.APPn;
3987 memcpy(params->APP_data,
3988 fh->jpg_settings.jpg_comp.APP_data,
3989 fh->jpg_settings.jpg_comp.APP_len);
3990 params->APP_len = fh->jpg_settings.jpg_comp.APP_len;
3991 memcpy(params->COM_data,
3992 fh->jpg_settings.jpg_comp.COM_data,
3993 fh->jpg_settings.jpg_comp.COM_len);
3994 params->COM_len = fh->jpg_settings.jpg_comp.COM_len;
3995 params->jpeg_markers =
3996 fh->jpg_settings.jpg_comp.jpeg_markers;
3997
3998 mutex_unlock(&zr->resource_lock);
3999
4000 return 0;
4001 }
4002 break;
4003
4004 case VIDIOC_S_JPEGCOMP:
4005 {
4006 struct v4l2_jpegcompression *params = arg;
4007 int res = 0;
4008
4009 settings = fh->jpg_settings;
4010
4011 dprintk(3,
4012 KERN_DEBUG
4013 "%s: VIDIOC_S_JPEGCOMP - quality=%d, APPN=%d, APP_len=%d, COM_len=%d\n",
4014 ZR_DEVNAME(zr), params->quality, params->APPn,
4015 params->APP_len, params->COM_len);
4016
4017 settings.jpg_comp = *params;
4018
4019 mutex_lock(&zr->resource_lock);
4020
4021 if (fh->v4l_buffers.active != ZORAN_FREE ||
4022 fh->jpg_buffers.active != ZORAN_FREE) {
4023 dprintk(1,
4024 KERN_WARNING
4025 "%s: VIDIOC_S_JPEGCOMP called while in playback/capture mode\n",
4026 ZR_DEVNAME(zr));
4027 res = -EBUSY;
4028 goto sjpegc_unlock_and_return;
4029 }
4030
4031 if ((res = zoran_check_jpg_settings(zr, &settings)))
4032 goto sjpegc_unlock_and_return;
4033 if (!fh->jpg_buffers.allocated)
4034 fh->jpg_buffers.buffer_size =
4035 zoran_v4l2_calc_bufsize(&fh->jpg_settings);
4036 fh->jpg_settings.jpg_comp = *params = settings.jpg_comp;
4037 sjpegc_unlock_and_return:
4038 mutex_unlock(&zr->resource_lock);
4039
4040 return 0;
4041 }
4042 break;
4043
4044 case VIDIOC_QUERYSTD:
4045 {
4046 v4l2_std_id *std = arg;
4047
4048 dprintk(3,
4049 KERN_DEBUG "%s: VIDIOC_QUERY_STD - std=0x%llx\n",
4050 ZR_DEVNAME(zr), (unsigned long long)*std);
4051
4052 if (*std == V4L2_STD_ALL || *std == V4L2_STD_NTSC ||
4053 *std == V4L2_STD_PAL || (*std == V4L2_STD_SECAM &&
4054 zr->card.norms == 3)) {
4055 return 0;
4056 }
4057
4058 return -EINVAL;
4059 }
4060 break;
4061
4062 case VIDIOC_TRY_FMT:
4063 {
4064 struct v4l2_format *fmt = arg;
4065 int res = 0;
4066
4067 dprintk(3, KERN_DEBUG "%s: VIDIOC_TRY_FMT - type=%d\n",
4068 ZR_DEVNAME(zr), fmt->type);
4069
4070 switch (fmt->type) {
4071 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
4072 mutex_lock(&zr->resource_lock);
4073
4074 if (fmt->fmt.win.w.width > BUZ_MAX_WIDTH)
4075 fmt->fmt.win.w.width = BUZ_MAX_WIDTH;
4076 if (fmt->fmt.win.w.width < BUZ_MIN_WIDTH)
4077 fmt->fmt.win.w.width = BUZ_MIN_WIDTH;
4078 if (fmt->fmt.win.w.height > BUZ_MAX_HEIGHT)
4079 fmt->fmt.win.w.height = BUZ_MAX_HEIGHT;
4080 if (fmt->fmt.win.w.height < BUZ_MIN_HEIGHT)
4081 fmt->fmt.win.w.height = BUZ_MIN_HEIGHT;
4082
4083 mutex_unlock(&zr->resource_lock);
4084 break;
4085
4086 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
4087 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
4088 if (fmt->fmt.pix.bytesperline > 0)
4089 return -EINVAL;
4090
4091 mutex_lock(&zr->resource_lock);
4092
4093 if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG) {
4094 settings = fh->jpg_settings;
4095
4096
4097 if ((fmt->fmt.pix.height * 2) >
4098 BUZ_MAX_HEIGHT)
4099 settings.TmpDcm = 1;
4100 else
4101 settings.TmpDcm = 2;
4102 settings.decimation = 0;
4103 if (fmt->fmt.pix.height <=
4104 fh->jpg_settings.img_height / 2)
4105 settings.VerDcm = 2;
4106 else
4107 settings.VerDcm = 1;
4108 if (fmt->fmt.pix.width <=
4109 fh->jpg_settings.img_width / 4)
4110 settings.HorDcm = 4;
4111 else if (fmt->fmt.pix.width <=
4112 fh->jpg_settings.img_width / 2)
4113 settings.HorDcm = 2;
4114 else
4115 settings.HorDcm = 1;
4116 if (settings.TmpDcm == 1)
4117 settings.field_per_buff = 2;
4118 else
4119 settings.field_per_buff = 1;
4120
4121
4122 if ((res =
4123 zoran_check_jpg_settings(zr,
4124 &settings)))
4125 goto tryfmt_unlock_and_return;
4126
4127
4128 fmt->fmt.pix.width =
4129 settings.img_width / settings.HorDcm;
4130 fmt->fmt.pix.height =
4131 settings.img_height * 2 /
4132 (settings.TmpDcm * settings.VerDcm);
4133 if (settings.TmpDcm == 1)
4134 fmt->fmt.pix.field =
4135 (fh->jpg_settings.
4136 odd_even ? V4L2_FIELD_SEQ_TB :
4137 V4L2_FIELD_SEQ_BT);
4138 else
4139 fmt->fmt.pix.field =
4140 (fh->jpg_settings.
4141 odd_even ? V4L2_FIELD_TOP :
4142 V4L2_FIELD_BOTTOM);
4143
4144 fmt->fmt.pix.sizeimage =
4145 zoran_v4l2_calc_bufsize(&settings);
4146 } else if (fmt->type ==
4147 V4L2_BUF_TYPE_VIDEO_CAPTURE) {
4148 int i;
4149
4150 for (i = 0; i < NUM_FORMATS; i++)
4151 if (zoran_formats[i].fourcc ==
4152 fmt->fmt.pix.pixelformat)
4153 break;
4154 if (i == NUM_FORMATS) {
4155 res = -EINVAL;
4156 goto tryfmt_unlock_and_return;
4157 }
4158
4159 if (fmt->fmt.pix.width > BUZ_MAX_WIDTH)
4160 fmt->fmt.pix.width = BUZ_MAX_WIDTH;
4161 if (fmt->fmt.pix.width < BUZ_MIN_WIDTH)
4162 fmt->fmt.pix.width = BUZ_MIN_WIDTH;
4163 if (fmt->fmt.pix.height > BUZ_MAX_HEIGHT)
4164 fmt->fmt.pix.height =
4165 BUZ_MAX_HEIGHT;
4166 if (fmt->fmt.pix.height < BUZ_MIN_HEIGHT)
4167 fmt->fmt.pix.height =
4168 BUZ_MIN_HEIGHT;
4169 } else {
4170 res = -EINVAL;
4171 goto tryfmt_unlock_and_return;
4172 }
4173 tryfmt_unlock_and_return:
4174 mutex_unlock(&zr->resource_lock);
4175
4176 return res;
4177 break;
4178
4179 default:
4180 return -EINVAL;
4181 }
4182
4183 return 0;
4184 }
4185 break;
4186
4187 default:
4188 dprintk(1, KERN_DEBUG "%s: UNKNOWN ioctl cmd: 0x%x\n",
4189 ZR_DEVNAME(zr), cmd);
4190 return -ENOIOCTLCMD;
4191 break;
4192
4193 }
4194 return 0;
4195}
4196
4197
4198static int
4199zoran_ioctl (struct inode *inode,
4200 struct file *file,
4201 unsigned int cmd,
4202 unsigned long arg)
4203{
4204 return video_usercopy(inode, file, cmd, arg, zoran_do_ioctl);
4205}
4206
4207static unsigned int
4208zoran_poll (struct file *file,
4209 poll_table *wait)
4210{
4211 struct zoran_fh *fh = file->private_data;
4212 struct zoran *zr = fh->zr;
4213 int res = 0, frame;
4214 unsigned long flags;
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224 mutex_lock(&zr->resource_lock);
4225
4226 switch (fh->map_mode) {
4227 case ZORAN_MAP_MODE_RAW:
4228 poll_wait(file, &zr->v4l_capq, wait);
4229 frame = zr->v4l_pend[zr->v4l_sync_tail & V4L_MASK_FRAME];
4230
4231 spin_lock_irqsave(&zr->spinlock, flags);
4232 dprintk(3,
4233 KERN_DEBUG
4234 "%s: %s() raw - active=%c, sync_tail=%lu/%c, pend_tail=%lu, pend_head=%lu\n",
4235 ZR_DEVNAME(zr), __func__,
4236 "FAL"[fh->v4l_buffers.active], zr->v4l_sync_tail,
4237 "UPMD"[zr->v4l_buffers.buffer[frame].state],
4238 zr->v4l_pend_tail, zr->v4l_pend_head);
4239
4240 if (fh->v4l_buffers.active != ZORAN_FREE &&
4241
4242 zr->v4l_buffers.buffer[frame].state == BUZ_STATE_DONE)
4243 res = POLLIN | POLLRDNORM;
4244 spin_unlock_irqrestore(&zr->spinlock, flags);
4245
4246 break;
4247
4248 case ZORAN_MAP_MODE_JPG_REC:
4249 case ZORAN_MAP_MODE_JPG_PLAY:
4250 poll_wait(file, &zr->jpg_capq, wait);
4251 frame = zr->jpg_pend[zr->jpg_que_tail & BUZ_MASK_FRAME];
4252
4253 spin_lock_irqsave(&zr->spinlock, flags);
4254 dprintk(3,
4255 KERN_DEBUG
4256 "%s: %s() jpg - active=%c, que_tail=%lu/%c, que_head=%lu, dma=%lu/%lu\n",
4257 ZR_DEVNAME(zr), __func__,
4258 "FAL"[fh->jpg_buffers.active], zr->jpg_que_tail,
4259 "UPMD"[zr->jpg_buffers.buffer[frame].state],
4260 zr->jpg_que_head, zr->jpg_dma_tail, zr->jpg_dma_head);
4261 if (fh->jpg_buffers.active != ZORAN_FREE &&
4262 zr->jpg_buffers.buffer[frame].state == BUZ_STATE_DONE) {
4263 if (fh->map_mode == ZORAN_MAP_MODE_JPG_REC)
4264 res = POLLIN | POLLRDNORM;
4265 else
4266 res = POLLOUT | POLLWRNORM;
4267 }
4268 spin_unlock_irqrestore(&zr->spinlock, flags);
4269
4270 break;
4271
4272 default:
4273 dprintk(1,
4274 KERN_ERR
4275 "%s: zoran_poll() - internal error, unknown map_mode=%d\n",
4276 ZR_DEVNAME(zr), fh->map_mode);
4277 res = POLLNVAL;
4278 }
4279
4280 mutex_unlock(&zr->resource_lock);
4281
4282 return res;
4283}
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298static void
4299zoran_vm_open (struct vm_area_struct *vma)
4300{
4301 struct zoran_mapping *map = vma->vm_private_data;
4302
4303 map->count++;
4304}
4305
4306static void
4307zoran_vm_close (struct vm_area_struct *vma)
4308{
4309 struct zoran_mapping *map = vma->vm_private_data;
4310 struct file *file = map->file;
4311 struct zoran_fh *fh = file->private_data;
4312 struct zoran *zr = fh->zr;
4313 int i;
4314
4315 map->count--;
4316 if (map->count == 0) {
4317 switch (fh->map_mode) {
4318 case ZORAN_MAP_MODE_JPG_REC:
4319 case ZORAN_MAP_MODE_JPG_PLAY:
4320
4321 dprintk(3, KERN_INFO "%s: munmap(MJPEG)\n",
4322 ZR_DEVNAME(zr));
4323
4324 for (i = 0; i < fh->jpg_buffers.num_buffers; i++) {
4325 if (fh->jpg_buffers.buffer[i].map == map) {
4326 fh->jpg_buffers.buffer[i].map =
4327 NULL;
4328 }
4329 }
4330 kfree(map);
4331
4332 for (i = 0; i < fh->jpg_buffers.num_buffers; i++)
4333 if (fh->jpg_buffers.buffer[i].map)
4334 break;
4335 if (i == fh->jpg_buffers.num_buffers) {
4336 mutex_lock(&zr->resource_lock);
4337
4338 if (fh->jpg_buffers.active != ZORAN_FREE) {
4339 jpg_qbuf(file, -1, zr->codec_mode);
4340 zr->jpg_buffers.allocated = 0;
4341 zr->jpg_buffers.active =
4342 fh->jpg_buffers.active =
4343 ZORAN_FREE;
4344 }
4345
4346 fh->jpg_buffers.allocated = 0;
4347 fh->jpg_buffers.ready_to_be_freed = 1;
4348
4349 mutex_unlock(&zr->resource_lock);
4350 }
4351
4352 break;
4353
4354 case ZORAN_MAP_MODE_RAW:
4355
4356 dprintk(3, KERN_INFO "%s: munmap(V4L)\n",
4357 ZR_DEVNAME(zr));
4358
4359 for (i = 0; i < fh->v4l_buffers.num_buffers; i++) {
4360 if (fh->v4l_buffers.buffer[i].map == map) {
4361
4362 fh->v4l_buffers.buffer[i].map =
4363 NULL;
4364 }
4365 }
4366 kfree(map);
4367
4368 for (i = 0; i < fh->v4l_buffers.num_buffers; i++)
4369 if (fh->v4l_buffers.buffer[i].map)
4370 break;
4371 if (i == fh->v4l_buffers.num_buffers) {
4372 mutex_lock(&zr->resource_lock);
4373
4374 if (fh->v4l_buffers.active != ZORAN_FREE) {
4375 unsigned long flags;
4376
4377 spin_lock_irqsave(&zr->spinlock, flags);
4378 zr36057_set_memgrab(zr, 0);
4379 zr->v4l_buffers.allocated = 0;
4380 zr->v4l_buffers.active =
4381 fh->v4l_buffers.active =
4382 ZORAN_FREE;
4383 spin_unlock_irqrestore(&zr->spinlock, flags);
4384 }
4385
4386 fh->v4l_buffers.allocated = 0;
4387 fh->v4l_buffers.ready_to_be_freed = 1;
4388
4389 mutex_unlock(&zr->resource_lock);
4390 }
4391
4392 break;
4393
4394 default:
4395 printk(KERN_ERR
4396 "%s: munmap() - internal error - unknown map mode %d\n",
4397 ZR_DEVNAME(zr), fh->map_mode);
4398 break;
4399
4400 }
4401 }
4402}
4403
4404static struct vm_operations_struct zoran_vm_ops = {
4405 .open = zoran_vm_open,
4406 .close = zoran_vm_close,
4407};
4408
4409static int
4410zoran_mmap (struct file *file,
4411 struct vm_area_struct *vma)
4412{
4413 struct zoran_fh *fh = file->private_data;
4414 struct zoran *zr = fh->zr;
4415 unsigned long size = (vma->vm_end - vma->vm_start);
4416 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
4417 int i, j;
4418 unsigned long page, start = vma->vm_start, todo, pos, fraglen;
4419 int first, last;
4420 struct zoran_mapping *map;
4421 int res = 0;
4422
4423 dprintk(3,
4424 KERN_INFO "%s: mmap(%s) of 0x%08lx-0x%08lx (size=%lu)\n",
4425 ZR_DEVNAME(zr),
4426 fh->map_mode == ZORAN_MAP_MODE_RAW ? "V4L" : "MJPEG",
4427 vma->vm_start, vma->vm_end, size);
4428
4429 if (!(vma->vm_flags & VM_SHARED) || !(vma->vm_flags & VM_READ) ||
4430 !(vma->vm_flags & VM_WRITE)) {
4431 dprintk(1,
4432 KERN_ERR
4433 "%s: mmap() - no MAP_SHARED/PROT_{READ,WRITE} given\n",
4434 ZR_DEVNAME(zr));
4435 return -EINVAL;
4436 }
4437
4438 switch (fh->map_mode) {
4439
4440 case ZORAN_MAP_MODE_JPG_REC:
4441 case ZORAN_MAP_MODE_JPG_PLAY:
4442
4443
4444 mutex_lock(&zr->resource_lock);
4445
4446
4447 if (!fh->jpg_buffers.allocated) {
4448 dprintk(1,
4449 KERN_ERR
4450 "%s: zoran_mmap(MJPEG) - buffers not yet allocated\n",
4451 ZR_DEVNAME(zr));
4452 res = -ENOMEM;
4453 goto jpg_mmap_unlock_and_return;
4454 }
4455
4456 first = offset / fh->jpg_buffers.buffer_size;
4457 last = first - 1 + size / fh->jpg_buffers.buffer_size;
4458 if (offset % fh->jpg_buffers.buffer_size != 0 ||
4459 size % fh->jpg_buffers.buffer_size != 0 || first < 0 ||
4460 last < 0 || first >= fh->jpg_buffers.num_buffers ||
4461 last >= fh->jpg_buffers.num_buffers) {
4462 dprintk(1,
4463 KERN_ERR
4464 "%s: mmap(MJPEG) - offset=%lu or size=%lu invalid for bufsize=%d and numbufs=%d\n",
4465 ZR_DEVNAME(zr), offset, size,
4466 fh->jpg_buffers.buffer_size,
4467 fh->jpg_buffers.num_buffers);
4468 res = -EINVAL;
4469 goto jpg_mmap_unlock_and_return;
4470 }
4471 for (i = first; i <= last; i++) {
4472 if (fh->jpg_buffers.buffer[i].map) {
4473 dprintk(1,
4474 KERN_ERR
4475 "%s: mmap(MJPEG) - buffer %d already mapped\n",
4476 ZR_DEVNAME(zr), i);
4477 res = -EBUSY;
4478 goto jpg_mmap_unlock_and_return;
4479 }
4480 }
4481
4482
4483 map = kmalloc(sizeof(struct zoran_mapping), GFP_KERNEL);
4484 if (!map) {
4485 res = -ENOMEM;
4486 goto jpg_mmap_unlock_and_return;
4487 }
4488 map->file = file;
4489 map->count = 1;
4490
4491 vma->vm_ops = &zoran_vm_ops;
4492 vma->vm_flags |= VM_DONTEXPAND;
4493 vma->vm_private_data = map;
4494
4495 for (i = first; i <= last; i++) {
4496 for (j = 0;
4497 j < fh->jpg_buffers.buffer_size / PAGE_SIZE;
4498 j++) {
4499 fraglen =
4500 (le32_to_cpu(fh->jpg_buffers.buffer[i].
4501 frag_tab[2 * j + 1]) & ~1) << 1;
4502 todo = size;
4503 if (todo > fraglen)
4504 todo = fraglen;
4505 pos =
4506 le32_to_cpu(fh->jpg_buffers.
4507 buffer[i].frag_tab[2 * j]);
4508
4509 page = virt_to_phys(bus_to_virt(pos))
4510 >> PAGE_SHIFT;
4511 if (remap_pfn_range(vma, start, page,
4512 todo, PAGE_SHARED)) {
4513 dprintk(1,
4514 KERN_ERR
4515 "%s: zoran_mmap(V4L) - remap_pfn_range failed\n",
4516 ZR_DEVNAME(zr));
4517 res = -EAGAIN;
4518 goto jpg_mmap_unlock_and_return;
4519 }
4520 size -= todo;
4521 start += todo;
4522 if (size == 0)
4523 break;
4524 if (le32_to_cpu(fh->jpg_buffers.buffer[i].
4525 frag_tab[2 * j + 1]) & 1)
4526 break;
4527 }
4528 fh->jpg_buffers.buffer[i].map = map;
4529 if (size == 0)
4530 break;
4531
4532 }
4533 jpg_mmap_unlock_and_return:
4534 mutex_unlock(&zr->resource_lock);
4535
4536 break;
4537
4538 case ZORAN_MAP_MODE_RAW:
4539
4540 mutex_lock(&zr->resource_lock);
4541
4542
4543 if (!fh->v4l_buffers.allocated) {
4544 dprintk(1,
4545 KERN_ERR
4546 "%s: zoran_mmap(V4L) - buffers not yet allocated\n",
4547 ZR_DEVNAME(zr));
4548 res = -ENOMEM;
4549 goto v4l_mmap_unlock_and_return;
4550 }
4551
4552 first = offset / fh->v4l_buffers.buffer_size;
4553 last = first - 1 + size / fh->v4l_buffers.buffer_size;
4554 if (offset % fh->v4l_buffers.buffer_size != 0 ||
4555 size % fh->v4l_buffers.buffer_size != 0 || first < 0 ||
4556 last < 0 || first >= fh->v4l_buffers.num_buffers ||
4557 last >= fh->v4l_buffers.buffer_size) {
4558 dprintk(1,
4559 KERN_ERR
4560 "%s: mmap(V4L) - offset=%lu or size=%lu invalid for bufsize=%d and numbufs=%d\n",
4561 ZR_DEVNAME(zr), offset, size,
4562 fh->v4l_buffers.buffer_size,
4563 fh->v4l_buffers.num_buffers);
4564 res = -EINVAL;
4565 goto v4l_mmap_unlock_and_return;
4566 }
4567 for (i = first; i <= last; i++) {
4568 if (fh->v4l_buffers.buffer[i].map) {
4569 dprintk(1,
4570 KERN_ERR
4571 "%s: mmap(V4L) - buffer %d already mapped\n",
4572 ZR_DEVNAME(zr), i);
4573 res = -EBUSY;
4574 goto v4l_mmap_unlock_and_return;
4575 }
4576 }
4577
4578
4579 map = kmalloc(sizeof(struct zoran_mapping), GFP_KERNEL);
4580 if (!map) {
4581 res = -ENOMEM;
4582 goto v4l_mmap_unlock_and_return;
4583 }
4584 map->file = file;
4585 map->count = 1;
4586
4587 vma->vm_ops = &zoran_vm_ops;
4588 vma->vm_flags |= VM_DONTEXPAND;
4589 vma->vm_private_data = map;
4590
4591 for (i = first; i <= last; i++) {
4592 todo = size;
4593 if (todo > fh->v4l_buffers.buffer_size)
4594 todo = fh->v4l_buffers.buffer_size;
4595 page = fh->v4l_buffers.buffer[i].fbuffer_phys;
4596 if (remap_pfn_range(vma, start, page >> PAGE_SHIFT,
4597 todo, PAGE_SHARED)) {
4598 dprintk(1,
4599 KERN_ERR
4600 "%s: zoran_mmap(V4L)i - remap_pfn_range failed\n",
4601 ZR_DEVNAME(zr));
4602 res = -EAGAIN;
4603 goto v4l_mmap_unlock_and_return;
4604 }
4605 size -= todo;
4606 start += todo;
4607 fh->v4l_buffers.buffer[i].map = map;
4608 if (size == 0)
4609 break;
4610 }
4611 v4l_mmap_unlock_and_return:
4612 mutex_unlock(&zr->resource_lock);
4613
4614 break;
4615
4616 default:
4617 dprintk(1,
4618 KERN_ERR
4619 "%s: zoran_mmap() - internal error - unknown map mode %d\n",
4620 ZR_DEVNAME(zr), fh->map_mode);
4621 break;
4622 }
4623
4624 return 0;
4625}
4626
4627static const struct file_operations zoran_fops = {
4628 .owner = THIS_MODULE,
4629 .open = zoran_open,
4630 .release = zoran_close,
4631 .ioctl = zoran_ioctl,
4632#ifdef CONFIG_COMPAT
4633 .compat_ioctl = v4l_compat_ioctl32,
4634#endif
4635 .llseek = no_llseek,
4636 .read = zoran_read,
4637 .write = zoran_write,
4638 .mmap = zoran_mmap,
4639 .poll = zoran_poll,
4640};
4641
4642struct video_device zoran_template __devinitdata = {
4643 .name = ZORAN_NAME,
4644 .fops = &zoran_fops,
4645 .release = &zoran_vdev_release,
4646 .minor = -1
4647};
4648
4649