Commit 93bef230 authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab

[media] smiapp: Implement support for autosuspend

Delay suspending the device by 1000 ms by default. This is done on
explicit power off through s_power() callback, through releasing the
file descriptor, NVM read or when the probe finishes.
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent cbba45d4
...@@ -1380,17 +1380,22 @@ static int smiapp_power_off(struct device *dev) ...@@ -1380,17 +1380,22 @@ static int smiapp_power_off(struct device *dev)
static int smiapp_set_power(struct v4l2_subdev *subdev, int on) static int smiapp_set_power(struct v4l2_subdev *subdev, int on)
{ {
int rval = 0; int rval;
if (on) { if (!on) {
rval = pm_runtime_get_sync(subdev->dev); pm_runtime_mark_last_busy(subdev->dev);
if (rval >= 0) pm_runtime_put_autosuspend(subdev->dev);
return 0;
if (rval != -EBUSY && rval != -EAGAIN) return 0;
pm_runtime_set_active(subdev->dev);
} }
rval = pm_runtime_get_sync(subdev->dev);
if (rval >= 0)
return 0;
if (rval != -EBUSY && rval != -EAGAIN)
pm_runtime_set_active(subdev->dev);
pm_runtime_put(subdev->dev); pm_runtime_put(subdev->dev);
return rval; return rval;
...@@ -2340,7 +2345,8 @@ smiapp_sysfs_nvm_read(struct device *dev, struct device_attribute *attr, ...@@ -2340,7 +2345,8 @@ smiapp_sysfs_nvm_read(struct device *dev, struct device_attribute *attr,
return -ENODEV; return -ENODEV;
} }
pm_runtime_put(&client->dev); pm_runtime_mark_last_busy(&client->dev);
pm_runtime_put_autosuspend(&client->dev);
} }
/* /*
* NVM is still way below a PAGE_SIZE, so we can safely * NVM is still way below a PAGE_SIZE, so we can safely
...@@ -2681,7 +2687,8 @@ static int smiapp_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) ...@@ -2681,7 +2687,8 @@ static int smiapp_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
static int smiapp_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) static int smiapp_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
{ {
pm_runtime_put(sd->dev); pm_runtime_mark_last_busy(sd->dev);
pm_runtime_put_autosuspend(sd->dev);
return 0; return 0;
} }
...@@ -3093,7 +3100,9 @@ static int smiapp_probe(struct i2c_client *client, ...@@ -3093,7 +3100,9 @@ static int smiapp_probe(struct i2c_client *client,
if (rval < 0) if (rval < 0)
goto out_media_entity_cleanup; goto out_media_entity_cleanup;
pm_runtime_put(&client->dev); pm_runtime_set_autosuspend_delay(&client->dev, 1000);
pm_runtime_use_autosuspend(&client->dev);
pm_runtime_put_autosuspend(&client->dev);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment