| From de42f72714d1b91e061159079898c31c74679ca9 Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Wed, 30 Jul 2014 23:52:26 -0700 |
| Subject: ASoC: rsnd: care audio local bus data format consistency |
| |
| R-Car sound uses Audio Local Bus which uses Lch/Rch format. |
| This bus is used if driver uses BUSIF. |
| But sound data is written as Rch/Lch format in register. |
| This means Rch <-> Lch will be inverted. |
| SSIU :: BUSIF_DALIGN is used to controlling data format. |
| |
| Reported-by: Jun Watanabe <jun.watanabe.ue@renesas.com> |
| Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Signed-off-by: Mark Brown <broonie@linaro.org> |
| (cherry picked from commit 1cc7195929501b96fccce42646f1ad0ffe2598a6) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| sound/soc/sh/rcar/gen.c | 1 + |
| sound/soc/sh/rcar/rsnd.h | 2 ++ |
| sound/soc/sh/rcar/src.c | 19 +++++++++++++++++++ |
| 3 files changed, 22 insertions(+) |
| |
| diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c |
| index 5f9e0722abcf..5db055750991 100644 |
| --- a/sound/soc/sh/rcar/gen.c |
| +++ b/sound/soc/sh/rcar/gen.c |
| @@ -284,6 +284,7 @@ static int rsnd_gen2_probe(struct platform_device *pdev, |
| /* FIXME: it needs SSI_MODE2/3 in the future */ |
| RSND_GEN_M_REG(SSI_BUSIF_MODE, 0x0, 0x80), |
| RSND_GEN_M_REG(SSI_BUSIF_ADINR, 0x4, 0x80), |
| + RSND_GEN_M_REG(BUSIF_DALIGN, 0x8, 0x80), |
| RSND_GEN_M_REG(SSI_CTRL, 0x10, 0x80), |
| RSND_GEN_M_REG(INT_ENABLE, 0x18, 0x80), |
| }; |
| diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h |
| index 631b149df08f..d119adf97c9c 100644 |
| --- a/sound/soc/sh/rcar/rsnd.h |
| +++ b/sound/soc/sh/rcar/rsnd.h |
| @@ -90,6 +90,7 @@ enum rsnd_reg { |
| RSND_REG_SHARE19, |
| RSND_REG_SHARE20, |
| RSND_REG_SHARE21, |
| + RSND_REG_SHARE22, |
| |
| RSND_REG_MAX, |
| }; |
| @@ -127,6 +128,7 @@ enum rsnd_reg { |
| #define RSND_REG_AUDIO_CLK_SEL2 RSND_REG_SHARE19 |
| #define RSND_REG_CMD_CTRL RSND_REG_SHARE20 |
| #define RSND_REG_CMDOUT_TIMSEL RSND_REG_SHARE21 |
| +#define RSND_REG_BUSIF_DALIGN RSND_REG_SHARE22 |
| |
| struct rsnd_of_data; |
| struct rsnd_priv; |
| diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c |
| index 1ef811a26bd7..9183e0145503 100644 |
| --- a/sound/soc/sh/rcar/src.c |
| +++ b/sound/soc/sh/rcar/src.c |
| @@ -110,6 +110,8 @@ int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod, |
| struct rsnd_dai *rdai, |
| int use_busif) |
| { |
| + struct rsnd_dai_stream *io = rsnd_mod_to_io(ssi_mod); |
| + struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
| int ssi_id = rsnd_mod_id(ssi_mod); |
| |
| /* |
| @@ -146,10 +148,27 @@ int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod, |
| * DMA settings for SSIU |
| */ |
| if (use_busif) { |
| + u32 val = 0x76543210; |
| + u32 mask = ~0; |
| + |
| rsnd_mod_write(ssi_mod, SSI_BUSIF_ADINR, |
| rsnd_get_adinr(ssi_mod)); |
| rsnd_mod_write(ssi_mod, SSI_BUSIF_MODE, 1); |
| rsnd_mod_write(ssi_mod, SSI_CTRL, 0x1); |
| + |
| + mask <<= runtime->channels * 4; |
| + val = val & mask; |
| + |
| + switch (runtime->sample_bits) { |
| + case 16: |
| + val |= 0x67452301 & ~mask; |
| + break; |
| + case 32: |
| + val |= 0x76543210 & ~mask; |
| + break; |
| + } |
| + rsnd_mod_write(ssi_mod, BUSIF_DALIGN, val); |
| + |
| } |
| |
| return 0; |
| -- |
| 2.1.2 |
| |