summaryrefslogtreecommitdiffstats
path: root/sound/soc/sh/rcar/gen.c
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2014-06-22 17:56:23 -0700
committerMark Brown <broonie@linaro.org>2014-06-28 14:41:19 +0100
commitd9288d0ba12de1b5efb830b9128e4cc6877318fc (patch)
treef02a9aabd4c12c16bb320e18b827270a25b48689 /sound/soc/sh/rcar/gen.c
parent8457e0e9e274cae4898f84dd5aaeb5d2098126c8 (diff)
downloadop-kernel-dev-d9288d0ba12de1b5efb830b9128e4cc6877318fc.zip
op-kernel-dev-d9288d0ba12de1b5efb830b9128e4cc6877318fc.tar.gz
ASoC: rsnd: SSI + DMA can select BUSIF
Sound data needs to be sent to R-Car sound SSI when playback. But, there are 2 interfaces for it. 1st is SSITDR/SSIRDR which are mapped on SSI. 2nd is SSIn_BUSIF which are mapped on SSIU. 2nd SSIn_BUSIF is used when DMA transfer, and it is always used if sound data came from via SRC. But, we can use it when SSI+DMA case too. (Current driver is assuming 1st SSITDR/SSIRDR for it) 2nd SSIn_BUSIF can be used as FIFO. This is very helpful/useful for SSI+DMA. But DMA address / DMA ID are not same between 1st/2nd cases. This patch care about these settings. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/sh/rcar/gen.c')
-rw-r--r--sound/soc/sh/rcar/gen.c64
1 files changed, 41 insertions, 23 deletions
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 0280a11..46677af 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -165,15 +165,19 @@ static int rsnd_gen_regmap_init(struct rsnd_priv *priv,
*
* ex) R-Car H2 case
* mod / DMAC in / DMAC out / DMAC PP in / DMAC pp out
- * SSI : 0xec541000 / 0xec241008 / 0xec24100c / 0xec400000 / 0xec400000
+ * SSI : 0xec541000 / 0xec241008 / 0xec24100c
+ * SSIU: 0xec541000 / 0xec100000 / 0xec100000 / 0xec400000 / 0xec400000
* SCU : 0xec500000 / 0xec000000 / 0xec004000 / 0xec300000 / 0xec304000
* CMD : 0xec500000 / 0xec008000 0xec308000
*/
#define RDMA_SSI_I_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0x8)
#define RDMA_SSI_O_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0xc)
-#define RDMA_SSI_I_P(addr, i) (addr ##_reg - 0x00141000 + (0x1000 * i))
-#define RDMA_SSI_O_P(addr, i) (addr ##_reg - 0x00141000 + (0x1000 * i))
+#define RDMA_SSIU_I_N(addr, i) (addr ##_reg - 0x00441000 + (0x1000 * i))
+#define RDMA_SSIU_O_N(addr, i) (addr ##_reg - 0x00441000 + (0x1000 * i))
+
+#define RDMA_SSIU_I_P(addr, i) (addr ##_reg - 0x00141000 + (0x1000 * i))
+#define RDMA_SSIU_O_P(addr, i) (addr ##_reg - 0x00141000 + (0x1000 * i))
#define RDMA_SRC_I_N(addr, i) (addr ##_reg - 0x00500000 + (0x400 * i))
#define RDMA_SRC_O_N(addr, i) (addr ##_reg - 0x004fc000 + (0x400 * i))
@@ -204,26 +208,36 @@ static void rsnd_gen2_dma_addr(struct rsnd_priv *priv,
struct dma_addr {
dma_addr_t src_addr;
dma_addr_t dst_addr;
- } dma_addrs[2][2][3] = {
- { /* SRC */
- /* Capture */
- {{ 0, 0 },
- { RDMA_SRC_O_N(src, id), 0 },
- { RDMA_CMD_O_N(src, id), 0 }},
- /* Playback */
- {{ 0, 0, },
- { 0, RDMA_SRC_I_N(src, id) },
- { 0, RDMA_SRC_I_N(src, id) }}
- }, { /* SSI */
- /* Capture */
- {{ RDMA_SSI_O_N(ssi, id), 0 },
- { RDMA_SSI_O_P(ssi, id), RDMA_SRC_I_P(src, id) },
- { RDMA_SSI_O_P(ssi, id), RDMA_SRC_I_P(src, id) }},
- /* Playback */
- {{ 0, RDMA_SSI_I_N(ssi, id) },
- { RDMA_SRC_O_P(src, id), RDMA_SSI_I_P(ssi, id) },
- { RDMA_CMD_O_P(src, id), RDMA_SSI_I_P(ssi, id) }}
- }
+ } dma_addrs[3][2][3] = {
+ /* SRC */
+ {{{ 0, 0 },
+ /* Capture */
+ { RDMA_SRC_O_N(src, id), 0 },
+ { RDMA_CMD_O_N(src, id), 0 } },
+ /* Playback */
+ {{ 0, 0, },
+ { 0, RDMA_SRC_I_N(src, id) },
+ { 0, RDMA_SRC_I_N(src, id) } }
+ },
+ /* SSI */
+ /* Capture */
+ {{{ RDMA_SSI_O_N(ssi, id), 0 },
+ { 0, 0 },
+ { 0, 0 } },
+ /* Playback */
+ {{ 0, RDMA_SSI_I_N(ssi, id) },
+ { 0, 0 },
+ { 0, 0 } }
+ },
+ /* SSIU */
+ /* Capture */
+ {{{ RDMA_SSIU_O_N(ssi, id), 0 },
+ { RDMA_SSIU_O_P(ssi, id), RDMA_SRC_I_P(src, id) },
+ { RDMA_SSIU_O_P(ssi, id), RDMA_SRC_I_P(src, id) } },
+ /* Playback */
+ {{ 0, RDMA_SSIU_I_N(ssi, id) },
+ { RDMA_SRC_O_P(src, id), RDMA_SSIU_I_P(ssi, id) },
+ { RDMA_CMD_O_P(src, id), RDMA_SSIU_I_P(ssi, id) } } },
};
/* it shouldn't happen */
@@ -232,6 +246,10 @@ static void rsnd_gen2_dma_addr(struct rsnd_priv *priv,
return;
}
+ /* use SSIU or SSI ? */
+ if (is_ssi && (0 == strcmp(rsnd_mod_dma_name(mod), "ssiu")))
+ is_ssi++;
+
cfg->src_addr = dma_addrs[is_ssi][is_play][use_src + use_dvc].src_addr;
cfg->dst_addr = dma_addrs[is_ssi][is_play][use_src + use_dvc].dst_addr;
OpenPOWER on IntegriCloud