[PATCH v3 10/15] can: grcan: Add saving and restoring of CAN FD baud-rate registers

Arun Muthusamy posted 15 patches 2 weeks, 4 days ago
There is a newer version of this series
[PATCH v3 10/15] can: grcan: Add saving and restoring of CAN FD baud-rate registers
Posted by Arun Muthusamy 2 weeks, 4 days ago
From: Daniel Hellstrom <daniel@gaisler.com>

While reset the GRCAN baud-rates are preserved, since GRCANFD has the
baud-rate in different registers we need to add saving of those
registers too.

Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
Signed-off-by: Arun Muthusamy <arun.muthusamy@gaisler.com>
---
 drivers/net/can/grcan.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/net/can/grcan.c b/drivers/net/can/grcan.c
index a2a5a5c868ff..0ee6e9bfbe7f 100644
--- a/drivers/net/can/grcan.c
+++ b/drivers/net/can/grcan.c
@@ -517,15 +517,27 @@ static void grcan_reset(struct net_device *dev)
 	struct grcan_priv *priv = netdev_priv(dev);
 	struct grcan_registers __iomem *regs = priv->regs;
 	u32 config = grcan_read_reg(&regs->conf);
+	u32 nbtr, fdbtr;
+
+	if (priv->hwcap->fd) {
+		nbtr = grcan_read_reg(&regs->nbtr);
+		fdbtr = grcan_read_reg(&regs->fdbtr);
+	}
 
 	grcan_set_bits(&regs->ctrl, GRCAN_CTRL_RESET);
 	grcan_write_reg(&regs->conf, config);
+	if (priv->hwcap->fd) {
+		grcan_write_reg(&regs->nbtr, nbtr);
+		grcan_write_reg(&regs->fdbtr, fdbtr);
+	}
 
 	priv->eskbp = grcan_read_reg(&regs->txrd);
 	priv->can.state = CAN_STATE_STOPPED;
 
 	/* Turn off hardware filtering - regs->rxcode set to 0 by reset */
 	grcan_write_reg(&regs->rxmask, 0);
+
+	priv->hwcap->set_bittiming(dev);
 }
 
 /* stop device without changing any configurations */
-- 
2.51.0
Re: [PATCH v3 10/15] can: grcan: Add saving and restoring of CAN FD baud-rate registers
Posted by Marc Kleine-Budde 2 weeks, 3 days ago
On 22.01.2026 13:10:33, Arun Muthusamy wrote:
> From: Daniel Hellstrom <daniel@gaisler.com>
>
> While reset the GRCAN baud-rates are preserved, since GRCANFD has the
> baud-rate in different registers we need to add saving of those
> registers too.
>
> Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
> Signed-off-by: Arun Muthusamy <arun.muthusamy@gaisler.com>
> ---
>  drivers/net/can/grcan.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/drivers/net/can/grcan.c b/drivers/net/can/grcan.c
> index a2a5a5c868ff..0ee6e9bfbe7f 100644
> --- a/drivers/net/can/grcan.c
> +++ b/drivers/net/can/grcan.c
> @@ -517,15 +517,27 @@ static void grcan_reset(struct net_device *dev)
>  	struct grcan_priv *priv = netdev_priv(dev);
>  	struct grcan_registers __iomem *regs = priv->regs;
>  	u32 config = grcan_read_reg(&regs->conf);
> +	u32 nbtr, fdbtr;
> +
> +	if (priv->hwcap->fd) {
> +		nbtr = grcan_read_reg(&regs->nbtr);

Why do you save nbtr....

> +		fdbtr = grcan_read_reg(&regs->fdbtr);

   Who writes fdbtr in the first place?

> +	}
>
>  	grcan_set_bits(&regs->ctrl, GRCAN_CTRL_RESET);
>  	grcan_write_reg(&regs->conf, config);
> +	if (priv->hwcap->fd) {
> +		grcan_write_reg(&regs->nbtr, nbtr);
> +		grcan_write_reg(&regs->fdbtr, fdbtr);
> +	}
>
>  	priv->eskbp = grcan_read_reg(&regs->txrd);
>  	priv->can.state = CAN_STATE_STOPPED;
>
>  	/* Turn off hardware filtering - regs->rxcode set to 0 by reset */
>  	grcan_write_reg(&regs->rxmask, 0);
> +
> +	priv->hwcap->set_bittiming(dev);

...if you configure the bit timing again, wich writes nbtr?

regards,
Marc

-- 
Pengutronix e.K.                 | Marc Kleine-Budde          |
Embedded Linux                   | https://www.pengutronix.de |
Vertretung Nürnberg              | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax:   +49-5121-206917-9   |
Re: [PATCH v3 10/15] can: grcan: Add saving and restoring of CAN FD baud-rate registers
Posted by Arun Muthusamy 1 week, 5 days ago
On 1/23/26 15:00, Marc Kleine-Budde wrote:
> On 22.01.2026 13:10:33, Arun Muthusamy wrote:
>> From: Daniel Hellstrom <daniel@gaisler.com>
>>
>> While reset the GRCAN baud-rates are preserved, since GRCANFD has the
>> baud-rate in different registers we need to add saving of those
>> registers too.
>>
>> Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
>> Signed-off-by: Arun Muthusamy <arun.muthusamy@gaisler.com>
>> ---
>>   drivers/net/can/grcan.c | 12 ++++++++++++
>>   1 file changed, 12 insertions(+)
>>
>> diff --git a/drivers/net/can/grcan.c b/drivers/net/can/grcan.c
>> index a2a5a5c868ff..0ee6e9bfbe7f 100644
>> --- a/drivers/net/can/grcan.c
>> +++ b/drivers/net/can/grcan.c
>> @@ -517,15 +517,27 @@ static void grcan_reset(struct net_device *dev)
>>   	struct grcan_priv *priv = netdev_priv(dev);
>>   	struct grcan_registers __iomem *regs = priv->regs;
>>   	u32 config = grcan_read_reg(&regs->conf);
>> +	u32 nbtr, fdbtr;
>> +
>> +	if (priv->hwcap->fd) {
>> +		nbtr = grcan_read_reg(&regs->nbtr);
> Why do you save nbtr....

You’re right. nbtr is reprogrammed by set_bittiming() after reset, so saving/restoring nbtr is redundant.

>> +		fdbtr = grcan_read_reg(&regs->fdbtr);
>     Who writes fdbtr in the first place?

These configuration values are embedded into the CAN controller IP at SoC design time(cfg record).
 From the driver's standpoint, saving/restoring fdbtr also redundant.

-- 
BR,

Arun Muthusamy
Software Engineer
Frontgrade Gaisler
T : +46 (0) 700 558 528
arun.muthusamy@gaisler.com

Frontgrade Gaisler AB, Kungsgatan 12, SE-411 19 GÖTEBORG, Sweden.
+46 (0) 31 775 8650, www.gaisler.com