@@ -354,16 +354,46 @@ static struct snd_rpi_simple_drvdata drvdata_hifiberry_dac = {
354
354
.dai = snd_hifiberry_dac_dai ,
355
355
};
356
356
357
+ SND_SOC_DAILINK_DEFS (hifiberry_dac8x ,
358
+ DAILINK_COMP_ARRAY (COMP_EMPTY ()),
359
+ DAILINK_COMP_ARRAY (COMP_CODEC ("snd-soc-dummy" , "snd-soc-dummy-dai" )),
360
+ DAILINK_COMP_ARRAY (COMP_EMPTY ()));
361
+
357
362
static int hifiberry_dac8x_init (struct snd_soc_pcm_runtime * rtd )
358
363
{
359
364
struct snd_soc_dai * codec_dai = snd_soc_rtd_to_codec (rtd , 0 );
365
+ struct snd_soc_card * card = rtd -> card ;
366
+ struct gpio_desc * gpio_desc ;
367
+ bool has_adc ;
360
368
361
- /* override the defaults to reflect 4 x PCM5102A on the card
362
- * and limit the sample rate to 192ksps
363
- */
369
+ /* Configure the codec for 8 channel playback */
364
370
codec_dai -> driver -> playback .channels_max = 8 ;
365
371
codec_dai -> driver -> playback .rates = SNDRV_PCM_RATE_8000_192000 ;
366
372
373
+ /* Activate capture based on ADC8x detection */
374
+ gpio_desc = devm_gpiod_get (card -> dev , "hasadc" , GPIOD_IN );
375
+ if (IS_ERR (gpio_desc )) {
376
+ dev_err (card -> dev , "Failed to get GPIO: %ld\n" , PTR_ERR (gpio_desc ));
377
+ return PTR_ERR (gpio_desc );
378
+ }
379
+
380
+ has_adc = gpiod_get_value (gpio_desc );
381
+
382
+ if (has_adc ) {
383
+ struct snd_soc_dai_link * dai = rtd -> dai_link ;
384
+
385
+ dev_info (card -> dev , "ADC8x detected: capture enabled\n" );
386
+ codec_dai -> driver -> symmetric_rate = 1 ;
387
+ codec_dai -> driver -> symmetric_channels = 1 ;
388
+ codec_dai -> driver -> symmetric_sample_bits = 1 ;
389
+ codec_dai -> driver -> capture .rates = SNDRV_PCM_RATE_8000_192000 ;
390
+ dai -> name = "HiFiBerry DAC8xADC8x" ;
391
+ dai -> stream_name = "HiFiBerry DAC8xADC8x HiFi" ;
392
+ } else {
393
+ dev_info (card -> dev , "no ADC8x detected\n" );
394
+ rtd -> dai_link -> playback_only = 1 ; // Disable capture
395
+ }
396
+
367
397
return 0 ;
368
398
}
369
399
@@ -375,7 +405,7 @@ static struct snd_soc_dai_link snd_hifiberry_dac8x_dai[] = {
375
405
SND_SOC_DAIFMT_NB_NF |
376
406
SND_SOC_DAIFMT_CBS_CFS ,
377
407
.init = hifiberry_dac8x_init ,
378
- SND_SOC_DAILINK_REG (hifiberry_dac ),
408
+ SND_SOC_DAILINK_REG (hifiberry_dac8x ),
379
409
},
380
410
};
381
411
0 commit comments