Date:2013-04-03 11:06:02 (9 years 5 months ago)
Author:Lars C.
Commit:8b5cdb8c7416236d8c10188d1269b11689d84855
Message:ASoC: dmaengine-pcm: Add a common DAI DMA data struct

This patch adds a common DMA data struct which can be used by DAI drivers to
communicate their DMA configuration requirements to the DMA pcm driver. Having
a common data structure for this allows us to implement common functions on top
of them, which can be used by multiple platforms.

This patch also introduces a new function to initialize certain fields of a
dma_slave_config struct from the common DAI DMA data struct.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Reviewed-by: Stephen Warren <swarren@nvidia.com>
Tested-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Files: include/sound/dmaengine_pcm.h (1 diff)
sound/soc/soc-dmaengine-pcm.c (1 diff)

Change Details

include/sound/dmaengine_pcm.h
4444
4545struct dma_chan *snd_dmaengine_pcm_get_chan(struct snd_pcm_substream *substream);
4646
47/**
48 * struct snd_dmaengine_dai_dma_data - DAI DMA configuration data
49 * @addr: Address of the DAI data source or destination register.
50 * @addr_width: Width of the DAI data source or destination register.
51 * @maxburst: Maximum number of words(note: words, as in units of the
52 * src_addr_width member, not bytes) that can be send to or received from the
53 * DAI in one burst.
54 * @slave_id: Slave requester id for the DMA channel.
55 * @filter_data: Custom DMA channel filter data, this will usually be used when
56 * requesting the DMA channel.
57 */
58struct snd_dmaengine_dai_dma_data {
59    dma_addr_t addr;
60    enum dma_slave_buswidth addr_width;
61    u32 maxburst;
62    unsigned int slave_id;
63    void *filter_data;
64};
65
66void snd_dmaengine_pcm_set_config_from_dai_data(
67    const struct snd_pcm_substream *substream,
68    const struct snd_dmaengine_dai_dma_data *dma_data,
69    struct dma_slave_config *config);
70
4771#endif
sound/soc/soc-dmaengine-pcm.c
9595}
9696EXPORT_SYMBOL_GPL(snd_hwparams_to_dma_slave_config);
9797
98/**
99 * snd_dmaengine_pcm_set_config_from_dai_data() - Initializes a dma slave config
100 * using DAI DMA data.
101 * @substream: PCM substream
102 * @dma_data: DAI DMA data
103 * @slave_config: DMA slave configuration
104 *
105 * Initializes the {dst,src}_addr, {dst,src}_maxburst, {dst,src}_addr_width and
106 * slave_id fields of the DMA slave config from the same fields of the DAI DMA
107 * data struct. The src and dst fields will be initialized depending on the
108 * direction of the substream. If the substream is a playback stream the dst
109 * fields will be initialized, if it is a capture stream the src fields will be
110 * initialized. The {dst,src}_addr_width field will only be initialized if the
111 * addr_width field of the DAI DMA data struct is not equal to
112 * DMA_SLAVE_BUSWIDTH_UNDEFINED.
113 */
114void snd_dmaengine_pcm_set_config_from_dai_data(
115    const struct snd_pcm_substream *substream,
116    const struct snd_dmaengine_dai_dma_data *dma_data,
117    struct dma_slave_config *slave_config)
118{
119    if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
120        slave_config->dst_addr = dma_data->addr;
121        slave_config->dst_maxburst = dma_data->maxburst;
122        if (dma_data->addr_width != DMA_SLAVE_BUSWIDTH_UNDEFINED)
123            slave_config->dst_addr_width = dma_data->addr_width;
124    } else {
125        slave_config->src_addr = dma_data->addr;
126        slave_config->src_maxburst = dma_data->maxburst;
127        if (dma_data->addr_width != DMA_SLAVE_BUSWIDTH_UNDEFINED)
128            slave_config->src_addr_width = dma_data->addr_width;
129    }
130
131    slave_config->slave_id = dma_data->slave_id;
132}
133EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_set_config_from_dai_data);
134
98135static void dmaengine_pcm_dma_complete(void *arg)
99136{
100137    struct snd_pcm_substream *substream = arg;

Archive Download the corresponding diff file



interactive