aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio
diff options
context:
space:
mode:
authorIrina Tirdea <irina.tirdea@intel.com>2014-12-10 11:23:53 -0500
committerJonathan Cameron <jic23@kernel.org>2014-12-12 07:28:35 -0500
commitfbd123e913ed25ec861ce3be10725b5beb27ab48 (patch)
tree284b0e690424904ad4dc5c43b130b69b0fcf2eb7 /drivers/iio
parent374956600ecbedf5ca29c76bde114160eb805091 (diff)
iio: accel: kxcjk-1013: error handling when set mode fails
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> Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio')
-rw-r--r--drivers/iio/accel/kxcjk-1013.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index 7b0a9dac7ae3..0dc6ccfbee46 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)
388 if (ret < 0) { 388 if (ret < 0) {
389 dev_err(&data->client->dev, 389 dev_err(&data->client->dev,
390 "Failed: kxcjk1013_set_power_state for %d\n", on); 390 "Failed: kxcjk1013_set_power_state for %d\n", on);
391 if (on)
392 pm_runtime_put_noidle(&data->client->dev);
391 return ret; 393 return ret;
392 } 394 }
393#endif 395#endif
@@ -859,6 +861,8 @@ static int kxcjk1013_write_event_config(struct iio_dev *indio_dev,
859 861
860 ret = kxcjk1013_setup_any_motion_interrupt(data, state); 862 ret = kxcjk1013_setup_any_motion_interrupt(data, state);
861 if (ret < 0) { 863 if (ret < 0) {
864 kxcjk1013_set_power_state(data, false);
865 data->ev_enable_state = 0;
862 mutex_unlock(&data->mutex); 866 mutex_unlock(&data->mutex);
863 return ret; 867 return ret;
864 } 868 }
@@ -1009,6 +1013,7 @@ static int kxcjk1013_data_rdy_trigger_set_state(struct iio_trigger *trig,
1009 else 1013 else
1010 ret = kxcjk1013_setup_new_data_interrupt(data, state); 1014 ret = kxcjk1013_setup_new_data_interrupt(data, state);
1011 if (ret < 0) { 1015 if (ret < 0) {
1016 kxcjk1013_set_power_state(data, false);
1012 mutex_unlock(&data->mutex); 1017 mutex_unlock(&data->mutex);
1013 return ret; 1018 return ret;
1014 } 1019 }
@@ -1368,8 +1373,14 @@ static int kxcjk1013_runtime_suspend(struct device *dev)
1368{ 1373{
1369 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); 1374 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1370 struct kxcjk1013_data *data = iio_priv(indio_dev); 1375 struct kxcjk1013_data *data = iio_priv(indio_dev);
1376 int ret;
1371 1377
1372 return kxcjk1013_set_mode(data, STANDBY); 1378 ret = kxcjk1013_set_mode(data, STANDBY);
1379 if (ret < 0) {
1380 dev_err(&data->client->dev, "powering off device failed\n");
1381 return -EAGAIN;
1382 }
1383 return 0;
1373} 1384}
1374 1385
1375static int kxcjk1013_runtime_resume(struct device *dev) 1386static int kxcjk1013_runtime_resume(struct device *dev)