提交 59d34489 编写于 作者: M Mauro Carvalho Chehab

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: NMauro Carvalho Chehab <mchehab@infradead.org>
上级 3b5fa928
...@@ -94,6 +94,13 @@ int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb, ...@@ -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) ...@@ -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 = { ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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 @@ ...@@ -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 { ...@@ -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, ...@@ -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); ...@@ -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 @@ ...@@ -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, ...@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册