]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: v4l: mt9v032: Disable clock on error paths
authorAlexey Khoroshilov <khoroshilov@ispras.ru>
Fri, 24 Nov 2017 22:04:37 +0000 (17:04 -0500)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Fri, 8 Dec 2017 14:24:01 +0000 (09:24 -0500)
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>
drivers/media/i2c/mt9v032.c

index 8a430640c85d512038d4de97960d12768c728190..4de63b2df3346a8f4dc0135a5230cdfc6d17fc17 100644 (file)
@@ -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;
+
+       ret = regmap_write(map, MT9V032_CHIP_CONTROL,
+                          MT9V032_CHIP_CONTROL_MASTER_MODE);
+       if (ret < 0)
+               goto err;
+
+       return 0;
 
-       return regmap_write(map, MT9V032_CHIP_CONTROL,
-                           MT9V032_CHIP_CONTROL_MASTER_MODE);
+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);