Add a flag to the suspend class function that leaves the chip in a running state with rx interrupt enabled, so that m_can device driver can configure and use the interrupt as a wakeup source. Signed-off-by: Martin Hundebøll <martin@xxxxxxxxxx> --- drivers/net/can/m_can/m_can.c | 13 +++++++++++-- drivers/net/can/m_can/m_can.h | 2 +- drivers/net/can/m_can/m_can_platform.c | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index 16ecc11c7f62..21ac826170f9 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c @@ -2113,7 +2113,7 @@ void m_can_class_unregister(struct m_can_classdev *cdev) } EXPORT_SYMBOL_GPL(m_can_class_unregister); -int m_can_class_suspend(struct device *dev) +int m_can_class_suspend(struct device *dev, bool is_wake_source) { struct m_can_classdev *cdev = dev_get_drvdata(dev); struct net_device *ndev = cdev->net; @@ -2121,7 +2121,16 @@ int m_can_class_suspend(struct device *dev) if (netif_running(ndev)) { netif_stop_queue(ndev); netif_device_detach(ndev); - m_can_stop(ndev); + + /* + * leave the chip running with rx interrupt enabled if it used + * as a wake-up source. + */ + if (is_wake_source) + m_can_write(cdev, M_CAN_IE, IR_RF0N); + else + m_can_stop(ndev); + m_can_clk_stop(cdev); } diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h index 520e14277dff..542e8daad578 100644 --- a/drivers/net/can/m_can/m_can.h +++ b/drivers/net/can/m_can/m_can.h @@ -105,6 +105,6 @@ int m_can_class_get_clocks(struct m_can_classdev *cdev); int m_can_init_ram(struct m_can_classdev *priv); int m_can_check_mram_cfg(struct m_can_classdev *cdev, u32 mram_max_size); -int m_can_class_suspend(struct device *dev); +int m_can_class_suspend(struct device *dev, bool is_wake_source); int m_can_class_resume(struct device *dev); #endif /* _CAN_M_H_ */ diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c index cdb28d6a092c..bbf6a245a3e0 100644 --- a/drivers/net/can/m_can/m_can_platform.c +++ b/drivers/net/can/m_can/m_can_platform.c @@ -169,7 +169,7 @@ static int m_can_plat_probe(struct platform_device *pdev) static __maybe_unused int m_can_suspend(struct device *dev) { - return m_can_class_suspend(dev); + return m_can_class_suspend(dev, false); } static __maybe_unused int m_can_resume(struct device *dev) -- 2.42.0