| From 273a1c66546f9045c0a832abefe6271b6067f606 Mon Sep 17 00:00:00 2001 |
| From: Nilkanth Ahirrao <anilkanth@jp.adit-jv.com> |
| Date: Thu, 21 Nov 2019 12:10:23 +0100 |
| Subject: [PATCH] ASoC: rsnd: fix DALIGN register for SSIU |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit ef8e14794308a428b194f8b06ad9ae06b43466e4 upstream. |
| |
| The current driver only sets 0x76543210 and 0x67452301 for DALIGN. |
| This doesn’t work well for TDM split and ex-split mode for all SSIU. |
| This patch programs the DALIGN registers based on the SSIU number. |
| |
| Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Cc: Jiada Wang <jiada_wang@mentor.com> |
| Cc: Andrew Gabbasov <andrew_gabbasov@mentor.com> |
| Fixes: a914e44693d41b ("ASoC: rsnd: more clear rsnd_get_dalign() for DALIGN") |
| Signed-off-by: Nilkanth Ahirrao <anilkanth@jp.adit-jv.com> |
| Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com> |
| Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Link: https://lore.kernel.org/r/20191121111023.10976-1-erosca@de.adit-jv.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c |
| index 4579827ea7c7..3e49a22f18ec 100644 |
| --- a/sound/soc/sh/rcar/core.c |
| +++ b/sound/soc/sh/rcar/core.c |
| @@ -376,6 +376,17 @@ u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io) |
| */ |
| u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io) |
| { |
| + static const u32 dalign_values[8][2] = { |
| + {0x76543210, 0x67452301}, |
| + {0x00000032, 0x00000023}, |
| + {0x00007654, 0x00006745}, |
| + {0x00000076, 0x00000067}, |
| + {0xfedcba98, 0xefcdab89}, |
| + {0x000000ba, 0x000000ab}, |
| + {0x0000fedc, 0x0000efcd}, |
| + {0x000000fe, 0x000000ef}, |
| + }; |
| + int id = 0, inv; |
| struct rsnd_mod *ssiu = rsnd_io_to_mod_ssiu(io); |
| struct rsnd_mod *target; |
| struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
| @@ -411,13 +422,18 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io) |
| target = cmd ? cmd : ssiu; |
| } |
| |
| + if (mod == ssiu) |
| + id = rsnd_mod_id_sub(mod); |
| + |
| /* Non target mod or non 16bit needs normal DALIGN */ |
| if ((snd_pcm_format_width(runtime->format) != 16) || |
| (mod != target)) |
| - return 0x76543210; |
| + inv = 0; |
| /* Target mod needs inverted DALIGN when 16bit */ |
| else |
| - return 0x67452301; |
| + inv = 1; |
| + |
| + return dalign_values[id][inv]; |
| } |
| |
| u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod) |
| -- |
| 2.7.4 |
| |