diff --git a/drivers/media/i2c/maxim4c/maxim4c_drv.c b/drivers/media/i2c/maxim4c/maxim4c_drv.c index 16d11afb4828..9d9df08b4dbd 100644 --- a/drivers/media/i2c/maxim4c/maxim4c_drv.c +++ b/drivers/media/i2c/maxim4c/maxim4c_drv.c @@ -29,10 +29,12 @@ * V2.03.00 * 1. remote device add the maxim4c prefix to driver name. * - * V2.04.02 + * V2.04.03 * 1. Add regulator supplier dependencies. * 2. Add config ssc-ratio property * 3. Add debugfs entry to change MIPI timing + * 4. Use PM runtime autosuspend feature + * 5. Fix unbalanced disabling for PoC regulator * */ #include @@ -63,7 +65,7 @@ #include "maxim4c_api.h" -#define DRIVER_VERSION KERNEL_VERSION(2, 0x04, 0x02) +#define DRIVER_VERSION KERNEL_VERSION(2, 0x04, 0x03) #define MAXIM4C_XVCLK_FREQ 25000000 @@ -681,6 +683,14 @@ static int maxim4c_probe(struct i2c_client *client, if (ret) goto err_destroy_mutex; + ret = maxim4c_remote_device_power_on(maxim4c); + if (ret) + dev_warn(dev, "Power on PoC regulator failed\n"); + + pm_runtime_set_active(dev); + pm_runtime_get_noresume(dev); + pm_runtime_enable(dev); + ret = maxim4c_check_local_chipid(maxim4c); if (ret) goto err_power_off; @@ -704,9 +714,10 @@ static int maxim4c_probe(struct i2c_client *client, goto err_power_off; #endif /* MAXIM4C_LOCAL_DES_ON_OFF_EN */ - pm_runtime_set_active(dev); - pm_runtime_enable(dev); - pm_runtime_idle(dev); + pm_runtime_set_autosuspend_delay(dev, 1000); + pm_runtime_use_autosuspend(dev); + pm_runtime_mark_last_busy(dev); + pm_runtime_put_autosuspend(dev); return 0; #endif /* MAXIM4C_TEST_PATTERN */ @@ -731,9 +742,10 @@ static int maxim4c_probe(struct i2c_client *client, maxim4c_lock_irq_init(maxim4c); maxim4c_lock_state_work_init(maxim4c); - pm_runtime_set_active(dev); - pm_runtime_enable(dev); - pm_runtime_idle(dev); + pm_runtime_set_autosuspend_delay(dev, 1000); + pm_runtime_use_autosuspend(dev); + pm_runtime_mark_last_busy(dev); + pm_runtime_put_autosuspend(dev); return 0; @@ -742,6 +754,9 @@ err_dbgfs_deinit: err_subdev_deinit: maxim4c_v4l2_subdev_deinit(maxim4c); err_power_off: + pm_runtime_disable(dev); + pm_runtime_put_noidle(dev); + maxim4c_remote_device_power_off(maxim4c); maxim4c_local_device_power_off(maxim4c); err_destroy_mutex: mutex_destroy(&maxim4c->mutex); diff --git a/drivers/media/i2c/maxim4c/maxim4c_v4l2.c b/drivers/media/i2c/maxim4c/maxim4c_v4l2.c index 37df9a622f59..b40fdf2b3632 100644 --- a/drivers/media/i2c/maxim4c/maxim4c_v4l2.c +++ b/drivers/media/i2c/maxim4c/maxim4c_v4l2.c @@ -589,21 +589,20 @@ static int maxim4c_s_stream(struct v4l2_subdev *sd, int on) goto unlock_and_return; if (on) { - ret = pm_runtime_get_sync(&client->dev); - if (ret < 0) { - pm_runtime_put_noidle(&client->dev); + ret = pm_runtime_resume_and_get(&client->dev); + if (ret < 0) goto unlock_and_return; - } ret = __maxim4c_start_stream(maxim4c); if (ret) { v4l2_err(sd, "start stream failed while write regs\n"); - pm_runtime_put(&client->dev); + pm_runtime_put_sync(&client->dev); goto unlock_and_return; } } else { __maxim4c_stop_stream(maxim4c); - pm_runtime_put(&client->dev); + pm_runtime_mark_last_busy(&client->dev); + pm_runtime_put_autosuspend(&client->dev); } maxim4c->streaming = on;