| From aa2193aab8cc4208ab58d20744728fa13892d609 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 22 Aug 2021 11:48:03 +0200 |
| Subject: media: dvb-frontends: mn88443x: Handle errors of clk_prepare_enable() |
| |
| 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 |
| |