5959
6060struct rtq9128_data {
6161 struct gpio_desc * enable ;
62+ unsigned int daifmt ;
6263 int tdm_slots ;
6364 int tdm_slot_width ;
6465 bool tdm_input_data2_select ;
@@ -391,7 +392,11 @@ static int rtq9128_component_probe(struct snd_soc_component *comp)
391392 unsigned int val ;
392393 int i , ret ;
393394
394- pm_runtime_resume_and_get (comp -> dev );
395+ ret = pm_runtime_resume_and_get (comp -> dev );
396+ if (ret < 0 ) {
397+ dev_err (comp -> dev , "Failed to resume device (%d)\n" , ret );
398+ return ret ;
399+ }
395400
396401 val = snd_soc_component_read (comp , RTQ9128_REG_EFUSE_DATA );
397402
@@ -437,10 +442,7 @@ static const struct snd_soc_component_driver rtq9128_comp_driver = {
437442static int rtq9128_dai_set_fmt (struct snd_soc_dai * dai , unsigned int fmt )
438443{
439444 struct rtq9128_data * data = snd_soc_dai_get_drvdata (dai );
440- struct snd_soc_component * comp = dai -> component ;
441445 struct device * dev = dai -> dev ;
442- unsigned int audfmt , fmtval ;
443- int ret ;
444446
445447 dev_dbg (dev , "%s: fmt 0x%8x\n" , __func__ , fmt );
446448
@@ -450,35 +452,10 @@ static int rtq9128_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
450452 return - EINVAL ;
451453 }
452454
453- fmtval = fmt & SND_SOC_DAIFMT_FORMAT_MASK ;
454- if (data -> tdm_slots && fmtval != SND_SOC_DAIFMT_DSP_A && fmtval != SND_SOC_DAIFMT_DSP_B ) {
455- dev_err (dev , "TDM is used, format only support DSP_A or DSP_B\n" );
456- return - EINVAL ;
457- }
455+ /* Store here and will be used in runtime hw_params for DAI format setting */
456+ data -> daifmt = fmt ;
458457
459- switch (fmtval ) {
460- case SND_SOC_DAIFMT_I2S :
461- audfmt = 8 ;
462- break ;
463- case SND_SOC_DAIFMT_LEFT_J :
464- audfmt = 9 ;
465- break ;
466- case SND_SOC_DAIFMT_RIGHT_J :
467- audfmt = 10 ;
468- break ;
469- case SND_SOC_DAIFMT_DSP_A :
470- audfmt = data -> tdm_slots ? 12 : 11 ;
471- break ;
472- case SND_SOC_DAIFMT_DSP_B :
473- audfmt = data -> tdm_slots ? 4 : 3 ;
474- break ;
475- default :
476- dev_err (dev , "Unsupported format 0x%8x\n" , fmt );
477- return - EINVAL ;
478- }
479-
480- ret = snd_soc_component_write_field (comp , RTQ9128_REG_I2S_OPT , RTQ9128_AUDFMT_MASK , audfmt );
481- return ret < 0 ? ret : 0 ;
458+ return 0 ;
482459}
483460
484461static int rtq9128_dai_set_tdm_slot (struct snd_soc_dai * dai , unsigned int tx_mask ,
@@ -554,10 +531,38 @@ static int rtq9128_dai_hw_params(struct snd_pcm_substream *stream, struct snd_pc
554531 unsigned int width , slot_width , bitrate , audbit , dolen ;
555532 struct snd_soc_component * comp = dai -> component ;
556533 struct device * dev = dai -> dev ;
534+ unsigned int fmtval , audfmt ;
557535 int ret ;
558536
559537 dev_dbg (dev , "%s: width %d\n" , __func__ , params_width (param ));
560538
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+
561566 switch (width = params_width (param )) {
562567 case 16 :
563568 audbit = 0 ;
@@ -611,6 +616,10 @@ static int rtq9128_dai_hw_params(struct snd_pcm_substream *stream, struct snd_pc
611616 return - EINVAL ;
612617 }
613618
619+ ret = snd_soc_component_write_field (comp , RTQ9128_REG_I2S_OPT , RTQ9128_AUDFMT_MASK , audfmt );
620+ if (ret < 0 )
621+ return ret ;
622+
614623 ret = snd_soc_component_write_field (comp , RTQ9128_REG_I2S_OPT , RTQ9128_AUDBIT_MASK , audbit );
615624 if (ret < 0 )
616625 return ret ;
0 commit comments