hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/sound/soc/rockchip/rockchip_spdif.c
....@@ -20,6 +20,7 @@
2020 #include <linux/mfd/syscon.h>
2121 #include <linux/regmap.h>
2222 #include <sound/pcm_params.h>
23
+#include <sound/pcm_iec958.h>
2324 #include <sound/dmaengine_pcm.h>
2425
2526 #include "rockchip_spdif.h"
....@@ -31,7 +32,25 @@
3132 RK_SPDIF_RK3366,
3233 };
3334
34
-#define RK3288_GRF_SOC_CON2 0x24c
35
+/*
36
+ * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
37
+ * CS0: | Mode | d | c | b | a |
38
+ * CS1: | Category Code |
39
+ * CS2: | Channel Number | Source Number |
40
+ * CS3: | Clock Accuracy | Sample Freq |
41
+ * CS4: | Ori Sample Freq | Word Length |
42
+ * CS5: | | CGMS-A |
43
+ * CS6~CS23: Reserved
44
+ *
45
+ * a: use of channel status block
46
+ * b: linear PCM identification: 0 for lpcm, 1 for nlpcm
47
+ * c: copyright information
48
+ * d: additional format information
49
+ */
50
+#define CS_BYTE 6
51
+#define CS_FRAME(c) ((c) << 16 | (c))
52
+
53
+#define RK3288_GRF_SOC_CON2 0x24c
3554
3655 struct rk_spdif_dev {
3756 struct device *dev;
....@@ -114,7 +133,19 @@
114133 struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
115134 unsigned int val = SPDIF_CFGR_HALFWORD_ENABLE;
116135 int srate, mclk;
117
- int ret;
136
+ int ret, i;
137
+ u8 cs[CS_BYTE];
138
+ u16 *fc = (u16 *)cs;
139
+
140
+ ret = snd_pcm_create_iec958_consumer_hw_params(params, cs, sizeof(cs));
141
+ if (ret < 0)
142
+ return ret;
143
+
144
+ for (i = 0; i < CS_BYTE / 2; i++)
145
+ regmap_write(spdif->regmap, SPDIF_CHNSRn(i), CS_FRAME(fc[i]));
146
+
147
+ regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CSE_MASK,
148
+ SPDIF_CFGR_CSE_EN);
118149
119150 srate = params_rate(params);
120151 mclk = srate * 128;
....@@ -128,6 +159,11 @@
128159 break;
129160 case SNDRV_PCM_FORMAT_S24_LE:
130161 val |= SPDIF_CFGR_VDW_24;
162
+ val |= SPDIF_CFGR_ADJ_RIGHT_J;
163
+ break;
164
+ case SNDRV_PCM_FORMAT_S32_LE:
165
+ val |= SPDIF_CFGR_VDW_24;
166
+ val |= SPDIF_CFGR_ADJ_LEFT_J;
131167 break;
132168 default:
133169 return -EINVAL;
....@@ -141,10 +177,14 @@
141177 return ret;
142178 }
143179
180
+ regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CLR_MASK,
181
+ SPDIF_CFGR_CLR_EN);
182
+ udelay(1);
144183 ret = regmap_update_bits(spdif->regmap, SPDIF_CFGR,
145184 SPDIF_CFGR_CLK_DIV_MASK |
146185 SPDIF_CFGR_HALFWORD_ENABLE |
147
- SDPIF_CFGR_VDW_MASK, val);
186
+ SDPIF_CFGR_VDW_MASK |
187
+ SPDIF_CFGR_ADJ_MASK, val);
148188
149189 return ret;
150190 }
....@@ -214,14 +254,11 @@
214254 .stream_name = "Playback",
215255 .channels_min = 2,
216256 .channels_max = 2,
217
- .rates = (SNDRV_PCM_RATE_32000 |
218
- SNDRV_PCM_RATE_44100 |
219
- SNDRV_PCM_RATE_48000 |
220
- SNDRV_PCM_RATE_96000 |
221
- SNDRV_PCM_RATE_192000),
257
+ .rates = SNDRV_PCM_RATE_8000_192000,
222258 .formats = (SNDRV_PCM_FMTBIT_S16_LE |
223259 SNDRV_PCM_FMTBIT_S20_3LE |
224
- SNDRV_PCM_FMTBIT_S24_LE),
260
+ SNDRV_PCM_FMTBIT_S24_LE |
261
+ SNDRV_PCM_FMTBIT_S32_LE),
225262 },
226263 .ops = &rk_spdif_dai_ops,
227264 };
....@@ -238,6 +275,9 @@
238275 case SPDIF_INTCR:
239276 case SPDIF_XFER:
240277 case SPDIF_SMPDR:
278
+ case SPDIF_VLDFRn(0) ... SPDIF_VLDFRn(11):
279
+ case SPDIF_USRDRn(0) ... SPDIF_USRDRn(11):
280
+ case SPDIF_CHNSRn(0) ... SPDIF_CHNSRn(11):
241281 return true;
242282 default:
243283 return false;
....@@ -253,6 +293,9 @@
253293 case SPDIF_INTSR:
254294 case SPDIF_XFER:
255295 case SPDIF_SMPDR:
296
+ case SPDIF_VLDFRn(0) ... SPDIF_VLDFRn(11):
297
+ case SPDIF_USRDRn(0) ... SPDIF_USRDRn(11):
298
+ case SPDIF_CHNSRn(0) ... SPDIF_CHNSRn(11):
256299 return true;
257300 default:
258301 return false;
....@@ -275,7 +318,7 @@
275318 .reg_bits = 32,
276319 .reg_stride = 4,
277320 .val_bits = 32,
278
- .max_register = SPDIF_SMPDR,
321
+ .max_register = SPDIF_VERSION,
279322 .writeable_reg = rk_spdif_wr_reg,
280323 .readable_reg = rk_spdif_rd_reg,
281324 .volatile_reg = rk_spdif_volatile_reg,