On 05/05/2017 01:46 PM, Quentin Schulz wrote: > This adds Power Management deep Suspend/Resume support for Bosch M_CAN > chip. > > When entering deep sleep, the clocks are gated, the interrupts are > disabled. When resuming from deep sleep, the chip needs to be > reinitialized, the clocks ungated and the interrupts enabled. > > Signed-off-by: Quentin Schulz > --- > > v3: > - do not close/reopen the can interface (which was previously done when > calling m_can_close), basically do the same routine as in probe but > it does not close/open the can device, much better! > - update commit log, > > v2: > - fix erroneous commit log, > > drivers/net/can/m_can/m_can.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c > index 3f0445440146..0a06690febe2 100644 > --- a/drivers/net/can/m_can/m_can.c > +++ b/drivers/net/can/m_can/m_can.c > @@ -1672,10 +1672,9 @@ static __maybe_unused int m_can_suspend(struct device *dev) > if (netif_running(ndev)) { > netif_stop_queue(ndev); > netif_device_detach(ndev); > + m_can_stop(ndev); > } > > - /* TODO: enter low power */ > - > priv->can.state = CAN_STATE_SLEEPING; > > return 0; > @@ -1686,11 +1685,23 @@ static __maybe_unused int m_can_resume(struct device *dev) > struct net_device *ndev = dev_get_drvdata(dev); > struct m_can_priv *priv = netdev_priv(ndev); > > - /* TODO: exit low power */ > + m_can_init_ram(priv); > > priv->can.state = CAN_STATE_ERROR_ACTIVE; > > if (netif_running(ndev)) { > + int ret = clk_prepare_enable(priv->hclk); > + > + if (ret) > + return ret; > + > + ret = clk_prepare_enable(priv->cclk); > + if (ret) { > + clk_disable_unprepare(priv->hclk); > + return ret; > + } > + > + m_can_start(ndev); Using m_can_stop() m_can_start() here is the way to go. However, when looking at this hook we se, that the m_can_start/stop functions are not symmetric (as they should be). Either move the clock handling to completely in or out of m_can_start/stop. > netif_device_attach(ndev); > netif_start_queue(ndev); > } > Marc -- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |