Commit 52d48a3d authored by Marc Kleine-Budde's avatar Marc Kleine-Budde
Browse files

Merge patch series "can: flexcan: only change CAN state when link up in system PM"

In this series Haibo Chen fixes several shortcomings of the suspend
and resume functions of the flexcan driver.

Link: https://patch.msgid.link/20250314110145.899179-1-haibo.chen@nxp.com


Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parents d5cd4548 5a191431
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -2260,14 +2260,19 @@ static int __maybe_unused flexcan_suspend(struct device *device)

			flexcan_chip_interrupts_disable(dev);

			err = flexcan_transceiver_disable(priv);
			if (err)
				return err;

			err = pinctrl_pm_select_sleep_state(device);
			if (err)
				return err;
		}
		netif_stop_queue(dev);
		netif_device_detach(dev);
	}

		priv->can.state = CAN_STATE_SLEEPING;
	}

	return 0;
}
@@ -2278,7 +2283,6 @@ static int __maybe_unused flexcan_resume(struct device *device)
	struct flexcan_priv *priv = netdev_priv(dev);
	int err;

	priv->can.state = CAN_STATE_ERROR_ACTIVE;
	if (netif_running(dev)) {
		netif_device_attach(dev);
		netif_start_queue(dev);
@@ -2292,12 +2296,20 @@ static int __maybe_unused flexcan_resume(struct device *device)
			if (err)
				return err;

			err = flexcan_chip_start(dev);
			err = flexcan_transceiver_enable(priv);
			if (err)
				return err;

			err = flexcan_chip_start(dev);
			if (err) {
				flexcan_transceiver_disable(priv);
				return err;
			}

			flexcan_chip_interrupts_enable(dev);
		}

		priv->can.state = CAN_STATE_ERROR_ACTIVE;
	}

	return 0;