return cma_release(dev_get_cma_area(dev), pages, count);
 }
 
+static struct page *cma_alloc_aligned(struct cma *cma, size_t size, gfp_t gfp)
+{
+       unsigned int align = min(get_order(size), CONFIG_CMA_ALIGNMENT);
+
+       return cma_alloc(cma, size >> PAGE_SHIFT, align, gfp & __GFP_NOWARN);
+}
+
 /**
  * dma_alloc_contiguous() - allocate contiguous pages
  * @dev:   Pointer to device for which the allocation is performed.
  */
 struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp)
 {
-       size_t count = size >> PAGE_SHIFT;
-       struct page *page = NULL;
-       struct cma *cma = NULL;
-
-       if (dev && dev->cma_area)
-               cma = dev->cma_area;
-       else if (count > 1)
-               cma = dma_contiguous_default_area;
-
        /* CMA can be used only in the context which permits sleeping */
-       if (cma && gfpflags_allow_blocking(gfp)) {
-               size_t align = get_order(size);
-               size_t cma_align = min_t(size_t, align, CONFIG_CMA_ALIGNMENT);
-
-               page = cma_alloc(cma, count, cma_align, gfp & __GFP_NOWARN);
-       }
-
-       return page;
+       if (!gfpflags_allow_blocking(gfp))
+               return NULL;
+       if (dev->cma_area)
+               return cma_alloc_aligned(dev->cma_area, size, gfp);
+       if (size <= PAGE_SIZE || !dma_contiguous_default_area)
+               return NULL;
+       return cma_alloc_aligned(dma_contiguous_default_area, size, gfp);
 }
 
 /**