]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: i2c: imx219: Rectify runtime PM handling in probe and remove
authorSakari Ailus <sakari.ailus@linux.intel.com>
Fri, 10 Jan 2025 12:53:20 +0000 (14:53 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 20 Apr 2025 08:15:37 +0000 (10:15 +0200)
commit 42eceae9793566d0df53d509be3e416465c347f5 upstream.

Set the device's runtime PM status and enable runtime PM before
registering the async sub-device. This is needed to avoid the case where
the device is runtime PM resumed while runtime PM has not been enabled
yet.

Also set the device's runtime PM status to suspended in remove only if it
wasn't so already.

Fixes: 1283b3b8f82b ("media: i2c: Add driver for Sony IMX219 sensor")
Cc: stable@vger.kernel.org # for >= v6.6
Reviewed-by: Bingbu Cao <bingbu.cao@intel.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/media/i2c/imx219.c

index d34fa3d9519a0bacfb56b71d3772eb1fdc0991fc..906aa314b7f84c1a9c4e5b7769cf5725a82d54ad 100644 (file)
@@ -1231,6 +1231,9 @@ static int imx219_probe(struct i2c_client *client)
                goto error_media_entity;
        }
 
+       pm_runtime_set_active(dev);
+       pm_runtime_enable(dev);
+
        ret = v4l2_async_register_subdev_sensor(&imx219->sd);
        if (ret < 0) {
                dev_err_probe(dev, ret,
@@ -1238,15 +1241,14 @@ static int imx219_probe(struct i2c_client *client)
                goto error_subdev_cleanup;
        }
 
-       /* Enable runtime PM and turn off the device */
-       pm_runtime_set_active(dev);
-       pm_runtime_enable(dev);
        pm_runtime_idle(dev);
 
        return 0;
 
 error_subdev_cleanup:
        v4l2_subdev_cleanup(&imx219->sd);
+       pm_runtime_disable(dev);
+       pm_runtime_set_suspended(dev);
 
 error_media_entity:
        media_entity_cleanup(&imx219->sd.entity);
@@ -1271,9 +1273,10 @@ static void imx219_remove(struct i2c_client *client)
        imx219_free_controls(imx219);
 
        pm_runtime_disable(&client->dev);
-       if (!pm_runtime_status_suspended(&client->dev))
+       if (!pm_runtime_status_suspended(&client->dev)) {
                imx219_power_off(&client->dev);
-       pm_runtime_set_suspended(&client->dev);
+               pm_runtime_set_suspended(&client->dev);
+       }
 }
 
 static const struct of_device_id imx219_dt_ids[] = {