ASoC: rt5514: Voice wakeup support.
authoroder_chiou@realtek.com <oder_chiou@realtek.com>
Wed, 8 Nov 2017 07:04:21 +0000 (15:04 +0800)
committerMark Brown <broonie@kernel.org>
Wed, 8 Nov 2017 21:29:05 +0000 (21:29 +0000)
If the rt5514 Wake on Voice device is opened while suspended, it will
be able to wake up the system when a voice command is detected.
This patch also supports user-space policy to override wakeup behavior
by /sys/bus/spi/drivers/rt5514/spi2.0/power/wakeup.

Signed-off-by: Chinyue Chen <chinyue@chromium.org>
Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5514-spi.c

index 0896817ffc3f82b56608693365a0c5f9be9c18e4..d03756913dd9c72fc5d32ee61ea76cd54d87605b 100644 (file)
@@ -456,9 +456,35 @@ static int rt5514_spi_probe(struct spi_device *spi)
                return ret;
        }
 
+       device_init_wakeup(&spi->dev, true);
+
+       return 0;
+}
+
+static int rt5514_suspend(struct device *dev)
+{
+       int irq = to_spi_device(dev)->irq;
+
+       if (device_may_wakeup(dev))
+               enable_irq_wake(irq);
+
        return 0;
 }
 
+static int rt5514_resume(struct device *dev)
+{
+       int irq = to_spi_device(dev)->irq;
+
+       if (device_may_wakeup(dev))
+               disable_irq_wake(irq);
+
+       return 0;
+}
+
+static const struct dev_pm_ops rt5514_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(rt5514_suspend, rt5514_resume)
+};
+
 static const struct of_device_id rt5514_of_match[] = {
        { .compatible = "realtek,rt5514", },
        {},
@@ -468,6 +494,7 @@ MODULE_DEVICE_TABLE(of, rt5514_of_match);
 static struct spi_driver rt5514_spi_driver = {
        .driver = {
                .name = "rt5514",
+               .pm = &rt5514_pm_ops,
                .of_match_table = of_match_ptr(rt5514_of_match),
        },
        .probe = rt5514_spi_probe,