linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] PM fixes for kxcjk-1013
@ 2014-12-05 22:18 Irina Tirdea
  2014-12-05 22:18 ` [PATCH 1/4] iio: accel: kxcjk-1013: always power on device in resume Irina Tirdea
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Irina Tirdea @ 2014-12-05 22:18 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio
  Cc: Peter Meerwald, Srinivas Pandruvada, Daniel Baluta, linux-kernel,
	Irina Tirdea

This is a small set of power manangement fixes for kxcjk-1013 accel driver,
mostly related to error handling.

Irina Tirdea (4):
  iio: accel: kxcjk-1013: always power on device in resume
  iio: accel: kxcjk-1013: only set power state if CONFIG_PM is defined
  iio: accel: kxcjk-1013: error handling when set mode fails
  iio: accel: kxcjk-1013: power off device if probe fails

 drivers/iio/accel/kxcjk-1013.c |   37 ++++++++++++++++++++++++++-----------
 1 file changed, 26 insertions(+), 11 deletions(-)

-- 
1.7.9.5


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/4] iio: accel: kxcjk-1013: always power on device in resume
  2014-12-05 22:18 [PATCH 0/4] PM fixes for kxcjk-1013 Irina Tirdea
@ 2014-12-05 22:18 ` Irina Tirdea
  2014-12-06 11:15   ` Jonathan Cameron
  2014-12-05 22:18 ` [PATCH 2/4] iio: accel: kxcjk-1013: only set power state if CONFIG_PM is defined Irina Tirdea
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Irina Tirdea @ 2014-12-05 22:18 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio
  Cc: Peter Meerwald, Srinivas Pandruvada, Daniel Baluta, linux-kernel,
	Irina Tirdea

When the system resumes, it will first call system resume and
then runtime suspend (if CONFIG_RUNTIME_PM is enabled).
There is no need to conditionally power on the device in
system resume, so always power it on and leave runtime
suspend to power it off if needed.

Suggested-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
 drivers/iio/accel/kxcjk-1013.c |    5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index 1720e9a..aed3777 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -1354,10 +1354,7 @@ static int kxcjk1013_resume(struct device *dev)
 	int ret = 0;
 
 	mutex_lock(&data->mutex);
-	/* Check, if the suspend occured while active */
-	if (data->dready_trigger_on || data->motion_trigger_on ||
-							data->ev_enable_state)
-		ret = kxcjk1013_set_mode(data, OPERATION);
+	ret = kxcjk1013_set_mode(data, OPERATION);
 	mutex_unlock(&data->mutex);
 
 	return ret;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/4] iio: accel: kxcjk-1013: only set power state if CONFIG_PM is defined
  2014-12-05 22:18 [PATCH 0/4] PM fixes for kxcjk-1013 Irina Tirdea
  2014-12-05 22:18 ` [PATCH 1/4] iio: accel: kxcjk-1013: always power on device in resume Irina Tirdea
@ 2014-12-05 22:18 ` Irina Tirdea
  2014-12-06 11:16   ` Jonathan Cameron
  2014-12-05 22:18 ` [PATCH 3/4] iio: accel: kxcjk-1013: error handling when set mode fails Irina Tirdea
  2014-12-05 22:18 ` [PATCH 4/4] iio: accel: kxcjk-1013: power off device if probe fails Irina Tirdea
  3 siblings, 1 reply; 8+ messages in thread
From: Irina Tirdea @ 2014-12-05 22:18 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio
  Cc: Peter Meerwald, Srinivas Pandruvada, Daniel Baluta, linux-kernel,
	Irina Tirdea

When CONFIG_PM is not defined and the driver tries to power off the device,
kxcjk1013_set_power_state will call pm_runtime_put_autosuspend, which is
not implemented (wil return -ENOSYS).

Only call pm_runtime calls to change power state  when CONFIG_PM is defined.

Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
 drivers/iio/accel/kxcjk-1013.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index aed3777..7b0a9da 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -376,6 +376,7 @@ static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data)
 
 static int kxcjk1013_set_power_state(struct kxcjk1013_data *data, bool on)
 {
+#ifdef CONFIG_PM
 	int ret;
 
 	if (on)
@@ -389,6 +390,7 @@ static int kxcjk1013_set_power_state(struct kxcjk1013_data *data, bool on)
 			"Failed: kxcjk1013_set_power_state for %d\n", on);
 		return ret;
 	}
+#endif
 
 	return 0;
 }
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/4] iio: accel: kxcjk-1013: error handling when set mode fails
  2014-12-05 22:18 [PATCH 0/4] PM fixes for kxcjk-1013 Irina Tirdea
  2014-12-05 22:18 ` [PATCH 1/4] iio: accel: kxcjk-1013: always power on device in resume Irina Tirdea
  2014-12-05 22:18 ` [PATCH 2/4] iio: accel: kxcjk-1013: only set power state if CONFIG_PM is defined Irina Tirdea
@ 2014-12-05 22:18 ` Irina Tirdea
  2014-12-06 11:11   ` Jonathan Cameron
  2014-12-05 22:18 ` [PATCH 4/4] iio: accel: kxcjk-1013: power off device if probe fails Irina Tirdea
  3 siblings, 1 reply; 8+ messages in thread
From: Irina Tirdea @ 2014-12-05 22:18 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio
  Cc: Peter Meerwald, Srinivas Pandruvada, Daniel Baluta, linux-kernel,
	Irina Tirdea

If there is an error in set mode at runtime resume, reset the state of
the runtime usage count.

If there is an error in set mode at runtime suspend, make sure the framework
retries to suspend the device.

Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
---
 drivers/iio/accel/kxcjk-1013.c |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index 7b0a9da..74b196f 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -388,6 +388,8 @@ static int kxcjk1013_set_power_state(struct kxcjk1013_data *data, bool on)
 	if (ret < 0) {
 		dev_err(&data->client->dev,
 			"Failed: kxcjk1013_set_power_state for %d\n", on);
+		if (on)
+			pm_runtime_put_noidle(&data->client->dev);
 		return ret;
 	}
 #endif
@@ -859,6 +861,7 @@ static int kxcjk1013_write_event_config(struct iio_dev *indio_dev,
 
 	ret =  kxcjk1013_setup_any_motion_interrupt(data, state);
 	if (ret < 0) {
+		kxcjk1013_set_power_state(data, !state);
 		mutex_unlock(&data->mutex);
 		return ret;
 	}
@@ -1009,6 +1012,7 @@ static int kxcjk1013_data_rdy_trigger_set_state(struct iio_trigger *trig,
 	else
 		ret = kxcjk1013_setup_new_data_interrupt(data, state);
 	if (ret < 0) {
+		kxcjk1013_set_power_state(data, !state);
 		mutex_unlock(&data->mutex);
 		return ret;
 	}
@@ -1368,8 +1372,14 @@ static int kxcjk1013_runtime_suspend(struct device *dev)
 {
 	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
 	struct kxcjk1013_data *data = iio_priv(indio_dev);
+	int ret;
 
-	return kxcjk1013_set_mode(data, STANDBY);
+	ret = kxcjk1013_set_mode(data, STANDBY);
+	if (ret < 0) {
+		dev_err(&data->client->dev, "powering off device failed\n");
+		return -EAGAIN;
+	}
+	return 0;
 }
 
 static int kxcjk1013_runtime_resume(struct device *dev)
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/4] iio: accel: kxcjk-1013: power off device if probe fails
  2014-12-05 22:18 [PATCH 0/4] PM fixes for kxcjk-1013 Irina Tirdea
                   ` (2 preceding siblings ...)
  2014-12-05 22:18 ` [PATCH 3/4] iio: accel: kxcjk-1013: error handling when set mode fails Irina Tirdea
@ 2014-12-05 22:18 ` Irina Tirdea
  3 siblings, 0 replies; 8+ messages in thread
From: Irina Tirdea @ 2014-12-05 22:18 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio
  Cc: Peter Meerwald, Srinivas Pandruvada, Daniel Baluta, linux-kernel,
	Irina Tirdea

When the device is initialized in probe, it is also powered on.
If there is an error after the initialization, the device will
remain powered on.

Power off the device in case probe fails after device initialization.

Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Suggested-by: Daniel Baluta <daniel.baluta@intel.com>
---
 drivers/iio/accel/kxcjk-1013.c |   18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index 74b196f..bc04c2f 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -1239,21 +1239,25 @@ static int kxcjk1013_probe(struct i2c_client *client,
 						KXCJK1013_IRQ_NAME,
 						indio_dev);
 		if (ret)
-			return ret;
+			goto err_poweroff;
 
 		data->dready_trig = devm_iio_trigger_alloc(&client->dev,
 							   "%s-dev%d",
 							   indio_dev->name,
 							   indio_dev->id);
-		if (!data->dready_trig)
-			return -ENOMEM;
+		if (!data->dready_trig) {
+			ret = -ENOMEM;
+			goto err_poweroff;
+		}
 
 		data->motion_trig = devm_iio_trigger_alloc(&client->dev,
 							  "%s-any-motion-dev%d",
 							  indio_dev->name,
 							  indio_dev->id);
-		if (!data->motion_trig)
-			return -ENOMEM;
+		if (!data->motion_trig) {
+			ret = -ENOMEM;
+			goto err_poweroff;
+		}
 
 		data->dready_trig->dev.parent = &client->dev;
 		data->dready_trig->ops = &kxcjk1013_trigger_ops;
@@ -1262,7 +1266,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
 		iio_trigger_get(indio_dev->trig);
 		ret = iio_trigger_register(data->dready_trig);
 		if (ret)
-			return ret;
+			goto err_poweroff;
 
 		data->motion_trig->dev.parent = &client->dev;
 		data->motion_trig->ops = &kxcjk1013_trigger_ops;
@@ -1311,6 +1315,8 @@ err_trigger_unregister:
 		iio_trigger_unregister(data->dready_trig);
 	if (data->motion_trig)
 		iio_trigger_unregister(data->motion_trig);
+err_poweroff:
+	kxcjk1013_set_mode(data, STANDBY);
 
 	return ret;
 }
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] iio: accel: kxcjk-1013: error handling when set mode fails
  2014-12-05 22:18 ` [PATCH 3/4] iio: accel: kxcjk-1013: error handling when set mode fails Irina Tirdea
@ 2014-12-06 11:11   ` Jonathan Cameron
  0 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2014-12-06 11:11 UTC (permalink / raw)
  To: Irina Tirdea, linux-iio
  Cc: Peter Meerwald, Srinivas Pandruvada, Daniel Baluta, linux-kernel

On 05/12/14 22:18, Irina Tirdea wrote:
> If there is an error in set mode at runtime resume, reset the state of
> the runtime usage count.
> 
> If there is an error in set mode at runtime suspend, make sure the framework
> retries to suspend the device.
> 
> Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Looks superficially fine to me, but I'd like Srinivas to take a look before
I apply this one or the next one.

If you have officially taken over support of this driver, just let me know
and I'll stop pestering Srinivas :)




> ---
>  drivers/iio/accel/kxcjk-1013.c |   12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
> index 7b0a9da..74b196f 100644
> --- a/drivers/iio/accel/kxcjk-1013.c
> +++ b/drivers/iio/accel/kxcjk-1013.c
> @@ -388,6 +388,8 @@ static int kxcjk1013_set_power_state(struct kxcjk1013_data *data, bool on)
>  	if (ret < 0) {
>  		dev_err(&data->client->dev,
>  			"Failed: kxcjk1013_set_power_state for %d\n", on);
> +		if (on)
> +			pm_runtime_put_noidle(&data->client->dev);
>  		return ret;
>  	}
>  #endif
> @@ -859,6 +861,7 @@ static int kxcjk1013_write_event_config(struct iio_dev *indio_dev,
>  
>  	ret =  kxcjk1013_setup_any_motion_interrupt(data, state);
>  	if (ret < 0) {
> +		kxcjk1013_set_power_state(data, !state);
>  		mutex_unlock(&data->mutex);
>  		return ret;
>  	}
> @@ -1009,6 +1012,7 @@ static int kxcjk1013_data_rdy_trigger_set_state(struct iio_trigger *trig,
>  	else
>  		ret = kxcjk1013_setup_new_data_interrupt(data, state);
>  	if (ret < 0) {
> +		kxcjk1013_set_power_state(data, !state);
>  		mutex_unlock(&data->mutex);
>  		return ret;
>  	}
> @@ -1368,8 +1372,14 @@ static int kxcjk1013_runtime_suspend(struct device *dev)
>  {
>  	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
>  	struct kxcjk1013_data *data = iio_priv(indio_dev);
> +	int ret;
>  
> -	return kxcjk1013_set_mode(data, STANDBY);
> +	ret = kxcjk1013_set_mode(data, STANDBY);
> +	if (ret < 0) {
> +		dev_err(&data->client->dev, "powering off device failed\n");
> +		return -EAGAIN;
> +	}
> +	return 0;
>  }
>  
>  static int kxcjk1013_runtime_resume(struct device *dev)
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/4] iio: accel: kxcjk-1013: always power on device in resume
  2014-12-05 22:18 ` [PATCH 1/4] iio: accel: kxcjk-1013: always power on device in resume Irina Tirdea
@ 2014-12-06 11:15   ` Jonathan Cameron
  0 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2014-12-06 11:15 UTC (permalink / raw)
  To: Irina Tirdea, linux-iio
  Cc: Peter Meerwald, Srinivas Pandruvada, Daniel Baluta, linux-kernel

On 05/12/14 22:18, Irina Tirdea wrote:
> When the system resumes, it will first call system resume and
> then runtime suspend (if CONFIG_RUNTIME_PM is enabled).
> There is no need to conditionally power on the device in
> system resume, so always power it on and leave runtime
> suspend to power it off if needed.
> 
> Suggested-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
> Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Applied to the togreg branch of iio.git

Thanks,
> ---
>  drivers/iio/accel/kxcjk-1013.c |    5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)
> 
> diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
> index 1720e9a..aed3777 100644
> --- a/drivers/iio/accel/kxcjk-1013.c
> +++ b/drivers/iio/accel/kxcjk-1013.c
> @@ -1354,10 +1354,7 @@ static int kxcjk1013_resume(struct device *dev)
>  	int ret = 0;
>  
>  	mutex_lock(&data->mutex);
> -	/* Check, if the suspend occured while active */
> -	if (data->dready_trigger_on || data->motion_trigger_on ||
> -							data->ev_enable_state)
> -		ret = kxcjk1013_set_mode(data, OPERATION);
> +	ret = kxcjk1013_set_mode(data, OPERATION);
>  	mutex_unlock(&data->mutex);
>  
>  	return ret;
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/4] iio: accel: kxcjk-1013: only set power state if CONFIG_PM is defined
  2014-12-05 22:18 ` [PATCH 2/4] iio: accel: kxcjk-1013: only set power state if CONFIG_PM is defined Irina Tirdea
@ 2014-12-06 11:16   ` Jonathan Cameron
  0 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2014-12-06 11:16 UTC (permalink / raw)
  To: Irina Tirdea, linux-iio
  Cc: Peter Meerwald, Srinivas Pandruvada, Daniel Baluta, linux-kernel

On 05/12/14 22:18, Irina Tirdea wrote:
> When CONFIG_PM is not defined and the driver tries to power off the device,
> kxcjk1013_set_power_state will call pm_runtime_put_autosuspend, which is
> not implemented (wil return -ENOSYS).
> 
> Only call pm_runtime calls to change power state  when CONFIG_PM is defined.
> 
> Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
> Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Applied to the togreg branch of iio.git

Thanks
> ---
>  drivers/iio/accel/kxcjk-1013.c |    2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
> index aed3777..7b0a9da 100644
> --- a/drivers/iio/accel/kxcjk-1013.c
> +++ b/drivers/iio/accel/kxcjk-1013.c
> @@ -376,6 +376,7 @@ static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data)
>  
>  static int kxcjk1013_set_power_state(struct kxcjk1013_data *data, bool on)
>  {
> +#ifdef CONFIG_PM
>  	int ret;
>  
>  	if (on)
> @@ -389,6 +390,7 @@ static int kxcjk1013_set_power_state(struct kxcjk1013_data *data, bool on)
>  			"Failed: kxcjk1013_set_power_state for %d\n", on);
>  		return ret;
>  	}
> +#endif
>  
>  	return 0;
>  }
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-12-06 11:16 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-05 22:18 [PATCH 0/4] PM fixes for kxcjk-1013 Irina Tirdea
2014-12-05 22:18 ` [PATCH 1/4] iio: accel: kxcjk-1013: always power on device in resume Irina Tirdea
2014-12-06 11:15   ` Jonathan Cameron
2014-12-05 22:18 ` [PATCH 2/4] iio: accel: kxcjk-1013: only set power state if CONFIG_PM is defined Irina Tirdea
2014-12-06 11:16   ` Jonathan Cameron
2014-12-05 22:18 ` [PATCH 3/4] iio: accel: kxcjk-1013: error handling when set mode fails Irina Tirdea
2014-12-06 11:11   ` Jonathan Cameron
2014-12-05 22:18 ` [PATCH 4/4] iio: accel: kxcjk-1013: power off device if probe fails Irina Tirdea

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).