1 /* 2 * linux/sound/arm/ep93xx-pcm.c - EP93xx ALSA PCM interface 3 * 4 * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org> 5 * Copyright (C) 2006 Applied Data Systems 6 * 7 * Rewritten for the SoC audio subsystem (Based on PXA2xx code): 8 * Copyright (c) 2008 Ryan Mallon 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License version 2 as 12 * published by the Free Software Foundation. 13 */ 14 15 #include <linux/module.h> 16 #include <linux/init.h> 17 #include <linux/platform_device.h> 18 #include <linux/dmaengine.h> 19 20 #include <sound/pcm.h> 21 #include <sound/soc.h> 22 #include <sound/dmaengine_pcm.h> 23 24 #include <linux/platform_data/dma-ep93xx.h> 25 26 #include "ep93xx-pcm.h" 27 28 static const struct snd_pcm_hardware ep93xx_pcm_hardware = { 29 .info = (SNDRV_PCM_INFO_MMAP | 30 SNDRV_PCM_INFO_MMAP_VALID | 31 SNDRV_PCM_INFO_INTERLEAVED | 32 SNDRV_PCM_INFO_BLOCK_TRANSFER), 33 .buffer_bytes_max = 131072, 34 .period_bytes_min = 32, 35 .period_bytes_max = 32768, 36 .periods_min = 1, 37 .periods_max = 32, 38 .fifo_size = 32, 39 }; 40 41 static bool ep93xx_pcm_dma_filter(struct dma_chan *chan, void *filter_param) 42 { 43 struct ep93xx_dma_data *data = filter_param; 44 45 if (data->direction == ep93xx_dma_chan_direction(chan)) { 46 chan->private = data; 47 return true; 48 } 49 50 return false; 51 } 52 53 static const struct snd_dmaengine_pcm_config ep93xx_dmaengine_pcm_config = { 54 .pcm_hardware = &ep93xx_pcm_hardware, 55 .compat_filter_fn = ep93xx_pcm_dma_filter, 56 .prealloc_buffer_size = 131072, 57 }; 58 59 int devm_ep93xx_pcm_platform_register(struct device *dev) 60 { 61 return devm_snd_dmaengine_pcm_register(dev, 62 &ep93xx_dmaengine_pcm_config, 63 SND_DMAENGINE_PCM_FLAG_NO_DT | 64 SND_DMAENGINE_PCM_FLAG_COMPAT); 65 } 66 EXPORT_SYMBOL_GPL(devm_ep93xx_pcm_platform_register); 67 68 MODULE_AUTHOR("Ryan Mallon"); 69 MODULE_DESCRIPTION("EP93xx ALSA PCM interface"); 70 MODULE_LICENSE("GPL"); 71