Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: pcm_dmaengine: Remove hardcoded PCM formats

Use the standard PCM helper function to figure out the sample bytes
instead of hardcodec PCM format checks in
snd_hwparams_to_dma_slave_config().

The patch also extends the format check for 8 bytes formats although
no one should match so far.

Acked-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

+11 -15
+11 -15
sound/core/pcm_dmaengine.c
··· 63 63 struct dma_slave_config *slave_config) 64 64 { 65 65 enum dma_slave_buswidth buswidth; 66 + int bits; 66 67 67 - switch (params_format(params)) { 68 - case SNDRV_PCM_FORMAT_S8: 69 - buswidth = DMA_SLAVE_BUSWIDTH_1_BYTE; 70 - break; 71 - case SNDRV_PCM_FORMAT_S16_LE: 72 - buswidth = DMA_SLAVE_BUSWIDTH_2_BYTES; 73 - break; 74 - case SNDRV_PCM_FORMAT_S18_3LE: 75 - case SNDRV_PCM_FORMAT_S20_3LE: 76 - case SNDRV_PCM_FORMAT_S24_LE: 77 - case SNDRV_PCM_FORMAT_S32_LE: 78 - buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES; 79 - break; 80 - default: 68 + bits = snd_pcm_format_physical_width(params_format(params)); 69 + if (bits < 8 || bits > 64) 81 70 return -EINVAL; 82 - } 71 + else if (bits == 8) 72 + buswidth = DMA_SLAVE_BUSWIDTH_1_BYTE; 73 + else if (bits == 16) 74 + buswidth = DMA_SLAVE_BUSWIDTH_2_BYTES; 75 + else if (bits <= 32) 76 + buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES; 77 + else 78 + buswidth = DMA_SLAVE_BUSWIDTH_8_BYTES; 83 79 84 80 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 85 81 slave_config->direction = DMA_MEM_TO_DEV;