mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-20 18:54:09 +08:00
9bdca822cb
As we are now passing the filter data as pointers to the drivers, we can take the final step and also pass the filter function the same way. I'm keeping this change separate, as there it's less obvious that this is a net win. Upsides of this are: - The ASoC drivers are completely independent from the DMA engine implementation, which simplifies the Kconfig logic and in theory allows the same sound drivers to be built in a kernel that supports different kinds of dmaengine drivers. - Consistency with other subsystems and drivers On the other hand, we have a few downsides: - The s3c24xx-dma driver now needs to be built-in for the ac97 platform device to be instantiated on s3c2440. - samsung_dmaengine_pcm_config cannot be marked 'const' any more because the filter function pointer needs to be set at runtime. This is safe as long we don't have multiple different DMA engines in thet same system at runtime, but is nonetheless ugly. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Signed-off-by: Mark Brown <broonie@kernel.org>
76 lines
2.3 KiB
C
76 lines
2.3 KiB
C
/*
|
|
* dmaengine.c - Samsung dmaengine wrapper
|
|
*
|
|
* Author: Mark Brown <broonie@linaro.org>
|
|
* Copyright 2013 Linaro
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/amba/pl08x.h>
|
|
#include <linux/platform_data/dma-s3c24xx.h>
|
|
|
|
#include <sound/core.h>
|
|
#include <sound/pcm.h>
|
|
#include <sound/pcm_params.h>
|
|
#include <sound/dmaengine_pcm.h>
|
|
#include <sound/soc.h>
|
|
#include <sound/soc-dai.h>
|
|
|
|
#include "dma.h"
|
|
|
|
static struct snd_dmaengine_pcm_config samsung_dmaengine_pcm_config = {
|
|
.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
|
|
};
|
|
|
|
void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
|
|
struct s3c_dma_params *playback,
|
|
struct s3c_dma_params *capture)
|
|
{
|
|
struct snd_dmaengine_dai_dma_data *playback_data = NULL;
|
|
struct snd_dmaengine_dai_dma_data *capture_data = NULL;
|
|
|
|
if (playback) {
|
|
playback_data = &playback->dma_data;
|
|
playback_data->filter_data = playback->slave;
|
|
playback_data->chan_name = playback->ch_name;
|
|
playback_data->addr = playback->dma_addr;
|
|
playback_data->addr_width = playback->dma_size;
|
|
}
|
|
if (capture) {
|
|
capture_data = &capture->dma_data;
|
|
capture_data->filter_data = capture->slave;
|
|
capture_data->chan_name = capture->ch_name;
|
|
capture_data->addr = capture->dma_addr;
|
|
capture_data->addr_width = capture->dma_size;
|
|
}
|
|
|
|
snd_soc_dai_init_dma_data(dai, playback_data, capture_data);
|
|
}
|
|
EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data);
|
|
|
|
int samsung_asoc_dma_platform_register(struct device *dev,
|
|
dma_filter_fn filter)
|
|
{
|
|
samsung_dmaengine_pcm_config.compat_filter_fn = filter;
|
|
|
|
return devm_snd_dmaengine_pcm_register(dev,
|
|
&samsung_dmaengine_pcm_config,
|
|
SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME |
|
|
SND_DMAENGINE_PCM_FLAG_COMPAT);
|
|
}
|
|
EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register);
|
|
|
|
MODULE_AUTHOR("Mark Brown <broonie@linaro.org>");
|
|
MODULE_DESCRIPTION("Samsung dmaengine ASoC driver");
|
|
MODULE_LICENSE("GPL");
|