59
59
60
60
struct rtq9128_data {
61
61
struct gpio_desc * enable ;
62
+ unsigned int daifmt ;
62
63
int tdm_slots ;
63
64
int tdm_slot_width ;
64
65
bool tdm_input_data2_select ;
@@ -441,10 +442,7 @@ static const struct snd_soc_component_driver rtq9128_comp_driver = {
441
442
static int rtq9128_dai_set_fmt (struct snd_soc_dai * dai , unsigned int fmt )
442
443
{
443
444
struct rtq9128_data * data = snd_soc_dai_get_drvdata (dai );
444
- struct snd_soc_component * comp = dai -> component ;
445
445
struct device * dev = dai -> dev ;
446
- unsigned int audfmt , fmtval ;
447
- int ret ;
448
446
449
447
dev_dbg (dev , "%s: fmt 0x%8x\n" , __func__ , fmt );
450
448
@@ -454,35 +452,10 @@ static int rtq9128_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
454
452
return - EINVAL ;
455
453
}
456
454
457
- fmtval = fmt & SND_SOC_DAIFMT_FORMAT_MASK ;
458
- if (data -> tdm_slots && fmtval != SND_SOC_DAIFMT_DSP_A && fmtval != SND_SOC_DAIFMT_DSP_B ) {
459
- dev_err (dev , "TDM is used, format only support DSP_A or DSP_B\n" );
460
- return - EINVAL ;
461
- }
455
+ /* Store here and will be used in runtime hw_params for DAI format setting */
456
+ data -> daifmt = fmt ;
462
457
463
- switch (fmtval ) {
464
- case SND_SOC_DAIFMT_I2S :
465
- audfmt = 8 ;
466
- break ;
467
- case SND_SOC_DAIFMT_LEFT_J :
468
- audfmt = 9 ;
469
- break ;
470
- case SND_SOC_DAIFMT_RIGHT_J :
471
- audfmt = 10 ;
472
- break ;
473
- case SND_SOC_DAIFMT_DSP_A :
474
- audfmt = data -> tdm_slots ? 12 : 11 ;
475
- break ;
476
- case SND_SOC_DAIFMT_DSP_B :
477
- audfmt = data -> tdm_slots ? 4 : 3 ;
478
- break ;
479
- default :
480
- dev_err (dev , "Unsupported format 0x%8x\n" , fmt );
481
- return - EINVAL ;
482
- }
483
-
484
- ret = snd_soc_component_write_field (comp , RTQ9128_REG_I2S_OPT , RTQ9128_AUDFMT_MASK , audfmt );
485
- return ret < 0 ? ret : 0 ;
458
+ return 0 ;
486
459
}
487
460
488
461
static int rtq9128_dai_set_tdm_slot (struct snd_soc_dai * dai , unsigned int tx_mask ,
@@ -558,10 +531,38 @@ static int rtq9128_dai_hw_params(struct snd_pcm_substream *stream, struct snd_pc
558
531
unsigned int width , slot_width , bitrate , audbit , dolen ;
559
532
struct snd_soc_component * comp = dai -> component ;
560
533
struct device * dev = dai -> dev ;
534
+ unsigned int fmtval , audfmt ;
561
535
int ret ;
562
536
563
537
dev_dbg (dev , "%s: width %d\n" , __func__ , params_width (param ));
564
538
539
+ fmtval = FIELD_GET (SND_SOC_DAIFMT_FORMAT_MASK , data -> daifmt );
540
+ if (data -> tdm_slots && fmtval != SND_SOC_DAIFMT_DSP_A && fmtval != SND_SOC_DAIFMT_DSP_B ) {
541
+ dev_err (dev , "TDM is used, format only support DSP_A or DSP_B\n" );
542
+ return - EINVAL ;
543
+ }
544
+
545
+ switch (fmtval ) {
546
+ case SND_SOC_DAIFMT_I2S :
547
+ audfmt = 8 ;
548
+ break ;
549
+ case SND_SOC_DAIFMT_LEFT_J :
550
+ audfmt = 9 ;
551
+ break ;
552
+ case SND_SOC_DAIFMT_RIGHT_J :
553
+ audfmt = 10 ;
554
+ break ;
555
+ case SND_SOC_DAIFMT_DSP_A :
556
+ audfmt = data -> tdm_slots ? 12 : 11 ;
557
+ break ;
558
+ case SND_SOC_DAIFMT_DSP_B :
559
+ audfmt = data -> tdm_slots ? 4 : 3 ;
560
+ break ;
561
+ default :
562
+ dev_err (dev , "Unsupported format 0x%8x\n" , fmtval );
563
+ return - EINVAL ;
564
+ }
565
+
565
566
switch (width = params_width (param )) {
566
567
case 16 :
567
568
audbit = 0 ;
@@ -615,6 +616,10 @@ static int rtq9128_dai_hw_params(struct snd_pcm_substream *stream, struct snd_pc
615
616
return - EINVAL ;
616
617
}
617
618
619
+ ret = snd_soc_component_write_field (comp , RTQ9128_REG_I2S_OPT , RTQ9128_AUDFMT_MASK , audfmt );
620
+ if (ret < 0 )
621
+ return ret ;
622
+
618
623
ret = snd_soc_component_write_field (comp , RTQ9128_REG_I2S_OPT , RTQ9128_AUDBIT_MASK , audbit );
619
624
if (ret < 0 )
620
625
return ret ;
0 commit comments