ALSA: memalloc: Make SG-buffer helper usable for continuous buffer, too
authorTakashi Iwai <tiwai@suse.de>
Mon, 15 Jun 2020 16:00:44 +0000 (18:00 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 15 Jun 2020 16:01:52 +0000 (18:01 +0200)
We have a few helper functions for making the access to the buffer
address easier on SG-buffer.  Those are specific to the buffer that is
allocated with SG-buffer type, and it makes hard to use both SG and
non-SG buffers in the same code.

This patch adds a few simple checks and lets the helpers to deal with
both SG- and continuous buffers gracefully.  It's a preliminary step
for the upcoming patch that mimics the buffer type on the fly.

Link: https://lore.kernel.org/r/20200615160045.2703-4-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/memalloc.h
sound/core/sgbuf.c

index 3b47832..5daa937 100644 (file)
@@ -94,7 +94,11 @@ static inline dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab,
                                           size_t offset)
 {
        struct snd_sg_buf *sgbuf = dmab->private_data;
-       dma_addr_t addr = sgbuf->table[offset >> PAGE_SHIFT].addr;
+       dma_addr_t addr;
+
+       if (!sgbuf)
+               return dmab->addr + offset;
+       addr = sgbuf->table[offset >> PAGE_SHIFT].addr;
        addr &= ~((dma_addr_t)PAGE_SIZE - 1);
        return addr + offset % PAGE_SIZE;
 }
@@ -106,6 +110,9 @@ static inline void *snd_sgbuf_get_ptr(struct snd_dma_buffer *dmab,
                                     size_t offset)
 {
        struct snd_sg_buf *sgbuf = dmab->private_data;
+
+       if (!sgbuf)
+               return dmab->area + offset;
        return sgbuf->table[offset >> PAGE_SHIFT].buf + offset % PAGE_SIZE;
 }
 
index c42217e..29ddb76 100644 (file)
@@ -142,6 +142,9 @@ unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
        struct snd_sg_buf *sg = dmab->private_data;
        unsigned int start, end, pg;
 
+       if (!sg)
+               return size;
+
        start = ofs >> PAGE_SHIFT;
        end = (ofs + size - 1) >> PAGE_SHIFT;
        /* check page continuity */