forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/sound/soc/meson/axg-tdmin.c
....@@ -43,7 +43,8 @@
4343 };
4444
4545 static const char * const axg_tdmin_sel_texts[] = {
46
- "IN 0", "IN 1", "IN 2", "IN 3", "IN 4", "IN 5",
46
+ "IN 0", "IN 1", "IN 2", "IN 3", "IN 4", "IN 5", "IN 6", "IN 7",
47
+ "IN 8", "IN 9", "IN 10", "IN 11", "IN 12", "IN 13", "IN 14", "IN 15",
4748 };
4849
4950 /* Change to special mux control to reset dapm */
....@@ -107,20 +108,21 @@
107108 regmap_update_bits(map, TDMIN_CTRL, TDMIN_CTRL_ENABLE, 0);
108109 }
109110
110
-static int axg_tdmin_prepare(struct regmap *map, struct axg_tdm_stream *ts)
111
+static int axg_tdmin_prepare(struct regmap *map,
112
+ const struct axg_tdm_formatter_hw *quirks,
113
+ struct axg_tdm_stream *ts)
111114 {
112
- unsigned int val = 0;
115
+ unsigned int val, skew = quirks->skew_offset;
113116
114117 /* Set stream skew */
115118 switch (ts->iface->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
116119 case SND_SOC_DAIFMT_I2S:
117120 case SND_SOC_DAIFMT_DSP_A:
118
- val |= TDMIN_CTRL_IN_BIT_SKEW(3);
121
+ skew += 1;
119122 break;
120123
121124 case SND_SOC_DAIFMT_LEFT_J:
122125 case SND_SOC_DAIFMT_DSP_B:
123
- val = TDMIN_CTRL_IN_BIT_SKEW(2);
124126 break;
125127
126128 default:
....@@ -128,6 +130,8 @@
128130 ts->iface->fmt & SND_SOC_DAIFMT_FORMAT_MASK);
129131 return -EINVAL;
130132 }
133
+
134
+ val = TDMIN_CTRL_IN_BIT_SKEW(skew);
131135
132136 /* Set stream format mode */
133137 switch (ts->iface->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
....@@ -161,12 +165,22 @@
161165 }
162166
163167 static const struct snd_soc_dapm_widget axg_tdmin_dapm_widgets[] = {
164
- SND_SOC_DAPM_AIF_IN("IN 0", NULL, 0, SND_SOC_NOPM, 0, 0),
165
- SND_SOC_DAPM_AIF_IN("IN 1", NULL, 0, SND_SOC_NOPM, 0, 0),
166
- SND_SOC_DAPM_AIF_IN("IN 2", NULL, 0, SND_SOC_NOPM, 0, 0),
167
- SND_SOC_DAPM_AIF_IN("IN 3", NULL, 0, SND_SOC_NOPM, 0, 0),
168
- SND_SOC_DAPM_AIF_IN("IN 4", NULL, 0, SND_SOC_NOPM, 0, 0),
169
- SND_SOC_DAPM_AIF_IN("IN 5", NULL, 0, SND_SOC_NOPM, 0, 0),
168
+ SND_SOC_DAPM_AIF_IN("IN 0", NULL, 0, SND_SOC_NOPM, 0, 0),
169
+ SND_SOC_DAPM_AIF_IN("IN 1", NULL, 0, SND_SOC_NOPM, 0, 0),
170
+ SND_SOC_DAPM_AIF_IN("IN 2", NULL, 0, SND_SOC_NOPM, 0, 0),
171
+ SND_SOC_DAPM_AIF_IN("IN 3", NULL, 0, SND_SOC_NOPM, 0, 0),
172
+ SND_SOC_DAPM_AIF_IN("IN 4", NULL, 0, SND_SOC_NOPM, 0, 0),
173
+ SND_SOC_DAPM_AIF_IN("IN 5", NULL, 0, SND_SOC_NOPM, 0, 0),
174
+ SND_SOC_DAPM_AIF_IN("IN 6", NULL, 0, SND_SOC_NOPM, 0, 0),
175
+ SND_SOC_DAPM_AIF_IN("IN 7", NULL, 0, SND_SOC_NOPM, 0, 0),
176
+ SND_SOC_DAPM_AIF_IN("IN 8", NULL, 0, SND_SOC_NOPM, 0, 0),
177
+ SND_SOC_DAPM_AIF_IN("IN 9", NULL, 0, SND_SOC_NOPM, 0, 0),
178
+ SND_SOC_DAPM_AIF_IN("IN 10", NULL, 0, SND_SOC_NOPM, 0, 0),
179
+ SND_SOC_DAPM_AIF_IN("IN 11", NULL, 0, SND_SOC_NOPM, 0, 0),
180
+ SND_SOC_DAPM_AIF_IN("IN 12", NULL, 0, SND_SOC_NOPM, 0, 0),
181
+ SND_SOC_DAPM_AIF_IN("IN 13", NULL, 0, SND_SOC_NOPM, 0, 0),
182
+ SND_SOC_DAPM_AIF_IN("IN 14", NULL, 0, SND_SOC_NOPM, 0, 0),
183
+ SND_SOC_DAPM_AIF_IN("IN 15", NULL, 0, SND_SOC_NOPM, 0, 0),
170184 SND_SOC_DAPM_MUX("SRC SEL", SND_SOC_NOPM, 0, 0, &axg_tdmin_in_mux),
171185 SND_SOC_DAPM_PGA_E("DEC", SND_SOC_NOPM, 0, 0, NULL, 0,
172186 axg_tdm_formatter_event,
....@@ -175,12 +189,22 @@
175189 };
176190
177191 static const struct snd_soc_dapm_route axg_tdmin_dapm_routes[] = {
178
- { "SRC SEL", "IN 0", "IN 0" },
179
- { "SRC SEL", "IN 1", "IN 1" },
180
- { "SRC SEL", "IN 2", "IN 2" },
181
- { "SRC SEL", "IN 3", "IN 3" },
182
- { "SRC SEL", "IN 4", "IN 4" },
183
- { "SRC SEL", "IN 5", "IN 5" },
192
+ { "SRC SEL", "IN 0", "IN 0" },
193
+ { "SRC SEL", "IN 1", "IN 1" },
194
+ { "SRC SEL", "IN 2", "IN 2" },
195
+ { "SRC SEL", "IN 3", "IN 3" },
196
+ { "SRC SEL", "IN 4", "IN 4" },
197
+ { "SRC SEL", "IN 5", "IN 5" },
198
+ { "SRC SEL", "IN 6", "IN 6" },
199
+ { "SRC SEL", "IN 7", "IN 7" },
200
+ { "SRC SEL", "IN 8", "IN 8" },
201
+ { "SRC SEL", "IN 9", "IN 9" },
202
+ { "SRC SEL", "IN 10", "IN 10" },
203
+ { "SRC SEL", "IN 11", "IN 11" },
204
+ { "SRC SEL", "IN 12", "IN 12" },
205
+ { "SRC SEL", "IN 13", "IN 13" },
206
+ { "SRC SEL", "IN 14", "IN 14" },
207
+ { "SRC SEL", "IN 15", "IN 15" },
184208 { "DEC", NULL, "SRC SEL" },
185209 { "OUT", NULL, "DEC" },
186210 };
....@@ -203,13 +227,21 @@
203227 .component_drv = &axg_tdmin_component_drv,
204228 .regmap_cfg = &axg_tdmin_regmap_cfg,
205229 .ops = &axg_tdmin_ops,
206
- .invert_sclk = false,
230
+ .quirks = &(const struct axg_tdm_formatter_hw) {
231
+ .skew_offset = 3,
232
+ },
207233 };
208234
209235 static const struct of_device_id axg_tdmin_of_match[] = {
210236 {
211237 .compatible = "amlogic,axg-tdmin",
212238 .data = &axg_tdmin_drv,
239
+ }, {
240
+ .compatible = "amlogic,g12a-tdmin",
241
+ .data = &axg_tdmin_drv,
242
+ }, {
243
+ .compatible = "amlogic,sm1-tdmin",
244
+ .data = &axg_tdmin_drv,
213245 }, {}
214246 };
215247 MODULE_DEVICE_TABLE(of, axg_tdmin_of_match);