@@ -448,19 +448,6 @@ static const struct snd_soc_dai_ops avs_dai_hda_be_ops = {
448
448
.trigger = avs_dai_hda_be_trigger ,
449
449
};
450
450
451
- static const unsigned int rates [] = {
452
- 8000 , 11025 , 12000 , 16000 ,
453
- 22050 , 24000 , 32000 , 44100 ,
454
- 48000 , 64000 , 88200 , 96000 ,
455
- 128000 , 176400 , 192000 ,
456
- };
457
-
458
- static const struct snd_pcm_hw_constraint_list hw_rates = {
459
- .count = ARRAY_SIZE (rates ),
460
- .list = rates ,
461
- .mask = 0 ,
462
- };
463
-
464
451
static int hw_rule_param_size (struct snd_pcm_hw_params * params , struct snd_pcm_hw_rule * rule )
465
452
{
466
453
struct snd_interval * interval = hw_param_interval (params , rule -> var );
@@ -481,40 +468,33 @@ static int hw_rule_param_size(struct snd_pcm_hw_params *params, struct snd_pcm_h
481
468
return snd_interval_refine (interval , & to );
482
469
}
483
470
484
- static int avs_dai_fe_startup (struct snd_pcm_substream * substream , struct snd_soc_dai * dai )
471
+ static int avs_pcm_hw_constraints_init (struct snd_pcm_substream * substream )
485
472
{
486
473
struct snd_pcm_runtime * runtime = substream -> runtime ;
487
- struct avs_dma_data * data ;
488
- struct hdac_bus * bus ;
489
- struct hdac_ext_stream * host_stream ;
474
+ static const unsigned int rates [] = {
475
+ 8000 , 11025 , 12000 , 16000 ,
476
+ 22050 , 24000 , 32000 , 44100 ,
477
+ 48000 , 64000 , 88200 , 96000 ,
478
+ 128000 , 176400 , 192000 ,
479
+ };
480
+ static const struct snd_pcm_hw_constraint_list rate_list = {
481
+ .count = ARRAY_SIZE (rates ),
482
+ .list = rates ,
483
+ };
490
484
int ret ;
491
485
492
- ret = avs_dai_startup (substream , dai );
493
- if (ret )
494
- return ret ;
495
-
496
- data = snd_soc_dai_get_dma_data (dai , substream );
497
- bus = & data -> adev -> base .core ;
498
-
499
- host_stream = snd_hdac_ext_stream_assign (bus , substream , HDAC_EXT_STREAM_TYPE_HOST );
500
- if (!host_stream ) {
501
- ret = - EBUSY ;
502
- goto err ;
503
- }
504
-
505
- data -> host_stream = host_stream ;
506
486
ret = snd_pcm_hw_constraint_integer (runtime , SNDRV_PCM_HW_PARAM_PERIODS );
507
487
if (ret < 0 )
508
- goto err ;
488
+ return ret ;
509
489
510
- /* avoid wrap-around with wall-clock */
490
+ /* Avoid wrap-around with wall-clock. */
511
491
ret = snd_pcm_hw_constraint_minmax (runtime , SNDRV_PCM_HW_PARAM_BUFFER_TIME , 20 , 178000000 );
512
492
if (ret < 0 )
513
- goto err ;
493
+ return ret ;
514
494
515
- ret = snd_pcm_hw_constraint_list (runtime , 0 , SNDRV_PCM_HW_PARAM_RATE , & hw_rates );
495
+ ret = snd_pcm_hw_constraint_list (runtime , 0 , SNDRV_PCM_HW_PARAM_RATE , & rate_list );
516
496
if (ret < 0 )
517
- goto err ;
497
+ return ret ;
518
498
519
499
/* Adjust buffer and period size based on the audio format. */
520
500
snd_pcm_hw_rule_add (runtime , 0 , SNDRV_PCM_HW_PARAM_BUFFER_SIZE , hw_rule_param_size , NULL ,
@@ -524,16 +504,40 @@ static int avs_dai_fe_startup(struct snd_pcm_substream *substream, struct snd_so
524
504
SNDRV_PCM_HW_PARAM_FORMAT , SNDRV_PCM_HW_PARAM_CHANNELS ,
525
505
SNDRV_PCM_HW_PARAM_RATE , -1 );
526
506
507
+ return ret ;
508
+ }
509
+
510
+ static int avs_dai_fe_startup (struct snd_pcm_substream * substream , struct snd_soc_dai * dai )
511
+ {
512
+ struct hdac_ext_stream * host_stream ;
513
+ struct avs_dma_data * data ;
514
+ struct hdac_bus * bus ;
515
+ int ret ;
516
+
517
+ ret = avs_pcm_hw_constraints_init (substream );
518
+ if (ret )
519
+ return ret ;
520
+
521
+ ret = avs_dai_startup (substream , dai );
522
+ if (ret )
523
+ return ret ;
524
+
525
+ data = snd_soc_dai_get_dma_data (dai , substream );
526
+ bus = & data -> adev -> base .core ;
527
+
528
+ host_stream = snd_hdac_ext_stream_assign (bus , substream , HDAC_EXT_STREAM_TYPE_HOST );
529
+ if (!host_stream ) {
530
+ avs_dai_shutdown (substream , dai );
531
+ return - EBUSY ;
532
+ }
533
+
534
+ data -> host_stream = host_stream ;
527
535
snd_pcm_set_sync (substream );
528
536
529
537
dev_dbg (dai -> dev , "%s fe STARTUP tag %d str %p" ,
530
538
__func__ , hdac_stream (host_stream )-> stream_tag , substream );
531
539
532
540
return 0 ;
533
-
534
- err :
535
- kfree (data );
536
- return ret ;
537
541
}
538
542
539
543
static void avs_dai_fe_shutdown (struct snd_pcm_substream * substream , struct snd_soc_dai * dai )
0 commit comments