From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from saturn.retrosnub.co.uk ([178.18.118.26]:52109 "EHLO saturn.retrosnub.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750716AbaKPUXL (ORCPT ); Sun, 16 Nov 2014 15:23:11 -0500 Message-ID: <546907AC.8050802@kernel.org> Date: Sun, 16 Nov 2014 20:23:08 +0000 From: Jonathan Cameron MIME-Version: 1.0 To: Srinivas Pandruvada CC: linux-iio@vger.kernel.org Subject: Re: [PATCH v1 1/4] iio: accel: bmc150: Error handling when mode set fails References: <1412998534-31971-1-git-send-email-srinivas.pandruvada@linux.intel.com> <1412998534-31971-2-git-send-email-srinivas.pandruvada@linux.intel.com> In-Reply-To: <1412998534-31971-2-git-send-email-srinivas.pandruvada@linux.intel.com> Content-Type: text/plain; charset=windows-1252 Sender: linux-iio-owner@vger.kernel.org List-Id: linux-iio@vger.kernel.org On 11/10/14 04:35, Srinivas Pandruvada wrote: > When mode set fails due to some transient failures, it will atleast > reset the state of runtime usage count and also let the runtime > suspend retry from the driver framework. > > Signed-off-by: Srinivas Pandruvada Applied to the fixes-togreg branch of iio.git Thanks, Jonathan > --- > drivers/iio/accel/bmc150-accel.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/drivers/iio/accel/bmc150-accel.c b/drivers/iio/accel/bmc150-accel.c > index 22c096c..fdb101c 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) > if (ret < 0) { > dev_err(&data->client->dev, > "Failed: bmc150_accel_set_power_state for %d\n", on); > + if (on) > + pm_runtime_put_noidle(&data->client->dev); > + > return ret; > } > > @@ -811,6 +814,7 @@ static int bmc150_accel_write_event_config(struct iio_dev *indio_dev, > > ret = bmc150_accel_setup_any_motion_interrupt(data, state); > if (ret < 0) { > + bmc150_accel_set_power_state(data, false); > mutex_unlock(&data->mutex); > return ret; > } > @@ -1054,6 +1058,7 @@ static int bmc150_accel_data_rdy_trigger_set_state(struct iio_trigger *trig, > else > ret = bmc150_accel_setup_new_data_interrupt(data, state); > if (ret < 0) { > + bmc150_accel_set_power_state(data, false); > mutex_unlock(&data->mutex); > return ret; > } > @@ -1354,10 +1359,14 @@ static int bmc150_accel_runtime_suspend(struct device *dev) > { > struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); > struct bmc150_accel_data *data = iio_priv(indio_dev); > + int ret; > > dev_dbg(&data->client->dev, __func__); > + ret = bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0); > + if (ret < 0) > + return -EAGAIN; > > - return bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0); > + return 0; > } > > static int bmc150_accel_runtime_resume(struct device *dev) >