/* Called under spinlock_irqsave(&pcdev->lock, ...) */ static void mx1_videobuf_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb) { struct soc_camera_device *icd = vq->priv_data; struct soc_camera_host *ici = to_soc_camera_host(icd->parent); struct mx1_camera_dev *pcdev = ici->priv; struct mx1_buffer *buf = container_of(vb, struct mx1_buffer, vb); dev_dbg(icd->parent, "%s (vb=0x%p) 0x%08lx %d\n", __func__, vb, vb->baddr, vb->bsize); list_add_tail(&vb->queue, &pcdev->capture); vb->state = VIDEOBUF_ACTIVE; if (!pcdev->active) { pcdev->active = buf; /* setup sg list for future DMA */ if (!mx1_camera_setup_dma(pcdev)) { unsigned int temp; /* enable SOF irq */ temp = __raw_readl(pcdev->base + CSICR1) | CSICR1_SOF_INTEN; __raw_writel(temp, pcdev->base + CSICR1); } } }
static void mx1_camera_wakeup(struct mx1_camera_dev *pcdev, struct videobuf_buffer *vb, struct mx1_buffer *buf) { /* _init is used to debug races, see comment in mx1_camera_reqbufs() */ list_del_init(&vb->queue); vb->state = VIDEOBUF_DONE; v4l2_get_timestamp(&vb->ts); vb->field_count++; wake_up(&vb->done); if (list_empty(&pcdev->capture)) { pcdev->active = NULL; return; } pcdev->active = list_entry(pcdev->capture.next, struct mx1_buffer, vb.queue); /* setup sg list for future DMA */ if (likely(!mx1_camera_setup_dma(pcdev))) { unsigned int temp; /* enable SOF irq */ temp = __raw_readl(pcdev->base + CSICR1) | CSICR1_SOF_INTEN; __raw_writel(temp, pcdev->base + CSICR1); } }
static void mx1_camera_wakeup(struct mx1_camera_dev *pcdev, struct videobuf_buffer *vb, struct mx1_buffer *buf) { list_del_init(&vb->queue); vb->state = VIDEOBUF_DONE; do_gettimeofday(&vb->ts); vb->field_count++; wake_up(&vb->done); if (list_empty(&pcdev->capture)) { pcdev->active = NULL; return; } pcdev->active = list_entry(pcdev->capture.next, struct mx1_buffer, vb.queue); if (likely(!mx1_camera_setup_dma(pcdev))) { unsigned int temp; temp = __raw_readl(pcdev->base + CSICR1) | CSICR1_SOF_INTEN; __raw_writel(temp, pcdev->base + CSICR1); } }