@@ -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