]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
can: mcp251xfd: move mcp251xfd_timestamp_start()/stop() into mcp251xfd_chip_start...
authorMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 11 Jan 2023 11:10:04 +0000 (12:10 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 28 Jun 2024 21:48:11 +0000 (23:48 +0200)
The mcp251xfd wakes up from Low Power or Sleep Mode when SPI activity
is detected. To avoid this, make sure that the timestamp worker is
stopped before shutting down the chip.

Split the starting of the timestamp worker out of
mcp251xfd_timestamp_init() into the separate function
mcp251xfd_timestamp_start().

Call mcp251xfd_timestamp_init() before mcp251xfd_chip_start(), move
mcp251xfd_timestamp_start() to mcp251xfd_chip_start(). In this way,
mcp251xfd_timestamp_stop() can be called unconditionally by
mcp251xfd_chip_stop().

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
drivers/net/can/spi/mcp251xfd/mcp251xfd-timestamp.c
drivers/net/can/spi/mcp251xfd/mcp251xfd.h

index ce1610f240a4d9450fbd9cd23fa4ba943aa340f8..e8e11c32cfda190098515b2a0da6a6fba41438ee 100644 (file)
@@ -744,6 +744,7 @@ static void mcp251xfd_chip_stop(struct mcp251xfd_priv *priv,
 
        mcp251xfd_chip_interrupts_disable(priv);
        mcp251xfd_chip_rx_int_disable(priv);
+       mcp251xfd_timestamp_stop(priv);
        mcp251xfd_chip_sleep(priv);
 }
 
@@ -763,6 +764,8 @@ static int mcp251xfd_chip_start(struct mcp251xfd_priv *priv)
        if (err)
                goto out_chip_stop;
 
+       mcp251xfd_timestamp_start(priv);
+
        err = mcp251xfd_set_bittiming(priv);
        if (err)
                goto out_chip_stop;
@@ -1611,11 +1614,12 @@ static int mcp251xfd_open(struct net_device *ndev)
        if (err)
                goto out_mcp251xfd_ring_free;
 
+       mcp251xfd_timestamp_init(priv);
+
        err = mcp251xfd_chip_start(priv);
        if (err)
                goto out_transceiver_disable;
 
-       mcp251xfd_timestamp_init(priv);
        clear_bit(MCP251XFD_FLAGS_DOWN, priv->flags);
        can_rx_offload_enable(&priv->offload);
 
@@ -1649,7 +1653,6 @@ out_destroy_workqueue:
 out_can_rx_offload_disable:
        can_rx_offload_disable(&priv->offload);
        set_bit(MCP251XFD_FLAGS_DOWN, priv->flags);
-       mcp251xfd_timestamp_stop(priv);
 out_transceiver_disable:
        mcp251xfd_transceiver_disable(priv);
 out_mcp251xfd_ring_free:
@@ -1675,7 +1678,6 @@ static int mcp251xfd_stop(struct net_device *ndev)
        free_irq(ndev->irq, priv);
        destroy_workqueue(priv->wq);
        can_rx_offload_disable(&priv->offload);
-       mcp251xfd_timestamp_stop(priv);
        mcp251xfd_chip_stop(priv, CAN_STATE_STOPPED);
        mcp251xfd_transceiver_disable(priv);
        mcp251xfd_ring_free(priv);
index 712e091869870c62ab5297cbdc2d6e2f61e710fc..7bbf4603038b318390f1d0ad19edec10ec72be57 100644 (file)
@@ -58,9 +58,12 @@ void mcp251xfd_timestamp_init(struct mcp251xfd_priv *priv)
        cc->shift = 1;
        cc->mult = clocksource_hz2mult(priv->can.clock.freq, cc->shift);
 
-       timecounter_init(&priv->tc, &priv->cc, ktime_get_real_ns());
-
        INIT_DELAYED_WORK(&priv->timestamp, mcp251xfd_timestamp_work);
+}
+
+void mcp251xfd_timestamp_start(struct mcp251xfd_priv *priv)
+{
+       timecounter_init(&priv->tc, &priv->cc, ktime_get_real_ns());
        schedule_delayed_work(&priv->timestamp,
                              MCP251XFD_TIMESTAMP_WORK_DELAY_SEC * HZ);
 }
index b35bfebd23f292a9953d634ab14d17f606949225..d6f6b3182e6a36baeb09783e0121ab4176343761 100644 (file)
@@ -954,6 +954,7 @@ int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv);
 void mcp251xfd_skb_set_timestamp(const struct mcp251xfd_priv *priv,
                                 struct sk_buff *skb, u32 timestamp);
 void mcp251xfd_timestamp_init(struct mcp251xfd_priv *priv);
+void mcp251xfd_timestamp_start(struct mcp251xfd_priv *priv);
 void mcp251xfd_timestamp_stop(struct mcp251xfd_priv *priv);
 
 void mcp251xfd_tx_obj_write_sync(struct work_struct *work);