]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
can: rcar_canfd: Simplify clock handling
authorGeert Uytterhoeven <geert+renesas@glider.be>
Wed, 29 May 2024 09:12:13 +0000 (11:12 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 28 Jun 2024 07:34:42 +0000 (09:34 +0200)
The main CAN clock is either the internal CANFD clock, or the external
CAN clock.  Hence replace the two-valued enum by a simple boolean flag.
Consolidate all CANFD clock handling inside a single branch.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Link: https://lore.kernel.org/all/2cf38c10b83c8e5c04d68b17a930b6d9dbf66f40.1716973640.git.geert+renesas@glider.be
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/rcar/rcar_canfd.c

index b828427187353d6f5a127c89347c9599a37038f2..474840b58e8f13f1c3c3ec3ed6c432f12677698c 100644 (file)
  */
 #define RCANFD_CFFIFO_IDX              0
 
-/* fCAN clock select register settings */
-enum rcar_canfd_fcanclk {
-       RCANFD_CANFDCLK = 0,            /* CANFD clock */
-       RCANFD_EXTCLK,                  /* Externally input clock */
-};
-
 struct rcar_canfd_global;
 
 struct rcar_canfd_hw_info {
@@ -545,8 +539,8 @@ struct rcar_canfd_global {
        struct platform_device *pdev;   /* Respective platform device */
        struct clk *clkp;               /* Peripheral clock */
        struct clk *can_clk;            /* fCAN clock */
-       enum rcar_canfd_fcanclk fcan;   /* CANFD or Ext clock */
        unsigned long channels_mask;    /* Enabled channels mask */
+       bool extclk;                    /* CANFD or Ext clock */
        bool fdmode;                    /* CAN FD or Classical CAN only mode */
        struct reset_control *rstc1;
        struct reset_control *rstc2;
@@ -777,7 +771,7 @@ static void rcar_canfd_configure_controller(struct rcar_canfd_global *gpriv)
                cfg |= RCANFD_GCFG_CMPOC;
 
        /* Set External Clock if selected */
-       if (gpriv->fcan != RCANFD_CANFDCLK)
+       if (gpriv->extclk)
                cfg |= RCANFD_GCFG_DCS;
 
        rcar_canfd_set_bit(gpriv->base, RCANFD_GCFG, cfg);
@@ -1941,16 +1935,12 @@ static int rcar_canfd_probe(struct platform_device *pdev)
                        return dev_err_probe(dev, PTR_ERR(gpriv->can_clk),
                                             "cannot get canfd clock\n");
 
-               gpriv->fcan = RCANFD_CANFDCLK;
-
+               /* CANFD clock may be further divided within the IP */
+               fcan_freq = clk_get_rate(gpriv->can_clk) / info->postdiv;
        } else {
-               gpriv->fcan = RCANFD_EXTCLK;
+               fcan_freq = clk_get_rate(gpriv->can_clk);
+               gpriv->extclk = true;
        }
-       fcan_freq = clk_get_rate(gpriv->can_clk);
-
-       if (gpriv->fcan == RCANFD_CANFDCLK)
-               /* CANFD clock is further divided by (1/2) within the IP */
-               fcan_freq /= info->postdiv;
 
        addr = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(addr)) {
@@ -2060,7 +2050,7 @@ static int rcar_canfd_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, gpriv);
        dev_info(dev, "global operational state (clk %d, fdmode %d)\n",
-                gpriv->fcan, gpriv->fdmode);
+                gpriv->extclk, gpriv->fdmode);
        return 0;
 
 fail_channel: