Merge tag 'v4.8' into patchwork
[cascardo/linux.git] / drivers / media / v4l2-core / videobuf2-dma-contig.c
index 863f658..fb6a177 100644 (file)
@@ -27,7 +27,7 @@ struct vb2_dc_buf {
        unsigned long                   size;
        void                            *cookie;
        dma_addr_t                      dma_addr;
-       struct dma_attrs                attrs;
+       unsigned long                   attrs;
        enum dma_data_direction         dma_dir;
        struct sg_table                 *dma_sgt;
        struct frame_vector             *vec;
@@ -130,32 +130,35 @@ static void vb2_dc_put(void *buf_priv)
                kfree(buf->sgt_base);
        }
        dma_free_attrs(buf->dev, buf->size, buf->cookie, buf->dma_addr,
-                       &buf->attrs);
+                      buf->attrs);
        put_device(buf->dev);
        kfree(buf);
 }
 
-static void *vb2_dc_alloc(struct device *dev, const struct dma_attrs *attrs,
+static void *vb2_dc_alloc(struct device *dev, unsigned long attrs,
                          unsigned long size, enum dma_data_direction dma_dir,
                          gfp_t gfp_flags)
 {
        struct vb2_dc_buf *buf;
 
+       if (WARN_ON(!dev))
+               return ERR_PTR(-EINVAL);
+
        buf = kzalloc(sizeof *buf, GFP_KERNEL);
        if (!buf)
                return ERR_PTR(-ENOMEM);
 
        if (attrs)
-               buf->attrs = *attrs;
+               buf->attrs = attrs;
        buf->cookie = dma_alloc_attrs(dev, size, &buf->dma_addr,
-                                       GFP_KERNEL | gfp_flags, &buf->attrs);
+                                       GFP_KERNEL | gfp_flags, buf->attrs);
        if (!buf->cookie) {
                dev_err(dev, "dma_alloc_coherent of size %ld failed\n", size);
                kfree(buf);
                return ERR_PTR(-ENOMEM);
        }
 
-       if (!dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, &buf->attrs))
+       if ((buf->attrs & DMA_ATTR_NO_KERNEL_MAPPING) == 0)
                buf->vaddr = buf->cookie;
 
        /* Prevent the device from being released while the buffer is used */
@@ -189,7 +192,7 @@ static int vb2_dc_mmap(void *buf_priv, struct vm_area_struct *vma)
        vma->vm_pgoff = 0;
 
        ret = dma_mmap_attrs(buf->dev, vma, buf->cookie,
-               buf->dma_addr, buf->size, &buf->attrs);
+               buf->dma_addr, buf->size, buf->attrs);
 
        if (ret) {
                pr_err("Remapping memory failed, error: %d\n", ret);
@@ -372,7 +375,7 @@ static struct sg_table *vb2_dc_get_base_sgt(struct vb2_dc_buf *buf)
        }
 
        ret = dma_get_sgtable_attrs(buf->dev, sgt, buf->cookie, buf->dma_addr,
-               buf->size, &buf->attrs);
+               buf->size, buf->attrs);
        if (ret < 0) {
                dev_err(buf->dev, "failed to get scatterlist from DMA API\n");
                kfree(sgt);
@@ -421,15 +424,12 @@ static void vb2_dc_put_userptr(void *buf_priv)
        struct page **pages;
 
        if (sgt) {
-               DEFINE_DMA_ATTRS(attrs);
-
-               dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
                /*
                 * No need to sync to CPU, it's already synced to the CPU
                 * since the finish() memop will have been called before this.
                 */
                dma_unmap_sg_attrs(buf->dev, sgt->sgl, sgt->orig_nents,
-                                  buf->dma_dir, &attrs);
+                                  buf->dma_dir, DMA_ATTR_SKIP_CPU_SYNC);
                pages = frame_vector_pages(buf->vec);
                /* sgt should exist only if vector contains pages... */
                BUG_ON(IS_ERR(pages));
@@ -484,9 +484,6 @@ static void *vb2_dc_get_userptr(struct device *dev, unsigned long vaddr,
        struct sg_table *sgt;
        unsigned long contig_size;
        unsigned long dma_align = dma_get_cache_alignment();
-       DEFINE_DMA_ATTRS(attrs);
-
-       dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
 
        /* Only cache aligned DMA transfers are reliable */
        if (!IS_ALIGNED(vaddr | size, dma_align)) {
@@ -499,6 +496,9 @@ static void *vb2_dc_get_userptr(struct device *dev, unsigned long vaddr,
                return ERR_PTR(-EINVAL);
        }
 
+       if (WARN_ON(!dev))
+               return ERR_PTR(-EINVAL);
+
        buf = kzalloc(sizeof *buf, GFP_KERNEL);
        if (!buf)
                return ERR_PTR(-ENOMEM);
@@ -548,7 +548,7 @@ static void *vb2_dc_get_userptr(struct device *dev, unsigned long vaddr,
         * prepare() memop is called.
         */
        sgt->nents = dma_map_sg_attrs(buf->dev, sgt->sgl, sgt->orig_nents,
-                                     buf->dma_dir, &attrs);
+                                     buf->dma_dir, DMA_ATTR_SKIP_CPU_SYNC);
        if (sgt->nents <= 0) {
                pr_err("failed to map scatterlist\n");
                ret = -EIO;
@@ -572,7 +572,7 @@ out:
 
 fail_map_sg:
        dma_unmap_sg_attrs(buf->dev, sgt->sgl, sgt->orig_nents,
-                          buf->dma_dir, &attrs);
+                          buf->dma_dir, DMA_ATTR_SKIP_CPU_SYNC);
 
 fail_sgt_init:
        sg_free_table(sgt);
@@ -679,6 +679,9 @@ static void *vb2_dc_attach_dmabuf(struct device *dev, struct dma_buf *dbuf,
        if (dbuf->size < size)
                return ERR_PTR(-EFAULT);
 
+       if (WARN_ON(!dev))
+               return ERR_PTR(-EINVAL);
+
        buf = kzalloc(sizeof(*buf), GFP_KERNEL);
        if (!buf)
                return ERR_PTR(-ENOMEM);
@@ -749,7 +752,7 @@ EXPORT_SYMBOL_GPL(vb2_dma_contig_memops);
 int vb2_dma_contig_set_max_seg_size(struct device *dev, unsigned int size)
 {
        if (!dev->dma_parms) {
-               dev->dma_parms = kzalloc(sizeof(dev->dma_parms), GFP_KERNEL);
+               dev->dma_parms = kzalloc(sizeof(*dev->dma_parms), GFP_KERNEL);
                if (!dev->dma_parms)
                        return -ENOMEM;
        }