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