From 64eae986fc1e3a281b00f04b7c9c00b145ec8a57 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Wed, 18 Jun 2014 17:54:43 +0900 Subject: [PATCH 1/2] ASoC: rsnd: fixup rsnd_gen_dma_addr() for Gen1 ad32d0c7b0e993433df152ae747652647eb65a27 (ASoC: rsnd: add rsnd_gen_dma_addr() for DMAC addr) added rsnd_gen_dma_addr() to calculate DMA addr, but, it is necessary only for Gen2. This patch ignores Gen1 case. Kernel will be panic without this patch. Special thanks to Simon Reported-by: Simon Horman Signed-off-by: Kuninori Morimoto Tested-by: Simon Horman Signed-off-by: Mark Brown --- sound/soc/sh/rcar/gen.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c index 1dd2b7d38c2c..0280a11c0899 100644 --- a/sound/soc/sh/rcar/gen.c +++ b/sound/soc/sh/rcar/gen.c @@ -184,7 +184,7 @@ static int rsnd_gen_regmap_init(struct rsnd_priv *priv, #define RDMA_CMD_O_N(addr, i) (addr ##_reg - 0x004f8000 + (0x400 * i)) #define RDMA_CMD_O_P(addr, i) (addr ##_reg - 0x001f8000 + (0x400 * i)) -void rsnd_gen_dma_addr(struct rsnd_priv *priv, +static void rsnd_gen2_dma_addr(struct rsnd_priv *priv, struct rsnd_dma *dma, struct dma_slave_config *cfg, int is_play, int slave_id) @@ -226,17 +226,6 @@ void rsnd_gen_dma_addr(struct rsnd_priv *priv, } }; - cfg->slave_id = slave_id; - cfg->src_addr = 0; - cfg->dst_addr = 0; - cfg->direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; - - /* - * gen1 uses default DMA addr - */ - if (rsnd_is_gen1(priv)) - return; - /* it shouldn't happen */ if (use_dvc & !use_src) { dev_err(dev, "DVC is selected without SRC\n"); @@ -250,6 +239,26 @@ void rsnd_gen_dma_addr(struct rsnd_priv *priv, id, cfg->src_addr, cfg->dst_addr); } +void rsnd_gen_dma_addr(struct rsnd_priv *priv, + struct rsnd_dma *dma, + struct dma_slave_config *cfg, + int is_play, int slave_id) +{ + cfg->slave_id = slave_id; + cfg->src_addr = 0; + cfg->dst_addr = 0; + cfg->direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; + + /* + * gen1 uses default DMA addr + */ + if (rsnd_is_gen1(priv)) + return; + + rsnd_gen2_dma_addr(priv, dma, cfg, is_play, slave_id); +} + + /* * Gen2 */ From c08c3b088053cec1465051258844e7934d3e3e37 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Wed, 18 Jun 2014 17:55:09 +0900 Subject: [PATCH 2/2] ASoC: rsnd: fixup loop exit timing of dma name search Current dma name search loop didn't care about SSI index This patch fixes it. Signed-off-by: Kuninori Morimoto Signed-off-by: Mark Brown --- sound/soc/sh/rcar/core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index 4e86265f625c..ed76901f8202 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c @@ -297,7 +297,6 @@ static void rsnd_dma_of_name(struct rsnd_dma *dma, for (i = 1; i < MOD_MAX; i++) { if (!src) { mod[i] = ssi; - break; } else if (!dvc) { mod[i] = src; src = NULL; @@ -308,6 +307,9 @@ static void rsnd_dma_of_name(struct rsnd_dma *dma, if (mod[i] == this) index = i; + + if (mod[i] == ssi) + break; } if (is_play) {