can: mcp251xfd: mcp251xfd_chip_clock_init(): prepare for PLL support, wait for OSC...
authorMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 19 Oct 2020 07:59:28 +0000 (09:59 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 24 Feb 2022 07:46:59 +0000 (08:46 +0100)
This patch prepares the mcp251xfd_chip_clock_init() function for PLL
support.

If the PLL is needed is must be switched on after chip reset. This
should be done in the mcp251xfd_chip_clock_init() function. Prepare
this function to wait for the OSC and PLL to be ready.

Link: https://lore.kernel.org/all/20220207131047.282110-14-mkl@pengutronix.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c

index d08e0481df35f3f3701c26d836b3a383c14d10e7..937424e5ac2bf2ae664161ddc927181fe889b569 100644 (file)
@@ -429,7 +429,7 @@ static int mcp251xfd_chip_softreset(const struct mcp251xfd_priv *priv)
 
 static int mcp251xfd_chip_clock_init(const struct mcp251xfd_priv *priv)
 {
-       u32 osc;
+       u32 osc, osc_reference, osc_mask;
        int err;
 
        /* Activate Low Power Mode on Oscillator Disable. This only
@@ -439,10 +439,17 @@ static int mcp251xfd_chip_clock_init(const struct mcp251xfd_priv *priv)
        osc = MCP251XFD_REG_OSC_LPMEN |
                FIELD_PREP(MCP251XFD_REG_OSC_CLKODIV_MASK,
                           MCP251XFD_REG_OSC_CLKODIV_10);
+       osc_reference = MCP251XFD_REG_OSC_OSCRDY;
+       osc_mask = MCP251XFD_REG_OSC_OSCRDY | MCP251XFD_REG_OSC_PLLRDY;
+
        err = regmap_write(priv->map_reg, MCP251XFD_REG_OSC, osc);
        if (err)
                return err;
 
+       err = mcp251xfd_chip_wait_for_osc_ready(priv, osc_reference, osc_mask);
+       if (err)
+               return err;
+
        return 0;
 }