]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
iio: imu: st_lsm6dsx: add wakeup-source option
authorSean Nyekjaer <sean@geanix.com>
Mon, 16 Sep 2019 13:56:28 +0000 (15:56 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 5 Oct 2019 11:36:39 +0000 (12:36 +0100)
This add ways for the SoC to wake from accelerometer wake events.

In the suspend function we skip disabling the sensor if wakeup-source
and events are activated.

Signed-off-by: Sean Nyekjaer <sean@geanix.com>
Reviewed-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c

index 806935c8f033e110acd1402437129257bebb9f8d..dcac1314e76983642679c727abcf0d1f5eaefd7c 100644 (file)
@@ -1858,6 +1858,9 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
                        return err;
        }
 
+       if (dev->of_node && of_property_read_bool(dev->of_node, "wakeup-source"))
+               device_init_wakeup(dev, true);
+
        return 0;
 }
 EXPORT_SYMBOL(st_lsm6dsx_probe);
@@ -1876,6 +1879,13 @@ static int __maybe_unused st_lsm6dsx_suspend(struct device *dev)
                if (!(hw->enable_mask & BIT(sensor->id)))
                        continue;
 
+               if (device_may_wakeup(dev) &&
+                   sensor->id == ST_LSM6DSX_ID_ACC && hw->enable_event) {
+                       /* Enable wake from IRQ */
+                       enable_irq_wake(hw->irq);
+                       continue;
+               }
+
                if (sensor->id == ST_LSM6DSX_ID_EXT0 ||
                    sensor->id == ST_LSM6DSX_ID_EXT1 ||
                    sensor->id == ST_LSM6DSX_ID_EXT2)
@@ -1905,6 +1915,10 @@ static int __maybe_unused st_lsm6dsx_resume(struct device *dev)
                        continue;
 
                sensor = iio_priv(hw->iio_devs[i]);
+               if (device_may_wakeup(dev) &&
+                   sensor->id == ST_LSM6DSX_ID_ACC && hw->enable_event)
+                       disable_irq_wake(hw->irq);
+
                if (!(hw->suspend_mask & BIT(sensor->id)))
                        continue;