Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.32 1900 lines 45 kB view raw
1/* 2 * drivers/media/video/omap24xxcam.c 3 * 4 * OMAP 2 camera block driver. 5 * 6 * Copyright (C) 2004 MontaVista Software, Inc. 7 * Copyright (C) 2004 Texas Instruments. 8 * Copyright (C) 2007-2008 Nokia Corporation. 9 * 10 * Contact: Sakari Ailus <sakari.ailus@nokia.com> 11 * 12 * Based on code from Andy Lowe <source@mvista.com> 13 * 14 * This program is free software; you can redistribute it and/or 15 * modify it under the terms of the GNU General Public License 16 * version 2 as published by the Free Software Foundation. 17 * 18 * This program is distributed in the hope that it will be useful, but 19 * WITHOUT ANY WARRANTY; without even the implied warranty of 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21 * General Public License for more details. 22 * 23 * You should have received a copy of the GNU General Public License 24 * along with this program; if not, write to the Free Software 25 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 26 * 02110-1301 USA 27 */ 28 29#include <linux/delay.h> 30#include <linux/kernel.h> 31#include <linux/interrupt.h> 32#include <linux/videodev2.h> 33#include <linux/pci.h> /* needed for videobufs */ 34#include <linux/version.h> 35#include <linux/platform_device.h> 36#include <linux/clk.h> 37#include <linux/io.h> 38 39#include <media/v4l2-common.h> 40#include <media/v4l2-ioctl.h> 41 42#include "omap24xxcam.h" 43 44#define OMAP24XXCAM_VERSION KERNEL_VERSION(0, 0, 0) 45 46#define RESET_TIMEOUT_NS 10000 47 48static void omap24xxcam_reset(struct omap24xxcam_device *cam); 49static int omap24xxcam_sensor_if_enable(struct omap24xxcam_device *cam); 50static void omap24xxcam_device_unregister(struct v4l2_int_device *s); 51static int omap24xxcam_remove(struct platform_device *pdev); 52 53/* module parameters */ 54static int video_nr = -1; /* video device minor (-1 ==> auto assign) */ 55/* 56 * Maximum amount of memory to use for capture buffers. 57 * Default is 4800KB, enough to double-buffer SXGA. 58 */ 59static int capture_mem = 1280 * 960 * 2 * 2; 60 61static struct v4l2_int_device omap24xxcam; 62 63/* 64 * 65 * Clocks. 66 * 67 */ 68 69static void omap24xxcam_clock_put(struct omap24xxcam_device *cam) 70{ 71 if (cam->ick != NULL && !IS_ERR(cam->ick)) 72 clk_put(cam->ick); 73 if (cam->fck != NULL && !IS_ERR(cam->fck)) 74 clk_put(cam->fck); 75 76 cam->ick = cam->fck = NULL; 77} 78 79static int omap24xxcam_clock_get(struct omap24xxcam_device *cam) 80{ 81 int rval = 0; 82 83 cam->fck = clk_get(cam->dev, "fck"); 84 if (IS_ERR(cam->fck)) { 85 dev_err(cam->dev, "can't get camera fck"); 86 rval = PTR_ERR(cam->fck); 87 omap24xxcam_clock_put(cam); 88 return rval; 89 } 90 91 cam->ick = clk_get(cam->dev, "ick"); 92 if (IS_ERR(cam->ick)) { 93 dev_err(cam->dev, "can't get camera ick"); 94 rval = PTR_ERR(cam->ick); 95 omap24xxcam_clock_put(cam); 96 } 97 98 return rval; 99} 100 101static void omap24xxcam_clock_on(struct omap24xxcam_device *cam) 102{ 103 clk_enable(cam->fck); 104 clk_enable(cam->ick); 105} 106 107static void omap24xxcam_clock_off(struct omap24xxcam_device *cam) 108{ 109 clk_disable(cam->fck); 110 clk_disable(cam->ick); 111} 112 113/* 114 * 115 * Camera core 116 * 117 */ 118 119/* 120 * Set xclk. 121 * 122 * To disable xclk, use value zero. 123 */ 124static void omap24xxcam_core_xclk_set(const struct omap24xxcam_device *cam, 125 u32 xclk) 126{ 127 if (xclk) { 128 u32 divisor = CAM_MCLK / xclk; 129 130 if (divisor == 1) 131 omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, 132 CC_CTRL_XCLK, 133 CC_CTRL_XCLK_DIV_BYPASS); 134 else 135 omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, 136 CC_CTRL_XCLK, divisor); 137 } else 138 omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, 139 CC_CTRL_XCLK, CC_CTRL_XCLK_DIV_STABLE_LOW); 140} 141 142static void omap24xxcam_core_hwinit(const struct omap24xxcam_device *cam) 143{ 144 /* 145 * Setting the camera core AUTOIDLE bit causes problems with frame 146 * synchronization, so we will clear the AUTOIDLE bit instead. 147 */ 148 omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_SYSCONFIG, 149 CC_SYSCONFIG_AUTOIDLE); 150 151 /* program the camera interface DMA packet size */ 152 omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_CTRL_DMA, 153 CC_CTRL_DMA_EN | (DMA_THRESHOLD / 4 - 1)); 154 155 /* enable camera core error interrupts */ 156 omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_IRQENABLE, 157 CC_IRQENABLE_FW_ERR_IRQ 158 | CC_IRQENABLE_FSC_ERR_IRQ 159 | CC_IRQENABLE_SSC_ERR_IRQ 160 | CC_IRQENABLE_FIFO_OF_IRQ); 161} 162 163/* 164 * Enable the camera core. 165 * 166 * Data transfer to the camera DMA starts from next starting frame. 167 */ 168static void omap24xxcam_core_enable(const struct omap24xxcam_device *cam) 169{ 170 171 omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_CTRL, 172 cam->cc_ctrl); 173} 174 175/* 176 * Disable camera core. 177 * 178 * The data transfer will be stopped immediately (CC_CTRL_CC_RST). The 179 * core internal state machines will be reset. Use 180 * CC_CTRL_CC_FRAME_TRIG instead if you want to transfer the current 181 * frame completely. 182 */ 183static void omap24xxcam_core_disable(const struct omap24xxcam_device *cam) 184{ 185 omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_CTRL, 186 CC_CTRL_CC_RST); 187} 188 189/* Interrupt service routine for camera core interrupts. */ 190static void omap24xxcam_core_isr(struct omap24xxcam_device *cam) 191{ 192 u32 cc_irqstatus; 193 const u32 cc_irqstatus_err = 194 CC_IRQSTATUS_FW_ERR_IRQ 195 | CC_IRQSTATUS_FSC_ERR_IRQ 196 | CC_IRQSTATUS_SSC_ERR_IRQ 197 | CC_IRQSTATUS_FIFO_UF_IRQ 198 | CC_IRQSTATUS_FIFO_OF_IRQ; 199 200 cc_irqstatus = omap24xxcam_reg_in(cam->mmio_base + CC_REG_OFFSET, 201 CC_IRQSTATUS); 202 omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_IRQSTATUS, 203 cc_irqstatus); 204 205 if (cc_irqstatus & cc_irqstatus_err 206 && !atomic_read(&cam->in_reset)) { 207 dev_dbg(cam->dev, "resetting camera, cc_irqstatus 0x%x\n", 208 cc_irqstatus); 209 omap24xxcam_reset(cam); 210 } 211} 212 213/* 214 * 215 * videobuf_buffer handling. 216 * 217 * Memory for mmapped videobuf_buffers is not allocated 218 * conventionally, but by several kmalloc allocations and then 219 * creating the scatterlist on our own. User-space buffers are handled 220 * normally. 221 * 222 */ 223 224/* 225 * Free the memory-mapped buffer memory allocated for a 226 * videobuf_buffer and the associated scatterlist. 227 */ 228static void omap24xxcam_vbq_free_mmap_buffer(struct videobuf_buffer *vb) 229{ 230 struct videobuf_dmabuf *dma = videobuf_to_dma(vb); 231 size_t alloc_size; 232 struct page *page; 233 int i; 234 235 if (dma->sglist == NULL) 236 return; 237 238 i = dma->sglen; 239 while (i) { 240 i--; 241 alloc_size = sg_dma_len(&dma->sglist[i]); 242 page = sg_page(&dma->sglist[i]); 243 do { 244 ClearPageReserved(page++); 245 } while (alloc_size -= PAGE_SIZE); 246 __free_pages(sg_page(&dma->sglist[i]), 247 get_order(sg_dma_len(&dma->sglist[i]))); 248 } 249 250 kfree(dma->sglist); 251 dma->sglist = NULL; 252} 253 254/* Release all memory related to the videobuf_queue. */ 255static void omap24xxcam_vbq_free_mmap_buffers(struct videobuf_queue *vbq) 256{ 257 int i; 258 259 mutex_lock(&vbq->vb_lock); 260 261 for (i = 0; i < VIDEO_MAX_FRAME; i++) { 262 if (NULL == vbq->bufs[i]) 263 continue; 264 if (V4L2_MEMORY_MMAP != vbq->bufs[i]->memory) 265 continue; 266 vbq->ops->buf_release(vbq, vbq->bufs[i]); 267 omap24xxcam_vbq_free_mmap_buffer(vbq->bufs[i]); 268 kfree(vbq->bufs[i]); 269 vbq->bufs[i] = NULL; 270 } 271 272 mutex_unlock(&vbq->vb_lock); 273 274 videobuf_mmap_free(vbq); 275} 276 277/* 278 * Allocate physically as contiguous as possible buffer for video 279 * frame and allocate and build DMA scatter-gather list for it. 280 */ 281static int omap24xxcam_vbq_alloc_mmap_buffer(struct videobuf_buffer *vb) 282{ 283 unsigned int order; 284 size_t alloc_size, size = vb->bsize; /* vb->bsize is page aligned */ 285 struct page *page; 286 int max_pages, err = 0, i = 0; 287 struct videobuf_dmabuf *dma = videobuf_to_dma(vb); 288 289 /* 290 * allocate maximum size scatter-gather list. Note this is 291 * overhead. We may not use as many entries as we allocate 292 */ 293 max_pages = vb->bsize >> PAGE_SHIFT; 294 dma->sglist = kcalloc(max_pages, sizeof(*dma->sglist), GFP_KERNEL); 295 if (dma->sglist == NULL) { 296 err = -ENOMEM; 297 goto out; 298 } 299 300 while (size) { 301 order = get_order(size); 302 /* 303 * do not over-allocate even if we would get larger 304 * contiguous chunk that way 305 */ 306 if ((PAGE_SIZE << order) > size) 307 order--; 308 309 /* try to allocate as many contiguous pages as possible */ 310 page = alloc_pages(GFP_KERNEL | GFP_DMA, order); 311 /* if allocation fails, try to allocate smaller amount */ 312 while (page == NULL) { 313 order--; 314 page = alloc_pages(GFP_KERNEL | GFP_DMA, order); 315 if (page == NULL && !order) { 316 err = -ENOMEM; 317 goto out; 318 } 319 } 320 size -= (PAGE_SIZE << order); 321 322 /* append allocated chunk of pages into scatter-gather list */ 323 sg_set_page(&dma->sglist[i], page, PAGE_SIZE << order, 0); 324 dma->sglen++; 325 i++; 326 327 alloc_size = (PAGE_SIZE << order); 328 329 /* clear pages before giving them to user space */ 330 memset(page_address(page), 0, alloc_size); 331 332 /* mark allocated pages reserved */ 333 do { 334 SetPageReserved(page++); 335 } while (alloc_size -= PAGE_SIZE); 336 } 337 /* 338 * REVISIT: not fully correct to assign nr_pages == sglen but 339 * video-buf is passing nr_pages for e.g. unmap_sg calls 340 */ 341 dma->nr_pages = dma->sglen; 342 dma->direction = PCI_DMA_FROMDEVICE; 343 344 return 0; 345 346out: 347 omap24xxcam_vbq_free_mmap_buffer(vb); 348 return err; 349} 350 351static int omap24xxcam_vbq_alloc_mmap_buffers(struct videobuf_queue *vbq, 352 unsigned int count) 353{ 354 int i, err = 0; 355 struct omap24xxcam_fh *fh = 356 container_of(vbq, struct omap24xxcam_fh, vbq); 357 358 mutex_lock(&vbq->vb_lock); 359 360 for (i = 0; i < count; i++) { 361 err = omap24xxcam_vbq_alloc_mmap_buffer(vbq->bufs[i]); 362 if (err) 363 goto out; 364 dev_dbg(fh->cam->dev, "sglen is %d for buffer %d\n", 365 videobuf_to_dma(vbq->bufs[i])->sglen, i); 366 } 367 368 mutex_unlock(&vbq->vb_lock); 369 370 return 0; 371out: 372 while (i) { 373 i--; 374 omap24xxcam_vbq_free_mmap_buffer(vbq->bufs[i]); 375 } 376 377 mutex_unlock(&vbq->vb_lock); 378 379 return err; 380} 381 382/* 383 * This routine is called from interrupt context when a scatter-gather DMA 384 * transfer of a videobuf_buffer completes. 385 */ 386static void omap24xxcam_vbq_complete(struct omap24xxcam_sgdma *sgdma, 387 u32 csr, void *arg) 388{ 389 struct omap24xxcam_device *cam = 390 container_of(sgdma, struct omap24xxcam_device, sgdma); 391 struct omap24xxcam_fh *fh = cam->streaming->private_data; 392 struct videobuf_buffer *vb = (struct videobuf_buffer *)arg; 393 const u32 csr_error = CAMDMA_CSR_MISALIGNED_ERR 394 | CAMDMA_CSR_SUPERVISOR_ERR | CAMDMA_CSR_SECURE_ERR 395 | CAMDMA_CSR_TRANS_ERR | CAMDMA_CSR_DROP; 396 unsigned long flags; 397 398 spin_lock_irqsave(&cam->core_enable_disable_lock, flags); 399 if (--cam->sgdma_in_queue == 0) 400 omap24xxcam_core_disable(cam); 401 spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags); 402 403 do_gettimeofday(&vb->ts); 404 vb->field_count = atomic_add_return(2, &fh->field_count); 405 if (csr & csr_error) { 406 vb->state = VIDEOBUF_ERROR; 407 if (!atomic_read(&fh->cam->in_reset)) { 408 dev_dbg(cam->dev, "resetting camera, csr 0x%x\n", csr); 409 omap24xxcam_reset(cam); 410 } 411 } else 412 vb->state = VIDEOBUF_DONE; 413 wake_up(&vb->done); 414} 415 416static void omap24xxcam_vbq_release(struct videobuf_queue *vbq, 417 struct videobuf_buffer *vb) 418{ 419 struct videobuf_dmabuf *dma = videobuf_to_dma(vb); 420 421 /* wait for buffer, especially to get out of the sgdma queue */ 422 videobuf_waiton(vb, 0, 0); 423 if (vb->memory == V4L2_MEMORY_MMAP) { 424 dma_unmap_sg(vbq->dev, dma->sglist, dma->sglen, 425 dma->direction); 426 dma->direction = DMA_NONE; 427 } else { 428 videobuf_dma_unmap(vbq, videobuf_to_dma(vb)); 429 videobuf_dma_free(videobuf_to_dma(vb)); 430 } 431 432 vb->state = VIDEOBUF_NEEDS_INIT; 433} 434 435/* 436 * Limit the number of available kernel image capture buffers based on the 437 * number requested, the currently selected image size, and the maximum 438 * amount of memory permitted for kernel capture buffers. 439 */ 440static int omap24xxcam_vbq_setup(struct videobuf_queue *vbq, unsigned int *cnt, 441 unsigned int *size) 442{ 443 struct omap24xxcam_fh *fh = vbq->priv_data; 444 445 if (*cnt <= 0) 446 *cnt = VIDEO_MAX_FRAME; /* supply a default number of buffers */ 447 448 if (*cnt > VIDEO_MAX_FRAME) 449 *cnt = VIDEO_MAX_FRAME; 450 451 *size = fh->pix.sizeimage; 452 453 /* accessing fh->cam->capture_mem is ok, it's constant */ 454 while (*size * *cnt > fh->cam->capture_mem) 455 (*cnt)--; 456 457 return 0; 458} 459 460static int omap24xxcam_dma_iolock(struct videobuf_queue *vbq, 461 struct videobuf_dmabuf *dma) 462{ 463 int err = 0; 464 465 dma->direction = PCI_DMA_FROMDEVICE; 466 if (!dma_map_sg(vbq->dev, dma->sglist, dma->sglen, dma->direction)) { 467 kfree(dma->sglist); 468 dma->sglist = NULL; 469 dma->sglen = 0; 470 err = -EIO; 471 } 472 473 return err; 474} 475 476static int omap24xxcam_vbq_prepare(struct videobuf_queue *vbq, 477 struct videobuf_buffer *vb, 478 enum v4l2_field field) 479{ 480 struct omap24xxcam_fh *fh = vbq->priv_data; 481 int err = 0; 482 483 /* 484 * Accessing pix here is okay since it's constant while 485 * streaming is on (and we only get called then). 486 */ 487 if (vb->baddr) { 488 /* This is a userspace buffer. */ 489 if (fh->pix.sizeimage > vb->bsize) { 490 /* The buffer isn't big enough. */ 491 err = -EINVAL; 492 } else 493 vb->size = fh->pix.sizeimage; 494 } else { 495 if (vb->state != VIDEOBUF_NEEDS_INIT) { 496 /* 497 * We have a kernel bounce buffer that has 498 * already been allocated. 499 */ 500 if (fh->pix.sizeimage > vb->size) { 501 /* 502 * The image size has been changed to 503 * a larger size since this buffer was 504 * allocated, so we need to free and 505 * reallocate it. 506 */ 507 omap24xxcam_vbq_release(vbq, vb); 508 vb->size = fh->pix.sizeimage; 509 } 510 } else { 511 /* We need to allocate a new kernel bounce buffer. */ 512 vb->size = fh->pix.sizeimage; 513 } 514 } 515 516 if (err) 517 return err; 518 519 vb->width = fh->pix.width; 520 vb->height = fh->pix.height; 521 vb->field = field; 522 523 if (vb->state == VIDEOBUF_NEEDS_INIT) { 524 if (vb->memory == V4L2_MEMORY_MMAP) 525 /* 526 * we have built the scatter-gather list by ourself so 527 * do the scatter-gather mapping as well 528 */ 529 err = omap24xxcam_dma_iolock(vbq, videobuf_to_dma(vb)); 530 else 531 err = videobuf_iolock(vbq, vb, NULL); 532 } 533 534 if (!err) 535 vb->state = VIDEOBUF_PREPARED; 536 else 537 omap24xxcam_vbq_release(vbq, vb); 538 539 return err; 540} 541 542static void omap24xxcam_vbq_queue(struct videobuf_queue *vbq, 543 struct videobuf_buffer *vb) 544{ 545 struct omap24xxcam_fh *fh = vbq->priv_data; 546 struct omap24xxcam_device *cam = fh->cam; 547 enum videobuf_state state = vb->state; 548 unsigned long flags; 549 int err; 550 551 /* 552 * FIXME: We're marking the buffer active since we have no 553 * pretty way of marking it active exactly when the 554 * scatter-gather transfer starts. 555 */ 556 vb->state = VIDEOBUF_ACTIVE; 557 558 err = omap24xxcam_sgdma_queue(&fh->cam->sgdma, 559 videobuf_to_dma(vb)->sglist, 560 videobuf_to_dma(vb)->sglen, vb->size, 561 omap24xxcam_vbq_complete, vb); 562 563 if (!err) { 564 spin_lock_irqsave(&cam->core_enable_disable_lock, flags); 565 if (++cam->sgdma_in_queue == 1 566 && !atomic_read(&cam->in_reset)) 567 omap24xxcam_core_enable(cam); 568 spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags); 569 } else { 570 /* 571 * Oops. We're not supposed to get any errors here. 572 * The only way we could get an error is if we ran out 573 * of scatter-gather DMA slots, but we are supposed to 574 * have at least as many scatter-gather DMA slots as 575 * video buffers so that can't happen. 576 */ 577 dev_err(cam->dev, "failed to queue a video buffer for dma!\n"); 578 dev_err(cam->dev, "likely a bug in the driver!\n"); 579 vb->state = state; 580 } 581} 582 583static struct videobuf_queue_ops omap24xxcam_vbq_ops = { 584 .buf_setup = omap24xxcam_vbq_setup, 585 .buf_prepare = omap24xxcam_vbq_prepare, 586 .buf_queue = omap24xxcam_vbq_queue, 587 .buf_release = omap24xxcam_vbq_release, 588}; 589 590/* 591 * 592 * OMAP main camera system 593 * 594 */ 595 596/* 597 * Reset camera block to power-on state. 598 */ 599static void omap24xxcam_poweron_reset(struct omap24xxcam_device *cam) 600{ 601 int max_loop = RESET_TIMEOUT_NS; 602 603 /* Reset whole camera subsystem */ 604 omap24xxcam_reg_out(cam->mmio_base, 605 CAM_SYSCONFIG, 606 CAM_SYSCONFIG_SOFTRESET); 607 608 /* Wait till it's finished */ 609 while (!(omap24xxcam_reg_in(cam->mmio_base, CAM_SYSSTATUS) 610 & CAM_SYSSTATUS_RESETDONE) 611 && --max_loop) { 612 ndelay(1); 613 } 614 615 if (!(omap24xxcam_reg_in(cam->mmio_base, CAM_SYSSTATUS) 616 & CAM_SYSSTATUS_RESETDONE)) 617 dev_err(cam->dev, "camera soft reset timeout\n"); 618} 619 620/* 621 * (Re)initialise the camera block. 622 */ 623static void omap24xxcam_hwinit(struct omap24xxcam_device *cam) 624{ 625 omap24xxcam_poweron_reset(cam); 626 627 /* set the camera subsystem autoidle bit */ 628 omap24xxcam_reg_out(cam->mmio_base, CAM_SYSCONFIG, 629 CAM_SYSCONFIG_AUTOIDLE); 630 631 /* set the camera MMU autoidle bit */ 632 omap24xxcam_reg_out(cam->mmio_base, 633 CAMMMU_REG_OFFSET + CAMMMU_SYSCONFIG, 634 CAMMMU_SYSCONFIG_AUTOIDLE); 635 636 omap24xxcam_core_hwinit(cam); 637 638 omap24xxcam_dma_hwinit(&cam->sgdma.dma); 639} 640 641/* 642 * Callback for dma transfer stalling. 643 */ 644static void omap24xxcam_stalled_dma_reset(unsigned long data) 645{ 646 struct omap24xxcam_device *cam = (struct omap24xxcam_device *)data; 647 648 if (!atomic_read(&cam->in_reset)) { 649 dev_dbg(cam->dev, "dma stalled, resetting camera\n"); 650 omap24xxcam_reset(cam); 651 } 652} 653 654/* 655 * Stop capture. Mark we're doing a reset, stop DMA transfers and 656 * core. (No new scatter-gather transfers will be queued whilst 657 * in_reset is non-zero.) 658 * 659 * If omap24xxcam_capture_stop is called from several places at 660 * once, only the first call will have an effect. Similarly, the last 661 * call omap24xxcam_streaming_cont will have effect. 662 * 663 * Serialisation is ensured by using cam->core_enable_disable_lock. 664 */ 665static void omap24xxcam_capture_stop(struct omap24xxcam_device *cam) 666{ 667 unsigned long flags; 668 669 spin_lock_irqsave(&cam->core_enable_disable_lock, flags); 670 671 if (atomic_inc_return(&cam->in_reset) != 1) { 672 spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags); 673 return; 674 } 675 676 omap24xxcam_core_disable(cam); 677 678 spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags); 679 680 omap24xxcam_sgdma_sync(&cam->sgdma); 681} 682 683/* 684 * Reset and continue streaming. 685 * 686 * Note: Resetting the camera FIFO via the CC_RST bit in the CC_CTRL 687 * register is supposed to be sufficient to recover from a camera 688 * interface error, but it doesn't seem to be enough. If we only do 689 * that then subsequent image captures are out of sync by either one 690 * or two times DMA_THRESHOLD bytes. Resetting and re-initializing the 691 * entire camera subsystem prevents the problem with frame 692 * synchronization. 693 */ 694static void omap24xxcam_capture_cont(struct omap24xxcam_device *cam) 695{ 696 unsigned long flags; 697 698 spin_lock_irqsave(&cam->core_enable_disable_lock, flags); 699 700 if (atomic_read(&cam->in_reset) != 1) 701 goto out; 702 703 omap24xxcam_hwinit(cam); 704 705 omap24xxcam_sensor_if_enable(cam); 706 707 omap24xxcam_sgdma_process(&cam->sgdma); 708 709 if (cam->sgdma_in_queue) 710 omap24xxcam_core_enable(cam); 711 712out: 713 atomic_dec(&cam->in_reset); 714 spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags); 715} 716 717static ssize_t 718omap24xxcam_streaming_show(struct device *dev, struct device_attribute *attr, 719 char *buf) 720{ 721 struct omap24xxcam_device *cam = dev_get_drvdata(dev); 722 723 return sprintf(buf, "%s\n", cam->streaming ? "active" : "inactive"); 724} 725static DEVICE_ATTR(streaming, S_IRUGO, omap24xxcam_streaming_show, NULL); 726 727/* 728 * Stop capture and restart it. I.e. reset the camera during use. 729 */ 730static void omap24xxcam_reset(struct omap24xxcam_device *cam) 731{ 732 omap24xxcam_capture_stop(cam); 733 omap24xxcam_capture_cont(cam); 734} 735 736/* 737 * The main interrupt handler. 738 */ 739static irqreturn_t omap24xxcam_isr(int irq, void *arg) 740{ 741 struct omap24xxcam_device *cam = (struct omap24xxcam_device *)arg; 742 u32 irqstatus; 743 unsigned int irqhandled = 0; 744 745 irqstatus = omap24xxcam_reg_in(cam->mmio_base, CAM_IRQSTATUS); 746 747 if (irqstatus & 748 (CAM_IRQSTATUS_DMA_IRQ2 | CAM_IRQSTATUS_DMA_IRQ1 749 | CAM_IRQSTATUS_DMA_IRQ0)) { 750 omap24xxcam_dma_isr(&cam->sgdma.dma); 751 irqhandled = 1; 752 } 753 if (irqstatus & CAM_IRQSTATUS_CC_IRQ) { 754 omap24xxcam_core_isr(cam); 755 irqhandled = 1; 756 } 757 if (irqstatus & CAM_IRQSTATUS_MMU_IRQ) 758 dev_err(cam->dev, "unhandled camera MMU interrupt!\n"); 759 760 return IRQ_RETVAL(irqhandled); 761} 762 763/* 764 * 765 * Sensor handling. 766 * 767 */ 768 769/* 770 * Enable the external sensor interface. Try to negotiate interface 771 * parameters with the sensor and start using the new ones. The calls 772 * to sensor_if_enable and sensor_if_disable need not to be balanced. 773 */ 774static int omap24xxcam_sensor_if_enable(struct omap24xxcam_device *cam) 775{ 776 int rval; 777 struct v4l2_ifparm p; 778 779 rval = vidioc_int_g_ifparm(cam->sdev, &p); 780 if (rval) { 781 dev_err(cam->dev, "vidioc_int_g_ifparm failed with %d\n", rval); 782 return rval; 783 } 784 785 cam->if_type = p.if_type; 786 787 cam->cc_ctrl = CC_CTRL_CC_EN; 788 789 switch (p.if_type) { 790 case V4L2_IF_TYPE_BT656: 791 if (p.u.bt656.frame_start_on_rising_vs) 792 cam->cc_ctrl |= CC_CTRL_NOBT_SYNCHRO; 793 if (p.u.bt656.bt_sync_correct) 794 cam->cc_ctrl |= CC_CTRL_BT_CORRECT; 795 if (p.u.bt656.swap) 796 cam->cc_ctrl |= CC_CTRL_PAR_ORDERCAM; 797 if (p.u.bt656.latch_clk_inv) 798 cam->cc_ctrl |= CC_CTRL_PAR_CLK_POL; 799 if (p.u.bt656.nobt_hs_inv) 800 cam->cc_ctrl |= CC_CTRL_NOBT_HS_POL; 801 if (p.u.bt656.nobt_vs_inv) 802 cam->cc_ctrl |= CC_CTRL_NOBT_VS_POL; 803 804 switch (p.u.bt656.mode) { 805 case V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT: 806 cam->cc_ctrl |= CC_CTRL_PAR_MODE_NOBT8; 807 break; 808 case V4L2_IF_TYPE_BT656_MODE_NOBT_10BIT: 809 cam->cc_ctrl |= CC_CTRL_PAR_MODE_NOBT10; 810 break; 811 case V4L2_IF_TYPE_BT656_MODE_NOBT_12BIT: 812 cam->cc_ctrl |= CC_CTRL_PAR_MODE_NOBT12; 813 break; 814 case V4L2_IF_TYPE_BT656_MODE_BT_8BIT: 815 cam->cc_ctrl |= CC_CTRL_PAR_MODE_BT8; 816 break; 817 case V4L2_IF_TYPE_BT656_MODE_BT_10BIT: 818 cam->cc_ctrl |= CC_CTRL_PAR_MODE_BT10; 819 break; 820 default: 821 dev_err(cam->dev, 822 "bt656 interface mode %d not supported\n", 823 p.u.bt656.mode); 824 return -EINVAL; 825 } 826 /* 827 * The clock rate that the sensor wants has changed. 828 * We have to adjust the xclk from OMAP 2 side to 829 * match the sensor's wish as closely as possible. 830 */ 831 if (p.u.bt656.clock_curr != cam->if_u.bt656.xclk) { 832 u32 xclk = p.u.bt656.clock_curr; 833 u32 divisor; 834 835 if (xclk == 0) 836 return -EINVAL; 837 838 if (xclk > CAM_MCLK) 839 xclk = CAM_MCLK; 840 841 divisor = CAM_MCLK / xclk; 842 if (divisor * xclk < CAM_MCLK) 843 divisor++; 844 if (CAM_MCLK / divisor < p.u.bt656.clock_min 845 && divisor > 1) 846 divisor--; 847 if (divisor > 30) 848 divisor = 30; 849 850 xclk = CAM_MCLK / divisor; 851 852 if (xclk < p.u.bt656.clock_min 853 || xclk > p.u.bt656.clock_max) 854 return -EINVAL; 855 856 cam->if_u.bt656.xclk = xclk; 857 } 858 omap24xxcam_core_xclk_set(cam, cam->if_u.bt656.xclk); 859 break; 860 default: 861 /* FIXME: how about other interfaces? */ 862 dev_err(cam->dev, "interface type %d not supported\n", 863 p.if_type); 864 return -EINVAL; 865 } 866 867 return 0; 868} 869 870static void omap24xxcam_sensor_if_disable(const struct omap24xxcam_device *cam) 871{ 872 switch (cam->if_type) { 873 case V4L2_IF_TYPE_BT656: 874 omap24xxcam_core_xclk_set(cam, 0); 875 break; 876 } 877} 878 879/* 880 * Initialise the sensor hardware. 881 */ 882static int omap24xxcam_sensor_init(struct omap24xxcam_device *cam) 883{ 884 int err = 0; 885 struct v4l2_int_device *sdev = cam->sdev; 886 887 omap24xxcam_clock_on(cam); 888 err = omap24xxcam_sensor_if_enable(cam); 889 if (err) { 890 dev_err(cam->dev, "sensor interface could not be enabled at " 891 "initialisation, %d\n", err); 892 cam->sdev = NULL; 893 goto out; 894 } 895 896 /* power up sensor during sensor initialization */ 897 vidioc_int_s_power(sdev, 1); 898 899 err = vidioc_int_dev_init(sdev); 900 if (err) { 901 dev_err(cam->dev, "cannot initialize sensor, error %d\n", err); 902 /* Sensor init failed --- it's nonexistent to us! */ 903 cam->sdev = NULL; 904 goto out; 905 } 906 907 dev_info(cam->dev, "sensor is %s\n", sdev->name); 908 909out: 910 omap24xxcam_sensor_if_disable(cam); 911 omap24xxcam_clock_off(cam); 912 913 vidioc_int_s_power(sdev, 0); 914 915 return err; 916} 917 918static void omap24xxcam_sensor_exit(struct omap24xxcam_device *cam) 919{ 920 if (cam->sdev) 921 vidioc_int_dev_exit(cam->sdev); 922} 923 924static void omap24xxcam_sensor_disable(struct omap24xxcam_device *cam) 925{ 926 omap24xxcam_sensor_if_disable(cam); 927 omap24xxcam_clock_off(cam); 928 vidioc_int_s_power(cam->sdev, 0); 929} 930 931/* 932 * Power-up and configure camera sensor. It's ready for capturing now. 933 */ 934static int omap24xxcam_sensor_enable(struct omap24xxcam_device *cam) 935{ 936 int rval; 937 938 omap24xxcam_clock_on(cam); 939 940 omap24xxcam_sensor_if_enable(cam); 941 942 rval = vidioc_int_s_power(cam->sdev, 1); 943 if (rval) 944 goto out; 945 946 rval = vidioc_int_init(cam->sdev); 947 if (rval) 948 goto out; 949 950 return 0; 951 952out: 953 omap24xxcam_sensor_disable(cam); 954 955 return rval; 956} 957 958static void omap24xxcam_sensor_reset_work(struct work_struct *work) 959{ 960 struct omap24xxcam_device *cam = 961 container_of(work, struct omap24xxcam_device, 962 sensor_reset_work); 963 964 if (atomic_read(&cam->reset_disable)) 965 return; 966 967 omap24xxcam_capture_stop(cam); 968 969 if (vidioc_int_reset(cam->sdev) == 0) { 970 vidioc_int_init(cam->sdev); 971 } else { 972 /* Can't reset it by vidioc_int_reset. */ 973 omap24xxcam_sensor_disable(cam); 974 omap24xxcam_sensor_enable(cam); 975 } 976 977 omap24xxcam_capture_cont(cam); 978} 979 980/* 981 * 982 * IOCTL interface. 983 * 984 */ 985 986static int vidioc_querycap(struct file *file, void *fh, 987 struct v4l2_capability *cap) 988{ 989 struct omap24xxcam_fh *ofh = fh; 990 struct omap24xxcam_device *cam = ofh->cam; 991 992 strlcpy(cap->driver, CAM_NAME, sizeof(cap->driver)); 993 strlcpy(cap->card, cam->vfd->name, sizeof(cap->card)); 994 cap->version = OMAP24XXCAM_VERSION; 995 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; 996 997 return 0; 998} 999 1000static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh, 1001 struct v4l2_fmtdesc *f) 1002{ 1003 struct omap24xxcam_fh *ofh = fh; 1004 struct omap24xxcam_device *cam = ofh->cam; 1005 int rval; 1006 1007 rval = vidioc_int_enum_fmt_cap(cam->sdev, f); 1008 1009 return rval; 1010} 1011 1012static int vidioc_g_fmt_vid_cap(struct file *file, void *fh, 1013 struct v4l2_format *f) 1014{ 1015 struct omap24xxcam_fh *ofh = fh; 1016 struct omap24xxcam_device *cam = ofh->cam; 1017 int rval; 1018 1019 mutex_lock(&cam->mutex); 1020 rval = vidioc_int_g_fmt_cap(cam->sdev, f); 1021 mutex_unlock(&cam->mutex); 1022 1023 return rval; 1024} 1025 1026static int vidioc_s_fmt_vid_cap(struct file *file, void *fh, 1027 struct v4l2_format *f) 1028{ 1029 struct omap24xxcam_fh *ofh = fh; 1030 struct omap24xxcam_device *cam = ofh->cam; 1031 int rval; 1032 1033 mutex_lock(&cam->mutex); 1034 if (cam->streaming) { 1035 rval = -EBUSY; 1036 goto out; 1037 } 1038 1039 rval = vidioc_int_s_fmt_cap(cam->sdev, f); 1040 1041out: 1042 mutex_unlock(&cam->mutex); 1043 1044 if (!rval) { 1045 mutex_lock(&ofh->vbq.vb_lock); 1046 ofh->pix = f->fmt.pix; 1047 mutex_unlock(&ofh->vbq.vb_lock); 1048 } 1049 1050 memset(f, 0, sizeof(*f)); 1051 vidioc_g_fmt_vid_cap(file, fh, f); 1052 1053 return rval; 1054} 1055 1056static int vidioc_try_fmt_vid_cap(struct file *file, void *fh, 1057 struct v4l2_format *f) 1058{ 1059 struct omap24xxcam_fh *ofh = fh; 1060 struct omap24xxcam_device *cam = ofh->cam; 1061 int rval; 1062 1063 mutex_lock(&cam->mutex); 1064 rval = vidioc_int_try_fmt_cap(cam->sdev, f); 1065 mutex_unlock(&cam->mutex); 1066 1067 return rval; 1068} 1069 1070static int vidioc_reqbufs(struct file *file, void *fh, 1071 struct v4l2_requestbuffers *b) 1072{ 1073 struct omap24xxcam_fh *ofh = fh; 1074 struct omap24xxcam_device *cam = ofh->cam; 1075 int rval; 1076 1077 mutex_lock(&cam->mutex); 1078 if (cam->streaming) { 1079 mutex_unlock(&cam->mutex); 1080 return -EBUSY; 1081 } 1082 1083 omap24xxcam_vbq_free_mmap_buffers(&ofh->vbq); 1084 mutex_unlock(&cam->mutex); 1085 1086 rval = videobuf_reqbufs(&ofh->vbq, b); 1087 1088 /* 1089 * Either videobuf_reqbufs failed or the buffers are not 1090 * memory-mapped (which would need special attention). 1091 */ 1092 if (rval < 0 || b->memory != V4L2_MEMORY_MMAP) 1093 goto out; 1094 1095 rval = omap24xxcam_vbq_alloc_mmap_buffers(&ofh->vbq, rval); 1096 if (rval) 1097 omap24xxcam_vbq_free_mmap_buffers(&ofh->vbq); 1098 1099out: 1100 return rval; 1101} 1102 1103static int vidioc_querybuf(struct file *file, void *fh, 1104 struct v4l2_buffer *b) 1105{ 1106 struct omap24xxcam_fh *ofh = fh; 1107 1108 return videobuf_querybuf(&ofh->vbq, b); 1109} 1110 1111static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *b) 1112{ 1113 struct omap24xxcam_fh *ofh = fh; 1114 1115 return videobuf_qbuf(&ofh->vbq, b); 1116} 1117 1118static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) 1119{ 1120 struct omap24xxcam_fh *ofh = fh; 1121 struct omap24xxcam_device *cam = ofh->cam; 1122 struct videobuf_buffer *vb; 1123 int rval; 1124 1125videobuf_dqbuf_again: 1126 rval = videobuf_dqbuf(&ofh->vbq, b, file->f_flags & O_NONBLOCK); 1127 if (rval) 1128 goto out; 1129 1130 vb = ofh->vbq.bufs[b->index]; 1131 1132 mutex_lock(&cam->mutex); 1133 /* _needs_reset returns -EIO if reset is required. */ 1134 rval = vidioc_int_g_needs_reset(cam->sdev, (void *)vb->baddr); 1135 mutex_unlock(&cam->mutex); 1136 if (rval == -EIO) 1137 schedule_work(&cam->sensor_reset_work); 1138 else 1139 rval = 0; 1140 1141out: 1142 /* 1143 * This is a hack. We don't want to show -EIO to the user 1144 * space. Requeue the buffer and try again if we're not doing 1145 * this in non-blocking mode. 1146 */ 1147 if (rval == -EIO) { 1148 videobuf_qbuf(&ofh->vbq, b); 1149 if (!(file->f_flags & O_NONBLOCK)) 1150 goto videobuf_dqbuf_again; 1151 /* 1152 * We don't have a videobuf_buffer now --- maybe next 1153 * time... 1154 */ 1155 rval = -EAGAIN; 1156 } 1157 1158 return rval; 1159} 1160 1161static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i) 1162{ 1163 struct omap24xxcam_fh *ofh = fh; 1164 struct omap24xxcam_device *cam = ofh->cam; 1165 int rval; 1166 1167 mutex_lock(&cam->mutex); 1168 if (cam->streaming) { 1169 rval = -EBUSY; 1170 goto out; 1171 } 1172 1173 rval = omap24xxcam_sensor_if_enable(cam); 1174 if (rval) { 1175 dev_dbg(cam->dev, "vidioc_int_g_ifparm failed\n"); 1176 goto out; 1177 } 1178 1179 rval = videobuf_streamon(&ofh->vbq); 1180 if (!rval) { 1181 cam->streaming = file; 1182 sysfs_notify(&cam->dev->kobj, NULL, "streaming"); 1183 } 1184 1185out: 1186 mutex_unlock(&cam->mutex); 1187 1188 return rval; 1189} 1190 1191static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i) 1192{ 1193 struct omap24xxcam_fh *ofh = fh; 1194 struct omap24xxcam_device *cam = ofh->cam; 1195 struct videobuf_queue *q = &ofh->vbq; 1196 int rval; 1197 1198 atomic_inc(&cam->reset_disable); 1199 1200 flush_scheduled_work(); 1201 1202 rval = videobuf_streamoff(q); 1203 if (!rval) { 1204 mutex_lock(&cam->mutex); 1205 cam->streaming = NULL; 1206 mutex_unlock(&cam->mutex); 1207 sysfs_notify(&cam->dev->kobj, NULL, "streaming"); 1208 } 1209 1210 atomic_dec(&cam->reset_disable); 1211 1212 return rval; 1213} 1214 1215static int vidioc_enum_input(struct file *file, void *fh, 1216 struct v4l2_input *inp) 1217{ 1218 if (inp->index > 0) 1219 return -EINVAL; 1220 1221 strlcpy(inp->name, "camera", sizeof(inp->name)); 1222 inp->type = V4L2_INPUT_TYPE_CAMERA; 1223 1224 return 0; 1225} 1226 1227static int vidioc_g_input(struct file *file, void *fh, unsigned int *i) 1228{ 1229 *i = 0; 1230 1231 return 0; 1232} 1233 1234static int vidioc_s_input(struct file *file, void *fh, unsigned int i) 1235{ 1236 if (i > 0) 1237 return -EINVAL; 1238 1239 return 0; 1240} 1241 1242static int vidioc_queryctrl(struct file *file, void *fh, 1243 struct v4l2_queryctrl *a) 1244{ 1245 struct omap24xxcam_fh *ofh = fh; 1246 struct omap24xxcam_device *cam = ofh->cam; 1247 int rval; 1248 1249 rval = vidioc_int_queryctrl(cam->sdev, a); 1250 1251 return rval; 1252} 1253 1254static int vidioc_g_ctrl(struct file *file, void *fh, 1255 struct v4l2_control *a) 1256{ 1257 struct omap24xxcam_fh *ofh = fh; 1258 struct omap24xxcam_device *cam = ofh->cam; 1259 int rval; 1260 1261 mutex_lock(&cam->mutex); 1262 rval = vidioc_int_g_ctrl(cam->sdev, a); 1263 mutex_unlock(&cam->mutex); 1264 1265 return rval; 1266} 1267 1268static int vidioc_s_ctrl(struct file *file, void *fh, 1269 struct v4l2_control *a) 1270{ 1271 struct omap24xxcam_fh *ofh = fh; 1272 struct omap24xxcam_device *cam = ofh->cam; 1273 int rval; 1274 1275 mutex_lock(&cam->mutex); 1276 rval = vidioc_int_s_ctrl(cam->sdev, a); 1277 mutex_unlock(&cam->mutex); 1278 1279 return rval; 1280} 1281 1282static int vidioc_g_parm(struct file *file, void *fh, 1283 struct v4l2_streamparm *a) { 1284 struct omap24xxcam_fh *ofh = fh; 1285 struct omap24xxcam_device *cam = ofh->cam; 1286 int rval; 1287 1288 mutex_lock(&cam->mutex); 1289 rval = vidioc_int_g_parm(cam->sdev, a); 1290 mutex_unlock(&cam->mutex); 1291 1292 return rval; 1293} 1294 1295static int vidioc_s_parm(struct file *file, void *fh, 1296 struct v4l2_streamparm *a) 1297{ 1298 struct omap24xxcam_fh *ofh = fh; 1299 struct omap24xxcam_device *cam = ofh->cam; 1300 struct v4l2_streamparm old_streamparm; 1301 int rval; 1302 1303 mutex_lock(&cam->mutex); 1304 if (cam->streaming) { 1305 rval = -EBUSY; 1306 goto out; 1307 } 1308 1309 old_streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 1310 rval = vidioc_int_g_parm(cam->sdev, &old_streamparm); 1311 if (rval) 1312 goto out; 1313 1314 rval = vidioc_int_s_parm(cam->sdev, a); 1315 if (rval) 1316 goto out; 1317 1318 rval = omap24xxcam_sensor_if_enable(cam); 1319 /* 1320 * Revert to old streaming parameters if enabling sensor 1321 * interface with the new ones failed. 1322 */ 1323 if (rval) 1324 vidioc_int_s_parm(cam->sdev, &old_streamparm); 1325 1326out: 1327 mutex_unlock(&cam->mutex); 1328 1329 return rval; 1330} 1331 1332/* 1333 * 1334 * File operations. 1335 * 1336 */ 1337 1338static unsigned int omap24xxcam_poll(struct file *file, 1339 struct poll_table_struct *wait) 1340{ 1341 struct omap24xxcam_fh *fh = file->private_data; 1342 struct omap24xxcam_device *cam = fh->cam; 1343 struct videobuf_buffer *vb; 1344 1345 mutex_lock(&cam->mutex); 1346 if (cam->streaming != file) { 1347 mutex_unlock(&cam->mutex); 1348 return POLLERR; 1349 } 1350 mutex_unlock(&cam->mutex); 1351 1352 mutex_lock(&fh->vbq.vb_lock); 1353 if (list_empty(&fh->vbq.stream)) { 1354 mutex_unlock(&fh->vbq.vb_lock); 1355 return POLLERR; 1356 } 1357 vb = list_entry(fh->vbq.stream.next, struct videobuf_buffer, stream); 1358 mutex_unlock(&fh->vbq.vb_lock); 1359 1360 poll_wait(file, &vb->done, wait); 1361 1362 if (vb->state == VIDEOBUF_DONE || vb->state == VIDEOBUF_ERROR) 1363 return POLLIN | POLLRDNORM; 1364 1365 return 0; 1366} 1367 1368static int omap24xxcam_mmap_buffers(struct file *file, 1369 struct vm_area_struct *vma) 1370{ 1371 struct omap24xxcam_fh *fh = file->private_data; 1372 struct omap24xxcam_device *cam = fh->cam; 1373 struct videobuf_queue *vbq = &fh->vbq; 1374 unsigned int first, last, size, i, j; 1375 int err = 0; 1376 1377 mutex_lock(&cam->mutex); 1378 if (cam->streaming) { 1379 mutex_unlock(&cam->mutex); 1380 return -EBUSY; 1381 } 1382 mutex_unlock(&cam->mutex); 1383 mutex_lock(&vbq->vb_lock); 1384 1385 /* look for first buffer to map */ 1386 for (first = 0; first < VIDEO_MAX_FRAME; first++) { 1387 if (NULL == vbq->bufs[first]) 1388 continue; 1389 if (V4L2_MEMORY_MMAP != vbq->bufs[first]->memory) 1390 continue; 1391 if (vbq->bufs[first]->boff == (vma->vm_pgoff << PAGE_SHIFT)) 1392 break; 1393 } 1394 1395 /* look for last buffer to map */ 1396 for (size = 0, last = first; last < VIDEO_MAX_FRAME; last++) { 1397 if (NULL == vbq->bufs[last]) 1398 continue; 1399 if (V4L2_MEMORY_MMAP != vbq->bufs[last]->memory) 1400 continue; 1401 size += vbq->bufs[last]->bsize; 1402 if (size == (vma->vm_end - vma->vm_start)) 1403 break; 1404 } 1405 1406 size = 0; 1407 for (i = first; i <= last; i++) { 1408 struct videobuf_dmabuf *dma = videobuf_to_dma(vbq->bufs[i]); 1409 1410 for (j = 0; j < dma->sglen; j++) { 1411 err = remap_pfn_range( 1412 vma, vma->vm_start + size, 1413 page_to_pfn(sg_page(&dma->sglist[j])), 1414 sg_dma_len(&dma->sglist[j]), vma->vm_page_prot); 1415 if (err) 1416 goto out; 1417 size += sg_dma_len(&dma->sglist[j]); 1418 } 1419 } 1420 1421out: 1422 mutex_unlock(&vbq->vb_lock); 1423 1424 return err; 1425} 1426 1427static int omap24xxcam_mmap(struct file *file, struct vm_area_struct *vma) 1428{ 1429 struct omap24xxcam_fh *fh = file->private_data; 1430 int rval; 1431 1432 /* let the video-buf mapper check arguments and set-up structures */ 1433 rval = videobuf_mmap_mapper(&fh->vbq, vma); 1434 if (rval) 1435 return rval; 1436 1437 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 1438 1439 /* do mapping to our allocated buffers */ 1440 rval = omap24xxcam_mmap_buffers(file, vma); 1441 /* 1442 * In case of error, free vma->vm_private_data allocated by 1443 * videobuf_mmap_mapper. 1444 */ 1445 if (rval) 1446 kfree(vma->vm_private_data); 1447 1448 return rval; 1449} 1450 1451static int omap24xxcam_open(struct file *file) 1452{ 1453 int minor = video_devdata(file)->minor; 1454 struct omap24xxcam_device *cam = omap24xxcam.priv; 1455 struct omap24xxcam_fh *fh; 1456 struct v4l2_format format; 1457 1458 if (!cam || !cam->vfd || (cam->vfd->minor != minor)) 1459 return -ENODEV; 1460 1461 fh = kzalloc(sizeof(*fh), GFP_KERNEL); 1462 if (fh == NULL) 1463 return -ENOMEM; 1464 1465 mutex_lock(&cam->mutex); 1466 if (cam->sdev == NULL || !try_module_get(cam->sdev->module)) { 1467 mutex_unlock(&cam->mutex); 1468 goto out_try_module_get; 1469 } 1470 1471 if (atomic_inc_return(&cam->users) == 1) { 1472 omap24xxcam_hwinit(cam); 1473 if (omap24xxcam_sensor_enable(cam)) { 1474 mutex_unlock(&cam->mutex); 1475 goto out_omap24xxcam_sensor_enable; 1476 } 1477 } 1478 mutex_unlock(&cam->mutex); 1479 1480 fh->cam = cam; 1481 mutex_lock(&cam->mutex); 1482 vidioc_int_g_fmt_cap(cam->sdev, &format); 1483 mutex_unlock(&cam->mutex); 1484 /* FIXME: how about fh->pix when there are more users? */ 1485 fh->pix = format.fmt.pix; 1486 1487 file->private_data = fh; 1488 1489 spin_lock_init(&fh->vbq_lock); 1490 1491 videobuf_queue_sg_init(&fh->vbq, &omap24xxcam_vbq_ops, NULL, 1492 &fh->vbq_lock, V4L2_BUF_TYPE_VIDEO_CAPTURE, 1493 V4L2_FIELD_NONE, 1494 sizeof(struct videobuf_buffer), fh); 1495 1496 return 0; 1497 1498out_omap24xxcam_sensor_enable: 1499 omap24xxcam_poweron_reset(cam); 1500 module_put(cam->sdev->module); 1501 1502out_try_module_get: 1503 kfree(fh); 1504 1505 return -ENODEV; 1506} 1507 1508static int omap24xxcam_release(struct file *file) 1509{ 1510 struct omap24xxcam_fh *fh = file->private_data; 1511 struct omap24xxcam_device *cam = fh->cam; 1512 1513 atomic_inc(&cam->reset_disable); 1514 1515 flush_scheduled_work(); 1516 1517 /* stop streaming capture */ 1518 videobuf_streamoff(&fh->vbq); 1519 1520 mutex_lock(&cam->mutex); 1521 if (cam->streaming == file) { 1522 cam->streaming = NULL; 1523 mutex_unlock(&cam->mutex); 1524 sysfs_notify(&cam->dev->kobj, NULL, "streaming"); 1525 } else { 1526 mutex_unlock(&cam->mutex); 1527 } 1528 1529 atomic_dec(&cam->reset_disable); 1530 1531 omap24xxcam_vbq_free_mmap_buffers(&fh->vbq); 1532 1533 /* 1534 * Make sure the reset work we might have scheduled is not 1535 * pending! It may be run *only* if we have users. (And it may 1536 * not be scheduled anymore since streaming is already 1537 * disabled.) 1538 */ 1539 flush_scheduled_work(); 1540 1541 mutex_lock(&cam->mutex); 1542 if (atomic_dec_return(&cam->users) == 0) { 1543 omap24xxcam_sensor_disable(cam); 1544 omap24xxcam_poweron_reset(cam); 1545 } 1546 mutex_unlock(&cam->mutex); 1547 1548 file->private_data = NULL; 1549 1550 module_put(cam->sdev->module); 1551 kfree(fh); 1552 1553 return 0; 1554} 1555 1556static struct v4l2_file_operations omap24xxcam_fops = { 1557 .ioctl = video_ioctl2, 1558 .poll = omap24xxcam_poll, 1559 .mmap = omap24xxcam_mmap, 1560 .open = omap24xxcam_open, 1561 .release = omap24xxcam_release, 1562}; 1563 1564/* 1565 * 1566 * Power management. 1567 * 1568 */ 1569 1570#ifdef CONFIG_PM 1571static int omap24xxcam_suspend(struct platform_device *pdev, pm_message_t state) 1572{ 1573 struct omap24xxcam_device *cam = platform_get_drvdata(pdev); 1574 1575 if (atomic_read(&cam->users) == 0) 1576 return 0; 1577 1578 if (!atomic_read(&cam->reset_disable)) 1579 omap24xxcam_capture_stop(cam); 1580 1581 omap24xxcam_sensor_disable(cam); 1582 omap24xxcam_poweron_reset(cam); 1583 1584 return 0; 1585} 1586 1587static int omap24xxcam_resume(struct platform_device *pdev) 1588{ 1589 struct omap24xxcam_device *cam = platform_get_drvdata(pdev); 1590 1591 if (atomic_read(&cam->users) == 0) 1592 return 0; 1593 1594 omap24xxcam_hwinit(cam); 1595 omap24xxcam_sensor_enable(cam); 1596 1597 if (!atomic_read(&cam->reset_disable)) 1598 omap24xxcam_capture_cont(cam); 1599 1600 return 0; 1601} 1602#endif /* CONFIG_PM */ 1603 1604static const struct v4l2_ioctl_ops omap24xxcam_ioctl_fops = { 1605 .vidioc_querycap = vidioc_querycap, 1606 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, 1607 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, 1608 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap, 1609 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, 1610 .vidioc_reqbufs = vidioc_reqbufs, 1611 .vidioc_querybuf = vidioc_querybuf, 1612 .vidioc_qbuf = vidioc_qbuf, 1613 .vidioc_dqbuf = vidioc_dqbuf, 1614 .vidioc_streamon = vidioc_streamon, 1615 .vidioc_streamoff = vidioc_streamoff, 1616 .vidioc_enum_input = vidioc_enum_input, 1617 .vidioc_g_input = vidioc_g_input, 1618 .vidioc_s_input = vidioc_s_input, 1619 .vidioc_queryctrl = vidioc_queryctrl, 1620 .vidioc_g_ctrl = vidioc_g_ctrl, 1621 .vidioc_s_ctrl = vidioc_s_ctrl, 1622 .vidioc_g_parm = vidioc_g_parm, 1623 .vidioc_s_parm = vidioc_s_parm, 1624}; 1625 1626/* 1627 * 1628 * Camera device (i.e. /dev/video). 1629 * 1630 */ 1631 1632static int omap24xxcam_device_register(struct v4l2_int_device *s) 1633{ 1634 struct omap24xxcam_device *cam = s->u.slave->master->priv; 1635 struct video_device *vfd; 1636 int rval; 1637 1638 /* We already have a slave. */ 1639 if (cam->sdev) 1640 return -EBUSY; 1641 1642 cam->sdev = s; 1643 1644 if (device_create_file(cam->dev, &dev_attr_streaming) != 0) { 1645 dev_err(cam->dev, "could not register sysfs entry\n"); 1646 rval = -EBUSY; 1647 goto err; 1648 } 1649 1650 /* initialize the video_device struct */ 1651 vfd = cam->vfd = video_device_alloc(); 1652 if (!vfd) { 1653 dev_err(cam->dev, "could not allocate video device struct\n"); 1654 rval = -ENOMEM; 1655 goto err; 1656 } 1657 vfd->release = video_device_release; 1658 1659 vfd->parent = cam->dev; 1660 1661 strlcpy(vfd->name, CAM_NAME, sizeof(vfd->name)); 1662 vfd->fops = &omap24xxcam_fops; 1663 vfd->minor = -1; 1664 vfd->ioctl_ops = &omap24xxcam_ioctl_fops; 1665 1666 omap24xxcam_hwinit(cam); 1667 1668 rval = omap24xxcam_sensor_init(cam); 1669 if (rval) 1670 goto err; 1671 1672 if (video_register_device(vfd, VFL_TYPE_GRABBER, video_nr) < 0) { 1673 dev_err(cam->dev, "could not register V4L device\n"); 1674 vfd->minor = -1; 1675 rval = -EBUSY; 1676 goto err; 1677 } 1678 1679 omap24xxcam_poweron_reset(cam); 1680 1681 dev_info(cam->dev, "registered device video%d\n", vfd->minor); 1682 1683 return 0; 1684 1685err: 1686 omap24xxcam_device_unregister(s); 1687 1688 return rval; 1689} 1690 1691static void omap24xxcam_device_unregister(struct v4l2_int_device *s) 1692{ 1693 struct omap24xxcam_device *cam = s->u.slave->master->priv; 1694 1695 omap24xxcam_sensor_exit(cam); 1696 1697 if (cam->vfd) { 1698 if (cam->vfd->minor == -1) { 1699 /* 1700 * The device was never registered, so release the 1701 * video_device struct directly. 1702 */ 1703 video_device_release(cam->vfd); 1704 } else { 1705 /* 1706 * The unregister function will release the 1707 * video_device struct as well as 1708 * unregistering it. 1709 */ 1710 video_unregister_device(cam->vfd); 1711 } 1712 cam->vfd = NULL; 1713 } 1714 1715 device_remove_file(cam->dev, &dev_attr_streaming); 1716 1717 cam->sdev = NULL; 1718} 1719 1720static struct v4l2_int_master omap24xxcam_master = { 1721 .attach = omap24xxcam_device_register, 1722 .detach = omap24xxcam_device_unregister, 1723}; 1724 1725static struct v4l2_int_device omap24xxcam = { 1726 .module = THIS_MODULE, 1727 .name = CAM_NAME, 1728 .type = v4l2_int_type_master, 1729 .u = { 1730 .master = &omap24xxcam_master 1731 }, 1732}; 1733 1734/* 1735 * 1736 * Driver initialisation and deinitialisation. 1737 * 1738 */ 1739 1740static int __init omap24xxcam_probe(struct platform_device *pdev) 1741{ 1742 struct omap24xxcam_device *cam; 1743 struct resource *mem; 1744 int irq; 1745 1746 cam = kzalloc(sizeof(*cam), GFP_KERNEL); 1747 if (!cam) { 1748 dev_err(&pdev->dev, "could not allocate memory\n"); 1749 goto err; 1750 } 1751 1752 platform_set_drvdata(pdev, cam); 1753 1754 cam->dev = &pdev->dev; 1755 1756 /* 1757 * Impose a lower limit on the amount of memory allocated for 1758 * capture. We require at least enough memory to double-buffer 1759 * QVGA (300KB). 1760 */ 1761 if (capture_mem < 320 * 240 * 2 * 2) 1762 capture_mem = 320 * 240 * 2 * 2; 1763 cam->capture_mem = capture_mem; 1764 1765 /* request the mem region for the camera registers */ 1766 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1767 if (!mem) { 1768 dev_err(cam->dev, "no mem resource?\n"); 1769 goto err; 1770 } 1771 if (!request_mem_region(mem->start, (mem->end - mem->start) + 1, 1772 pdev->name)) { 1773 dev_err(cam->dev, 1774 "cannot reserve camera register I/O region\n"); 1775 goto err; 1776 } 1777 cam->mmio_base_phys = mem->start; 1778 cam->mmio_size = (mem->end - mem->start) + 1; 1779 1780 /* map the region */ 1781 cam->mmio_base = (unsigned long) 1782 ioremap_nocache(cam->mmio_base_phys, cam->mmio_size); 1783 if (!cam->mmio_base) { 1784 dev_err(cam->dev, "cannot map camera register I/O region\n"); 1785 goto err; 1786 } 1787 1788 irq = platform_get_irq(pdev, 0); 1789 if (irq <= 0) { 1790 dev_err(cam->dev, "no irq for camera?\n"); 1791 goto err; 1792 } 1793 1794 /* install the interrupt service routine */ 1795 if (request_irq(irq, omap24xxcam_isr, 0, CAM_NAME, cam)) { 1796 dev_err(cam->dev, 1797 "could not install interrupt service routine\n"); 1798 goto err; 1799 } 1800 cam->irq = irq; 1801 1802 if (omap24xxcam_clock_get(cam)) 1803 goto err; 1804 1805 INIT_WORK(&cam->sensor_reset_work, omap24xxcam_sensor_reset_work); 1806 1807 mutex_init(&cam->mutex); 1808 spin_lock_init(&cam->core_enable_disable_lock); 1809 1810 omap24xxcam_sgdma_init(&cam->sgdma, 1811 cam->mmio_base + CAMDMA_REG_OFFSET, 1812 omap24xxcam_stalled_dma_reset, 1813 (unsigned long)cam); 1814 1815 omap24xxcam.priv = cam; 1816 1817 if (v4l2_int_device_register(&omap24xxcam)) 1818 goto err; 1819 1820 return 0; 1821 1822err: 1823 omap24xxcam_remove(pdev); 1824 return -ENODEV; 1825} 1826 1827static int omap24xxcam_remove(struct platform_device *pdev) 1828{ 1829 struct omap24xxcam_device *cam = platform_get_drvdata(pdev); 1830 1831 if (!cam) 1832 return 0; 1833 1834 if (omap24xxcam.priv != NULL) 1835 v4l2_int_device_unregister(&omap24xxcam); 1836 omap24xxcam.priv = NULL; 1837 1838 omap24xxcam_clock_put(cam); 1839 1840 if (cam->irq) { 1841 free_irq(cam->irq, cam); 1842 cam->irq = 0; 1843 } 1844 1845 if (cam->mmio_base) { 1846 iounmap((void *)cam->mmio_base); 1847 cam->mmio_base = 0; 1848 } 1849 1850 if (cam->mmio_base_phys) { 1851 release_mem_region(cam->mmio_base_phys, cam->mmio_size); 1852 cam->mmio_base_phys = 0; 1853 } 1854 1855 kfree(cam); 1856 1857 return 0; 1858} 1859 1860static struct platform_driver omap24xxcam_driver = { 1861 .probe = omap24xxcam_probe, 1862 .remove = omap24xxcam_remove, 1863#ifdef CONFIG_PM 1864 .suspend = omap24xxcam_suspend, 1865 .resume = omap24xxcam_resume, 1866#endif 1867 .driver = { 1868 .name = CAM_NAME, 1869 .owner = THIS_MODULE, 1870 }, 1871}; 1872 1873/* 1874 * 1875 * Module initialisation and deinitialisation 1876 * 1877 */ 1878 1879static int __init omap24xxcam_init(void) 1880{ 1881 return platform_driver_register(&omap24xxcam_driver); 1882} 1883 1884static void __exit omap24xxcam_cleanup(void) 1885{ 1886 platform_driver_unregister(&omap24xxcam_driver); 1887} 1888 1889MODULE_AUTHOR("Sakari Ailus <sakari.ailus@nokia.com>"); 1890MODULE_DESCRIPTION("OMAP24xx Video for Linux camera driver"); 1891MODULE_LICENSE("GPL"); 1892module_param(video_nr, int, 0); 1893MODULE_PARM_DESC(video_nr, 1894 "Minor number for video device (-1 ==> auto assign)"); 1895module_param(capture_mem, int, 0); 1896MODULE_PARM_DESC(capture_mem, "Maximum amount of memory for capture " 1897 "buffers (default 4800kiB)"); 1898 1899module_init(omap24xxcam_init); 1900module_exit(omap24xxcam_cleanup);