Skip to content

Commit

Permalink
ASoC: rsnd: fix DALIGN register for SSIU
Browse files Browse the repository at this point in the history
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: a914e44 ("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>
  • Loading branch information
Nilkanth Ahirrao authored and Mark Brown committed Nov 22, 2019
1 parent 0bb8877 commit ef8e147
Showing 1 changed file with 18 additions and 2 deletions.
20 changes: 18 additions & 2 deletions sound/soc/sh/rcar/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit ef8e147

Please sign in to comment.