net: ethernet: renesas: rcar_gen4_ptp: Get clock increment from clock rate
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tue, 21 Nov 2023 15:53:05 +0000 (16:53 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 23 Nov 2023 11:02:49 +0000 (12:02 +0100)
Instead of using hard coded clock increment values for each SoC derive
the clock increment from the module clock. This is done in preparation
to support a second platform, R-Car V4H that uses a 200Mhz clock
compared with the 320Mhz clock used on R-Car S4.

Tested on both SoCs,

S4 reports a clock of 320000000Hz which gives a value of 0x19000000.
Documentation says a 320Mhz clock is used and the correct increment for
that clock is 0x19000000.

V4H reports a clock of 199999992Hz which gives a value of 0x2800001a.
Documentation says a 200Mhz clock is used and the correct increment for
that clock is 0x28000000.

Suggested-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/renesas/rcar_gen4_ptp.c
drivers/net/ethernet/renesas/rcar_gen4_ptp.h
drivers/net/ethernet/renesas/rswitch.c

index 59f6351e9ae953a686bf682d5789e0b934b9e067..9583894634ae9c44801b3e60007cd182b36f0b4d 100644 (file)
@@ -141,8 +141,18 @@ static int rcar_gen4_ptp_set_offs(struct rcar_gen4_ptp_private *ptp_priv,
        return 0;
 }
 
+static s64 rcar_gen4_ptp_rate_to_increment(u32 rate)
+{
+       /* Timer increment in ns.
+        * bit[31:27] - integer
+        * bit[26:0]  - decimal
+        * increment[ns] = perid[ns] * 2^27 => (1ns * 2^27) / rate[hz]
+        */
+       return div_s64(1000000000LL << 27, rate);
+}
+
 int rcar_gen4_ptp_register(struct rcar_gen4_ptp_private *ptp_priv,
-                          enum rcar_gen4_ptp_reg_layout layout, u32 clock)
+                          enum rcar_gen4_ptp_reg_layout layout, u32 rate)
 {
        int ret;
 
@@ -155,7 +165,7 @@ int rcar_gen4_ptp_register(struct rcar_gen4_ptp_private *ptp_priv,
        if (ret)
                return ret;
 
-       ptp_priv->default_addend = clock;
+       ptp_priv->default_addend = rcar_gen4_ptp_rate_to_increment(rate);
        iowrite32(ptp_priv->default_addend, ptp_priv->addr + ptp_priv->offs->increment);
        ptp_priv->clock = ptp_clock_register(&ptp_priv->info, NULL);
        if (IS_ERR(ptp_priv->clock))
index 35664d1dc472036238d6688f2cc1e71b45195b85..e22da5acd53da7b61e10528db5d599c0de1487d5 100644 (file)
@@ -9,8 +9,6 @@
 
 #include <linux/ptp_clock_kernel.h>
 
-#define PTPTIVC_INIT                   0x19000000      /* 320MHz */
-#define RCAR_GEN4_PTP_CLOCK_S4         PTPTIVC_INIT
 #define RCAR_GEN4_GPTP_OFFSET_S4       0x00018000
 
 enum rcar_gen4_ptp_reg_layout {
@@ -64,7 +62,7 @@ struct rcar_gen4_ptp_private {
 };
 
 int rcar_gen4_ptp_register(struct rcar_gen4_ptp_private *ptp_priv,
-                          enum rcar_gen4_ptp_reg_layout layout, u32 clock);
+                          enum rcar_gen4_ptp_reg_layout layout, u32 rate);
 int rcar_gen4_ptp_unregister(struct rcar_gen4_ptp_private *ptp_priv);
 struct rcar_gen4_ptp_private *rcar_gen4_ptp_alloc(struct platform_device *pdev);
 
index e1e29a2caf22b0e32be165b6980c2a194f166923..d6089429f65410e37ae45637d4c4861d5d750f73 100644 (file)
@@ -1829,7 +1829,7 @@ static int rswitch_init(struct rswitch_private *priv)
        rswitch_fwd_init(priv);
 
        err = rcar_gen4_ptp_register(priv->ptp_priv, RCAR_GEN4_PTP_REG_LAYOUT,
-                                    RCAR_GEN4_PTP_CLOCK_S4);
+                                    clk_get_rate(priv->clk));
        if (err < 0)
                goto err_ptp_register;