| From a5e8b5feaa961249ed9c857429d64849c1e3fc30 Mon Sep 17 00:00:00 2001 |
| From: Jerome Brunet <jbrunet@baylibre.com> |
| Date: Wed, 29 Jul 2020 17:44:53 +0200 |
| Subject: [PATCH] ASoC: meson: axg-tdm-interface: fix link fmt setup |
| |
| commit 6878ba91ce84f7a07887a0615af70f969508839f upstream. |
| |
| The .set_fmt() callback of the axg tdm interface incorrectly |
| test the content of SND_SOC_DAIFMT_MASTER_MASK as if it was a |
| bitfield, which it is not. |
| |
| Implement the test correctly. |
| |
| Fixes: d60e4f1e4be5 ("ASoC: meson: add tdm interface driver") |
| Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> |
| Link: https://lore.kernel.org/r/20200729154456.1983396-2-jbrunet@baylibre.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/soc/meson/axg-tdm-interface.c b/sound/soc/meson/axg-tdm-interface.c |
| index 585ce030b79b..702595715f94 100644 |
| --- a/sound/soc/meson/axg-tdm-interface.c |
| +++ b/sound/soc/meson/axg-tdm-interface.c |
| @@ -119,18 +119,25 @@ static int axg_tdm_iface_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) |
| { |
| struct axg_tdm_iface *iface = snd_soc_dai_get_drvdata(dai); |
| |
| - /* These modes are not supported */ |
| - if (fmt & (SND_SOC_DAIFMT_CBS_CFM | SND_SOC_DAIFMT_CBM_CFS)) { |
| + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
| + case SND_SOC_DAIFMT_CBS_CFS: |
| + if (!iface->mclk) { |
| + dev_err(dai->dev, "cpu clock master: mclk missing\n"); |
| + return -ENODEV; |
| + } |
| + break; |
| + |
| + case SND_SOC_DAIFMT_CBM_CFM: |
| + break; |
| + |
| + case SND_SOC_DAIFMT_CBS_CFM: |
| + case SND_SOC_DAIFMT_CBM_CFS: |
| dev_err(dai->dev, "only CBS_CFS and CBM_CFM are supported\n"); |
| + /* Fall-through */ |
| + default: |
| return -EINVAL; |
| } |
| |
| - /* If the TDM interface is the clock master, it requires mclk */ |
| - if (!iface->mclk && (fmt & SND_SOC_DAIFMT_CBS_CFS)) { |
| - dev_err(dai->dev, "cpu clock master: mclk missing\n"); |
| - return -ENODEV; |
| - } |
| - |
| iface->fmt = fmt; |
| return 0; |
| } |
| @@ -319,7 +326,8 @@ static int axg_tdm_iface_hw_params(struct snd_pcm_substream *substream, |
| if (ret) |
| return ret; |
| |
| - if (iface->fmt & SND_SOC_DAIFMT_CBS_CFS) { |
| + if ((iface->fmt & SND_SOC_DAIFMT_MASTER_MASK) == |
| + SND_SOC_DAIFMT_CBS_CFS) { |
| ret = axg_tdm_iface_set_sclk(dai, params); |
| if (ret) |
| return ret; |
| -- |
| 2.27.0 |
| |