@@ -483,63 +483,103 @@ static void cs35l41_irq_release(struct cs35l41_hda *cs35l41)
483483 cs35l41 -> irq_errors = 0 ;
484484}
485485
486- static void cs35l41_hda_playback_hook (struct device * dev , int action )
486+ static void cs35l41_hda_play_start (struct device * dev )
487487{
488488 struct cs35l41_hda * cs35l41 = dev_get_drvdata (dev );
489489 struct regmap * reg = cs35l41 -> regmap ;
490- int ret = 0 ;
490+
491+ dev_dbg (dev , "Play (Start)\n" );
492+
493+ if (cs35l41 -> playback_started ) {
494+ dev_dbg (dev , "Playback already started." );
495+ return ;
496+ }
497+
498+ cs35l41 -> playback_started = true;
499+
500+ if (cs35l41 -> firmware_running ) {
501+ regmap_multi_reg_write (reg , cs35l41_hda_config_dsp ,
502+ ARRAY_SIZE (cs35l41_hda_config_dsp ));
503+ regmap_update_bits (reg , CS35L41_PWR_CTRL2 ,
504+ CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK ,
505+ 1 << CS35L41_VMON_EN_SHIFT | 1 << CS35L41_IMON_EN_SHIFT );
506+ cs35l41_set_cspl_mbox_cmd (cs35l41 -> dev , reg , CSPL_MBOX_CMD_RESUME );
507+ } else {
508+ regmap_multi_reg_write (reg , cs35l41_hda_config , ARRAY_SIZE (cs35l41_hda_config ));
509+ }
510+ regmap_update_bits (reg , CS35L41_PWR_CTRL2 , CS35L41_AMP_EN_MASK , 1 << CS35L41_AMP_EN_SHIFT );
511+ if (cs35l41 -> hw_cfg .bst_type == CS35L41_EXT_BOOST )
512+ regmap_write (reg , CS35L41_GPIO1_CTRL1 , 0x00008001 );
513+
514+ }
515+
516+ static void cs35l41_hda_play_done (struct device * dev )
517+ {
518+ struct cs35l41_hda * cs35l41 = dev_get_drvdata (dev );
519+ struct regmap * reg = cs35l41 -> regmap ;
520+
521+ dev_dbg (dev , "Play (Complete)\n" );
522+
523+ cs35l41_global_enable (dev , reg , cs35l41 -> hw_cfg .bst_type , 1 , NULL ,
524+ cs35l41 -> firmware_running );
525+ }
526+
527+ static void cs35l41_hda_pause_start (struct device * dev )
528+ {
529+ struct cs35l41_hda * cs35l41 = dev_get_drvdata (dev );
530+ struct regmap * reg = cs35l41 -> regmap ;
531+
532+ dev_dbg (dev , "Pause (Start)\n" );
533+
534+ regmap_multi_reg_write (reg , cs35l41_hda_mute , ARRAY_SIZE (cs35l41_hda_mute ));
535+ cs35l41_global_enable (dev , reg , cs35l41 -> hw_cfg .bst_type , 0 , NULL ,
536+ cs35l41 -> firmware_running );
537+ }
538+
539+ static void cs35l41_hda_pause_done (struct device * dev )
540+ {
541+ struct cs35l41_hda * cs35l41 = dev_get_drvdata (dev );
542+ struct regmap * reg = cs35l41 -> regmap ;
543+
544+ dev_dbg (dev , "Pause (Complete)\n" );
545+
546+ regmap_update_bits (reg , CS35L41_PWR_CTRL2 , CS35L41_AMP_EN_MASK , 0 << CS35L41_AMP_EN_SHIFT );
547+ if (cs35l41 -> hw_cfg .bst_type == CS35L41_EXT_BOOST )
548+ regmap_write (reg , CS35L41_GPIO1_CTRL1 , 0x00000001 );
549+ if (cs35l41 -> firmware_running ) {
550+ cs35l41_set_cspl_mbox_cmd (dev , reg , CSPL_MBOX_CMD_PAUSE );
551+ regmap_update_bits (reg , CS35L41_PWR_CTRL2 ,
552+ CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK ,
553+ 0 << CS35L41_VMON_EN_SHIFT | 0 << CS35L41_IMON_EN_SHIFT );
554+ }
555+ cs35l41_irq_release (cs35l41 );
556+ cs35l41 -> playback_started = false;
557+ }
558+
559+ static void cs35l41_hda_playback_hook (struct device * dev , int action )
560+ {
561+ struct cs35l41_hda * cs35l41 = dev_get_drvdata (dev );
491562
492563 switch (action ) {
493564 case HDA_GEN_PCM_ACT_OPEN :
494565 pm_runtime_get_sync (dev );
495566 mutex_lock (& cs35l41 -> fw_mutex );
496- cs35l41 -> playback_started = true;
497- if (cs35l41 -> firmware_running ) {
498- regmap_multi_reg_write (reg , cs35l41_hda_config_dsp ,
499- ARRAY_SIZE (cs35l41_hda_config_dsp ));
500- regmap_update_bits (cs35l41 -> regmap , CS35L41_PWR_CTRL2 ,
501- CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK ,
502- 1 << CS35L41_VMON_EN_SHIFT | 1 << CS35L41_IMON_EN_SHIFT );
503- cs35l41_set_cspl_mbox_cmd (cs35l41 -> dev , cs35l41 -> regmap ,
504- CSPL_MBOX_CMD_RESUME );
505- } else {
506- regmap_multi_reg_write (reg , cs35l41_hda_config ,
507- ARRAY_SIZE (cs35l41_hda_config ));
508- }
509- ret = regmap_update_bits (reg , CS35L41_PWR_CTRL2 ,
510- CS35L41_AMP_EN_MASK , 1 << CS35L41_AMP_EN_SHIFT );
511- if (cs35l41 -> hw_cfg .bst_type == CS35L41_EXT_BOOST )
512- regmap_write (reg , CS35L41_GPIO1_CTRL1 , 0x00008001 );
567+ cs35l41_hda_play_start (dev );
513568 mutex_unlock (& cs35l41 -> fw_mutex );
514569 break ;
515570 case HDA_GEN_PCM_ACT_PREPARE :
516571 mutex_lock (& cs35l41 -> fw_mutex );
517- ret = cs35l41_global_enable (dev , reg , cs35l41 -> hw_cfg .bst_type , 1 , NULL ,
518- cs35l41 -> firmware_running );
572+ cs35l41_hda_play_done (dev );
519573 mutex_unlock (& cs35l41 -> fw_mutex );
520574 break ;
521575 case HDA_GEN_PCM_ACT_CLEANUP :
522576 mutex_lock (& cs35l41 -> fw_mutex );
523- regmap_multi_reg_write (reg , cs35l41_hda_mute , ARRAY_SIZE (cs35l41_hda_mute ));
524- ret = cs35l41_global_enable (dev , reg , cs35l41 -> hw_cfg .bst_type , 0 , NULL ,
525- cs35l41 -> firmware_running );
577+ cs35l41_hda_pause_start (dev );
526578 mutex_unlock (& cs35l41 -> fw_mutex );
527579 break ;
528580 case HDA_GEN_PCM_ACT_CLOSE :
529581 mutex_lock (& cs35l41 -> fw_mutex );
530- ret = regmap_update_bits (reg , CS35L41_PWR_CTRL2 ,
531- CS35L41_AMP_EN_MASK , 0 << CS35L41_AMP_EN_SHIFT );
532- if (cs35l41 -> hw_cfg .bst_type == CS35L41_EXT_BOOST )
533- regmap_write (reg , CS35L41_GPIO1_CTRL1 , 0x00000001 );
534- if (cs35l41 -> firmware_running ) {
535- cs35l41_set_cspl_mbox_cmd (cs35l41 -> dev , cs35l41 -> regmap ,
536- CSPL_MBOX_CMD_PAUSE );
537- regmap_update_bits (cs35l41 -> regmap , CS35L41_PWR_CTRL2 ,
538- CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK ,
539- 0 << CS35L41_VMON_EN_SHIFT | 0 << CS35L41_IMON_EN_SHIFT );
540- }
541- cs35l41_irq_release (cs35l41 );
542- cs35l41 -> playback_started = false;
582+ cs35l41_hda_pause_done (dev );
543583 mutex_unlock (& cs35l41 -> fw_mutex );
544584
545585 pm_runtime_mark_last_busy (dev );
@@ -549,9 +589,6 @@ static void cs35l41_hda_playback_hook(struct device *dev, int action)
549589 dev_warn (cs35l41 -> dev , "Playback action not supported: %d\n" , action );
550590 break ;
551591 }
552-
553- if (ret )
554- dev_err (cs35l41 -> dev , "Regmap access fail: %d\n" , ret );
555592}
556593
557594static int cs35l41_hda_channel_map (struct device * dev , unsigned int tx_num , unsigned int * tx_slot ,
@@ -703,18 +740,8 @@ static int cs35l41_runtime_suspend(struct device *dev)
703740 mutex_lock (& cs35l41 -> fw_mutex );
704741
705742 if (cs35l41 -> playback_started ) {
706- regmap_multi_reg_write (cs35l41 -> regmap , cs35l41_hda_mute ,
707- ARRAY_SIZE (cs35l41_hda_mute ));
708- cs35l41_global_enable (cs35l41 -> dev , cs35l41 -> regmap , cs35l41 -> hw_cfg .bst_type , 0 ,
709- NULL , cs35l41 -> firmware_running );
710- regmap_update_bits (cs35l41 -> regmap , CS35L41_PWR_CTRL2 ,
711- CS35L41_AMP_EN_MASK , 0 << CS35L41_AMP_EN_SHIFT );
712- if (cs35l41 -> hw_cfg .bst_type == CS35L41_EXT_BOOST )
713- regmap_write (cs35l41 -> regmap , CS35L41_GPIO1_CTRL1 , 0x00000001 );
714- regmap_update_bits (cs35l41 -> regmap , CS35L41_PWR_CTRL2 ,
715- CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK ,
716- 0 << CS35L41_VMON_EN_SHIFT | 0 << CS35L41_IMON_EN_SHIFT );
717- cs35l41 -> playback_started = false;
743+ cs35l41_hda_pause_start (dev );
744+ cs35l41_hda_pause_done (dev );
718745 }
719746
720747 if (cs35l41 -> firmware_running ) {
0 commit comments