Merge tag 'kbuild-v5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[linux-2.6-microblaze.git] / sound / core / sgbuf.c
index 232cf3f..8352a5c 100644 (file)
@@ -43,8 +43,8 @@ static void snd_dma_sg_free(struct snd_dma_buffer *dmab)
        dmab->area = NULL;
 
        tmpb.dev.type = SNDRV_DMA_TYPE_DEV;
-       if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_UC_SG)
-               tmpb.dev.type = SNDRV_DMA_TYPE_DEV_UC;
+       if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG)
+               tmpb.dev.type = SNDRV_DMA_TYPE_DEV_WC;
        tmpb.dev.dev = sgbuf->dev;
        for (i = 0; i < sgbuf->pages; i++) {
                if (!(sgbuf->table[i].addr & ~PAGE_MASK))
@@ -63,7 +63,7 @@ static void snd_dma_sg_free(struct snd_dma_buffer *dmab)
 
 #define MAX_ALLOC_PAGES                32
 
-static int snd_dma_sg_alloc(struct snd_dma_buffer *dmab, size_t size)
+static void *snd_dma_sg_alloc(struct snd_dma_buffer *dmab, size_t size)
 {
        struct snd_sg_buf *sgbuf;
        unsigned int i, pages, chunk, maxpages;
@@ -72,12 +72,13 @@ static int snd_dma_sg_alloc(struct snd_dma_buffer *dmab, size_t size)
        struct page **pgtable;
        int type = SNDRV_DMA_TYPE_DEV;
        pgprot_t prot = PAGE_KERNEL;
+       void *area;
 
        dmab->private_data = sgbuf = kzalloc(sizeof(*sgbuf), GFP_KERNEL);
        if (!sgbuf)
-               return -ENOMEM;
-       if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_UC_SG) {
-               type = SNDRV_DMA_TYPE_DEV_UC;
+               return NULL;
+       if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG) {
+               type = SNDRV_DMA_TYPE_DEV_WC;
 #ifdef pgprot_noncached
                prot = pgprot_noncached(PAGE_KERNEL);
 #endif
@@ -127,14 +128,14 @@ static int snd_dma_sg_alloc(struct snd_dma_buffer *dmab, size_t size)
        }
 
        sgbuf->size = size;
-       dmab->area = vmap(sgbuf->page_table, sgbuf->pages, VM_MAP, prot);
-       if (! dmab->area)
+       area = vmap(sgbuf->page_table, sgbuf->pages, VM_MAP, prot);
+       if (!area)
                goto _failed;
-       return 0;
+       return area;
 
  _failed:
        snd_dma_sg_free(dmab); /* free the table */
-       return -ENOMEM;
+       return NULL;
 }
 
 static dma_addr_t snd_dma_sg_get_addr(struct snd_dma_buffer *dmab,
@@ -182,10 +183,19 @@ static unsigned int snd_dma_sg_get_chunk_size(struct snd_dma_buffer *dmab,
        return size;
 }
 
+static int snd_dma_sg_mmap(struct snd_dma_buffer *dmab,
+                          struct vm_area_struct *area)
+{
+       if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG)
+               area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
+       return -ENOENT; /* continue with the default mmap handler */
+}
+
 const struct snd_malloc_ops snd_dma_sg_ops = {
        .alloc = snd_dma_sg_alloc,
        .free = snd_dma_sg_free,
        .get_addr = snd_dma_sg_get_addr,
        .get_page = snd_dma_sg_get_page,
        .get_chunk_size = snd_dma_sg_get_chunk_size,
+       .mmap = snd_dma_sg_mmap,
 };