]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-5.0/asoc-hdmi-codec-fix-s-pdif-dai.patch
Linux 4.19.42
[thirdparty/kernel/stable-queue.git] / queue-5.0 / asoc-hdmi-codec-fix-s-pdif-dai.patch
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
5
6 [ Upstream commit 2e95f984aae4cf0608d0ba2189c756f2bd50b44a ]
7
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.
12
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.
16
17 Since the S/PDIF DAI will only be used by S/PDIF, prepare the
18 hdmi_codec_daifmt structure for this format.
19
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>
24 ---
25 sound/soc/codecs/hdmi-codec.c | 118 +++++++++++++++++-----------------
26 1 file changed, 59 insertions(+), 59 deletions(-)
27
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,
33 {
34 struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai);
35 struct hdmi_codec_daifmt cf = { 0 };
36 - int ret = 0;
37
38 dev_dbg(dai->dev, "%s()\n", __func__);
39
40 - if (dai->id == DAI_ID_SPDIF) {
41 - cf.fmt = HDMI_SPDIF;
42 - } else {
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;
47 - break;
48 - case SND_SOC_DAIFMT_CBS_CFM:
49 - cf.frame_clk_master = 1;
50 - break;
51 - case SND_SOC_DAIFMT_CBM_CFS:
52 - cf.bit_clk_master = 1;
53 - break;
54 - case SND_SOC_DAIFMT_CBS_CFS:
55 - break;
56 - default:
57 - return -EINVAL;
58 - }
59 + if (dai->id == DAI_ID_SPDIF)
60 + return 0;
61 +
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;
66 + break;
67 + case SND_SOC_DAIFMT_CBS_CFM:
68 + cf.frame_clk_master = 1;
69 + break;
70 + case SND_SOC_DAIFMT_CBM_CFS:
71 + cf.bit_clk_master = 1;
72 + break;
73 + case SND_SOC_DAIFMT_CBS_CFS:
74 + break;
75 + default:
76 + return -EINVAL;
77 + }
78
79 - switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
80 - case SND_SOC_DAIFMT_NB_NF:
81 - break;
82 - case SND_SOC_DAIFMT_NB_IF:
83 - cf.frame_clk_inv = 1;
84 - break;
85 - case SND_SOC_DAIFMT_IB_NF:
86 - cf.bit_clk_inv = 1;
87 - break;
88 - case SND_SOC_DAIFMT_IB_IF:
89 - cf.frame_clk_inv = 1;
90 - cf.bit_clk_inv = 1;
91 - break;
92 - }
93 + switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
94 + case SND_SOC_DAIFMT_NB_NF:
95 + break;
96 + case SND_SOC_DAIFMT_NB_IF:
97 + cf.frame_clk_inv = 1;
98 + break;
99 + case SND_SOC_DAIFMT_IB_NF:
100 + cf.bit_clk_inv = 1;
101 + break;
102 + case SND_SOC_DAIFMT_IB_IF:
103 + cf.frame_clk_inv = 1;
104 + cf.bit_clk_inv = 1;
105 + break;
106 + }
107
108 - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
109 - case SND_SOC_DAIFMT_I2S:
110 - cf.fmt = HDMI_I2S;
111 - break;
112 - case SND_SOC_DAIFMT_DSP_A:
113 - cf.fmt = HDMI_DSP_A;
114 - break;
115 - case SND_SOC_DAIFMT_DSP_B:
116 - cf.fmt = HDMI_DSP_B;
117 - break;
118 - case SND_SOC_DAIFMT_RIGHT_J:
119 - cf.fmt = HDMI_RIGHT_J;
120 - break;
121 - case SND_SOC_DAIFMT_LEFT_J:
122 - cf.fmt = HDMI_LEFT_J;
123 - break;
124 - case SND_SOC_DAIFMT_AC97:
125 - cf.fmt = HDMI_AC97;
126 - break;
127 - default:
128 - dev_err(dai->dev, "Invalid DAI interface format\n");
129 - return -EINVAL;
130 - }
131 + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
132 + case SND_SOC_DAIFMT_I2S:
133 + cf.fmt = HDMI_I2S;
134 + break;
135 + case SND_SOC_DAIFMT_DSP_A:
136 + cf.fmt = HDMI_DSP_A;
137 + break;
138 + case SND_SOC_DAIFMT_DSP_B:
139 + cf.fmt = HDMI_DSP_B;
140 + break;
141 + case SND_SOC_DAIFMT_RIGHT_J:
142 + cf.fmt = HDMI_RIGHT_J;
143 + break;
144 + case SND_SOC_DAIFMT_LEFT_J:
145 + cf.fmt = HDMI_LEFT_J;
146 + break;
147 + case SND_SOC_DAIFMT_AC97:
148 + cf.fmt = HDMI_AC97;
149 + break;
150 + default:
151 + dev_err(dai->dev, "Invalid DAI interface format\n");
152 + return -EINVAL;
153 }
154
155 hcp->daifmt[dai->id] = cf;
156
157 - return ret;
158 + return 0;
159 }
160
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)
163 i++;
164 }
165
166 - if (hcd->spdif)
167 + if (hcd->spdif) {
168 hcp->daidrv[i] = hdmi_spdif_dai;
169 + hcp->daifmt[DAI_ID_SPDIF].fmt = HDMI_SPDIF;
170 + }
171
172 dev_set_drvdata(dev, hcp);
173
174 --
175 2.20.1
176