Skip to content

Commit f01bc67

Browse files
jbrun3tbroonie
authored andcommitted
ASoC: meson: axg-tdm-formatter: rework quirks settings
The g12a tdmout requires a different signal skew offset than the axg. With this change, the skew offset is added as a parameter of the tdm formatters to prepare the addition of the g12a support. Signed-off-by: Jerome Brunet <[email protected]> Signed-off-by: Mark Brown <[email protected]>
1 parent fcced66 commit f01bc67

4 files changed

Lines changed: 35 additions & 14 deletions

File tree

sound/soc/meson/axg-tdm-formatter.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ EXPORT_SYMBOL_GPL(axg_tdm_formatter_set_channel_masks);
6868
static int axg_tdm_formatter_enable(struct axg_tdm_formatter *formatter)
6969
{
7070
struct axg_tdm_stream *ts = formatter->stream;
71-
bool invert = formatter->drv->invert_sclk;
71+
bool invert = formatter->drv->quirks->invert_sclk;
7272
int ret;
7373

7474
/* Do nothing if the formatter is already enabled */
@@ -85,7 +85,9 @@ static int axg_tdm_formatter_enable(struct axg_tdm_formatter *formatter)
8585
return ret;
8686

8787
/* Setup the stream parameter in the formatter */
88-
ret = formatter->drv->ops->prepare(formatter->map, formatter->stream);
88+
ret = formatter->drv->ops->prepare(formatter->map,
89+
formatter->drv->quirks,
90+
formatter->stream);
8991
if (ret)
9092
return ret;
9193

sound/soc/meson/axg-tdm-formatter.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,25 @@ struct regmap;
1414
struct snd_soc_dapm_widget;
1515
struct snd_kcontrol;
1616

17+
struct axg_tdm_formatter_hw {
18+
unsigned int skew_offset;
19+
bool invert_sclk;
20+
};
21+
1722
struct axg_tdm_formatter_ops {
1823
struct axg_tdm_stream *(*get_stream)(struct snd_soc_dapm_widget *w);
1924
void (*enable)(struct regmap *map);
2025
void (*disable)(struct regmap *map);
21-
int (*prepare)(struct regmap *map, struct axg_tdm_stream *ts);
26+
int (*prepare)(struct regmap *map,
27+
const struct axg_tdm_formatter_hw *quirks,
28+
struct axg_tdm_stream *ts);
2229
};
2330

2431
struct axg_tdm_formatter_driver {
2532
const struct snd_soc_component_driver *component_drv;
2633
const struct regmap_config *regmap_cfg;
2734
const struct axg_tdm_formatter_ops *ops;
28-
bool invert_sclk;
35+
const struct axg_tdm_formatter_hw *quirks;
2936
};
3037

3138
int axg_tdm_formatter_set_channel_masks(struct regmap *map,

sound/soc/meson/axg-tdmin.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,21 +107,22 @@ static void axg_tdmin_disable(struct regmap *map)
107107
regmap_update_bits(map, TDMIN_CTRL, TDMIN_CTRL_ENABLE, 0);
108108
}
109109

110-
static int axg_tdmin_prepare(struct regmap *map, struct axg_tdm_stream *ts)
110+
static int axg_tdmin_prepare(struct regmap *map,
111+
const struct axg_tdm_formatter_hw *quirks,
112+
struct axg_tdm_stream *ts)
111113
{
112-
unsigned int val = 0;
114+
unsigned int val, skew = quirks->skew_offset;
113115

114116
/* Set stream skew */
115117
switch (ts->iface->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
116118
case SND_SOC_DAIFMT_I2S:
117119
case SND_SOC_DAIFMT_DSP_A:
118-
val |= TDMIN_CTRL_IN_BIT_SKEW(3);
120+
skew += 1;
119121
break;
120122

121123
case SND_SOC_DAIFMT_LEFT_J:
122124
case SND_SOC_DAIFMT_RIGHT_J:
123125
case SND_SOC_DAIFMT_DSP_B:
124-
val = TDMIN_CTRL_IN_BIT_SKEW(2);
125126
break;
126127

127128
default:
@@ -130,6 +131,8 @@ static int axg_tdmin_prepare(struct regmap *map, struct axg_tdm_stream *ts)
130131
return -EINVAL;
131132
}
132133

134+
val = TDMIN_CTRL_IN_BIT_SKEW(skew);
135+
133136
/* Set stream format mode */
134137
switch (ts->iface->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
135138
case SND_SOC_DAIFMT_I2S:
@@ -204,7 +207,10 @@ static const struct axg_tdm_formatter_driver axg_tdmin_drv = {
204207
.component_drv = &axg_tdmin_component_drv,
205208
.regmap_cfg = &axg_tdmin_regmap_cfg,
206209
.ops = &axg_tdmin_ops,
207-
.invert_sclk = false,
210+
.quirks = &(const struct axg_tdm_formatter_hw) {
211+
.invert_sclk = false,
212+
.skew_offset = 2,
213+
},
208214
};
209215

210216
static const struct of_device_id axg_tdmin_of_match[] = {

sound/soc/meson/axg-tdmout.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,21 +124,22 @@ static void axg_tdmout_disable(struct regmap *map)
124124
regmap_update_bits(map, TDMOUT_CTRL0, TDMOUT_CTRL0_ENABLE, 0);
125125
}
126126

127-
static int axg_tdmout_prepare(struct regmap *map, struct axg_tdm_stream *ts)
127+
static int axg_tdmout_prepare(struct regmap *map,
128+
const struct axg_tdm_formatter_hw *quirks,
129+
struct axg_tdm_stream *ts)
128130
{
129-
unsigned int val = 0;
131+
unsigned int val, skew = quirks->skew_offset;
130132

131133
/* Set the stream skew */
132134
switch (ts->iface->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
133135
case SND_SOC_DAIFMT_I2S:
134136
case SND_SOC_DAIFMT_DSP_A:
135-
val |= TDMOUT_CTRL0_INIT_BITNUM(1);
136137
break;
137138

138139
case SND_SOC_DAIFMT_LEFT_J:
139140
case SND_SOC_DAIFMT_RIGHT_J:
140141
case SND_SOC_DAIFMT_DSP_B:
141-
val |= TDMOUT_CTRL0_INIT_BITNUM(2);
142+
skew += 1;
142143
break;
143144

144145
default:
@@ -147,6 +148,8 @@ static int axg_tdmout_prepare(struct regmap *map, struct axg_tdm_stream *ts)
147148
return -EINVAL;
148149
}
149150

151+
val = TDMOUT_CTRL0_INIT_BITNUM(skew);
152+
150153
/* Set the slot width */
151154
val |= TDMOUT_CTRL0_BITNUM(ts->iface->slot_width - 1);
152155

@@ -234,7 +237,10 @@ static const struct axg_tdm_formatter_driver axg_tdmout_drv = {
234237
.component_drv = &axg_tdmout_component_drv,
235238
.regmap_cfg = &axg_tdmout_regmap_cfg,
236239
.ops = &axg_tdmout_ops,
237-
.invert_sclk = true,
240+
.quirks = &(const struct axg_tdm_formatter_hw) {
241+
.invert_sclk = true,
242+
.skew_offset = 1,
243+
},
238244
};
239245

240246
static const struct of_device_id axg_tdmout_of_match[] = {

0 commit comments

Comments
 (0)