media: v4l: mt9v032: Disable clock on error paths
mt9v032_power_on() leaves clk enabled in case of errors, but it is not expected by its callers. There is a similar problem in mt9v032_registered(). Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
parent
b48d908d2b
commit
7df66d7783
|
@ -294,14 +294,22 @@ static int mt9v032_power_on(struct mt9v032 *mt9v032)
|
|||
/* Reset the chip and stop data read out */
|
||||
ret = regmap_write(map, MT9V032_RESET, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto err;
|
||||
|
||||
ret = regmap_write(map, MT9V032_RESET, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto err;
|
||||
|
||||
return regmap_write(map, MT9V032_CHIP_CONTROL,
|
||||
MT9V032_CHIP_CONTROL_MASTER_MODE);
|
||||
ret = regmap_write(map, MT9V032_CHIP_CONTROL,
|
||||
MT9V032_CHIP_CONTROL_MASTER_MODE);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
clk_disable_unprepare(mt9v032->clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mt9v032_power_off(struct mt9v032 *mt9v032)
|
||||
|
@ -876,6 +884,9 @@ static int mt9v032_registered(struct v4l2_subdev *subdev)
|
|||
|
||||
/* Read and check the sensor version */
|
||||
ret = regmap_read(mt9v032->regmap, MT9V032_CHIP_VERSION, &version);
|
||||
|
||||
mt9v032_power_off(mt9v032);
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "Failed reading chip version\n");
|
||||
return ret;
|
||||
|
@ -894,8 +905,6 @@ static int mt9v032_registered(struct v4l2_subdev *subdev)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
mt9v032_power_off(mt9v032);
|
||||
|
||||
dev_info(&client->dev, "%s detected at address 0x%02x\n",
|
||||
mt9v032->version->name, client->addr);
|
||||
|
||||
|
|
Loading…
Reference in New Issue