Hi Martin, On Tue, Sep 19, 2023 at 02:28:33PM +0200, Martin Hundebøll wrote: > Implement the "wakeup-source" device tree property, so the chip is left > running when suspending, and its rx interrupt is used as a wakeup source > to resume operation. I think you need to add a patch in your series to update the binding documentation in Documentation/devicetree/bindings/net/can/tcan4x5x.txt with the wakeup-source property. Best, Markus > > Signed-off-by: Martin Hundebøll <martin@xxxxxxxxxx> > --- > > Change since v1: > * Added `static` keyword to dev_pm_ops sturcture > > drivers/net/can/m_can/tcan4x5x-core.c | 34 ++++++++++++++++++++++++++- > 1 file changed, 33 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/can/m_can/tcan4x5x-core.c b/drivers/net/can/m_can/tcan4x5x-core.c > index 8a4143809d33..ccb279af22bb 100644 > --- a/drivers/net/can/m_can/tcan4x5x-core.c > +++ b/drivers/net/can/m_can/tcan4x5x-core.c > @@ -459,6 +459,9 @@ static int tcan4x5x_can_probe(struct spi_device *spi) > goto out_power; > } > > + if (device_property_read_bool(&spi->dev, "wakeup-source")) > + device_init_wakeup(&spi->dev, true); > + > ret = m_can_class_register(mcan_class); > if (ret) { > dev_err(&spi->dev, "Failed registering m_can device %pe\n", > @@ -487,6 +490,31 @@ static void tcan4x5x_can_remove(struct spi_device *spi) > m_can_class_free_dev(priv->cdev.net); > } > > +static int __maybe_unused tcan4x5x_suspend(struct device *dev) > +{ > + struct spi_device *spi = to_spi_device(dev); > + > + if (device_may_wakeup(dev)) { > + enable_irq_wake(spi->irq); > + > + return m_can_class_suspend(dev, true); > + } > + > + return m_can_class_suspend(dev, false); > +} > + > +static int __maybe_unused tcan4x5x_resume(struct device *dev) > +{ > + struct spi_device *spi = to_spi_device(dev); > + bool wake_source = device_may_wakeup(dev); > + int ret = m_can_class_resume(dev, wake_source); > + > + if (wake_source) > + disable_irq_wake(spi->irq); > + > + return ret; > +} > + > static const struct of_device_id tcan4x5x_of_match[] = { > { > .compatible = "ti,tcan4x5x", > @@ -505,11 +533,15 @@ static const struct spi_device_id tcan4x5x_id_table[] = { > }; > MODULE_DEVICE_TABLE(spi, tcan4x5x_id_table); > > +static const struct dev_pm_ops tcan4x5x_pm_ops = { > + SET_SYSTEM_SLEEP_PM_OPS(tcan4x5x_suspend, tcan4x5x_resume) > +}; > + > static struct spi_driver tcan4x5x_can_driver = { > .driver = { > .name = KBUILD_MODNAME, > .of_match_table = tcan4x5x_of_match, > - .pm = NULL, > + .pm = &tcan4x5x_pm_ops, > }, > .id_table = tcan4x5x_id_table, > .probe = tcan4x5x_can_probe, > -- > 2.42.0 >