Message ID | 20190614122604.52935-3-sean@geanix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | io: imu: st_lsm6dsx: wake on acc event | expand |
> This adds a wakeup_enabled hook in sysfs. > If wakeup-source is enabled, wake on accelerometer event is default active. > > Signed-off-by: Sean Nyekjaer <sean@geanix.com> > --- > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 31 ++++++++++++++++++++ > 1 file changed, 31 insertions(+) > same here, what about using write_event_value/write_event_config function pointer? > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > index 092c4d02bd4e..2c8ad7d65d2f 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > @@ -630,15 +630,46 @@ static ssize_t st_lsm6dsx_sysfs_scale_avail(struct device *dev, > return len; > } > > +static ssize_t st_lsm6dsx_sysfs_get_wakeup_enabled(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct st_lsm6dsx_sensor *sensor = iio_priv(dev_get_drvdata(dev)); > + struct st_lsm6dsx_hw *hw = sensor->hw; > + > + if (device_may_wakeup(hw->dev)) > + return sprintf(buf, "%d\n", 1); > + return sprintf(buf, "%d\n", 0); what about: return sprintf(buf, "%d\n", device_may_wakeup(hw->dev)); > +} > + > +static ssize_t st_lsm6dsx_sysfs_set_wakeup_enabled(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t len) > +{ > + struct st_lsm6dsx_sensor *sensor = iio_priv(dev_get_drvdata(dev)); > + struct st_lsm6dsx_hw *hw = sensor->hw; > + > + if (strncmp(buf, "1", 1) == 0) > + device_set_wakeup_enable(hw->dev, true); > + else > + device_set_wakeup_enable(hw->dev, false); > + > + return len; > +} > + > static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(st_lsm6dsx_sysfs_sampling_frequency_avail); > static IIO_DEVICE_ATTR(in_accel_scale_available, 0444, > st_lsm6dsx_sysfs_scale_avail, NULL, 0); > +static IIO_DEVICE_ATTR(wakeup_enabled, 0644, > + st_lsm6dsx_sysfs_get_wakeup_enabled, > + st_lsm6dsx_sysfs_set_wakeup_enabled, 0); > static IIO_DEVICE_ATTR(in_anglvel_scale_available, 0444, > st_lsm6dsx_sysfs_scale_avail, NULL, 0); > > static struct attribute *st_lsm6dsx_acc_attributes[] = { > &iio_dev_attr_sampling_frequency_available.dev_attr.attr, > &iio_dev_attr_in_accel_scale_available.dev_attr.attr, > + &iio_dev_attr_wakeup_enabled.dev_attr.attr, > NULL, > }; > > -- > 2.22.0 >
On Fri, 14 Jun 2019 14:26:03 +0200 Sean Nyekjaer <sean@geanix.com> wrote: > This adds a wakeup_enabled hook in sysfs. > If wakeup-source is enabled, wake on accelerometer event is default active. > > Signed-off-by: Sean Nyekjaer <sean@geanix.com> This seems to replicate the stuff that should be there under ../power to allow the wake up source to turned on and off.. > --- > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 31 ++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > index 092c4d02bd4e..2c8ad7d65d2f 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > @@ -630,15 +630,46 @@ static ssize_t st_lsm6dsx_sysfs_scale_avail(struct device *dev, > return len; > } > > +static ssize_t st_lsm6dsx_sysfs_get_wakeup_enabled(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct st_lsm6dsx_sensor *sensor = iio_priv(dev_get_drvdata(dev)); > + struct st_lsm6dsx_hw *hw = sensor->hw; > + > + if (device_may_wakeup(hw->dev)) > + return sprintf(buf, "%d\n", 1); > + return sprintf(buf, "%d\n", 0); > +} > + > +static ssize_t st_lsm6dsx_sysfs_set_wakeup_enabled(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t len) > +{ > + struct st_lsm6dsx_sensor *sensor = iio_priv(dev_get_drvdata(dev)); > + struct st_lsm6dsx_hw *hw = sensor->hw; > + > + if (strncmp(buf, "1", 1) == 0) Can't use the kstrtobool function? It's rather less strict but should be unambiguous here. > + device_set_wakeup_enable(hw->dev, true); > + else > + device_set_wakeup_enable(hw->dev, false); > + > + return len; > +} > + > static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(st_lsm6dsx_sysfs_sampling_frequency_avail); > static IIO_DEVICE_ATTR(in_accel_scale_available, 0444, > st_lsm6dsx_sysfs_scale_avail, NULL, 0); > +static IIO_DEVICE_ATTR(wakeup_enabled, 0644, > + st_lsm6dsx_sysfs_get_wakeup_enabled, > + st_lsm6dsx_sysfs_set_wakeup_enabled, 0); > static IIO_DEVICE_ATTR(in_anglvel_scale_available, 0444, > st_lsm6dsx_sysfs_scale_avail, NULL, 0); > > static struct attribute *st_lsm6dsx_acc_attributes[] = { > &iio_dev_attr_sampling_frequency_available.dev_attr.attr, > &iio_dev_attr_in_accel_scale_available.dev_attr.attr, > + &iio_dev_attr_wakeup_enabled.dev_attr.attr, > NULL, > }; >
On 16/06/2019 15.30, Jonathan Cameron wrote: > On Fri, 14 Jun 2019 14:26:03 +0200 > Sean Nyekjaer<sean@geanix.com> wrote: > >> This adds a wakeup_enabled hook in sysfs. >> If wakeup-source is enabled, wake on accelerometer event is default active. >> >> Signed-off-by: Sean Nyekjaer<sean@geanix.com> > This seems to replicate the stuff that should be there under ../power > to allow the wake up source to turned on and off.. > Hi, Doh, I have already done it the correct way :-) The hook is here: root@host:~# cat /sys/devices/soc0/***/i2c-1/1-006a/power/wakeup enabled /Sean
diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c index 092c4d02bd4e..2c8ad7d65d2f 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -630,15 +630,46 @@ static ssize_t st_lsm6dsx_sysfs_scale_avail(struct device *dev, return len; } +static ssize_t st_lsm6dsx_sysfs_get_wakeup_enabled(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct st_lsm6dsx_sensor *sensor = iio_priv(dev_get_drvdata(dev)); + struct st_lsm6dsx_hw *hw = sensor->hw; + + if (device_may_wakeup(hw->dev)) + return sprintf(buf, "%d\n", 1); + return sprintf(buf, "%d\n", 0); +} + +static ssize_t st_lsm6dsx_sysfs_set_wakeup_enabled(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct st_lsm6dsx_sensor *sensor = iio_priv(dev_get_drvdata(dev)); + struct st_lsm6dsx_hw *hw = sensor->hw; + + if (strncmp(buf, "1", 1) == 0) + device_set_wakeup_enable(hw->dev, true); + else + device_set_wakeup_enable(hw->dev, false); + + return len; +} + static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(st_lsm6dsx_sysfs_sampling_frequency_avail); static IIO_DEVICE_ATTR(in_accel_scale_available, 0444, st_lsm6dsx_sysfs_scale_avail, NULL, 0); +static IIO_DEVICE_ATTR(wakeup_enabled, 0644, + st_lsm6dsx_sysfs_get_wakeup_enabled, + st_lsm6dsx_sysfs_set_wakeup_enabled, 0); static IIO_DEVICE_ATTR(in_anglvel_scale_available, 0444, st_lsm6dsx_sysfs_scale_avail, NULL, 0); static struct attribute *st_lsm6dsx_acc_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_accel_scale_available.dev_attr.attr, + &iio_dev_attr_wakeup_enabled.dev_attr.attr, NULL, };
This adds a wakeup_enabled hook in sysfs. If wakeup-source is enabled, wake on accelerometer event is default active. Signed-off-by: Sean Nyekjaer <sean@geanix.com> --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+)