|
@@ -25,14 +25,56 @@ struct vb2_dc_conf {
|
|
|
struct vb2_dc_buf {
|
|
|
struct device *dev;
|
|
|
void *vaddr;
|
|
|
- dma_addr_t dma_addr;
|
|
|
unsigned long size;
|
|
|
- struct vm_area_struct *vma;
|
|
|
- atomic_t refcount;
|
|
|
+ dma_addr_t dma_addr;
|
|
|
+
|
|
|
+ /* MMAP related */
|
|
|
struct vb2_vmarea_handler handler;
|
|
|
+ atomic_t refcount;
|
|
|
+
|
|
|
+ /* USERPTR related */
|
|
|
+ struct vm_area_struct *vma;
|
|
|
};
|
|
|
|
|
|
-static void vb2_dc_put(void *buf_priv);
|
|
|
+/*********************************************/
|
|
|
+/* callbacks for all buffers */
|
|
|
+/*********************************************/
|
|
|
+
|
|
|
+static void *vb2_dc_cookie(void *buf_priv)
|
|
|
+{
|
|
|
+ struct vb2_dc_buf *buf = buf_priv;
|
|
|
+
|
|
|
+ return &buf->dma_addr;
|
|
|
+}
|
|
|
+
|
|
|
+static void *vb2_dc_vaddr(void *buf_priv)
|
|
|
+{
|
|
|
+ struct vb2_dc_buf *buf = buf_priv;
|
|
|
+
|
|
|
+ return buf->vaddr;
|
|
|
+}
|
|
|
+
|
|
|
+static unsigned int vb2_dc_num_users(void *buf_priv)
|
|
|
+{
|
|
|
+ struct vb2_dc_buf *buf = buf_priv;
|
|
|
+
|
|
|
+ return atomic_read(&buf->refcount);
|
|
|
+}
|
|
|
+
|
|
|
+/*********************************************/
|
|
|
+/* callbacks for MMAP buffers */
|
|
|
+/*********************************************/
|
|
|
+
|
|
|
+static void vb2_dc_put(void *buf_priv)
|
|
|
+{
|
|
|
+ struct vb2_dc_buf *buf = buf_priv;
|
|
|
+
|
|
|
+ if (!atomic_dec_and_test(&buf->refcount))
|
|
|
+ return;
|
|
|
+
|
|
|
+ dma_free_coherent(buf->dev, buf->size, buf->vaddr, buf->dma_addr);
|
|
|
+ kfree(buf);
|
|
|
+}
|
|
|
|
|
|
static void *vb2_dc_alloc(void *alloc_ctx, unsigned long size)
|
|
|
{
|
|
@@ -63,40 +105,6 @@ static void *vb2_dc_alloc(void *alloc_ctx, unsigned long size)
|
|
|
return buf;
|
|
|
}
|
|
|
|
|
|
-static void vb2_dc_put(void *buf_priv)
|
|
|
-{
|
|
|
- struct vb2_dc_buf *buf = buf_priv;
|
|
|
-
|
|
|
- if (atomic_dec_and_test(&buf->refcount)) {
|
|
|
- dma_free_coherent(buf->dev, buf->size, buf->vaddr,
|
|
|
- buf->dma_addr);
|
|
|
- kfree(buf);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void *vb2_dc_cookie(void *buf_priv)
|
|
|
-{
|
|
|
- struct vb2_dc_buf *buf = buf_priv;
|
|
|
-
|
|
|
- return &buf->dma_addr;
|
|
|
-}
|
|
|
-
|
|
|
-static void *vb2_dc_vaddr(void *buf_priv)
|
|
|
-{
|
|
|
- struct vb2_dc_buf *buf = buf_priv;
|
|
|
- if (!buf)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- return buf->vaddr;
|
|
|
-}
|
|
|
-
|
|
|
-static unsigned int vb2_dc_num_users(void *buf_priv)
|
|
|
-{
|
|
|
- struct vb2_dc_buf *buf = buf_priv;
|
|
|
-
|
|
|
- return atomic_read(&buf->refcount);
|
|
|
-}
|
|
|
-
|
|
|
static int vb2_dc_mmap(void *buf_priv, struct vm_area_struct *vma)
|
|
|
{
|
|
|
struct vb2_dc_buf *buf = buf_priv;
|
|
@@ -110,6 +118,10 @@ static int vb2_dc_mmap(void *buf_priv, struct vm_area_struct *vma)
|
|
|
&vb2_common_vm_ops, &buf->handler);
|
|
|
}
|
|
|
|
|
|
+/*********************************************/
|
|
|
+/* callbacks for USERPTR buffers */
|
|
|
+/*********************************************/
|
|
|
+
|
|
|
static void *vb2_dc_get_userptr(void *alloc_ctx, unsigned long vaddr,
|
|
|
unsigned long size, int write)
|
|
|
{
|
|
@@ -148,6 +160,10 @@ static void vb2_dc_put_userptr(void *mem_priv)
|
|
|
kfree(buf);
|
|
|
}
|
|
|
|
|
|
+/*********************************************/
|
|
|
+/* DMA CONTIG exported functions */
|
|
|
+/*********************************************/
|
|
|
+
|
|
|
const struct vb2_mem_ops vb2_dma_contig_memops = {
|
|
|
.alloc = vb2_dc_alloc,
|
|
|
.put = vb2_dc_put,
|