| From 145f44f7c73960b730cd1234450413ede3176b93 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 29 Jul 2020 17:44:55 +0200 |
| Subject: ASoC: meson: axg-tdm-formatters: fix sclk inversion |
| |
| From: Jerome Brunet <jbrunet@baylibre.com> |
| |
| [ 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> |
| --- |
| sound/soc/meson/axg-tdm-formatter.c | 11 ++++++----- |
| sound/soc/meson/axg-tdm-formatter.h | 1 - |
| sound/soc/meson/axg-tdmin.c | 2 -- |
| sound/soc/meson/axg-tdmout.c | 3 --- |
| 4 files changed, 6 insertions(+), 11 deletions(-) |
| |
| diff --git a/sound/soc/meson/axg-tdm-formatter.c b/sound/soc/meson/axg-tdm-formatter.c |
| index 358c8c0d861cd..f7e8e9da68a06 100644 |
| --- a/sound/soc/meson/axg-tdm-formatter.c |
| +++ b/sound/soc/meson/axg-tdm-formatter.c |
| @@ -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; |
| |
| diff --git a/sound/soc/meson/axg-tdm-formatter.h b/sound/soc/meson/axg-tdm-formatter.h |
| index 9ef98e955cb27..a1f0dcc0ff134 100644 |
| --- a/sound/soc/meson/axg-tdm-formatter.h |
| +++ b/sound/soc/meson/axg-tdm-formatter.h |
| @@ -16,7 +16,6 @@ struct snd_kcontrol; |
| |
| struct axg_tdm_formatter_hw { |
| unsigned int skew_offset; |
| - bool invert_sclk; |
| }; |
| |
| struct axg_tdm_formatter_ops { |
| diff --git a/sound/soc/meson/axg-tdmin.c b/sound/soc/meson/axg-tdmin.c |
| index 3d002b4eb939e..88ed95ae886bb 100644 |
| --- a/sound/soc/meson/axg-tdmin.c |
| +++ b/sound/soc/meson/axg-tdmin.c |
| @@ -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, |
| }, |
| }; |
| diff --git a/sound/soc/meson/axg-tdmout.c b/sound/soc/meson/axg-tdmout.c |
| index 418ec314b37d4..3ceabddae629e 100644 |
| --- a/sound/soc/meson/axg-tdmout.c |
| +++ b/sound/soc/meson/axg-tdmout.c |
| @@ -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, |
| }, |
| }; |
| -- |
| 2.25.1 |
| |