Esempio n. 1
0
static void
vbi_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
	struct cx88_buffer    *buf = container_of(vb,struct cx88_buffer,vb);
	struct cx88_buffer    *prev;
	struct cx8800_fh      *fh   = vq->priv_data;
	struct cx8800_dev     *dev  = fh->dev;
	struct cx88_dmaqueue  *q    = &dev->vbiq;

	/* add jump to stopper */
	buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
	buf->risc.jmp[1] = cpu_to_le32(q->stopper.dma);

	if (list_empty(&q->active)) {
		list_add_tail(&buf->vb.queue,&q->active);
		cx8800_start_vbi_dma(dev, q, buf);
		buf->vb.state = VIDEOBUF_ACTIVE;
		buf->count    = q->count++;
		mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
		dprintk(2,"[%p/%d] vbi_queue - first active\n",
			buf, buf->vb.i);

	} else {
		prev = list_entry(q->active.prev, struct cx88_buffer, vb.queue);
		list_add_tail(&buf->vb.queue,&q->active);
		buf->vb.state = VIDEOBUF_ACTIVE;
		buf->count    = q->count++;
		prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
		dprintk(2,"[%p/%d] buffer_queue - append to active\n",
			buf, buf->vb.i);
	}
}
Esempio n. 2
0
static void buffer_queue(struct vb2_buffer *vb)
{
    struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
    struct cx8800_dev *dev = vb->vb2_queue->drv_priv;
    struct cx88_buffer    *buf = container_of(vbuf, struct cx88_buffer, vb);
    struct cx88_buffer    *prev;
    struct cx88_dmaqueue  *q    = &dev->vbiq;

    /* add jump to start */
    buf->risc.cpu[1] = cpu_to_le32(buf->risc.dma + 8);
    buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_CNT_INC);
    buf->risc.jmp[1] = cpu_to_le32(buf->risc.dma + 8);

    if (list_empty(&q->active)) {
        list_add_tail(&buf->list, &q->active);
        cx8800_start_vbi_dma(dev, q, buf);
        dprintk(2,"[%p/%d] vbi_queue - first active\n",
                buf, buf->vb.vb2_buf.index);

    } else {
        buf->risc.cpu[0] |= cpu_to_le32(RISC_IRQ1);
        prev = list_entry(q->active.prev, struct cx88_buffer, list);
        list_add_tail(&buf->list, &q->active);
        prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
        dprintk(2,"[%p/%d] buffer_queue - append to active\n",
                buf, buf->vb.vb2_buf.index);
    }
}
Esempio n. 3
0
static int start_streaming(struct vb2_queue *q, unsigned int count)
{
    struct cx8800_dev *dev = q->drv_priv;
    struct cx88_dmaqueue *dmaq = &dev->vbiq;
    struct cx88_buffer *buf = list_entry(dmaq->active.next,
                                         struct cx88_buffer, list);

    cx8800_start_vbi_dma(dev, dmaq, buf);
    return 0;
}
Esempio n. 4
0
int cx8800_restart_vbi_queue(struct cx8800_dev    *dev,
                             struct cx88_dmaqueue *q)
{
    struct cx88_buffer *buf;

    if (list_empty(&q->active))
        return 0;

    buf = list_entry(q->active.next, struct cx88_buffer, list);
    dprintk(2,"restart_queue [%p/%d]: restart dma\n",
            buf, buf->vb.vb2_buf.index);
    cx8800_start_vbi_dma(dev, q, buf);
    return 0;
}
Esempio n. 5
0
int cx8800_restart_vbi_queue(struct cx8800_dev    *dev,
			     struct cx88_dmaqueue *q)
{
	struct cx88_buffer *buf;

	if (list_empty(&q->active))
		return 0;

	buf = list_entry(q->active.next, struct cx88_buffer, vb.queue);
	dprintk(2,"restart_queue [%p/%d]: restart dma\n",
		buf, buf->vb.i);
	cx8800_start_vbi_dma(dev, q, buf);
	list_for_each_entry(buf, &q->active, vb.queue)
		buf->count = q->count++;
	mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
	return 0;
}