3636#include <sof/ssp.h>
3737#include <sof/alloc.h>
3838#include <sof/interrupt.h>
39+ #include <sof/pm_runtime.h>
3940#include <sof/math/numbers.h>
4041#include <config.h>
4142
@@ -65,29 +66,27 @@ static int hweight_32(uint32_t mask)
6566/* empty SSP transmit FIFO */
6667static void ssp_empty_tx_fifo (struct dai * dai )
6768{
68- struct ssp_pdata * ssp = dai_get_drvdata (dai );
6969 uint32_t sssr ;
7070
71- spin_lock (& ssp -> lock );
71+ spin_lock (& dai -> lock );
7272
7373 sssr = ssp_read (dai , SSSR );
7474
7575 /* clear interrupt */
7676 if (sssr & SSSR_TUR )
7777 ssp_write (dai , SSSR , sssr );
7878
79- spin_unlock (& ssp -> lock );
79+ spin_unlock (& dai -> lock );
8080}
8181
8282/* empty SSP receive FIFO */
8383static void ssp_empty_rx_fifo (struct dai * dai )
8484{
85- struct ssp_pdata * ssp = dai_get_drvdata (dai );
8685 uint32_t sssr ;
8786 uint32_t entries ;
8887 uint32_t i ;
8988
90- spin_lock (& ssp -> lock );
89+ spin_lock (& dai -> lock );
9190
9291 sssr = ssp_read (dai , SSSR );
9392
@@ -102,7 +101,7 @@ static void ssp_empty_rx_fifo(struct dai *dai)
102101 ssp_read (dai , SSDR );
103102 }
104103
105- spin_unlock (& ssp -> lock );
104+ spin_unlock (& dai -> lock );
106105}
107106
108107/* save SSP context prior to entering D3 */
@@ -171,7 +170,7 @@ static inline int ssp_set_config(struct dai *dai,
171170 bool start_delay = false;
172171 int ret = 0 ;
173172
174- spin_lock (& ssp -> lock );
173+ spin_lock (& dai -> lock );
175174
176175 /* is playback/capture already running */
177176 if (ssp -> state [DAI_DIR_PLAYBACK ] == COMP_STATE_ACTIVE ||
@@ -733,22 +732,20 @@ static inline int ssp_set_config(struct dai *dai,
733732 ssp -> state [DAI_DIR_CAPTURE ] = COMP_STATE_PREPARE ;
734733
735734out :
736- spin_unlock (& ssp -> lock );
735+ spin_unlock (& dai -> lock );
737736
738737 return ret ;
739738}
740739
741740/* Digital Audio interface formatting */
742741static inline int ssp_set_loopback_mode (struct dai * dai , uint32_t lbm )
743742{
744- struct ssp_pdata * ssp = dai_get_drvdata (dai );
745-
746743 trace_ssp ("loo" );
747- spin_lock (& ssp -> lock );
744+ spin_lock (& dai -> lock );
748745
749746 ssp_update_bits (dai , SSCR1 , SSCR1_LBM , lbm ? SSCR1_LBM : 0 );
750747
751- spin_unlock (& ssp -> lock );
748+ spin_unlock (& dai -> lock );
752749
753750 return 0 ;
754751}
@@ -758,7 +755,7 @@ static void ssp_start(struct dai *dai, int direction)
758755{
759756 struct ssp_pdata * ssp = dai_get_drvdata (dai );
760757
761- spin_lock (& ssp -> lock );
758+ spin_lock (& dai -> lock );
762759
763760 /* enable port */
764761 ssp_update_bits (dai , SSCR0 , SSCR0_SSE , SSCR0_SSE );
@@ -775,15 +772,15 @@ static void ssp_start(struct dai *dai, int direction)
775772 ssp_update_bits (dai , SSRSA , 0x1 << 8 , 0x1 << 8 );
776773 }
777774
778- spin_unlock (& ssp -> lock );
775+ spin_unlock (& dai -> lock );
779776}
780777
781778/* stop the SSP for either playback or capture */
782779static void ssp_stop (struct dai * dai , int direction )
783780{
784781 struct ssp_pdata * ssp = dai_get_drvdata (dai );
785782
786- spin_lock (& ssp -> lock );
783+ spin_lock (& dai -> lock );
787784
788785 /* wait to get valid fifo status */
789786 wait_delay (PLATFORM_SSP_STOP_DELAY );
@@ -817,7 +814,7 @@ static void ssp_stop(struct dai *dai, int direction)
817814 trace_ssp ("Ss2" );
818815 }
819816
820- spin_unlock (& ssp -> lock );
817+ spin_unlock (& dai -> lock );
821818}
822819
823820static int ssp_trigger (struct dai * dai , int cmd , int direction )
@@ -871,13 +868,17 @@ static int ssp_probe(struct dai *dai)
871868{
872869 struct ssp_pdata * ssp ;
873870
871+ if (dai_get_drvdata (dai ))
872+ return - EEXIST ; /* already created */
873+
874+ /* Disable dynamic clock gating before touching any register */
875+ pm_runtime_get_sync (SSP_CLK , dai -> index );
876+
874877 /* allocate private data */
875878 ssp = rzalloc (RZONE_SYS | RZONE_FLAG_UNCACHED , SOF_MEM_CAPS_RAM ,
876879 sizeof (* ssp ));
877880 dai_set_drvdata (dai , ssp );
878881
879- spinlock_init (& ssp -> lock );
880-
881882 ssp -> state [DAI_DIR_PLAYBACK ] = COMP_STATE_READY ;
882883 ssp -> state [DAI_DIR_CAPTURE ] = COMP_STATE_READY ;
883884
0 commit comments