lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 056/107] ASoC: sti: fix possible sleep-in-atomic
    Date
    From: Arnaud Pouliquen <arnaud.pouliquen@st.com>

    [ Upstream commit ce780a47c3c01e1e179d0792df6b853a913928f1 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/sti/uniperif_player.c | 7 ++++---
    1 file changed, 4 insertions(+), 3 deletions(-)

    diff --git a/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c
    index 48ea915b24ba2..2ed92c990b97c 100644
    --- a/sound/soc/sti/uniperif_player.c
    +++ b/sound/soc/sti/uniperif_player.c
    @@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif *player,
    * sampling frequency. If no sample rate is already specified, then
    * set one.
    */
    - mutex_lock(&player->ctrl_lock);
    if (runtime) {
    switch (runtime->rate) {
    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;
    SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status);
    }
    - mutex_unlock(&player->ctrl_lock);

    /* Update the channel status */
    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);

    + mutex_lock(&player->ctrl_lock);
    /* Update the channel status */
    uni_player_set_channel_status(player, runtime);
    + mutex_unlock(&player->ctrl_lock);

    /* Clear the user validity user bits */
    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[2] = ucontrol->value.iec958.status[2];
    iec958->status[3] = ucontrol->value.iec958.status[3];
    - mutex_unlock(&player->ctrl_lock);

    spin_lock_irqsave(&player->irq_lock, flags);
    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);

    spin_unlock_irqrestore(&player->irq_lock, flags);
    + mutex_unlock(&player->ctrl_lock);
    +
    return 0;
    }

    --
    2.20.1
    \
     
     \ /
      Last update: 2020-01-24 15:37    [W:4.556 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site