lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 410/849] media: dvb-frontends: mn88443x: Handle errors of clk_prepare_enable()
    Date
    From: Evgeny Novikov <novikov@ispras.ru>

    [ Upstream commit 69a10678e2fba3d182e78ea041f2d1b1a6058764 ]

    mn88443x_cmn_power_on() did not handle possible errors of
    clk_prepare_enable() and always finished successfully so that its caller
    mn88443x_probe() did not care about failed preparing/enabling of clocks
    as well.

    Add missed error handling in both mn88443x_cmn_power_on() and
    mn88443x_probe(). This required to change the return value of the former
    from "void" to "int".

    Found by Linux Driver Verification project (linuxtesting.org).

    Fixes: 0f408ce8941f ("media: dvb-frontends: add Socionext MN88443x ISDB-S/T demodulator driver")
    Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
    Co-developed-by: Kirill Shilimanov <kirill.shilimanov@huawei.com>
    Signed-off-by: Kirill Shilimanov <kirill.shilimanov@huawei.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/media/dvb-frontends/mn88443x.c | 18 +++++++++++++++---
    1 file changed, 15 insertions(+), 3 deletions(-)

    diff --git a/drivers/media/dvb-frontends/mn88443x.c b/drivers/media/dvb-frontends/mn88443x.c
    index e4528784f8477..fff212c0bf3b5 100644
    --- a/drivers/media/dvb-frontends/mn88443x.c
    +++ b/drivers/media/dvb-frontends/mn88443x.c
    @@ -204,11 +204,18 @@ struct mn88443x_priv {
    struct regmap *regmap_t;
    };

    -static void mn88443x_cmn_power_on(struct mn88443x_priv *chip)
    +static int mn88443x_cmn_power_on(struct mn88443x_priv *chip)
    {
    + struct device *dev = &chip->client_s->dev;
    struct regmap *r_t = chip->regmap_t;
    + int ret;

    - clk_prepare_enable(chip->mclk);
    + ret = clk_prepare_enable(chip->mclk);
    + if (ret) {
    + dev_err(dev, "Failed to prepare and enable mclk: %d\n",
    + ret);
    + return ret;
    + }

    gpiod_set_value_cansleep(chip->reset_gpio, 1);
    usleep_range(100, 1000);
    @@ -222,6 +229,8 @@ static void mn88443x_cmn_power_on(struct mn88443x_priv *chip)
    } else {
    regmap_write(r_t, HIZSET3, 0x8f);
    }
    +
    + return 0;
    }

    static void mn88443x_cmn_power_off(struct mn88443x_priv *chip)
    @@ -738,7 +747,10 @@ static int mn88443x_probe(struct i2c_client *client,
    chip->fe.demodulator_priv = chip;
    i2c_set_clientdata(client, chip);

    - mn88443x_cmn_power_on(chip);
    + ret = mn88443x_cmn_power_on(chip);
    + if (ret)
    + goto err_i2c_t;
    +
    mn88443x_s_sleep(chip);
    mn88443x_t_sleep(chip);

    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 02:38    [W:2.418 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site