iio: accel: kxcjk-1013: error handling when set mode fails
[firefly-linux-kernel-4.4.55.git] / drivers / iio / accel / kxcjk-1013.c
index 7b0a9dac7ae3177c4646194dfe585e313e691de1..0dc6ccfbee4616ee07b9d40bca5406c72c428efc 100644 (file)
@@ -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,8 @@ 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, false);
+               data->ev_enable_state = 0;
                mutex_unlock(&data->mutex);
                return ret;
        }
@@ -1009,6 +1013,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, false);
                mutex_unlock(&data->mutex);
                return ret;
        }
@@ -1368,8 +1373,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)