| From 816716fd70ed7b6a8b58c4b71a2237011c90c810 Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Fri, 8 Dec 2017 06:23:11 +0000 |
| Subject: [PATCH 0564/1795] ASoC: rsnd: more clear rsnd_get_dalign() for DALIGN |
| |
| On Renesas sound device, DALIGN which exchanges channel position |
| is needed because SW and HW are using defferent data order if |
| 16bit data. It is not needed when 24bit data. |
| rsnd_get_dalign() returns necessary value, but it was confusable |
| code. This patch makes it more simple. |
| |
| Tested-by: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com> |
| Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| (cherry picked from commit a914e44693d41ba43604afa8c435c98a6d2c7cb1) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| --- |
| sound/soc/sh/rcar/core.c | 33 ++++++++++----------------------- |
| 1 file changed, 10 insertions(+), 23 deletions(-) |
| |
| diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c |
| index d76ad46a6fd9..8e50b284230d 100644 |
| --- a/sound/soc/sh/rcar/core.c |
| +++ b/sound/soc/sh/rcar/core.c |
| @@ -294,11 +294,12 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io) |
| struct rsnd_mod *ssiu = rsnd_io_to_mod_ssiu(io); |
| struct rsnd_mod *target; |
| struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
| - u32 val = 0x76543210; |
| - u32 mask = ~0; |
| |
| /* |
| - * *Hardware* L/R and *Software* L/R are inverted. |
| + * *Hardware* L/R and *Software* L/R are inverted for 16bit data. |
| + * 31..16 15...0 |
| + * HW: [L ch] [R ch] |
| + * SW: [R ch] [L ch] |
| * We need to care about inversion timing to control |
| * Playback/Capture correctly. |
| * The point is [DVC] needs *Hardware* L/R, [MEM] needs *Software* L/R |
| @@ -325,27 +326,13 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io) |
| target = cmd ? cmd : ssiu; |
| } |
| |
| - mask <<= runtime->channels * 4; |
| - val = val & mask; |
| - |
| - switch (runtime->sample_bits) { |
| - case 16: |
| - val |= 0x67452301 & ~mask; |
| - break; |
| - case 32: |
| - val |= 0x76543210 & ~mask; |
| - break; |
| - } |
| - |
| - /* |
| - * exchange channeles on SRC if possible, |
| - * otherwise, R/L volume settings on DVC |
| - * changes inverted channels |
| - */ |
| - if (mod == target) |
| - return val; |
| - else |
| + /* Non target mod or 24bit data needs normal DALIGN */ |
| + if ((runtime->sample_bits != 16) || |
| + (mod != target)) |
| return 0x76543210; |
| + /* Target mod needs inverted DALIGN when 16bit */ |
| + else |
| + return 0x67452301; |
| } |
| |
| u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod) |
| -- |
| 2.19.0 |
| |