ASoC: meson: axg-tdm-formatters: fix sclk inversion
authorJerome Brunet <jbrunet@baylibre.com>
Wed, 29 Jul 2020 15:44:55 +0000 (17:44 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 30 Jul 2020 18:45:01 +0000 (19:45 +0100)
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>
sound/soc/meson/axg-tdm-formatter.c
sound/soc/meson/axg-tdm-formatter.h
sound/soc/meson/axg-tdmin.c
sound/soc/meson/axg-tdmout.c

index 358c8c0d861cd79dc3af06a8f89d972cd8d8c93f..f7e8e9da68a06bbd9e951be45ea9a12880259d16 100644 (file)
@@ -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;
 
index 9ef98e955cb2744450e75006b432a2043aa13593..a1f0dcc0ff134c7e5fd021958c2fa342e05a9dac 100644 (file)
@@ -16,7 +16,6 @@ struct snd_kcontrol;
 
 struct axg_tdm_formatter_hw {
        unsigned int skew_offset;
-       bool invert_sclk;
 };
 
 struct axg_tdm_formatter_ops {
index 3d002b4eb939ecbb68d5940a85aae095238474d3..88ed95ae886bb506cda8c8ac74dae2babcd568c0 100644 (file)
@@ -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,
        },
 };
index 418ec314b37d452e390b59501219b32f750bb88a..3ceabddae629ec19cd7f81e31aeb2866d8977fd3 100644 (file)
@@ -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,
        },
 };