2727int hda_dsp_core_reset_enter (struct snd_sof_dev * sdev , unsigned int core_mask )
2828{
2929 u32 adspcs ;
30+ u32 reset ;
3031 int ret ;
3132
3233 /* set reset bits for cores */
34+ reset = HDA_DSP_ADSPCS_CRST_MASK (core_mask );
3335 snd_sof_dsp_update_bits_unlocked (sdev , HDA_DSP_BAR ,
3436 HDA_DSP_REG_ADSPCS ,
35- HDA_DSP_ADSPCS_CRST_MASK (core_mask ),
36- HDA_DSP_ADSPCS_CRST_MASK (core_mask ));
37+ reset , reset ),
3738
3839 /* poll with timeout to check if operation successful */
39- ret = snd_sof_dsp_register_poll (sdev , HDA_DSP_BAR ,
40- HDA_DSP_REG_ADSPCS ,
41- HDA_DSP_ADSPCS_CRST_MASK (core_mask ),
42- HDA_DSP_ADSPCS_CRST_MASK (core_mask ),
43- HDA_DSP_RESET_TIMEOUT ,
44- HDA_DSP_REG_POLL_INTERVAL_US );
40+ ret = snd_sof_dsp_read_poll_timeout (sdev , HDA_DSP_BAR ,
41+ HDA_DSP_REG_ADSPCS , adspcs ,
42+ ((adspcs & reset ) == reset ),
43+ HDA_DSP_REG_POLL_INTERVAL_US ,
44+ HDA_DSP_RESET_TIMEOUT_US );
4545
4646 /* has core entered reset ? */
4747 adspcs = snd_sof_dsp_read (sdev , HDA_DSP_BAR ,
@@ -59,6 +59,7 @@ int hda_dsp_core_reset_enter(struct snd_sof_dev *sdev, unsigned int core_mask)
5959
6060int hda_dsp_core_reset_leave (struct snd_sof_dev * sdev , unsigned int core_mask )
6161{
62+ unsigned int crst ;
6263 u32 adspcs ;
6364 int ret ;
6465
@@ -69,11 +70,12 @@ int hda_dsp_core_reset_leave(struct snd_sof_dev *sdev, unsigned int core_mask)
6970 0 );
7071
7172 /* poll with timeout to check if operation successful */
72- ret = snd_sof_dsp_register_poll (sdev , HDA_DSP_BAR ,
73- HDA_DSP_REG_ADSPCS ,
74- HDA_DSP_ADSPCS_CRST_MASK (core_mask ), 0 ,
75- HDA_DSP_RESET_TIMEOUT ,
76- HDA_DSP_REG_POLL_INTERVAL_US );
73+ crst = HDA_DSP_ADSPCS_CRST_MASK (core_mask );
74+ ret = snd_sof_dsp_read_poll_timeout (sdev , HDA_DSP_BAR ,
75+ HDA_DSP_REG_ADSPCS , adspcs ,
76+ !(adspcs & crst ),
77+ HDA_DSP_REG_POLL_INTERVAL_US ,
78+ HDA_DSP_RESET_TIMEOUT_US );
7779
7880 /* has core left reset ? */
7981 adspcs = snd_sof_dsp_read (sdev , HDA_DSP_BAR ,
@@ -133,6 +135,7 @@ int hda_dsp_core_run(struct snd_sof_dev *sdev, unsigned int core_mask)
133135
134136int hda_dsp_core_power_up (struct snd_sof_dev * sdev , unsigned int core_mask )
135137{
138+ unsigned int cpa ;
136139 u32 adspcs ;
137140 int ret ;
138141
@@ -142,12 +145,12 @@ int hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask)
142145 HDA_DSP_ADSPCS_SPA_MASK (core_mask ));
143146
144147 /* poll with timeout to check if operation successful */
145- ret = snd_sof_dsp_register_poll ( sdev , HDA_DSP_BAR ,
146- HDA_DSP_REG_ADSPCS ,
147- HDA_DSP_ADSPCS_CPA_MASK ( core_mask ) ,
148- HDA_DSP_ADSPCS_CPA_MASK ( core_mask ) ,
149- HDA_DSP_PU_TIMEOUT ,
150- HDA_DSP_REG_POLL_INTERVAL_US );
148+ cpa = HDA_DSP_ADSPCS_CPA_MASK ( core_mask );
149+ ret = snd_sof_dsp_read_poll_timeout ( sdev , HDA_DSP_BAR ,
150+ HDA_DSP_REG_ADSPCS , adspcs ,
151+ ( adspcs & cpa ) == cpa ,
152+ HDA_DSP_REG_POLL_INTERVAL_US ,
153+ HDA_DSP_RESET_TIMEOUT_US );
151154 if (ret < 0 )
152155 dev_err (sdev -> dev , "error: timeout on core powerup\n" );
153156
@@ -167,16 +170,18 @@ int hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask)
167170
168171int hda_dsp_core_power_down (struct snd_sof_dev * sdev , unsigned int core_mask )
169172{
173+ u32 adspcs ;
174+
170175 /* update bits */
171176 snd_sof_dsp_update_bits_unlocked (sdev , HDA_DSP_BAR ,
172177 HDA_DSP_REG_ADSPCS ,
173178 HDA_DSP_ADSPCS_SPA_MASK (core_mask ), 0 );
174179
175- /* poll with timeout to check if operation successful */
176- return snd_sof_dsp_register_poll ( sdev , HDA_DSP_BAR ,
177- HDA_DSP_REG_ADSPCS , HDA_DSP_ADSPCS_CPA_MASK (core_mask ), 0 ,
178- HDA_DSP_PD_TIMEOUT ,
179- HDA_DSP_REG_POLL_INTERVAL_US );
180+ return snd_sof_dsp_read_poll_timeout ( sdev , HDA_DSP_BAR ,
181+ HDA_DSP_REG_ADSPCS , adspcs ,
182+ !( adspcs & HDA_DSP_ADSPCS_SPA_MASK (core_mask )) ,
183+ HDA_DSP_REG_POLL_INTERVAL_US ,
184+ HDA_DSP_PD_TIMEOUT * USEC_PER_MSEC );
180185}
181186
182187bool hda_dsp_core_is_enabled (struct snd_sof_dev * sdev ,
0 commit comments