On Sat, Dec 04, 2021 at 05:37:15PM +0300, Dmitry Osipenko wrote:
SPDIF and other SoC components share audio PLL on Tegra, thus only one component may set the desired base clock rate. This creates problem for HDMI audio because it uses SPDIF and audio may not work if SPDIF's clock doesn't exactly match standard audio rate since some receivers may reject audio in that case. Filter out audio rates which SPDIF output can't support, assuming that other components won't change rate at runtime.
Signed-off-by: Dmitry Osipenko digetx@gmail.com
sound/soc/tegra/tegra20_spdif.c | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+)
diff --git a/sound/soc/tegra/tegra20_spdif.c b/sound/soc/tegra/tegra20_spdif.c index a4aa5614aef4..d09cd7ee6879 100644 --- a/sound/soc/tegra/tegra20_spdif.c +++ b/sound/soc/tegra/tegra20_spdif.c @@ -79,6 +79,7 @@ static int tegra20_spdif_hw_params(struct snd_pcm_substream *substream, struct tegra20_spdif *spdif = dev_get_drvdata(dai->dev); unsigned int mask = 0, val = 0; int ret, spdifclock;
- long rate;
Perhaps we should change spdifclock to be "long" as well, even though they're the same on Tegra20. SND_SOC_TEGRA depends on || COMPILE_TEST, so technically somebody could build this on 64-bit and then these are no longer the same types.
Still shouldn't be problematic given the numbers that are passed in, but it'd still be nice to keep consistent types for these.
mask |= TEGRA20_SPDIF_CTRL_PACK | TEGRA20_SPDIF_CTRL_BIT_MODE_MASK; @@ -133,6 +134,12 @@ static int tegra20_spdif_hw_params(struct snd_pcm_substream *substream, return ret; }
- rate = clk_get_rate(spdif->clk_spdif_out);
- if (rate != spdifclock)
dev_warn_once(dai->dev,
"SPDIF clock rate %d doesn't match requested rate %lu\n",
That should be %ld since it's not unsigned.
Otherwise, looks good. Probably not worth respinning for just these minor comments, so:
Acked-by: Thierry Reding treding@nvidia.com