| .. | .. |
|---|
| 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); |
|---|