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