Skip to content

Commit

Permalink
can: rcar_canfd: Simplify clock handling
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Geert Uytterhoeven authored and Marc Kleine-Budde committed Jun 28, 2024
1 parent 94833ad commit dd20d16
Showing 1 changed file with 7 additions and 17 deletions.
24 changes: 7 additions & 17 deletions drivers/net/can/rcar/rcar_canfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -508,12 +508,6 @@
*/
#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 {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit dd20d16

Please sign in to comment.