lkml.org 
[lkml]   [2021]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.10 156/176] ASoC: rockchip: i2s: Fix regmap_ops hang
    Date
    From: Sugar Zhang <sugar.zhang@rock-chips.com>

    [ Upstream commit 53ca9b9777b95cdd689181d7c547e38dc79adad0 ]

    API 'set_fmt' maybe called when PD is off, in the situation,
    any register access will hang the system. so, enable PD
    before r/w register.

    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
    Link: https://lore.kernel.org/r/1629950520-14190-4-git-send-email-sugar.zhang@rock-chips.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/rockchip/rockchip_i2s.c | 19 ++++++++++++++-----
    1 file changed, 14 insertions(+), 5 deletions(-)

    diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
    index 593299675b8c..43522d7701e9 100644
    --- a/sound/soc/rockchip/rockchip_i2s.c
    +++ b/sound/soc/rockchip/rockchip_i2s.c
    @@ -186,7 +186,9 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
    {
    struct rk_i2s_dev *i2s = to_info(cpu_dai);
    unsigned int mask = 0, val = 0;
    + int ret = 0;

    + pm_runtime_get_sync(cpu_dai->dev);
    mask = I2S_CKR_MSS_MASK;
    switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
    case SND_SOC_DAIFMT_CBS_CFS:
    @@ -199,7 +201,8 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
    i2s->is_master_mode = false;
    break;
    default:
    - return -EINVAL;
    + ret = -EINVAL;
    + goto err_pm_put;
    }

    regmap_update_bits(i2s->regmap, I2S_CKR, mask, val);
    @@ -213,7 +216,8 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
    val = I2S_CKR_CKP_POS;
    break;
    default:
    - return -EINVAL;
    + ret = -EINVAL;
    + goto err_pm_put;
    }

    regmap_update_bits(i2s->regmap, I2S_CKR, mask, val);
    @@ -236,7 +240,8 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
    val = I2S_TXCR_TFS_PCM | I2S_TXCR_PBM_MODE(1);
    break;
    default:
    - return -EINVAL;
    + ret = -EINVAL;
    + goto err_pm_put;
    }

    regmap_update_bits(i2s->regmap, I2S_TXCR, mask, val);
    @@ -259,12 +264,16 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
    val = I2S_RXCR_TFS_PCM | I2S_RXCR_PBM_MODE(1);
    break;
    default:
    - return -EINVAL;
    + ret = -EINVAL;
    + goto err_pm_put;
    }

    regmap_update_bits(i2s->regmap, I2S_RXCR, mask, val);

    - return 0;
    +err_pm_put:
    + pm_runtime_put(cpu_dai->dev);
    +
    + return ret;
    }

    static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream,
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-09-09 15:07    [W:2.627 / U:0.260 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site