diff options
author | NeilBrown <neilb@suse.de> | 2015-02-23 21:24:41 -0500 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2015-03-09 10:54:42 -0400 |
commit | 60d3e3bbd5992bb4478f9f99a4e4c5748a1a1ba7 (patch) | |
tree | 44327c9e057a82b0001722f5d9eeca3885757b88 | |
parent | d1bd4867b0959d5221dc528ccf60c8534aae865d (diff) |
iio: gyro: itg3200: add suspend/resume support.
Unless we put the device to sleep when not it use, it wastes
6mA.
If the device is asleep on probe, the 'id' register
sometimes mis-reads - so reset first. If the device responds
at all a command sent to the address, it is almost certainly
the correct device already.
Acked-by: Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
Acked-by: Hartmut Knaack <knaack.h@gmx.de>
Signed-off-by: NeilBrown <neil@brown.name>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r-- | drivers/iio/gyro/itg3200_core.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/drivers/iio/gyro/itg3200_core.c b/drivers/iio/gyro/itg3200_core.c index 6a8020d48140..f0fd94055d88 100644 --- a/drivers/iio/gyro/itg3200_core.c +++ b/drivers/iio/gyro/itg3200_core.c | |||
@@ -223,6 +223,10 @@ static int itg3200_initial_setup(struct iio_dev *indio_dev) | |||
223 | int ret; | 223 | int ret; |
224 | u8 val; | 224 | u8 val; |
225 | 225 | ||
226 | ret = itg3200_reset(indio_dev); | ||
227 | if (ret) | ||
228 | goto err_ret; | ||
229 | |||
226 | ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_ADDRESS, &val); | 230 | ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_ADDRESS, &val); |
227 | if (ret) | 231 | if (ret) |
228 | goto err_ret; | 232 | goto err_ret; |
@@ -233,10 +237,6 @@ static int itg3200_initial_setup(struct iio_dev *indio_dev) | |||
233 | goto err_ret; | 237 | goto err_ret; |
234 | } | 238 | } |
235 | 239 | ||
236 | ret = itg3200_reset(indio_dev); | ||
237 | if (ret) | ||
238 | goto err_ret; | ||
239 | |||
240 | ret = itg3200_enable_full_scale(indio_dev); | 240 | ret = itg3200_enable_full_scale(indio_dev); |
241 | err_ret: | 241 | err_ret: |
242 | return ret; | 242 | return ret; |
@@ -351,6 +351,26 @@ static int itg3200_remove(struct i2c_client *client) | |||
351 | return 0; | 351 | return 0; |
352 | } | 352 | } |
353 | 353 | ||
354 | static int __maybe_unused itg3200_suspend(struct device *dev) | ||
355 | { | ||
356 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | ||
357 | struct itg3200 *st = iio_priv(indio_dev); | ||
358 | |||
359 | dev_dbg(&st->i2c->dev, "suspend device"); | ||
360 | |||
361 | return itg3200_write_reg_8(indio_dev, ITG3200_REG_POWER_MANAGEMENT, | ||
362 | ITG3200_SLEEP); | ||
363 | } | ||
364 | |||
365 | static int __maybe_unused itg3200_resume(struct device *dev) | ||
366 | { | ||
367 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | ||
368 | |||
369 | return itg3200_initial_setup(indio_dev); | ||
370 | } | ||
371 | |||
372 | static SIMPLE_DEV_PM_OPS(itg3200_pm_ops, itg3200_suspend, itg3200_resume); | ||
373 | |||
354 | static const struct i2c_device_id itg3200_id[] = { | 374 | static const struct i2c_device_id itg3200_id[] = { |
355 | { "itg3200", 0 }, | 375 | { "itg3200", 0 }, |
356 | { } | 376 | { } |
@@ -361,6 +381,7 @@ static struct i2c_driver itg3200_driver = { | |||
361 | .driver = { | 381 | .driver = { |
362 | .owner = THIS_MODULE, | 382 | .owner = THIS_MODULE, |
363 | .name = "itg3200", | 383 | .name = "itg3200", |
384 | .pm = &itg3200_pm_ops, | ||
364 | }, | 385 | }, |
365 | .id_table = itg3200_id, | 386 | .id_table = itg3200_id, |
366 | .probe = itg3200_probe, | 387 | .probe = itg3200_probe, |