Previously, I2S driver only can support system dma. In this patch, i2s driver can support internal dma too.
Signed-off-by: Sangbeom Kim sbkim73@samsung.com --- sound/soc/samsung/i2s.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c index 1568eea..8b29c78 100644 --- a/sound/soc/samsung/i2s.c +++ b/sound/soc/samsung/i2s.c @@ -21,6 +21,7 @@ #include <plat/audio.h>
#include "dma.h" +#include "idma.h" #include "i2s.h" #include "i2s-regs.h"
@@ -544,9 +545,12 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, { struct i2s_dai *i2s = to_info(dai); u32 mod = readl(i2s->addr + I2SMOD); + u32 ahb = 0;
if (!is_secondary(i2s)) mod &= ~(MOD_DC2_EN | MOD_DC1_EN); + else + ahb = readl(i2s->addr + I2SAHB);
switch (params_channels(params)) { case 6: @@ -600,6 +604,13 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, params_format(params)); return -EINVAL; } + + if (is_secondary(i2s)) { + ahb |= (AHB_DMARLD | AHB_INTMASK); + mod |= MOD_TXS_IDMA; + writel(ahb, i2s->addr + I2SAHB); + } + writel(mod, i2s->addr + I2SMOD);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -1068,6 +1079,8 @@ static __devinit int samsung_i2s_probe(struct platform_device *pdev) ret = -ENOMEM; goto err2; } + idma_reg_addr_init((void *)ioremap(regs_base, 0x100), + i2s_cfg->idma_addr); sec_dai->dma_playback.dma_addr = regs_base + I2STXDS; sec_dai->dma_playback.client = (struct s3c2410_dma_client *)&sec_dai->dma_playback;