ASoC: rsnd: Calculate DALIGN inversion at run-time
There is no need to store the inverted DALIGN values in the table, as they can easily be calculated at run-time. This also protects against the introduction of inconsistencies between normal and inverted values by a future table modification. Reorder the two subexpressions in the AND check, to perform the least expensive check first. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Reviewed-by: Eugeniu Rosca <erosca@de.adit-jv.com> Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Link: https://lore.kernel.org/r/20191202155834.22582-1-geert+renesas@glider.be Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
3176f94c46
commit
49df1e3925
|
@ -376,20 +376,15 @@ 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},
|
||||
static const u32 dalign_values[8] = {
|
||||
0x76543210, 0x00000032, 0x00007654, 0x00000076,
|
||||
0xfedcba98, 0x000000ba, 0x0000fedc, 0x000000fe,
|
||||
};
|
||||
int id = 0, inv;
|
||||
int id = 0;
|
||||
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 dalign;
|
||||
|
||||
/*
|
||||
* *Hardware* L/R and *Software* L/R are inverted for 16bit data.
|
||||
|
@ -425,15 +420,15 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
|
|||
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))
|
||||
inv = 0;
|
||||
/* Target mod needs inverted DALIGN when 16bit */
|
||||
else
|
||||
inv = 1;
|
||||
dalign = dalign_values[id];
|
||||
|
||||
return dalign_values[id][inv];
|
||||
if (mod == target && snd_pcm_format_width(runtime->format) == 16) {
|
||||
/* Target mod needs inverted DALIGN when 16bit */
|
||||
dalign = (dalign & 0xf0f0f0f0) >> 4 |
|
||||
(dalign & 0x0f0f0f0f) << 4;
|
||||
}
|
||||
|
||||
return dalign;
|
||||
}
|
||||
|
||||
u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod)
|
||||
|
|
Loading…
Reference in New Issue