Re: [PATCH 2/2] iio: imu: st_lsm6dsx: add system sleep power management support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> On 04/21/2017 08:22 PM, Lorenzo Bianconi wrote:
>> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@xxxxxx>
>
> Hi,

Hi Lars,

>
> Please consider writing a commit message
> (https://chris.beams.io/posts/git-commit/).
>

Ack, I will do in v2. Meanwhile I will wait for more comments.

Regards,
Lorenzo

>> ---
>>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h      |  2 ++
>>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 54 ++++++++++++++++++++++++++++
>>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c  |  1 +
>>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c  |  1 +
>>  4 files changed, 58 insertions(+)
>>
>> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
>> index 7778520..46352c7 100644
>> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
>> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
>> @@ -135,6 +135,8 @@ struct st_lsm6dsx_hw {
>>  #endif /* CONFIG_SPI_MASTER */
>>  };
>>
>> +extern const struct dev_pm_ops st_lsm6dsx_pm_ops;
>> +
>>  int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id, const char *name,
>>                    const struct st_lsm6dsx_transfer_function *tf_ops);
>>  int st_lsm6dsx_sensor_enable(struct st_lsm6dsx_sensor *sensor);
>> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
>> index 462a27b..1b53848 100644
>> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
>> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
>> @@ -36,6 +36,7 @@
>>  #include <linux/delay.h>
>>  #include <linux/iio/iio.h>
>>  #include <linux/iio/sysfs.h>
>> +#include <linux/pm.h>
>>
>>  #include <linux/platform_data/st_sensors_pdata.h>
>>
>> @@ -731,6 +732,59 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id, const char *name,
>>  }
>>  EXPORT_SYMBOL(st_lsm6dsx_probe);
>>
>> +#ifdef CONFIG_PM
>> +static int st_lsm6dsx_suspend(struct device *dev)
>> +{
>> +     struct st_lsm6dsx_hw *hw = dev_get_drvdata(dev);
>> +     struct st_lsm6dsx_sensor *sensor;
>> +     int i, err = 0;
>> +
>> +     for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) {
>> +             sensor = iio_priv(hw->iio_devs[i]);
>> +             if (!(hw->enable_mask & BIT(sensor->id)))
>> +                     continue;
>> +
>> +             err = st_lsm6dsx_write_with_mask(hw,
>> +                             st_lsm6dsx_odr_table[sensor->id].reg.addr,
>> +                             st_lsm6dsx_odr_table[sensor->id].reg.mask, 0);
>> +             if (err < 0)
>> +                     return err;
>> +     }
>> +
>> +     if (hw->fifo_mode != ST_LSM6DSX_FIFO_BYPASS)
>> +             err = st_lsm6dsx_flush_fifo(hw);
>> +
>> +     return err;
>> +}
>> +
>> +static int st_lsm6dsx_resume(struct device *dev)
>> +{
>> +     struct st_lsm6dsx_hw *hw = dev_get_drvdata(dev);
>> +     struct st_lsm6dsx_sensor *sensor;
>> +     int i, err = 0;
>> +
>> +     for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) {
>> +             sensor = iio_priv(hw->iio_devs[i]);
>> +             if (!(hw->enable_mask & BIT(sensor->id)))
>> +                     continue;
>> +
>> +             err = st_lsm6dsx_set_odr(sensor, sensor->odr);
>> +             if (err < 0)
>> +                     return err;
>> +     }
>> +
>> +     if (hw->enable_mask)
>> +             err = st_lsm6dsx_set_fifo_mode(hw, ST_LSM6DSX_FIFO_CONT);
>> +
>> +     return err;
>> +}
>> +#endif /* CONFIG_PM */
>> +
>> +const struct dev_pm_ops st_lsm6dsx_pm_ops = {
>> +     SET_SYSTEM_SLEEP_PM_OPS(st_lsm6dsx_suspend, st_lsm6dsx_resume)
>> +};
>> +EXPORT_SYMBOL(st_lsm6dsx_pm_ops);
>> +
>>  MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@xxxxxx>");
>>  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@xxxxxx>");
>>  MODULE_DESCRIPTION("STMicroelectronics st_lsm6dsx driver");
>> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c
>> index 09a51cf..305fec7 100644
>> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c
>> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c
>> @@ -98,6 +98,7 @@ MODULE_DEVICE_TABLE(i2c, st_lsm6dsx_i2c_id_table);
>>  static struct i2c_driver st_lsm6dsx_driver = {
>>       .driver = {
>>               .name = "st_lsm6dsx_i2c",
>> +             .pm = &st_lsm6dsx_pm_ops,
>>               .of_match_table = of_match_ptr(st_lsm6dsx_i2c_of_match),
>>       },
>>       .probe = st_lsm6dsx_i2c_probe,
>> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c
>> index f765a50..95472f1 100644
>> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c
>> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c
>> @@ -115,6 +115,7 @@ MODULE_DEVICE_TABLE(spi, st_lsm6dsx_spi_id_table);
>>  static struct spi_driver st_lsm6dsx_driver = {
>>       .driver = {
>>               .name = "st_lsm6dsx_spi",
>> +             .pm = &st_lsm6dsx_pm_ops,
>>               .of_match_table = of_match_ptr(st_lsm6dsx_spi_of_match),
>>       },
>>       .probe = st_lsm6dsx_spi_probe,
>>
>



-- 
UNIX is Sexy: who | grep -i blonde | talk; cd ~; wine; talk; touch;
unzip; touch; strip; gasp; finger; gasp; mount; fsck; more; yes; gasp;
umount; make clean; sleep
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux