/** * @brief: for ak_videobuf_release, free buffer if camera stopped. * * @author: caolianming * @date: 2014-01-06 * @param [in] *vq: V4L2 buffer queue information structure * @param [in] *buf: ak camera drivers structure, include struct videobuf_buffer */ static void free_buffer(struct videobuf_queue *vq, struct ak_buffer *buf) { struct soc_camera_device *icd = vq->priv_data; struct videobuf_buffer *vb = &buf->vb; struct soc_camera_host *ici = to_soc_camera_host(icd->parent); struct ak_camera_dev *pcdev = ici->priv; isp_dbg("%s (vb=0x%p) buf[%d] 0x%08lx %d\n", __func__, vb, vb->i, vb->baddr, vb->bsize); BUG_ON(in_interrupt()); /* This waits until this buffer is out of danger, i.e., until it is no * longer in STATE_QUEUED or STATE_ACTIVE */ if (vb->state == VIDEOBUF_ACTIVE && !pcdev->dma_running) { printk("free_buffer: dma_running=%d, doesn't neee to wait\n", pcdev->dma_running); //vb->state = VIDEOBUF_ERROR; list_del(&vb->queue); } else { vb->state = VIDEOBUF_DONE; videobuf_waiton(vq, vb, 0, 0); } videobuf_dma_contig_free(vq, vb); vb->state = VIDEOBUF_NEEDS_INIT; }
static int solo_buf_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb, enum v4l2_field field) { struct solo_filehandle *fh = vq->priv_data; struct solo6010_dev *solo_dev = fh->solo_dev; vb->size = solo_image_size(solo_dev); if (vb->baddr != 0 && vb->bsize < vb->size) return -EINVAL; /* XXX: These properties only change when queue is idle */ vb->width = solo_dev->video_hsize; vb->height = solo_vlines(solo_dev); vb->bytesperline = solo_bytesperline(solo_dev); vb->field = field; if (vb->state == VIDEOBUF_NEEDS_INIT) { int rc = videobuf_iolock(vq, vb, NULL); if (rc < 0) { videobuf_dma_contig_free(vq, vb); vb->state = VIDEOBUF_NEEDS_INIT; return rc; } } vb->state = VIDEOBUF_PREPARED; return 0; }
/** * vpif_buffer_release : Callback function to free buffer * @q: buffer queue ptr * @vb: ptr to video buffer * * This function is called from the videobuf layer to free memory * allocated to the buffers */ static void vpif_buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) { /* Get the file handle object and channel object */ struct vpif_fh *fh = q->priv_data; struct channel_obj *ch = fh->channel; struct common_obj *common; common = &ch->common[VPIF_VIDEO_INDEX]; videobuf_dma_contig_free(q, vb); vb->state = VIDEOBUF_NEEDS_INIT; }
static void free_buffer(struct videobuf_queue *vq, struct sh_mobile_ceu_buffer *buf) { struct soc_camera_device *icd = vq->priv_data; dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %zd\n", __func__, &buf->vb, buf->vb.baddr, buf->vb.bsize); if (in_interrupt()) BUG(); videobuf_dma_contig_free(vq, &buf->vb); dev_dbg(&icd->dev, "%s freed\n", __func__); buf->vb.state = VIDEOBUF_NEEDS_INIT; }
static void free_buffer(struct videobuf_queue *vq, struct mx1_buffer *buf) { struct soc_camera_device *icd = vq->priv_data; struct videobuf_buffer *vb = &buf->vb; BUG_ON(in_interrupt()); dev_dbg(icd->parent, "%s (vb=0x%p) 0x%08lx %d\n", __func__, vb, vb->baddr, vb->bsize); videobuf_waiton(vq, vb, 0, 0); videobuf_dma_contig_free(vq, vb); vb->state = VIDEOBUF_NEEDS_INIT; }
/* * vpif_buffer_release: This function is called from the videobuf layer to * free memory allocated to the buffers */ static void vpif_buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) { struct vpif_fh *fh = q->priv_data; struct channel_obj *ch = fh->channel; struct common_obj *common; unsigned int buf_size = 0; common = &ch->common[VPIF_VIDEO_INDEX]; videobuf_dma_contig_free(q, vb); vb->state = VIDEOBUF_NEEDS_INIT; if (V4L2_MEMORY_MMAP != common->memory) return; buf_size = config_params.channel_bufsize[ch->channel_id]; }
static void free_buffer(struct videobuf_queue *vq, struct jz4780_buffer *buf) { struct videobuf_buffer *vb = &buf->vb; BUG_ON(in_interrupt()); dprintk(7, "%s (vb=0x%p) 0x%08lx %d\n", __func__, vb, vb->baddr, vb->bsize); /* * This waits until this buffer is out of danger, i.e., until it is no * longer in STATE_QUEUED or STATE_ACTIVE */ videobuf_waiton(vq, vb, 0, 0); videobuf_dma_contig_free(vq, vb); vb->state = VIDEOBUF_NEEDS_INIT; }
static void free_buffer(struct videobuf_queue *vq, struct mx1_buffer *buf) { struct soc_camera_device *icd = vq->priv_data; struct videobuf_buffer *vb = &buf->vb; BUG_ON(in_interrupt()); dev_dbg(icd->parent, "%s (vb=0x%p) 0x%08lx %d\n", __func__, vb, vb->baddr, vb->bsize); /* * This waits until this buffer is out of danger, i.e., until it is no * longer in STATE_QUEUED or STATE_ACTIVE */ videobuf_waiton(vq, vb, 0, 0); videobuf_dma_contig_free(vq, vb); vb->state = VIDEOBUF_NEEDS_INIT; }
static void free_buffer(struct videobuf_queue *vq, struct omap1_cam_buf *buf, enum omap1_cam_vb_mode vb_mode) { struct videobuf_buffer *vb = &buf->vb; BUG_ON(in_interrupt()); videobuf_waiton(vq, vb, 0, 0); if (vb_mode == OMAP1_CAM_DMA_CONTIG) { videobuf_dma_contig_free(vq, vb); } else { struct soc_camera_device *icd = vq->priv_data; struct device *dev = icd->dev.parent; struct videobuf_dmabuf *dma = videobuf_to_dma(vb); videobuf_dma_unmap(dev, dma); videobuf_dma_free(dma); } vb->state = VIDEOBUF_NEEDS_INIT; }
static void solo_buf_release(struct videobuf_queue *vq, struct videobuf_buffer *vb) { videobuf_dma_contig_free(vq, vb); vb->state = VIDEOBUF_NEEDS_INIT; }