1 From 56cd1822742c143f878d69deca2dec2b5db7d1e9 Mon Sep 17 00:00:00 2001
2 From: Russell King <rmk+kernel@armlinux.org.uk>
3 Date: Thu, 28 Feb 2019 15:30:34 +0000
4 Subject: ASoC: hdmi-codec: fix S/PDIF DAI
6 [ Upstream commit 2e95f984aae4cf0608d0ba2189c756f2bd50b44a ]
8 When using the S/PDIF DAI, there is no requirement to call
9 snd_soc_dai_set_fmt() as there is no DAI format definition that defines
10 S/PDIF. In any case, S/PDIF does not have separate clocks, this is
11 embedded into the data stream.
13 Consequently, when attempting to use TDA998x in S/PDIF mode, the attempt
14 to configure TDA998x via the hw_params callback fails as the
15 hdmi_codec_daifmt is left initialised to zero.
17 Since the S/PDIF DAI will only be used by S/PDIF, prepare the
18 hdmi_codec_daifmt structure for this format.
20 Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
21 Reviewed-by: Jyri Sarha <jsarha@ti.com>
22 Signed-off-by: Mark Brown <broonie@kernel.org>
23 Signed-off-by: Sasha Levin <sashal@kernel.org>
25 sound/soc/codecs/hdmi-codec.c | 118 +++++++++++++++++-----------------
26 1 file changed, 59 insertions(+), 59 deletions(-)
28 diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
29 index e5b6769b97977..d5f73c8372817 100644
30 --- a/sound/soc/codecs/hdmi-codec.c
31 +++ b/sound/soc/codecs/hdmi-codec.c
32 @@ -529,73 +529,71 @@ static int hdmi_codec_set_fmt(struct snd_soc_dai *dai,
34 struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai);
35 struct hdmi_codec_daifmt cf = { 0 };
38 dev_dbg(dai->dev, "%s()\n", __func__);
40 - if (dai->id == DAI_ID_SPDIF) {
41 - cf.fmt = HDMI_SPDIF;
43 - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
44 - case SND_SOC_DAIFMT_CBM_CFM:
45 - cf.bit_clk_master = 1;
46 - cf.frame_clk_master = 1;
48 - case SND_SOC_DAIFMT_CBS_CFM:
49 - cf.frame_clk_master = 1;
51 - case SND_SOC_DAIFMT_CBM_CFS:
52 - cf.bit_clk_master = 1;
54 - case SND_SOC_DAIFMT_CBS_CFS:
59 + if (dai->id == DAI_ID_SPDIF)
62 + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
63 + case SND_SOC_DAIFMT_CBM_CFM:
64 + cf.bit_clk_master = 1;
65 + cf.frame_clk_master = 1;
67 + case SND_SOC_DAIFMT_CBS_CFM:
68 + cf.frame_clk_master = 1;
70 + case SND_SOC_DAIFMT_CBM_CFS:
71 + cf.bit_clk_master = 1;
73 + case SND_SOC_DAIFMT_CBS_CFS:
79 - switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
80 - case SND_SOC_DAIFMT_NB_NF:
82 - case SND_SOC_DAIFMT_NB_IF:
83 - cf.frame_clk_inv = 1;
85 - case SND_SOC_DAIFMT_IB_NF:
88 - case SND_SOC_DAIFMT_IB_IF:
89 - cf.frame_clk_inv = 1;
93 + switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
94 + case SND_SOC_DAIFMT_NB_NF:
96 + case SND_SOC_DAIFMT_NB_IF:
97 + cf.frame_clk_inv = 1;
99 + case SND_SOC_DAIFMT_IB_NF:
100 + cf.bit_clk_inv = 1;
102 + case SND_SOC_DAIFMT_IB_IF:
103 + cf.frame_clk_inv = 1;
104 + cf.bit_clk_inv = 1;
108 - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
109 - case SND_SOC_DAIFMT_I2S:
112 - case SND_SOC_DAIFMT_DSP_A:
113 - cf.fmt = HDMI_DSP_A;
115 - case SND_SOC_DAIFMT_DSP_B:
116 - cf.fmt = HDMI_DSP_B;
118 - case SND_SOC_DAIFMT_RIGHT_J:
119 - cf.fmt = HDMI_RIGHT_J;
121 - case SND_SOC_DAIFMT_LEFT_J:
122 - cf.fmt = HDMI_LEFT_J;
124 - case SND_SOC_DAIFMT_AC97:
125 - cf.fmt = HDMI_AC97;
128 - dev_err(dai->dev, "Invalid DAI interface format\n");
131 + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
132 + case SND_SOC_DAIFMT_I2S:
135 + case SND_SOC_DAIFMT_DSP_A:
136 + cf.fmt = HDMI_DSP_A;
138 + case SND_SOC_DAIFMT_DSP_B:
139 + cf.fmt = HDMI_DSP_B;
141 + case SND_SOC_DAIFMT_RIGHT_J:
142 + cf.fmt = HDMI_RIGHT_J;
144 + case SND_SOC_DAIFMT_LEFT_J:
145 + cf.fmt = HDMI_LEFT_J;
147 + case SND_SOC_DAIFMT_AC97:
148 + cf.fmt = HDMI_AC97;
151 + dev_err(dai->dev, "Invalid DAI interface format\n");
155 hcp->daifmt[dai->id] = cf;
161 static int hdmi_codec_digital_mute(struct snd_soc_dai *dai, int mute)
162 @@ -792,8 +790,10 @@ static int hdmi_codec_probe(struct platform_device *pdev)
168 hcp->daidrv[i] = hdmi_spdif_dai;
169 + hcp->daifmt[DAI_ID_SPDIF].fmt = HDMI_SPDIF;
172 dev_set_drvdata(dev, hcp);