ASoC: meson: axg-tdm-formatters: fix sclk inversion
[ Upstream commit 0d3f01dcdc234001f979a0af0b6b31cb9f25b6c1 ] After carefully checking, it appears that both tdmout and tdmin require the rising edge of the sclk they get to be synchronized with the frame sync event (which should be a rising edge of lrclk). TDMIN was improperly set before this patch. Remove the sclk_invert quirk which is no longer needed and fix the sclk phase. Fixes: 1a11d88f499c ("ASoC: meson: add tdm formatter base driver") Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Link: https://lore.kernel.org/r/20200729154456.1983396-4-jbrunet@baylibre.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
0cc88bf694
commit
115da6e650
@ -70,7 +70,7 @@ EXPORT_SYMBOL_GPL(axg_tdm_formatter_set_channel_masks);
|
||||
static int axg_tdm_formatter_enable(struct axg_tdm_formatter *formatter)
|
||||
{
|
||||
struct axg_tdm_stream *ts = formatter->stream;
|
||||
bool invert = formatter->drv->quirks->invert_sclk;
|
||||
bool invert;
|
||||
int ret;
|
||||
|
||||
/* Do nothing if the formatter is already enabled */
|
||||
@ -96,11 +96,12 @@ static int axg_tdm_formatter_enable(struct axg_tdm_formatter *formatter)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* If sclk is inverted, invert it back and provide the inversion
|
||||
* required by the formatter
|
||||
* If sclk is inverted, it means the bit should latched on the
|
||||
* rising edge which is what our HW expects. If not, we need to
|
||||
* invert it before the formatter.
|
||||
*/
|
||||
invert ^= axg_tdm_sclk_invert(ts->iface->fmt);
|
||||
ret = clk_set_phase(formatter->sclk, invert ? 180 : 0);
|
||||
invert = axg_tdm_sclk_invert(ts->iface->fmt);
|
||||
ret = clk_set_phase(formatter->sclk, invert ? 0 : 180);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -16,7 +16,6 @@ struct snd_kcontrol;
|
||||
|
||||
struct axg_tdm_formatter_hw {
|
||||
unsigned int skew_offset;
|
||||
bool invert_sclk;
|
||||
};
|
||||
|
||||
struct axg_tdm_formatter_ops {
|
||||
|
@ -228,7 +228,6 @@ static const struct axg_tdm_formatter_driver axg_tdmin_drv = {
|
||||
.regmap_cfg = &axg_tdmin_regmap_cfg,
|
||||
.ops = &axg_tdmin_ops,
|
||||
.quirks = &(const struct axg_tdm_formatter_hw) {
|
||||
.invert_sclk = false,
|
||||
.skew_offset = 2,
|
||||
},
|
||||
};
|
||||
@ -238,7 +237,6 @@ static const struct axg_tdm_formatter_driver g12a_tdmin_drv = {
|
||||
.regmap_cfg = &axg_tdmin_regmap_cfg,
|
||||
.ops = &axg_tdmin_ops,
|
||||
.quirks = &(const struct axg_tdm_formatter_hw) {
|
||||
.invert_sclk = false,
|
||||
.skew_offset = 3,
|
||||
},
|
||||
};
|
||||
|
@ -238,7 +238,6 @@ static const struct axg_tdm_formatter_driver axg_tdmout_drv = {
|
||||
.regmap_cfg = &axg_tdmout_regmap_cfg,
|
||||
.ops = &axg_tdmout_ops,
|
||||
.quirks = &(const struct axg_tdm_formatter_hw) {
|
||||
.invert_sclk = true,
|
||||
.skew_offset = 1,
|
||||
},
|
||||
};
|
||||
@ -248,7 +247,6 @@ static const struct axg_tdm_formatter_driver g12a_tdmout_drv = {
|
||||
.regmap_cfg = &axg_tdmout_regmap_cfg,
|
||||
.ops = &axg_tdmout_ops,
|
||||
.quirks = &(const struct axg_tdm_formatter_hw) {
|
||||
.invert_sclk = true,
|
||||
.skew_offset = 2,
|
||||
},
|
||||
};
|
||||
@ -309,7 +307,6 @@ static const struct axg_tdm_formatter_driver sm1_tdmout_drv = {
|
||||
.regmap_cfg = &axg_tdmout_regmap_cfg,
|
||||
.ops = &axg_tdmout_ops,
|
||||
.quirks = &(const struct axg_tdm_formatter_hw) {
|
||||
.invert_sclk = true,
|
||||
.skew_offset = 2,
|
||||
},
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user