diff options
Diffstat (limited to 'drivers/iio')
-rw-r--r-- | drivers/iio/accel/bmc150-accel.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/iio/accel/bmc150-accel.c b/drivers/iio/accel/bmc150-accel.c index 22c096ce39ad..fdb101c48599 100644 --- a/drivers/iio/accel/bmc150-accel.c +++ b/drivers/iio/accel/bmc150-accel.c | |||
@@ -536,6 +536,9 @@ static int bmc150_accel_set_power_state(struct bmc150_accel_data *data, bool on) | |||
536 | if (ret < 0) { | 536 | if (ret < 0) { |
537 | dev_err(&data->client->dev, | 537 | dev_err(&data->client->dev, |
538 | "Failed: bmc150_accel_set_power_state for %d\n", on); | 538 | "Failed: bmc150_accel_set_power_state for %d\n", on); |
539 | if (on) | ||
540 | pm_runtime_put_noidle(&data->client->dev); | ||
541 | |||
539 | return ret; | 542 | return ret; |
540 | } | 543 | } |
541 | 544 | ||
@@ -811,6 +814,7 @@ static int bmc150_accel_write_event_config(struct iio_dev *indio_dev, | |||
811 | 814 | ||
812 | ret = bmc150_accel_setup_any_motion_interrupt(data, state); | 815 | ret = bmc150_accel_setup_any_motion_interrupt(data, state); |
813 | if (ret < 0) { | 816 | if (ret < 0) { |
817 | bmc150_accel_set_power_state(data, false); | ||
814 | mutex_unlock(&data->mutex); | 818 | mutex_unlock(&data->mutex); |
815 | return ret; | 819 | return ret; |
816 | } | 820 | } |
@@ -1054,6 +1058,7 @@ static int bmc150_accel_data_rdy_trigger_set_state(struct iio_trigger *trig, | |||
1054 | else | 1058 | else |
1055 | ret = bmc150_accel_setup_new_data_interrupt(data, state); | 1059 | ret = bmc150_accel_setup_new_data_interrupt(data, state); |
1056 | if (ret < 0) { | 1060 | if (ret < 0) { |
1061 | bmc150_accel_set_power_state(data, false); | ||
1057 | mutex_unlock(&data->mutex); | 1062 | mutex_unlock(&data->mutex); |
1058 | return ret; | 1063 | return ret; |
1059 | } | 1064 | } |
@@ -1354,10 +1359,14 @@ static int bmc150_accel_runtime_suspend(struct device *dev) | |||
1354 | { | 1359 | { |
1355 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | 1360 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); |
1356 | struct bmc150_accel_data *data = iio_priv(indio_dev); | 1361 | struct bmc150_accel_data *data = iio_priv(indio_dev); |
1362 | int ret; | ||
1357 | 1363 | ||
1358 | dev_dbg(&data->client->dev, __func__); | 1364 | dev_dbg(&data->client->dev, __func__); |
1365 | ret = bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0); | ||
1366 | if (ret < 0) | ||
1367 | return -EAGAIN; | ||
1359 | 1368 | ||
1360 | return bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0); | 1369 | return 0; |
1361 | } | 1370 | } |
1362 | 1371 | ||
1363 | static int bmc150_accel_runtime_resume(struct device *dev) | 1372 | static int bmc150_accel_runtime_resume(struct device *dev) |