]> www.infradead.org Git - users/hch/misc.git/commitdiff
can: m_can: call deinit/init callback when going into suspend/resume
authorSean Nyekjaer <sean@geanix.com>
Fri, 22 Nov 2024 14:52:24 +0000 (15:52 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 10 Jan 2025 10:05:44 +0000 (11:05 +0100)
m_can user like the tcan4x5x device, can go into standby mode.
Low power RX mode is enabled to allow wake on can.

Signed-off-by: Sean Nyekjaer <sean@geanix.com>
Link: https://patch.msgid.link/20241122-tcan-standby-v3-3-90bafaf5eccd@geanix.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/m_can/m_can.c

index e31ce973892a96f47d26d06464e0f6e2245550fd..777dfb23c6fa2052e9544d0808c0c4980e9c8b0f 100644 (file)
@@ -2444,6 +2444,7 @@ int m_can_class_suspend(struct device *dev)
 {
        struct m_can_classdev *cdev = dev_get_drvdata(dev);
        struct net_device *ndev = cdev->net;
+       int ret = 0;
 
        if (netif_running(ndev)) {
                netif_stop_queue(ndev);
@@ -2456,6 +2457,9 @@ int m_can_class_suspend(struct device *dev)
                if (cdev->pm_wake_source) {
                        hrtimer_cancel(&cdev->hrtimer);
                        m_can_write(cdev, M_CAN_IE, IR_RF0N);
+
+                       if (cdev->ops->deinit)
+                               ret = cdev->ops->deinit(cdev);
                } else {
                        m_can_stop(ndev);
                }
@@ -2467,7 +2471,7 @@ int m_can_class_suspend(struct device *dev)
 
        cdev->can.state = CAN_STATE_SLEEPING;
 
-       return 0;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(m_can_class_suspend);
 
@@ -2475,14 +2479,13 @@ int m_can_class_resume(struct device *dev)
 {
        struct m_can_classdev *cdev = dev_get_drvdata(dev);
        struct net_device *ndev = cdev->net;
+       int ret = 0;
 
        pinctrl_pm_select_default_state(dev);
 
        cdev->can.state = CAN_STATE_ERROR_ACTIVE;
 
        if (netif_running(ndev)) {
-               int ret;
-
                ret = m_can_clk_start(cdev);
                if (ret)
                        return ret;
@@ -2495,6 +2498,10 @@ int m_can_class_resume(struct device *dev)
                         * again.
                         */
                        cdev->active_interrupts |= IR_RF0N | IR_TEFN;
+
+                       if (cdev->ops->init)
+                               ret = cdev->ops->init(cdev);
+
                        m_can_write(cdev, M_CAN_IE, cdev->active_interrupts);
                } else {
                        ret  = m_can_start(ndev);
@@ -2508,7 +2515,7 @@ int m_can_class_resume(struct device *dev)
                netif_start_queue(ndev);
        }
 
-       return 0;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(m_can_class_resume);