.. | .. |
---|
43 | 43 | }; |
---|
44 | 44 | |
---|
45 | 45 | 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", |
---|
47 | 48 | }; |
---|
48 | 49 | |
---|
49 | 50 | /* Change to special mux control to reset dapm */ |
---|
.. | .. |
---|
107 | 108 | regmap_update_bits(map, TDMIN_CTRL, TDMIN_CTRL_ENABLE, 0); |
---|
108 | 109 | } |
---|
109 | 110 | |
---|
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) |
---|
111 | 114 | { |
---|
112 | | - unsigned int val = 0; |
---|
| 115 | + unsigned int val, skew = quirks->skew_offset; |
---|
113 | 116 | |
---|
114 | 117 | /* Set stream skew */ |
---|
115 | 118 | switch (ts->iface->fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
---|
116 | 119 | case SND_SOC_DAIFMT_I2S: |
---|
117 | 120 | case SND_SOC_DAIFMT_DSP_A: |
---|
118 | | - val |= TDMIN_CTRL_IN_BIT_SKEW(3); |
---|
| 121 | + skew += 1; |
---|
119 | 122 | break; |
---|
120 | 123 | |
---|
121 | 124 | case SND_SOC_DAIFMT_LEFT_J: |
---|
122 | 125 | case SND_SOC_DAIFMT_DSP_B: |
---|
123 | | - val = TDMIN_CTRL_IN_BIT_SKEW(2); |
---|
124 | 126 | break; |
---|
125 | 127 | |
---|
126 | 128 | default: |
---|
.. | .. |
---|
128 | 130 | ts->iface->fmt & SND_SOC_DAIFMT_FORMAT_MASK); |
---|
129 | 131 | return -EINVAL; |
---|
130 | 132 | } |
---|
| 133 | + |
---|
| 134 | + val = TDMIN_CTRL_IN_BIT_SKEW(skew); |
---|
131 | 135 | |
---|
132 | 136 | /* Set stream format mode */ |
---|
133 | 137 | switch (ts->iface->fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
---|
.. | .. |
---|
161 | 165 | } |
---|
162 | 166 | |
---|
163 | 167 | 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), |
---|
170 | 184 | SND_SOC_DAPM_MUX("SRC SEL", SND_SOC_NOPM, 0, 0, &axg_tdmin_in_mux), |
---|
171 | 185 | SND_SOC_DAPM_PGA_E("DEC", SND_SOC_NOPM, 0, 0, NULL, 0, |
---|
172 | 186 | axg_tdm_formatter_event, |
---|
.. | .. |
---|
175 | 189 | }; |
---|
176 | 190 | |
---|
177 | 191 | 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" }, |
---|
184 | 208 | { "DEC", NULL, "SRC SEL" }, |
---|
185 | 209 | { "OUT", NULL, "DEC" }, |
---|
186 | 210 | }; |
---|
.. | .. |
---|
203 | 227 | .component_drv = &axg_tdmin_component_drv, |
---|
204 | 228 | .regmap_cfg = &axg_tdmin_regmap_cfg, |
---|
205 | 229 | .ops = &axg_tdmin_ops, |
---|
206 | | - .invert_sclk = false, |
---|
| 230 | + .quirks = &(const struct axg_tdm_formatter_hw) { |
---|
| 231 | + .skew_offset = 3, |
---|
| 232 | + }, |
---|
207 | 233 | }; |
---|
208 | 234 | |
---|
209 | 235 | static const struct of_device_id axg_tdmin_of_match[] = { |
---|
210 | 236 | { |
---|
211 | 237 | .compatible = "amlogic,axg-tdmin", |
---|
212 | 238 | .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, |
---|
213 | 245 | }, {} |
---|
214 | 246 | }; |
---|
215 | 247 | MODULE_DEVICE_TABLE(of, axg_tdmin_of_match); |
---|