V4L/DVB (7566): videobuf-dvb: allow its usage with videobuf-vmalloc
videobuf-dvb were still using a function that were videobuf-dma-sg dependent. This patch creates a generic handler for this function. This way, videobuf-dvb can now work with all videobuf implementations. Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
3b5fa928a6
commit
59d3448995
@ -94,6 +94,13 @@ int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb,
|
|||||||
return CALL(q, iolock, q, vb, fbuf);
|
return CALL(q, iolock, q, vb, fbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *videobuf_queue_to_vmalloc (struct videobuf_queue *q,
|
||||||
|
struct videobuf_buffer *buf)
|
||||||
|
{
|
||||||
|
return CALL(q, vmalloc, buf);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(videobuf_queue_to_vmalloc);
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
@ -432,6 +432,16 @@ static void *__videobuf_alloc(size_t size)
|
|||||||
return vb;
|
return vb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *__videobuf_to_vmalloc (struct videobuf_buffer *buf)
|
||||||
|
{
|
||||||
|
struct videobuf_dma_sg_memory *mem = buf->priv;
|
||||||
|
BUG_ON(!mem);
|
||||||
|
|
||||||
|
MAGIC_CHECK(mem->magic, MAGIC_SG_MEM);
|
||||||
|
|
||||||
|
return mem->dma.vmalloc;
|
||||||
|
}
|
||||||
|
|
||||||
static int __videobuf_iolock (struct videobuf_queue* q,
|
static int __videobuf_iolock (struct videobuf_queue* q,
|
||||||
struct videobuf_buffer *vb,
|
struct videobuf_buffer *vb,
|
||||||
struct v4l2_framebuffer *fbuf)
|
struct v4l2_framebuffer *fbuf)
|
||||||
@ -677,6 +687,7 @@ static struct videobuf_qtype_ops sg_ops = {
|
|||||||
.mmap_mapper = __videobuf_mmap_mapper,
|
.mmap_mapper = __videobuf_mmap_mapper,
|
||||||
.video_copy_to_user = __videobuf_copy_to_user,
|
.video_copy_to_user = __videobuf_copy_to_user,
|
||||||
.copy_stream = __videobuf_copy_stream,
|
.copy_stream = __videobuf_copy_stream,
|
||||||
|
.vmalloc = __videobuf_to_vmalloc,
|
||||||
};
|
};
|
||||||
|
|
||||||
void *videobuf_sg_alloc(size_t size)
|
void *videobuf_sg_alloc(size_t size)
|
||||||
|
@ -20,9 +20,10 @@
|
|||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/file.h>
|
#include <linux/file.h>
|
||||||
|
|
||||||
#include <linux/freezer.h>
|
#include <linux/freezer.h>
|
||||||
|
|
||||||
#include <media/videobuf-dma-sg.h>
|
#include <media/videobuf-core.h>
|
||||||
#include <media/videobuf-dvb.h>
|
#include <media/videobuf-dvb.h>
|
||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
@ -45,7 +46,7 @@ static int videobuf_dvb_thread(void *data)
|
|||||||
struct videobuf_buffer *buf;
|
struct videobuf_buffer *buf;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int err;
|
int err;
|
||||||
struct videobuf_dmabuf *dma;
|
void *outp;
|
||||||
|
|
||||||
dprintk("dvb thread started\n");
|
dprintk("dvb thread started\n");
|
||||||
set_freezable();
|
set_freezable();
|
||||||
@ -66,9 +67,10 @@ static int videobuf_dvb_thread(void *data)
|
|||||||
try_to_freeze();
|
try_to_freeze();
|
||||||
|
|
||||||
/* feed buffer data to demux */
|
/* feed buffer data to demux */
|
||||||
dma=videobuf_to_dma(buf);
|
outp = videobuf_queue_to_vmalloc (&dvb->dvbq, buf);
|
||||||
|
|
||||||
if (buf->state == VIDEOBUF_DONE)
|
if (buf->state == VIDEOBUF_DONE)
|
||||||
dvb_dmx_swfilter(&dvb->demux, dma->vmalloc,
|
dvb_dmx_swfilter(&dvb->demux, outp,
|
||||||
buf->size);
|
buf->size);
|
||||||
|
|
||||||
/* requeue buffer */
|
/* requeue buffer */
|
||||||
|
@ -387,6 +387,7 @@ static struct videobuf_qtype_ops qops = {
|
|||||||
.mmap_mapper = __videobuf_mmap_mapper,
|
.mmap_mapper = __videobuf_mmap_mapper,
|
||||||
.video_copy_to_user = __videobuf_copy_to_user,
|
.video_copy_to_user = __videobuf_copy_to_user,
|
||||||
.copy_stream = __videobuf_copy_stream,
|
.copy_stream = __videobuf_copy_stream,
|
||||||
|
.vmalloc = videobuf_to_vmalloc,
|
||||||
};
|
};
|
||||||
|
|
||||||
void videobuf_queue_vmalloc_init(struct videobuf_queue* q,
|
void videobuf_queue_vmalloc_init(struct videobuf_queue* q,
|
||||||
|
@ -13,6 +13,9 @@
|
|||||||
* the Free Software Foundation; either version 2
|
* the Free Software Foundation; either version 2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef _VIDEOBUF_CORE_H
|
||||||
|
#define _VIDEOBUF_CORE_H
|
||||||
|
|
||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||||
#include <linux/videodev.h>
|
#include <linux/videodev.h>
|
||||||
@ -123,7 +126,8 @@ struct videobuf_queue_ops {
|
|||||||
struct videobuf_qtype_ops {
|
struct videobuf_qtype_ops {
|
||||||
u32 magic;
|
u32 magic;
|
||||||
|
|
||||||
void* (*alloc) (size_t size);
|
void *(*alloc) (size_t size);
|
||||||
|
void *(*vmalloc) (struct videobuf_buffer *buf);
|
||||||
int (*iolock) (struct videobuf_queue* q,
|
int (*iolock) (struct videobuf_queue* q,
|
||||||
struct videobuf_buffer *vb,
|
struct videobuf_buffer *vb,
|
||||||
struct v4l2_framebuffer *fbuf);
|
struct v4l2_framebuffer *fbuf);
|
||||||
@ -185,6 +189,10 @@ int videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb,
|
|||||||
|
|
||||||
void *videobuf_alloc(struct videobuf_queue* q);
|
void *videobuf_alloc(struct videobuf_queue* q);
|
||||||
|
|
||||||
|
/* Used on videobuf-dvb */
|
||||||
|
void *videobuf_queue_to_vmalloc (struct videobuf_queue* q,
|
||||||
|
struct videobuf_buffer *buf);
|
||||||
|
|
||||||
void videobuf_queue_core_init(struct videobuf_queue *q,
|
void videobuf_queue_core_init(struct videobuf_queue *q,
|
||||||
struct videobuf_queue_ops *ops,
|
struct videobuf_queue_ops *ops,
|
||||||
struct device *dev,
|
struct device *dev,
|
||||||
@ -233,10 +241,4 @@ int videobuf_mmap_free(struct videobuf_queue *q);
|
|||||||
int videobuf_mmap_mapper(struct videobuf_queue *q,
|
int videobuf_mmap_mapper(struct videobuf_queue *q,
|
||||||
struct vm_area_struct *vma);
|
struct vm_area_struct *vma);
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Local variables:
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation; either version 2
|
* the Free Software Foundation; either version 2
|
||||||
*/
|
*/
|
||||||
|
#ifndef _VIDEOBUF_VMALLOC_H
|
||||||
|
#define _VIDEOBUF_VMALLOC_H
|
||||||
|
|
||||||
#include <media/videobuf-core.h>
|
#include <media/videobuf-core.h>
|
||||||
|
|
||||||
@ -39,3 +41,5 @@ void videobuf_queue_vmalloc_init(struct videobuf_queue* q,
|
|||||||
void *videobuf_to_vmalloc (struct videobuf_buffer *buf);
|
void *videobuf_to_vmalloc (struct videobuf_buffer *buf);
|
||||||
|
|
||||||
void videobuf_vmalloc_free (struct videobuf_buffer *buf);
|
void videobuf_vmalloc_free (struct videobuf_buffer *buf);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user