lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 389/862] ASoC: rockchip: i2s: use regmap_read_poll_timeout to poll I2S_CLR
    Date
    From: Judy Hsiao <judyhsiao@chromium.org>

    [ Upstream commit fbb0ec656ee5ee43b4b3022fd8290707265c52df ]

    Use regmap_read_poll_timeout to poll I2S_CLR.
    It also fixes the 'rockchip-i2s ff070000.i2s; fail to clear' when
    the read of I2S_CLR exceeds the retry limit.

    Fixes: 0ff9f8b9f592 ("ASoC: rockchip: i2s: Fix error code when fail to read I2S_CLR")
    Signed-off-by: Judy Hsiao <judyhsiao@chromium.org>
    Reviewed-by: Brian Norris <briannorris@chromium.org>
    Link: https://lore.kernel.org/r/20220914031234.2250298-1-judyhsiao@chromium.org
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/rockchip/rockchip_i2s.c | 41 ++++++++++++-------------------
    1 file changed, 16 insertions(+), 25 deletions(-)

    diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
    index f5f3540a9e18..28c86f5e435e 100644
    --- a/sound/soc/rockchip/rockchip_i2s.c
    +++ b/sound/soc/rockchip/rockchip_i2s.c
    @@ -126,7 +126,6 @@ static inline struct rk_i2s_dev *to_info(struct snd_soc_dai *dai)
    static int rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)
    {
    unsigned int val = 0;
    - int retry = 10;
    int ret = 0;

    spin_lock(&i2s->lock);
    @@ -163,18 +162,14 @@ static int rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)
    I2S_CLR_TXC | I2S_CLR_RXC);
    if (ret < 0)
    goto end;
    - regmap_read(i2s->regmap, I2S_CLR, &val);
    -
    - /* Should wait for clear operation to finish */
    - while (val) {
    - regmap_read(i2s->regmap, I2S_CLR, &val);
    - retry--;
    - if (!retry) {
    - dev_warn(i2s->dev, "fail to clear\n");
    - ret = -EBUSY;
    - break;
    - }
    - }
    + ret = regmap_read_poll_timeout(i2s->regmap,
    + I2S_CLR,
    + val,
    + val != 0,
    + 20,
    + 200);
    + if (ret < 0)
    + dev_warn(i2s->dev, "fail to clear: %d\n", ret);
    }
    }
    end:
    @@ -188,7 +183,6 @@ static int rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)
    static int rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on)
    {
    unsigned int val = 0;
    - int retry = 10;
    int ret = 0;

    spin_lock(&i2s->lock);
    @@ -226,17 +220,14 @@ static int rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on)
    I2S_CLR_TXC | I2S_CLR_RXC);
    if (ret < 0)
    goto end;
    - regmap_read(i2s->regmap, I2S_CLR, &val);
    - /* Should wait for clear operation to finish */
    - while (val) {
    - regmap_read(i2s->regmap, I2S_CLR, &val);
    - retry--;
    - if (!retry) {
    - dev_warn(i2s->dev, "fail to clear\n");
    - ret = -EBUSY;
    - break;
    - }
    - }
    + ret = regmap_read_poll_timeout(i2s->regmap,
    + I2S_CLR,
    + val,
    + val != 0,
    + 20,
    + 200);
    + if (ret < 0)
    + dev_warn(i2s->dev, "fail to clear: %d\n", ret);
    }
    }
    end:
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-19 11:07    [W:4.023 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site