You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
V4L/DVB (3516): Make video_buf more generic
Video_buf were concerned to allow PCI devices to be used as video capture devices. This patch extends video_buf features by virtualizing pci-dependent functions and allowing other type of devices to use it. It is still DMA centric, although it may be used also by devices that emulates scatter/gather behavior or a DMA device Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
@@ -50,14 +50,15 @@ void saa7146_res_free(struct saa7146_fh *fh, unsigned int bits)
|
||||
/********************************************************************************/
|
||||
/* common dma functions */
|
||||
|
||||
void saa7146_dma_free(struct saa7146_dev *dev,struct saa7146_buf *buf)
|
||||
void saa7146_dma_free(struct saa7146_dev *dev,struct videobuf_queue *q,
|
||||
struct saa7146_buf *buf)
|
||||
{
|
||||
DEB_EE(("dev:%p, buf:%p\n",dev,buf));
|
||||
|
||||
BUG_ON(in_interrupt());
|
||||
|
||||
videobuf_waiton(&buf->vb,0,0);
|
||||
videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma);
|
||||
videobuf_dma_unmap(q, &buf->vb.dma);
|
||||
videobuf_dma_free(&buf->vb.dma);
|
||||
buf->vb.state = STATE_NEEDS_INIT;
|
||||
}
|
||||
|
||||
@@ -236,7 +236,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e
|
||||
}
|
||||
|
||||
if (buf->vb.size != size)
|
||||
saa7146_dma_free(dev,buf);
|
||||
saa7146_dma_free(dev,q,buf);
|
||||
|
||||
if (STATE_NEEDS_INIT == buf->vb.state) {
|
||||
buf->vb.width = llength;
|
||||
@@ -247,7 +247,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e
|
||||
saa7146_pgtable_free(dev->pci, &buf->pt[2]);
|
||||
saa7146_pgtable_alloc(dev->pci, &buf->pt[2]);
|
||||
|
||||
err = videobuf_iolock(dev->pci,&buf->vb, NULL);
|
||||
err = videobuf_iolock(q,&buf->vb, NULL);
|
||||
if (err)
|
||||
goto oops;
|
||||
err = saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen);
|
||||
@@ -261,7 +261,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e
|
||||
|
||||
oops:
|
||||
DEB_VBI(("error out.\n"));
|
||||
saa7146_dma_free(dev,buf);
|
||||
saa7146_dma_free(dev,q,buf);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -301,7 +301,7 @@ static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
struct saa7146_buf *buf = (struct saa7146_buf *)vb;
|
||||
|
||||
DEB_VBI(("vb:%p\n",vb));
|
||||
saa7146_dma_free(dev,buf);
|
||||
saa7146_dma_free(dev,q,buf);
|
||||
}
|
||||
|
||||
static struct videobuf_queue_ops vbi_qops = {
|
||||
|
||||
@@ -1275,7 +1275,7 @@ static int buffer_prepare(struct videobuf_queue *q,
|
||||
buf->vb.field != field ||
|
||||
buf->vb.field != fh->video_fmt.field ||
|
||||
buf->fmt != &fh->video_fmt) {
|
||||
saa7146_dma_free(dev,buf);
|
||||
saa7146_dma_free(dev,q,buf);
|
||||
}
|
||||
|
||||
if (STATE_NEEDS_INIT == buf->vb.state) {
|
||||
@@ -1304,7 +1304,7 @@ static int buffer_prepare(struct videobuf_queue *q,
|
||||
saa7146_pgtable_alloc(dev->pci, &buf->pt[0]);
|
||||
}
|
||||
|
||||
err = videobuf_iolock(dev->pci,&buf->vb, &vv->ov_fb);
|
||||
err = videobuf_iolock(q,&buf->vb, &vv->ov_fb);
|
||||
if (err)
|
||||
goto oops;
|
||||
err = saa7146_pgtable_build(dev,buf);
|
||||
@@ -1318,7 +1318,7 @@ static int buffer_prepare(struct videobuf_queue *q,
|
||||
|
||||
oops:
|
||||
DEB_D(("error out.\n"));
|
||||
saa7146_dma_free(dev,buf);
|
||||
saa7146_dma_free(dev,q,buf);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -1363,7 +1363,7 @@ static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
struct saa7146_buf *buf = (struct saa7146_buf *)vb;
|
||||
|
||||
DEB_CAP(("vbuf:%p\n",vb));
|
||||
saa7146_dma_free(dev,buf);
|
||||
saa7146_dma_free(dev,q,buf);
|
||||
}
|
||||
|
||||
static struct videobuf_queue_ops video_qops = {
|
||||
|
||||
@@ -1397,7 +1397,7 @@ bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
|
||||
free_btres(btv,fh,RESOURCE_OVERLAY);
|
||||
if (NULL != old) {
|
||||
dprintk("switch_overlay: old=%p state is %d\n",old,old->vb.state);
|
||||
bttv_dma_free(btv, old);
|
||||
bttv_dma_free(&fh->cap,btv, old);
|
||||
kfree(old);
|
||||
}
|
||||
dprintk("switch_overlay: done\n");
|
||||
@@ -1407,7 +1407,8 @@ bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* video4linux (1) interface */
|
||||
|
||||
static int bttv_prepare_buffer(struct bttv *btv, struct bttv_buffer *buf,
|
||||
static int bttv_prepare_buffer(struct videobuf_queue *q,struct bttv *btv,
|
||||
struct bttv_buffer *buf,
|
||||
const struct bttv_format *fmt,
|
||||
unsigned int width, unsigned int height,
|
||||
enum v4l2_field field)
|
||||
@@ -1450,7 +1451,7 @@ static int bttv_prepare_buffer(struct bttv *btv, struct bttv_buffer *buf,
|
||||
/* alloc risc memory */
|
||||
if (STATE_NEEDS_INIT == buf->vb.state) {
|
||||
redo_dma_risc = 1;
|
||||
if (0 != (rc = videobuf_iolock(btv->c.pci,&buf->vb,&btv->fbuf)))
|
||||
if (0 != (rc = videobuf_iolock(q,&buf->vb,&btv->fbuf)))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -1462,7 +1463,7 @@ static int bttv_prepare_buffer(struct bttv *btv, struct bttv_buffer *buf,
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
bttv_dma_free(btv,buf);
|
||||
bttv_dma_free(q,btv,buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -1486,7 +1487,7 @@ buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
|
||||
struct bttv_fh *fh = q->priv_data;
|
||||
|
||||
return bttv_prepare_buffer(fh->btv, buf, fh->fmt,
|
||||
return bttv_prepare_buffer(q,fh->btv, buf, fh->fmt,
|
||||
fh->width, fh->height, field);
|
||||
}
|
||||
|
||||
@@ -1510,7 +1511,7 @@ static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
|
||||
struct bttv_fh *fh = q->priv_data;
|
||||
|
||||
bttv_dma_free(fh->btv,buf);
|
||||
bttv_dma_free(&fh->cap,fh->btv,buf);
|
||||
}
|
||||
|
||||
static struct videobuf_queue_ops bttv_video_qops = {
|
||||
@@ -2496,7 +2497,7 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
|
||||
field = (vm->height > bttv_tvnorms[btv->tvnorm].sheight/2)
|
||||
? V4L2_FIELD_INTERLACED
|
||||
: V4L2_FIELD_BOTTOM;
|
||||
retval = bttv_prepare_buffer(btv,buf,
|
||||
retval = bttv_prepare_buffer(&fh->cap,btv,buf,
|
||||
format_by_palette(vm->format),
|
||||
vm->width,vm->height,field);
|
||||
if (0 != retval)
|
||||
@@ -2528,8 +2529,8 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
|
||||
retval = -EIO;
|
||||
/* fall through */
|
||||
case STATE_DONE:
|
||||
videobuf_dma_pci_sync(btv->c.pci,&buf->vb.dma);
|
||||
bttv_dma_free(btv,buf);
|
||||
videobuf_dma_sync(&fh->cap,&buf->vb.dma);
|
||||
bttv_dma_free(&fh->cap,btv,buf);
|
||||
break;
|
||||
default:
|
||||
retval = -EINVAL;
|
||||
|
||||
@@ -509,11 +509,11 @@ bttv_risc_hook(struct bttv *btv, int slot, struct btcx_riscmem *risc,
|
||||
}
|
||||
|
||||
void
|
||||
bttv_dma_free(struct bttv *btv, struct bttv_buffer *buf)
|
||||
bttv_dma_free(struct videobuf_queue *q,struct bttv *btv, struct bttv_buffer *buf)
|
||||
{
|
||||
BUG_ON(in_interrupt());
|
||||
videobuf_waiton(&buf->vb,0,0);
|
||||
videobuf_dma_pci_unmap(btv->c.pci, &buf->vb.dma);
|
||||
videobuf_dma_unmap(q, &buf->vb.dma);
|
||||
videobuf_dma_free(&buf->vb.dma);
|
||||
btcx_riscmem_free(btv->c.pci,&buf->bottom);
|
||||
btcx_riscmem_free(btv->c.pci,&buf->top);
|
||||
|
||||
@@ -96,7 +96,7 @@ static int vbi_buffer_prepare(struct videobuf_queue *q,
|
||||
return -EINVAL;
|
||||
|
||||
if (STATE_NEEDS_INIT == buf->vb.state) {
|
||||
if (0 != (rc = videobuf_iolock(btv->c.pci, &buf->vb, NULL)))
|
||||
if (0 != (rc = videobuf_iolock(q, &buf->vb, NULL)))
|
||||
goto fail;
|
||||
if (0 != (rc = vbi_buffer_risc(btv,buf,fh->lines)))
|
||||
goto fail;
|
||||
@@ -109,7 +109,7 @@ static int vbi_buffer_prepare(struct videobuf_queue *q,
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
bttv_dma_free(btv,buf);
|
||||
bttv_dma_free(q,btv,buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@ static void vbi_buffer_release(struct videobuf_queue *q, struct videobuf_buffer
|
||||
struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
|
||||
|
||||
dprintk("free %p\n",vb);
|
||||
bttv_dma_free(fh->btv,buf);
|
||||
bttv_dma_free(&fh->cap,fh->btv,buf);
|
||||
}
|
||||
|
||||
struct videobuf_queue_ops bttv_vbi_qops = {
|
||||
|
||||
@@ -190,7 +190,8 @@ int bttv_buffer_activate_video(struct bttv *btv,
|
||||
struct bttv_buffer_set *set);
|
||||
int bttv_buffer_activate_vbi(struct bttv *btv,
|
||||
struct bttv_buffer *vbi);
|
||||
void bttv_dma_free(struct bttv *btv, struct bttv_buffer *buf);
|
||||
void bttv_dma_free(struct videobuf_queue *q, struct bttv *btv,
|
||||
struct bttv_buffer *buf);
|
||||
|
||||
/* overlay handling */
|
||||
int bttv_overlay_risc(struct bttv *btv, struct bttv_overlay *ov,
|
||||
|
||||
@@ -303,7 +303,7 @@ static int dsp_buffer_free(snd_cx88_card_t *chip)
|
||||
BUG_ON(!chip->dma_size);
|
||||
|
||||
dprintk(2,"Freeing buffer\n");
|
||||
videobuf_dma_pci_unmap(chip->pci, &chip->dma_risc);
|
||||
videobuf_pci_dma_unmap(chip->pci, &chip->dma_risc);
|
||||
videobuf_dma_free(&chip->dma_risc);
|
||||
btcx_riscmem_free(chip->pci,&chip->buf->risc);
|
||||
kfree(chip->buf);
|
||||
@@ -429,7 +429,7 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream,
|
||||
videobuf_dma_init_kernel(&buf->vb.dma,PCI_DMA_FROMDEVICE,
|
||||
(PAGE_ALIGN(buf->vb.size) >> PAGE_SHIFT));
|
||||
|
||||
videobuf_dma_pci_map(chip->pci,&buf->vb.dma);
|
||||
videobuf_pci_dma_map(chip->pci,&buf->vb.dma);
|
||||
|
||||
|
||||
cx88_risc_databuffer(chip->pci, &buf->risc,
|
||||
|
||||
@@ -1341,7 +1341,7 @@ bb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
enum v4l2_field field)
|
||||
{
|
||||
struct cx8802_fh *fh = q->priv_data;
|
||||
return cx8802_buf_prepare(fh->dev, (struct cx88_buffer*)vb, field);
|
||||
return cx8802_buf_prepare(q, fh->dev, (struct cx88_buffer*)vb, field);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1354,8 +1354,7 @@ bb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
static void
|
||||
bb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
{
|
||||
struct cx8802_fh *fh = q->priv_data;
|
||||
cx88_free_buffer(fh->dev->pci, (struct cx88_buffer*)vb);
|
||||
cx88_free_buffer(q, (struct cx88_buffer*)vb);
|
||||
}
|
||||
|
||||
static struct videobuf_queue_ops blackbird_qops = {
|
||||
|
||||
@@ -213,13 +213,13 @@ int cx88_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
|
||||
}
|
||||
|
||||
void
|
||||
cx88_free_buffer(struct pci_dev *pci, struct cx88_buffer *buf)
|
||||
cx88_free_buffer(struct videobuf_queue *q, struct cx88_buffer *buf)
|
||||
{
|
||||
BUG_ON(in_interrupt());
|
||||
videobuf_waiton(&buf->vb,0,0);
|
||||
videobuf_dma_pci_unmap(pci, &buf->vb.dma);
|
||||
videobuf_dma_unmap(q, &buf->vb.dma);
|
||||
videobuf_dma_free(&buf->vb.dma);
|
||||
btcx_riscmem_free(pci, &buf->risc);
|
||||
btcx_riscmem_free((struct pci_dev *)q->dev, &buf->risc);
|
||||
buf->vb.state = STATE_NEEDS_INIT;
|
||||
}
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@ static int dvb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
enum v4l2_field field)
|
||||
{
|
||||
struct cx8802_dev *dev = q->priv_data;
|
||||
return cx8802_buf_prepare(dev, (struct cx88_buffer*)vb,field);
|
||||
return cx8802_buf_prepare(q, dev, (struct cx88_buffer*)vb,field);
|
||||
}
|
||||
|
||||
static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
@@ -101,8 +101,7 @@ static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
|
||||
static void dvb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
{
|
||||
struct cx8802_dev *dev = q->priv_data;
|
||||
cx88_free_buffer(dev->pci, (struct cx88_buffer*)vb);
|
||||
cx88_free_buffer(q, (struct cx88_buffer*)vb);
|
||||
}
|
||||
|
||||
static struct videobuf_queue_ops dvb_qops = {
|
||||
|
||||
@@ -163,8 +163,8 @@ static int cx8802_restart_queue(struct cx8802_dev *dev,
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
int cx8802_buf_prepare(struct cx8802_dev *dev, struct cx88_buffer *buf,
|
||||
enum v4l2_field field)
|
||||
int cx8802_buf_prepare(struct videobuf_queue *q, struct cx8802_dev *dev,
|
||||
struct cx88_buffer *buf, enum v4l2_field field)
|
||||
{
|
||||
int size = dev->ts_packet_size * dev->ts_packet_count;
|
||||
int rc;
|
||||
@@ -179,7 +179,7 @@ int cx8802_buf_prepare(struct cx8802_dev *dev, struct cx88_buffer *buf,
|
||||
buf->vb.size = size;
|
||||
buf->vb.field = field /*V4L2_FIELD_TOP*/;
|
||||
|
||||
if (0 != (rc = videobuf_iolock(dev->pci,&buf->vb,NULL)))
|
||||
if (0 != (rc = videobuf_iolock(q,&buf->vb,NULL)))
|
||||
goto fail;
|
||||
cx88_risc_databuffer(dev->pci, &buf->risc,
|
||||
buf->vb.dma.sglist,
|
||||
@@ -189,36 +189,36 @@ int cx8802_buf_prepare(struct cx8802_dev *dev, struct cx88_buffer *buf,
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
cx88_free_buffer(dev->pci,buf);
|
||||
cx88_free_buffer(q,buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf)
|
||||
{
|
||||
struct cx88_buffer *prev;
|
||||
struct cx88_dmaqueue *q = &dev->mpegq;
|
||||
struct cx88_dmaqueue *cx88q = &dev->mpegq;
|
||||
|
||||
dprintk( 1, "cx8802_buf_queue\n" );
|
||||
/* 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);
|
||||
buf->risc.jmp[1] = cpu_to_le32(cx88q->stopper.dma);
|
||||
|
||||
if (list_empty(&q->active)) {
|
||||
if (list_empty(&cx88q->active)) {
|
||||
dprintk( 0, "queue is empty - first active\n" );
|
||||
list_add_tail(&buf->vb.queue,&q->active);
|
||||
cx8802_start_dma(dev, q, buf);
|
||||
list_add_tail(&buf->vb.queue,&cx88q->active);
|
||||
cx8802_start_dma(dev, cx88q, buf);
|
||||
buf->vb.state = STATE_ACTIVE;
|
||||
buf->count = q->count++;
|
||||
mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
|
||||
buf->count = cx88q->count++;
|
||||
mod_timer(&cx88q->timeout, jiffies+BUFFER_TIMEOUT);
|
||||
dprintk(0,"[%p/%d] %s - first active\n",
|
||||
buf, buf->vb.i, __FUNCTION__);
|
||||
|
||||
} else {
|
||||
dprintk( 1, "queue is not empty - append to active\n" );
|
||||
prev = list_entry(q->active.prev, struct cx88_buffer, vb.queue);
|
||||
list_add_tail(&buf->vb.queue,&q->active);
|
||||
prev = list_entry(cx88q->active.prev, struct cx88_buffer, vb.queue);
|
||||
list_add_tail(&buf->vb.queue,&cx88q->active);
|
||||
buf->vb.state = STATE_ACTIVE;
|
||||
buf->count = q->count++;
|
||||
buf->count = cx88q->count++;
|
||||
prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
|
||||
dprintk( 1, "[%p/%d] %s - append to active\n",
|
||||
buf, buf->vb.i, __FUNCTION__);
|
||||
|
||||
@@ -175,7 +175,7 @@ vbi_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
buf->vb.size = size;
|
||||
buf->vb.field = V4L2_FIELD_SEQ_TB;
|
||||
|
||||
if (0 != (rc = videobuf_iolock(dev->pci,&buf->vb,NULL)))
|
||||
if (0 != (rc = videobuf_iolock(q,&buf->vb,NULL)))
|
||||
goto fail;
|
||||
cx88_risc_buffer(dev->pci, &buf->risc,
|
||||
buf->vb.dma.sglist,
|
||||
@@ -187,7 +187,7 @@ vbi_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
cx88_free_buffer(dev->pci,buf);
|
||||
cx88_free_buffer(q,buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -227,9 +227,8 @@ vbi_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
|
||||
static void vbi_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
{
|
||||
struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
|
||||
struct cx8800_fh *fh = q->priv_data;
|
||||
|
||||
cx88_free_buffer(fh->dev->pci,buf);
|
||||
cx88_free_buffer(q,buf);
|
||||
}
|
||||
|
||||
struct videobuf_queue_ops cx8800_vbi_qops = {
|
||||
|
||||
@@ -564,7 +564,7 @@ buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
|
||||
if (STATE_NEEDS_INIT == buf->vb.state) {
|
||||
init_buffer = 1;
|
||||
if (0 != (rc = videobuf_iolock(dev->pci,&buf->vb,NULL)))
|
||||
if (0 != (rc = videobuf_iolock(q,&buf->vb,NULL)))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -614,7 +614,7 @@ buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
cx88_free_buffer(dev->pci,buf);
|
||||
cx88_free_buffer(q,buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -671,9 +671,8 @@ buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
|
||||
static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
{
|
||||
struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
|
||||
struct cx8800_fh *fh = q->priv_data;
|
||||
|
||||
cx88_free_buffer(fh->dev->pci,buf);
|
||||
cx88_free_buffer(q,buf);
|
||||
}
|
||||
|
||||
static struct videobuf_queue_ops cx8800_video_qops = {
|
||||
@@ -1251,9 +1250,17 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio,
|
||||
{
|
||||
int err;
|
||||
|
||||
dprintk(2, "CORE IOCTL: 0x%x\n", cmd );
|
||||
if (video_debug > 1)
|
||||
v4l_print_ioctl(core->name,cmd);
|
||||
if (video_debug) {
|
||||
if (video_debug > 1) {
|
||||
if (_IOC_DIR(cmd) & _IOC_WRITE)
|
||||
v4l_printk_ioctl_arg("cx88(w)",cmd, arg);
|
||||
else if (!_IOC_DIR(cmd) & _IOC_READ) {
|
||||
v4l_print_ioctl("cx88", cmd);
|
||||
}
|
||||
} else
|
||||
v4l_print_ioctl(core->name,cmd);
|
||||
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
/* ---------- tv norms ---------- */
|
||||
@@ -1460,7 +1467,19 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio,
|
||||
static int video_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return video_usercopy(inode, file, cmd, arg, video_do_ioctl);
|
||||
int retval;
|
||||
|
||||
retval=video_usercopy(inode, file, cmd, arg, video_do_ioctl);
|
||||
|
||||
if (video_debug > 1) {
|
||||
if (retval < 0) {
|
||||
v4l_print_ioctl("cx88(err)", cmd);
|
||||
printk(KERN_DEBUG "cx88(err): errcode=%d\n",retval);
|
||||
} else if (_IOC_DIR(cmd) & _IOC_READ)
|
||||
v4l_printk_ioctl_arg("cx88(r)",cmd, (void *)arg);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
|
||||
@@ -485,7 +485,7 @@ extern int
|
||||
cx88_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
|
||||
u32 reg, u32 mask, u32 value);
|
||||
extern void
|
||||
cx88_free_buffer(struct pci_dev *pci, struct cx88_buffer *buf);
|
||||
cx88_free_buffer(struct videobuf_queue *q, struct cx88_buffer *buf);
|
||||
|
||||
extern void cx88_risc_disasm(struct cx88_core *core,
|
||||
struct btcx_riscmem *risc);
|
||||
@@ -577,8 +577,8 @@ void cx88_ir_irq(struct cx88_core *core);
|
||||
/* ----------------------------------------------------------- */
|
||||
/* cx88-mpeg.c */
|
||||
|
||||
int cx8802_buf_prepare(struct cx8802_dev *dev, struct cx88_buffer *buf,
|
||||
enum v4l2_field field);
|
||||
int cx8802_buf_prepare(struct videobuf_queue *q,struct cx8802_dev *dev,
|
||||
struct cx88_buffer *buf, enum v4l2_field field);
|
||||
void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf);
|
||||
void cx8802_cancel_buffers(struct cx8802_dev *dev);
|
||||
|
||||
|
||||
@@ -507,7 +507,7 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
|
||||
/* release the old buffer */
|
||||
if (substream->runtime->dma_area) {
|
||||
saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
|
||||
videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
|
||||
videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma);
|
||||
dsp_buffer_free(dev);
|
||||
substream->runtime->dma_area = NULL;
|
||||
}
|
||||
@@ -523,12 +523,12 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
|
||||
return err;
|
||||
}
|
||||
|
||||
if (0 != (err = videobuf_dma_pci_map(dev->pci, &dev->dmasound.dma))) {
|
||||
if (0 != (err = videobuf_pci_dma_map(dev->pci, &dev->dmasound.dma))) {
|
||||
dsp_buffer_free(dev);
|
||||
return err;
|
||||
}
|
||||
if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt))) {
|
||||
videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
|
||||
videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma);
|
||||
dsp_buffer_free(dev);
|
||||
return err;
|
||||
}
|
||||
@@ -537,7 +537,7 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
|
||||
dev->dmasound.dma.sglen,
|
||||
0))) {
|
||||
saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
|
||||
videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
|
||||
videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma);
|
||||
dsp_buffer_free(dev);
|
||||
return err;
|
||||
}
|
||||
@@ -571,7 +571,7 @@ static int snd_card_saa7134_hw_free(struct snd_pcm_substream * substream)
|
||||
|
||||
if (substream->runtime->dma_area) {
|
||||
saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
|
||||
videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
|
||||
videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma);
|
||||
dsp_buffer_free(dev);
|
||||
substream->runtime->dma_area = NULL;
|
||||
}
|
||||
|
||||
@@ -254,12 +254,12 @@ void saa7134_pgtable_free(struct pci_dev *pci, struct saa7134_pgtable *pt)
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
void saa7134_dma_free(struct saa7134_dev *dev,struct saa7134_buf *buf)
|
||||
void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf)
|
||||
{
|
||||
BUG_ON(in_interrupt());
|
||||
|
||||
videobuf_waiton(&buf->vb,0,0);
|
||||
videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma);
|
||||
videobuf_dma_unmap(q, &buf->vb.dma);
|
||||
videobuf_dma_free(&buf->vb.dma);
|
||||
buf->vb.state = STATE_NEEDS_INIT;
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ static int dsp_rec_start(struct saa7134_dev *dev)
|
||||
unsigned long flags;
|
||||
|
||||
/* prepare buffer */
|
||||
if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->dmasound.dma)))
|
||||
if (0 != (err = videobuf_pci_dma_map(dev->pci,&dev->dmasound.dma)))
|
||||
return err;
|
||||
if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt)))
|
||||
goto fail1;
|
||||
@@ -213,7 +213,7 @@ static int dsp_rec_start(struct saa7134_dev *dev)
|
||||
fail2:
|
||||
saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
|
||||
fail1:
|
||||
videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
|
||||
videobuf_pci_dma_unmap(dev->pci,&dev->dmasound.dma);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -231,7 +231,7 @@ static int dsp_rec_stop(struct saa7134_dev *dev)
|
||||
|
||||
/* unlock buffer */
|
||||
saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
|
||||
videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
|
||||
videobuf_pci_dma_unmap(dev->pci,&dev->dmasound.dma);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
return -EINVAL;
|
||||
|
||||
if (buf->vb.size != size) {
|
||||
saa7134_dma_free(dev,buf);
|
||||
saa7134_dma_free(q,buf);
|
||||
}
|
||||
|
||||
if (STATE_NEEDS_INIT == buf->vb.state) {
|
||||
@@ -98,7 +98,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
buf->vb.size = size;
|
||||
buf->pt = &dev->ts.pt_ts;
|
||||
|
||||
err = videobuf_iolock(dev->pci,&buf->vb,NULL);
|
||||
err = videobuf_iolock(q,&buf->vb,NULL);
|
||||
if (err)
|
||||
goto oops;
|
||||
err = saa7134_pgtable_build(dev->pci,buf->pt,
|
||||
@@ -126,7 +126,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
saa7134_dma_free(dev,buf);
|
||||
saa7134_dma_free(q,buf);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -152,10 +152,9 @@ static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
|
||||
static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
{
|
||||
struct saa7134_dev *dev = q->priv_data;
|
||||
struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
|
||||
|
||||
saa7134_dma_free(dev,buf);
|
||||
saa7134_dma_free(q,buf);
|
||||
}
|
||||
|
||||
struct videobuf_queue_ops saa7134_ts_qops = {
|
||||
|
||||
@@ -135,7 +135,7 @@ static int buffer_prepare(struct videobuf_queue *q,
|
||||
return -EINVAL;
|
||||
|
||||
if (buf->vb.size != size)
|
||||
saa7134_dma_free(dev,buf);
|
||||
saa7134_dma_free(q,buf);
|
||||
|
||||
if (STATE_NEEDS_INIT == buf->vb.state) {
|
||||
buf->vb.width = llength;
|
||||
@@ -143,7 +143,7 @@ static int buffer_prepare(struct videobuf_queue *q,
|
||||
buf->vb.size = size;
|
||||
buf->pt = &fh->pt_vbi;
|
||||
|
||||
err = videobuf_iolock(dev->pci,&buf->vb,NULL);
|
||||
err = videobuf_iolock(q,&buf->vb,NULL);
|
||||
if (err)
|
||||
goto oops;
|
||||
err = saa7134_pgtable_build(dev->pci,buf->pt,
|
||||
@@ -159,7 +159,7 @@ static int buffer_prepare(struct videobuf_queue *q,
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
saa7134_dma_free(dev,buf);
|
||||
saa7134_dma_free(q,buf);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -190,11 +190,9 @@ static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
|
||||
static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
{
|
||||
struct saa7134_fh *fh = q->priv_data;
|
||||
struct saa7134_dev *dev = fh->dev;
|
||||
struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
|
||||
|
||||
saa7134_dma_free(dev,buf);
|
||||
saa7134_dma_free(q,buf);
|
||||
}
|
||||
|
||||
struct videobuf_queue_ops saa7134_vbi_qops = {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user