ASoC: sti: fix possible sleep-in-atomic
Change mutex and spinlock management to avoid sleep in atomic issue. Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@st.com> Link: https://lore.kernel.org/r/20200113100400.30472-1-arnaud.pouliquen@st.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
e0beec8839
commit
ce780a47c3
|
@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif *player,
|
||||||
* sampling frequency. If no sample rate is already specified, then
|
* sampling frequency. If no sample rate is already specified, then
|
||||||
* set one.
|
* set one.
|
||||||
*/
|
*/
|
||||||
mutex_lock(&player->ctrl_lock);
|
|
||||||
if (runtime) {
|
if (runtime) {
|
||||||
switch (runtime->rate) {
|
switch (runtime->rate) {
|
||||||
case 22050:
|
case 22050:
|
||||||
|
@ -303,7 +302,6 @@ static void uni_player_set_channel_status(struct uniperif *player,
|
||||||
player->stream_settings.iec958.status[3 + (n * 4)] << 24;
|
player->stream_settings.iec958.status[3 + (n * 4)] << 24;
|
||||||
SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status);
|
SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status);
|
||||||
}
|
}
|
||||||
mutex_unlock(&player->ctrl_lock);
|
|
||||||
|
|
||||||
/* Update the channel status */
|
/* Update the channel status */
|
||||||
if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
|
if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
|
||||||
|
@ -365,8 +363,10 @@ static int uni_player_prepare_iec958(struct uniperif *player,
|
||||||
|
|
||||||
SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player);
|
SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player);
|
||||||
|
|
||||||
|
mutex_lock(&player->ctrl_lock);
|
||||||
/* Update the channel status */
|
/* Update the channel status */
|
||||||
uni_player_set_channel_status(player, runtime);
|
uni_player_set_channel_status(player, runtime);
|
||||||
|
mutex_unlock(&player->ctrl_lock);
|
||||||
|
|
||||||
/* Clear the user validity user bits */
|
/* Clear the user validity user bits */
|
||||||
SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
|
SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
|
||||||
|
@ -598,7 +598,6 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,
|
||||||
iec958->status[1] = ucontrol->value.iec958.status[1];
|
iec958->status[1] = ucontrol->value.iec958.status[1];
|
||||||
iec958->status[2] = ucontrol->value.iec958.status[2];
|
iec958->status[2] = ucontrol->value.iec958.status[2];
|
||||||
iec958->status[3] = ucontrol->value.iec958.status[3];
|
iec958->status[3] = ucontrol->value.iec958.status[3];
|
||||||
mutex_unlock(&player->ctrl_lock);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&player->irq_lock, flags);
|
spin_lock_irqsave(&player->irq_lock, flags);
|
||||||
if (player->substream && player->substream->runtime)
|
if (player->substream && player->substream->runtime)
|
||||||
|
@ -608,6 +607,8 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,
|
||||||
uni_player_set_channel_status(player, NULL);
|
uni_player_set_channel_status(player, NULL);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&player->irq_lock, flags);
|
spin_unlock_irqrestore(&player->irq_lock, flags);
|
||||||
|
mutex_unlock(&player->ctrl_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue