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