lkml.org 
[lkml]   [2022]   [Aug]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.18 71/93] can: sja1000: Add Quirk for RZ/N1 SJA1000 CAN controller
    Date
    From: Biju Das <biju.das.jz@bp.renesas.com>

    [ Upstream commit 2d99bfbf3386962692dcccd73931cb0db07a1a43 ]

    As per Chapter 6.5.16 of the RZ/N1 Peripheral Manual, The SJA1000
    CAN controller does not support Clock Divider Register compared to
    the reference Philips SJA1000 device.

    This patch adds a device quirk to handle this difference.

    Link: https://lore.kernel.org/all/20220710115248.190280-4-biju.das.jz@bp.renesas.com
    Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/can/sja1000/sja1000.c | 8 +++++---
    drivers/net/can/sja1000/sja1000.h | 3 ++-
    2 files changed, 7 insertions(+), 4 deletions(-)

    diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
    index 966316479485..12c4cd8dc05d 100644
    --- a/drivers/net/can/sja1000/sja1000.c
    +++ b/drivers/net/can/sja1000/sja1000.c
    @@ -184,8 +184,9 @@ static void chipset_init(struct net_device *dev)
    {
    struct sja1000_priv *priv = netdev_priv(dev);

    - /* set clock divider and output control register */
    - priv->write_reg(priv, SJA1000_CDR, priv->cdr | CDR_PELICAN);
    + if (!(priv->flags & SJA1000_QUIRK_NO_CDR_REG))
    + /* set clock divider and output control register */
    + priv->write_reg(priv, SJA1000_CDR, priv->cdr | CDR_PELICAN);

    /* set acceptance filter (accept all) */
    priv->write_reg(priv, SJA1000_ACCC0, 0x00);
    @@ -210,7 +211,8 @@ static void sja1000_start(struct net_device *dev)
    set_reset_mode(dev);

    /* Initialize chip if uninitialized at this stage */
    - if (!(priv->read_reg(priv, SJA1000_CDR) & CDR_PELICAN))
    + if (!(priv->flags & SJA1000_QUIRK_NO_CDR_REG ||
    + priv->read_reg(priv, SJA1000_CDR) & CDR_PELICAN))
    chipset_init(dev);

    /* Clear error counters and error code capture */
    diff --git a/drivers/net/can/sja1000/sja1000.h b/drivers/net/can/sja1000/sja1000.h
    index 9d46398f8154..7f736f1df547 100644
    --- a/drivers/net/can/sja1000/sja1000.h
    +++ b/drivers/net/can/sja1000/sja1000.h
    @@ -145,7 +145,8 @@
    /*
    * Flags for sja1000priv.flags
    */
    -#define SJA1000_CUSTOM_IRQ_HANDLER 0x1
    +#define SJA1000_CUSTOM_IRQ_HANDLER BIT(0)
    +#define SJA1000_QUIRK_NO_CDR_REG BIT(1)

    /*
    * SJA1000 private data structure
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-08-11 18:14    [W:4.848 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site