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 4.14 53/59] 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 0e07e3dea7de..93a4829f80cc 100644
    --- a/sound/soc/rockchip/rockchip_i2s.c
    +++ b/sound/soc/rockchip/rockchip_i2s.c
    @@ -188,7 +188,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:
    @@ -201,7 +203,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);
    @@ -215,7 +218,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);
    @@ -238,7 +242,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);
    @@ -261,12 +266,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:17    [W:6.685 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site