Skip to content

Commit b9384d5

Browse files
henrixRobertCNelson
authored andcommitted
Added support for higher sampling rates in AD193X driver. Added Device Tree IDs for AD193X SPI
1 parent 0649a58 commit b9384d5

File tree

2 files changed

+60
-17
lines changed

2 files changed

+60
-17
lines changed

sound/soc/codecs/ad193x-spi.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,29 @@ static int ad193x_spi_remove(struct spi_device *spi)
3333
return 0;
3434
}
3535

36+
static const struct spi_device_id ad193x_spi_id[] = {
37+
{ "ad1938", },
38+
{ "ad1939", },
39+
{ },
40+
};
41+
MODULE_DEVICE_TABLE(spi, ad193x_spi_id);
42+
43+
static const struct of_device_id ad193x_of_match[] = {
44+
{ .compatible = "analog,ad1938", },
45+
{ .compatible = "analog,ad1939", },
46+
{ }
47+
};
48+
MODULE_DEVICE_TABLE(of, ad193x_of_match);
49+
3650
static struct spi_driver ad193x_spi_driver = {
3751
.driver = {
3852
.name = "ad193x",
3953
.owner = THIS_MODULE,
54+
.of_match_table = ad193x_of_match,
4055
},
4156
.probe = ad193x_spi_probe,
4257
.remove = ad193x_spi_remove,
58+
.id_table = ad193x_spi_id
4359
};
4460
module_spi_driver(ad193x_spi_driver);
4561

sound/soc/codecs/ad193x.c

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
247247
struct snd_pcm_hw_params *params,
248248
struct snd_soc_dai *dai)
249249
{
250-
int word_len = 0, master_rate = 0;
250+
int word_len = 0, master_rate = 0, sample_rate = 0;
251251
struct snd_soc_codec *codec = dai->codec;
252252
struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec);
253253

@@ -265,6 +265,22 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
265265
break;
266266
}
267267

268+
/* sample rate */
269+
switch(params_rate(params)){
270+
case 48000:
271+
sample_rate = 0;
272+
break;
273+
case 96000:
274+
sample_rate = 1;
275+
break;
276+
case 192000:
277+
sample_rate = 2;
278+
break;
279+
default:
280+
sample_rate = 0; //48 kHz
281+
break;
282+
}
283+
268284
switch (ad193x->sysclk) {
269285
case 12288000:
270286
master_rate = AD193X_PLL_INPUT_256;
@@ -280,6 +296,12 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
280296
break;
281297
}
282298

299+
regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL0,
300+
0x06, sample_rate << 1);
301+
302+
regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL0,
303+
0xC0, sample_rate << 6);
304+
283305
regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL0,
284306
AD193X_PLL_INPUT_MASK, master_rate);
285307

@@ -308,15 +330,15 @@ static struct snd_soc_dai_driver ad193x_dai = {
308330
.stream_name = "Playback",
309331
.channels_min = 2,
310332
.channels_max = 8,
311-
.rates = SNDRV_PCM_RATE_48000,
333+
.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000,
312334
.formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
313335
SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
314336
},
315337
.capture = {
316338
.stream_name = "Capture",
317339
.channels_min = 2,
318340
.channels_max = 4,
319-
.rates = SNDRV_PCM_RATE_48000,
341+
.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000,
320342
.formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
321343
SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
322344
},
@@ -327,21 +349,26 @@ static int ad193x_codec_probe(struct snd_soc_codec *codec)
327349
{
328350
struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec);
329351

330-
/* default setting for ad193x */
331-
332-
/* unmute dac channels */
333-
regmap_write(ad193x->regmap, AD193X_DAC_CHNL_MUTE, 0x0);
334-
/* de-emphasis: 48kHz, powedown dac */
352+
/* modified settings for ad193x */
353+
354+
// pll input 256: mclki/xi, xtal oscillator enabled
355+
regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL0, 0x80);
356+
// adc / dac clock source: mclk
357+
regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL1, 0x00);
358+
// dac in tdm mode, sdata delay: 1, 48kHz sample rate
359+
regmap_write(ad193x->regmap, AD193X_DAC_CTRL0, AD193X_DAC_SERFMT_TDM);
360+
// DAC bclk and lcr slave, 256 bclk per frame
361+
regmap_write(ad193x->regmap, AD193X_DAC_CTRL1, 0x04);
362+
// word width: 16, de-emphasis: 48kHz, powedown dac
335363
regmap_write(ad193x->regmap, AD193X_DAC_CTRL2, 0x1A);
336-
/* dac in tdm mode */
337-
regmap_write(ad193x->regmap, AD193X_DAC_CTRL0, 0x40);
338-
/* high-pass filter enable */
339-
regmap_write(ad193x->regmap, AD193X_ADC_CTRL0, 0x3);
340-
/* sata delay=1, adc aux mode */
341-
regmap_write(ad193x->regmap, AD193X_ADC_CTRL1, 0x43);
342-
/* pll input: mclki/xi */
343-
regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */
344-
regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL1, 0x04);
364+
// unmute dac channels
365+
regmap_write(ad193x->regmap, AD193X_DAC_CHNL_MUTE, 0x0);
366+
// high-pass filter enable
367+
regmap_write(ad193x->regmap, AD193X_ADC_CTRL0, 0x02);
368+
// sdata delay=1, adc tdm mode, word width: 16
369+
regmap_write(ad193x->regmap, AD193X_ADC_CTRL1, AD193X_ADC_SERFMT_TDM | 0x03);
370+
// 256 bclks per frame
371+
regmap_write(ad193x->regmap, AD193X_ADC_CTRL2, 0x20); //0x02
345372

346373
return 0;
347374
}

0 commit comments

Comments
 (0)