* [PATCH net-next v2 0/3] ptp: Add driver for R-Car Gen4 gPTP timer
@ 2026-06-12 9:28 Niklas Söderlund
2026-06-12 9:28 ` [PATCH net-next v2 1/3] dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 Niklas Söderlund
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Niklas Söderlund @ 2026-06-12 9:28 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Richard Cochran, Andrew Lunn,
DavidS. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
linux-renesas-soc, devicetree, linux-kernel, netdev
Cc: Niklas Söderlund
Hello,
This series is the first part cleaning up how PTP timer support is
implemented on R-Car Gen4. Currently there is partial support for it in
some of the Ethernet devices that can use it, but not all.
The partial support have been implemented by hacking the gPTP module
directly into the first Ethernet device driver that used it, RTSN for
V4H and RSWITCH for S4. This is understandable as earlier R-Car
generations had a dedicated gPTP timer for each Ethernet device, but on
Gen4 there is a single system-wide PTP timer shared by all.
The current implementation makes it impossible for other Ethernet
devices on the platform to use the PTP timer without messing around with
other Ethernet device drivers.
The effort to clean this up starts with this series which adds the
system-wide gPTP timer as its own driver and device tree node.
This series will then be followed by work to add proper PTP support to
the R-Car RAVB Gen4 driver, which currently advertises to user-space it
supports PTP but which implementation is broken and does not work.
This will in turn be followed by work to the RTSN and RSWITCH drivers
will be be switched from its current partial support by mapping the gPTP
address space directly to instead use this driver.
Having both this and RTSN/RSWITCH described and enabled (!) in device
tree will not work as they will try to use the same memory region. For
this reason this new solution will only be enabled on platforms
after all user's of the gPTP clock have moved to only use the new
centralized timer. But in the interim both devices will be described
(but not enabled) in the platforms base dtsi file.
For some platforms this is straight forward, such as V4H Sparrow Hawk,
which only have the RAVB Ethernet interface. This platform currently
have no users of the PTP timer, but still advertise it supports it. This
and the soon to be posted RAVB patches solves that.
As the RAVB patches depends on this series the device tree node for the
gPTP clock is added in this series but will be enabled and linked to
consumers in the RAVB gPTP series for platforms where it will not
conflict with RTSN and RSWITCH. And further enabled as more of this is
cleaned up.
The gPTP driver itself is heavily influence by the existing partial
support for gPTP in the RTSN and RSWITCH drivers and the Renesas BSP.
Niklas Söderlund (3):
dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4
ptp: Add driver for R-Car Gen4
arm64: dts: renesas: r8a779g0: Add gPTP node
.../bindings/ptp/renesas,rcar-gen4-gptp.yaml | 64 +++++
MAINTAINERS | 7 +
arch/arm64/boot/dts/renesas/r8a779g0.dtsi | 9 +
drivers/ptp/Kconfig | 12 +
drivers/ptp/Makefile | 1 +
drivers/ptp/ptp_rcar_gen4.c | 219 ++++++++++++++++++
6 files changed, 312 insertions(+)
create mode 100644 Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml
create mode 100644 drivers/ptp/ptp_rcar_gen4.c
--
2.54.0
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH net-next v2 1/3] dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 2026-06-12 9:28 [PATCH net-next v2 0/3] ptp: Add driver for R-Car Gen4 gPTP timer Niklas Söderlund @ 2026-06-12 9:28 ` Niklas Söderlund 2026-06-13 8:11 ` Krzysztof Kozlowski 2026-06-13 9:29 ` sashiko-bot 2026-06-12 9:28 ` [PATCH net-next v2 2/3] ptp: Add driver for " Niklas Söderlund 2026-06-12 9:28 ` [PATCH net-next v2 3/3] arm64: dts: renesas: r8a779g0: Add gPTP node Niklas Söderlund 2 siblings, 2 replies; 9+ messages in thread From: Niklas Söderlund @ 2026-06-12 9:28 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven, Magnus Damm, Richard Cochran, Andrew Lunn, DavidS. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-renesas-soc, devicetree, linux-kernel, netdev Cc: Niklas Söderlund Add bindings for the R-Car Gen4 gPTP timer. The timer enables accurate synchronization of the clock in the control system. The timer is system-wide and used by different Ethernet devices on each Gen4 platform. - On R-Car S4 it is shared between RSWITCH and RAVB. - On R-Car V4H it is shared between RTSN and RAVB. - On R-Car V4M it is only used by RAVB. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> --- * Changes since v1 - Drop 'binding for' for patch subject. - Drop comment for renesas,rcar-gen4-gptp compatible to match other Renesas bindings. - Drop unused label in example. - Rename node ptp in example. --- .../bindings/ptp/renesas,rcar-gen4-gptp.yaml | 64 +++++++++++++++++++ MAINTAINERS | 6 ++ 2 files changed, 70 insertions(+) create mode 100644 Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml diff --git a/Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml b/Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml new file mode 100644 index 000000000000..3edd64d40038 --- /dev/null +++ b/Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +# Copyright (C) 2026 Renesas Electronics Corp. +# Copyright (C) 2026 Niklas Söderlund <niklas.soderlund@ragnatech.se> +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/ptp/renesas,rcar-gen4-gptp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Renesas R-Car Gen4 gPTP timer + +maintainers: + - Niklas Söderlund <niklas.soderlund@ragnatech.se> + +description: + The R-Car Gen4 gPTP timer enables accurate synchronization of the clock in + the control system. The timer is system-wide and used by different Ethernet + devices on each Gen4 platform. + + - On R-Car S4 it is shared between RSWITCH and RAVB. + - On R-Car V4H it is shared between RTSN and RAVB. + - On R-Car V4M it is only used by RAVB. + +properties: + compatible: + items: + - enum: + - renesas,r8a779f0-gptp # S4-8 + - renesas,r8a779g0-gptp # V4H + - renesas,r8a779h0-gptp # V4M + - const: renesas,rcar-gen4-gptp + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + power-domains: + maxItems: 1 + + resets: + maxItems: 1 + +required: + - compatible + - reg + - clocks + - power-domains + - resets + +additionalProperties: false + +examples: + - | + #include <dt-bindings/clock/r8a779g0-cpg-mssr.h> + #include <dt-bindings/power/r8a779g0-sysc.h> + + ptp@e6449000 { + compatible = "renesas,r8a779g0-gptp", "renesas,rcar-gen4-gptp"; + reg = <0xe6449000 0x500>; + clocks = <&cpg CPG_MOD 2723>; + power-domains = <&sysc R8A779G0_PD_ALWAYS_ON>; + resets = <&cpg 2723>; + }; diff --git a/MAINTAINERS b/MAINTAINERS index cc1dde0c9067..d638c1132504 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -22664,6 +22664,12 @@ S: Maintained F: Documentation/devicetree/bindings/mtd/renesas-nandc.yaml F: drivers/mtd/nand/raw/renesas-nand-controller.c +RENESAS R-CAR GEN4 GPTP DRIVER +M: Niklas Söderlund <niklas.soderlund@ragnatech.se> +L: linux-renesas-soc@vger.kernel.org +S: Supported +F: Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml + RENESAS R-CAR GYROADC DRIVER M: Marek Vasut <marek.vasut@gmail.com> L: linux-iio@vger.kernel.org -- 2.54.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v2 1/3] dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 2026-06-12 9:28 ` [PATCH net-next v2 1/3] dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 Niklas Söderlund @ 2026-06-13 8:11 ` Krzysztof Kozlowski 2026-06-13 9:29 ` sashiko-bot 1 sibling, 0 replies; 9+ messages in thread From: Krzysztof Kozlowski @ 2026-06-13 8:11 UTC (permalink / raw) To: Niklas Söderlund Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven, Magnus Damm, Richard Cochran, Andrew Lunn, DavidS. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-renesas-soc, devicetree, linux-kernel, netdev On Fri, Jun 12, 2026 at 11:28:49AM +0200, Niklas Söderlund wrote: > Add bindings for the R-Car Gen4 gPTP timer. The timer enables accurate > synchronization of the clock in the control system. The timer is > system-wide and used by different Ethernet devices on each Gen4 platform. > > - On R-Car S4 it is shared between RSWITCH and RAVB. > > - On R-Car V4H it is shared between RTSN and RAVB. > > - On R-Car V4M it is only used by RAVB. > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> > --- Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v2 1/3] dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 2026-06-12 9:28 ` [PATCH net-next v2 1/3] dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 Niklas Söderlund 2026-06-13 8:11 ` Krzysztof Kozlowski @ 2026-06-13 9:29 ` sashiko-bot 1 sibling, 0 replies; 9+ messages in thread From: sashiko-bot @ 2026-06-13 9:29 UTC (permalink / raw) To: Niklas Söderlund; +Cc: wsa+renesas, robh, conor+dt, devicetree Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] The device tree changes introduce a standalone node for the gPTP timer which maps the exact same physical memory region already mapped by the existing Ethernet controller, leading to a resource conflict during probe. -- commit b3e38755e98012153ce2a29973eff93cb0cf332d Author: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 This commit adds device tree bindings for the R-Car Gen4 gPTP timer. The timer enables system-wide clock synchronization and is shared by different Ethernet devices across Gen4 platforms. > diff --git a/Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml b/Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml > new file mode 100644 > index 0000000000000..3edd64d400387 > --- /dev/null > +++ b/Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml > @@ -0,0 +1,64 @@ [ ... ] > +properties: > + compatible: > + items: > + - enum: > + - renesas,r8a779f0-gptp # S4-8 > + - renesas,r8a779g0-gptp # V4H > + - renesas,r8a779h0-gptp # V4M > + - const: renesas,rcar-gen4-gptp > + > + reg: > + maxItems: 1 [Severity: High] Will this standalone reg mapping conflict with the existing Ethernet TSN node? The device tree bindings introduce a standalone node for the gPTP timer which maps the exact same physical memory region (e.g. 0xe6449000) already claimed by the existing renesas,ethertsn device node via its gptp reg resource. At runtime, the new ptp_rcar_gen4 driver maps this with: drivers/ptp/ptp_rcar_gen4.c:ptp_rcar_gen4_probe() { ... priv->base = devm_platform_ioremap_resource(pdev, 0); ... } And the existing rtsn driver does the same: drivers/net/ethernet/renesas/rtsn.c:rtsn_probe() { ... ptpaddr = devm_ioremap_resource(&pdev->dev, res); ... } Since devm_ioremap_resource() internally calls request_mem_region(), which claims exclusive access to the physical memory, the second driver to probe will be rejected with -EBUSY and fail to load. Should shared hardware registers be modeled using a provider-consumer pattern with phandles instead of duplicating reg mappings across distinct nodes? > + > + clocks: > + maxItems: 1 [ ... ] -- Sashiko AI review · https://sashiko.dev/#/patchset/20260612092851.2141782-1-niklas.soderlund+renesas@ragnatech.se?part=1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH net-next v2 2/3] ptp: Add driver for R-Car Gen4 2026-06-12 9:28 [PATCH net-next v2 0/3] ptp: Add driver for R-Car Gen4 gPTP timer Niklas Söderlund 2026-06-12 9:28 ` [PATCH net-next v2 1/3] dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 Niklas Söderlund @ 2026-06-12 9:28 ` Niklas Söderlund 2026-06-13 9:29 ` sashiko-bot 2026-06-12 9:28 ` [PATCH net-next v2 3/3] arm64: dts: renesas: r8a779g0: Add gPTP node Niklas Söderlund 2 siblings, 1 reply; 9+ messages in thread From: Niklas Söderlund @ 2026-06-12 9:28 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven, Magnus Damm, Richard Cochran, Andrew Lunn, DavidS. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-renesas-soc, devicetree, linux-kernel, netdev Cc: Niklas Söderlund Add driver for the gPTP timer found on R-Car Gen4 devices. The timer is system-wide and shared by different Ethernet devices on each Gen4 platform. The operation of the timer is however not completely in depended of the systems Ethernet devices. - On R-Car S4 is gated by the RSWITCH Ethernet module clock. - On R-Car V4H is gated by the RTSN Ethernet module clock. - On R-Car V4M is gated by its own module clock, the system have neither RTSN or RSWITCH device. But the module clock is the same as RTSN on V4H and the documentation referees to it as tsn (EtherTSN). The gPTP device do have its own register space on all three platforms. But on S4 and V4H it will share its clock and reset property with RSWITCH or RTSN, respectively. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> --- MAINTAINERS | 1 + drivers/ptp/Kconfig | 12 ++ drivers/ptp/Makefile | 1 + drivers/ptp/ptp_rcar_gen4.c | 219 ++++++++++++++++++++++++++++++++++++ 4 files changed, 233 insertions(+) create mode 100644 drivers/ptp/ptp_rcar_gen4.c diff --git a/MAINTAINERS b/MAINTAINERS index d638c1132504..a3e3fa987e40 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -22669,6 +22669,7 @@ M: Niklas Söderlund <niklas.soderlund@ragnatech.se> L: linux-renesas-soc@vger.kernel.org S: Supported F: Documentation/devicetree/bindings/ptp/renesas,rcar-gen4-gptp.yaml +F: drivers/ptp/ptp_rcar_gen4.c RENESAS R-CAR GYROADC DRIVER M: Marek Vasut <marek.vasut@gmail.com> diff --git a/drivers/ptp/Kconfig b/drivers/ptp/Kconfig index b93640ca08b7..3593fd9da92a 100644 --- a/drivers/ptp/Kconfig +++ b/drivers/ptp/Kconfig @@ -263,4 +263,16 @@ config PTP_NETC_V4_TIMER synchronization. It also supports periodic output signal (e.g. PPS) and external trigger timestamping. +config PTP_RCAR_GEN4 + tristate "Renesas R-Car Gen4 PTP Driver" + depends on ARCH_RENESAS || COMPILE_TEST + depends on PTP_1588_CLOCK + help + This driver adds support for using the Renesas R-Car Gen4 gPTP timer + as a PTP clock, the clock can then be used by Gen4 Ethernet drivers + for PTP time synchronization. + + To compile this driver as a module, choose M here: the module + will be called ptp_rcar_gen4. + endmenu diff --git a/drivers/ptp/Makefile b/drivers/ptp/Makefile index bdc47e284f14..0464a586bed2 100644 --- a/drivers/ptp/Makefile +++ b/drivers/ptp/Makefile @@ -22,3 +22,4 @@ obj-$(CONFIG_PTP_1588_CLOCK_OCP) += ptp_ocp.o obj-$(CONFIG_PTP_DFL_TOD) += ptp_dfl_tod.o obj-$(CONFIG_PTP_S390) += ptp_s390.o obj-$(CONFIG_PTP_NETC_V4_TIMER) += ptp_netc.o +obj-$(CONFIG_PTP_RCAR_GEN4) += ptp_rcar_gen4.o diff --git a/drivers/ptp/ptp_rcar_gen4.c b/drivers/ptp/ptp_rcar_gen4.c new file mode 100644 index 000000000000..ab0be2431be8 --- /dev/null +++ b/drivers/ptp/ptp_rcar_gen4.c @@ -0,0 +1,219 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Renesas R-Car Gen4 gPTP device driver + * + * Copyright (C) 2026 Renesas Electronics Corporation + * Copyright (C) 2026 Niklas Söderlund <niklas.soderlund@ragnatech.se> + */ + +#include <linux/clk.h> +#include <linux/err.h> +#include <linux/io.h> +#include <linux/mod_devicetable.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/pm_runtime.h> +#include <linux/ptp_clock_kernel.h> +#include <linux/types.h> + +#define PTPTMEC_REG 0x0010 +#define PTPTMDC_REG 0x0014 +#define PTPTIVC0_REG 0x0020 +#define PTPTOVC00_REG 0x0030 +#define PTPTOVC10_REG 0x0034 +#define PTPTOVC20_REG 0x0038 +#define PTPGPTPTM00_REG 0x0050 +#define PTPGPTPTM10_REG 0x0054 +#define PTPGPTPTM20_REG 0x0058 + +struct ptp_rcar_gen4_priv { + void __iomem *base; + struct clk *clk; + + struct ptp_clock *clock; + struct ptp_clock_info info; + + spinlock_t lock; /* Registers access. */ + s64 default_addend; +}; + +#define ptp_to_priv(ptp) container_of(ptp, struct ptp_rcar_gen4_priv, info) + +static int ptp_rcar_gen4_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) +{ + struct ptp_rcar_gen4_priv *priv = ptp_to_priv(ptp); + s64 addend = priv->default_addend; + bool neg_adj = scaled_ppm < 0; + unsigned long flags; + s64 diff; + + if (neg_adj) + scaled_ppm = -scaled_ppm; + diff = div_s64(addend * scaled_ppm_to_ppb(scaled_ppm), NSEC_PER_SEC); + addend = neg_adj ? addend - diff : addend + diff; + + spin_lock_irqsave(&priv->lock, flags); + iowrite32(addend, priv->base + PTPTIVC0_REG); + spin_unlock_irqrestore(&priv->lock, flags); + + return 0; +} + +static void _ptp_rcar_gen4_gettime(struct ptp_clock_info *ptp, + struct timespec64 *ts) +{ + struct ptp_rcar_gen4_priv *priv = ptp_to_priv(ptp); + + lockdep_assert_held(&priv->lock); + + ts->tv_nsec = ioread32(priv->base + PTPGPTPTM00_REG); + ts->tv_sec = ioread32(priv->base + PTPGPTPTM10_REG) | + ((s64)ioread32(priv->base + PTPGPTPTM20_REG) << 32); +} + +static int ptp_rcar_gen4_gettime(struct ptp_clock_info *ptp, + struct timespec64 *ts) +{ + struct ptp_rcar_gen4_priv *priv = ptp_to_priv(ptp); + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + _ptp_rcar_gen4_gettime(ptp, ts); + spin_unlock_irqrestore(&priv->lock, flags); + + return 0; +} + +static void _ptp_rcar_gen4_settime(struct ptp_clock_info *ptp, + const struct timespec64 *ts) +{ + struct ptp_rcar_gen4_priv *priv = ptp_to_priv(ptp); + + lockdep_assert_held(&priv->lock); + + iowrite32(1, priv->base + PTPTMDC_REG); + iowrite32(0, priv->base + PTPTOVC20_REG); + iowrite32(0, priv->base + PTPTOVC10_REG); + iowrite32(0, priv->base + PTPTOVC00_REG); + iowrite32(1, priv->base + PTPTMEC_REG); + iowrite32(ts->tv_sec >> 32, priv->base + PTPTOVC20_REG); + iowrite32(ts->tv_sec, priv->base + PTPTOVC10_REG); + iowrite32(ts->tv_nsec, priv->base + PTPTOVC00_REG); +} + +static int ptp_rcar_gen4_settime(struct ptp_clock_info *ptp, + const struct timespec64 *ts) +{ + struct ptp_rcar_gen4_priv *priv = ptp_to_priv(ptp); + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + _ptp_rcar_gen4_settime(ptp, ts); + spin_unlock_irqrestore(&priv->lock, flags); + + return 0; +} + +static int ptp_rcar_gen4_adjtime(struct ptp_clock_info *ptp, s64 delta) +{ + struct ptp_rcar_gen4_priv *priv = ptp_to_priv(ptp); + struct timespec64 ts; + unsigned long flags; + s64 now; + + spin_lock_irqsave(&priv->lock, flags); + _ptp_rcar_gen4_gettime(ptp, &ts); + now = ktime_to_ns(timespec64_to_ktime(ts)); + ts = ns_to_timespec64(now + delta); + _ptp_rcar_gen4_settime(ptp, &ts); + spin_unlock_irqrestore(&priv->lock, flags); + + return 0; +} + +static struct ptp_clock_info ptp_rcar_gen4_info = { + .owner = THIS_MODULE, + .name = "R-Car Gen4 gPTP", + .max_adj = 50000000, + .adjfine = ptp_rcar_gen4_adjfine, + .adjtime = ptp_rcar_gen4_adjtime, + .gettime64 = ptp_rcar_gen4_gettime, + .settime64 = ptp_rcar_gen4_settime, +}; + +static int ptp_rcar_gen4_probe(struct platform_device *pdev) +{ + struct ptp_rcar_gen4_priv *priv; + struct device *dev = &pdev->dev; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + platform_set_drvdata(pdev, priv); + + priv->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + + priv->clk = devm_clk_get(dev, NULL); + if (IS_ERR(priv->clk)) + return PTR_ERR(priv->clk); + + spin_lock_init(&priv->lock); + + priv->info = ptp_rcar_gen4_info; + + /* Default timer increment in ns. + * bit[31:27] - integer + * bit[26:0] - decimal + * increment[ns] = perid[ns] * 2^27 => (1ns * 2^27) / rate[hz] + */ + priv->default_addend = + div_s64(1000000000LL << 27, clk_get_rate(priv->clk)); + + pm_runtime_enable(dev); + pm_runtime_get_sync(dev); + + iowrite32(priv->default_addend, priv->base + PTPTIVC0_REG); + + priv->clock = ptp_clock_register(&priv->info, dev); + if (IS_ERR(priv->clock)) + return PTR_ERR(priv->clock); + + iowrite32(1, priv->base + PTPTMEC_REG); + + return 0; +} + +static void ptp_rcar_gen4_remove(struct platform_device *pdev) +{ + struct ptp_rcar_gen4_priv *priv = platform_get_drvdata(pdev); + struct device *dev = &pdev->dev; + + ptp_clock_unregister(priv->clock); + + iowrite32(1, priv->base + PTPTMDC_REG); + + pm_runtime_put_sync(dev); + pm_runtime_disable(dev); +} + +static const struct of_device_id ptp_rcar_gen4_of_match[] = { + { .compatible = "renesas,rcar-gen4-gptp", }, + { /* Sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, ptp_rcar_gen4_of_match); + +static struct platform_driver ptp_rcar_gen4_driver = { + .driver = { + .name = "ptp-rcar-gen4", + .of_match_table = ptp_rcar_gen4_of_match, + }, + .probe = ptp_rcar_gen4_probe, + .remove = ptp_rcar_gen4_remove, +}; +module_platform_driver(ptp_rcar_gen4_driver); + +MODULE_AUTHOR("Niklas Söderlund"); +MODULE_DESCRIPTION("Renesas R-Car Gen4 gPTP driver"); +MODULE_LICENSE("GPL"); -- 2.54.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v2 2/3] ptp: Add driver for R-Car Gen4 2026-06-12 9:28 ` [PATCH net-next v2 2/3] ptp: Add driver for " Niklas Söderlund @ 2026-06-13 9:29 ` sashiko-bot 0 siblings, 0 replies; 9+ messages in thread From: sashiko-bot @ 2026-06-13 9:29 UTC (permalink / raw) To: Niklas Söderlund; +Cc: conor+dt, robh, wsa+renesas, devicetree Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider: - [High] Missing return value check for pm_runtime_get_sync() before hardware access. - [High] Potential divide-by-zero kernel panic due to unchecked clk_get_rate(). - [High] The driver lacks system PM callbacks to restore hardware register state after a suspend/resume cycle. - [Medium] Missing PM runtime cleanup on the ptp_clock_register() error path. - [Medium] The PTP clock is registered and exposed to userspace before the hardware timer is enabled. -- commit 0a2d69b0a8fcc58f8e457187381c743ade641986 Author: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> ptp: Add driver for R-Car Gen4 This commit adds a new driver for the gPTP timer found on R-Car Gen4 devices. The clock can be used by Ethernet drivers for PTP time synchronization. > diff --git a/drivers/ptp/ptp_rcar_gen4.c b/drivers/ptp/ptp_rcar_gen4.c > new file mode 100644 > index 0000000000000..ab0be2431be8d > --- /dev/null > +++ b/drivers/ptp/ptp_rcar_gen4.c [ ... ] > +static int ptp_rcar_gen4_probe(struct platform_device *pdev) > +{ > + struct ptp_rcar_gen4_priv *priv; > + struct device *dev = &pdev->dev; [ ... ] > + /* Default timer increment in ns. > + * bit[31:27] - integer > + * bit[26:0] - decimal > + * increment[ns] = perid[ns] * 2^27 => (1ns * 2^27) / rate[hz] > + */ > + priv->default_addend = > + div_s64(1000000000LL << 27, clk_get_rate(priv->clk)); [Severity: High] If clk_get_rate() returns 0 because the hardware clock is unconfigured or fails to determine the rate, does this div_s64() result in a divide-by-zero panic during the probe sequence? Would it be better to verify the rate is strictly greater than zero before performing the division? > + > + pm_runtime_enable(dev); > + pm_runtime_get_sync(dev); [Severity: High] Does this code need to check the return value of pm_runtime_get_sync()? If the device fails to resume, perhaps due to a power domain failure, could accessing its registers via iowrite32() cause a synchronous external abort and lead to a kernel crash? > + > + iowrite32(priv->default_addend, priv->base + PTPTIVC0_REG); > + > + priv->clock = ptp_clock_register(&priv->info, dev); > + if (IS_ERR(priv->clock)) > + return PTR_ERR(priv->clock); [Severity: Medium] If ptp_clock_register() fails and the function returns the error directly, does this leave the runtime PM reference permanently incremented? It looks like pm_runtime_put_sync() and pm_runtime_disable() are not called on this error path. [Severity: Medium] Is it possible for userspace to interact with the device before the hardware timer is enabled? The ptp_clock_register() function exposes the PTP character device, but the timer is only enabled via PTPTMEC_REG after this succeeds. Could a process open the device and read invalid time values during this race window? > + > + iowrite32(1, priv->base + PTPTMEC_REG); > + > + return 0; > +} [ ... ] > +static struct platform_driver ptp_rcar_gen4_driver = { > + .driver = { > + .name = "ptp-rcar-gen4", > + .of_match_table = ptp_rcar_gen4_of_match, > + }, > + .probe = ptp_rcar_gen4_probe, > + .remove = ptp_rcar_gen4_remove, > +}; [Severity: High] Does this driver need system PM callbacks to handle suspend and resume? Without them, if the system enters deep sleep and the SoC power domain shuts off the device, the internal register state, such as the default addend and enable bit, might be lost. Would the PTP clock hardware remain stopped and broken after the system wakes up? -- Sashiko AI review · https://sashiko.dev/#/patchset/20260612092851.2141782-1-niklas.soderlund+renesas@ragnatech.se?part=2 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH net-next v2 3/3] arm64: dts: renesas: r8a779g0: Add gPTP node 2026-06-12 9:28 [PATCH net-next v2 0/3] ptp: Add driver for R-Car Gen4 gPTP timer Niklas Söderlund 2026-06-12 9:28 ` [PATCH net-next v2 1/3] dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 Niklas Söderlund 2026-06-12 9:28 ` [PATCH net-next v2 2/3] ptp: Add driver for " Niklas Söderlund @ 2026-06-12 9:28 ` Niklas Söderlund 2026-06-12 9:44 ` Geert Uytterhoeven 2026-06-13 9:29 ` sashiko-bot 2 siblings, 2 replies; 9+ messages in thread From: Niklas Söderlund @ 2026-06-12 9:28 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven, Magnus Damm, Richard Cochran, Andrew Lunn, DavidS. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-renesas-soc, devicetree, linux-kernel, netdev Cc: Niklas Söderlund The gPTP module is shared between the RAVB and RTSN Ethernet devices on the SoC. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> --- * Changes since v1 - Rename node ptp. --- arch/arm64/boot/dts/renesas/r8a779g0.dtsi | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/arm64/boot/dts/renesas/r8a779g0.dtsi b/arch/arm64/boot/dts/renesas/r8a779g0.dtsi index 82a7278836e5..4f2844995c44 100644 --- a/arch/arm64/boot/dts/renesas/r8a779g0.dtsi +++ b/arch/arm64/boot/dts/renesas/r8a779g0.dtsi @@ -603,6 +603,15 @@ tsn0: ethernet@e6460000 { status = "disabled"; }; + gptp: ptp@e6449000 { + compatible = "renesas,r8a779g0-gptp", "renesas,rcar-gen4-gptp"; + reg = <0 0xe6449000 0 0x500>; + clocks = <&cpg CPG_MOD 2723>; + power-domains = <&sysc R8A779G0_PD_ALWAYS_ON>; + resets = <&cpg 2723>; + status = "disabled"; + }; + i2c0: i2c@e6500000 { compatible = "renesas,i2c-r8a779g0", "renesas,rcar-gen4-i2c"; -- 2.54.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v2 3/3] arm64: dts: renesas: r8a779g0: Add gPTP node 2026-06-12 9:28 ` [PATCH net-next v2 3/3] arm64: dts: renesas: r8a779g0: Add gPTP node Niklas Söderlund @ 2026-06-12 9:44 ` Geert Uytterhoeven 2026-06-13 9:29 ` sashiko-bot 1 sibling, 0 replies; 9+ messages in thread From: Geert Uytterhoeven @ 2026-06-12 9:44 UTC (permalink / raw) To: Niklas Söderlund Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven, Magnus Damm, Richard Cochran, Andrew Lunn, DavidS. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-renesas-soc, devicetree, linux-kernel, netdev Hi Niklas, On Fri, 12 Jun 2026 at 11:29, Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> wrote: > The gPTP module is shared between the RAVB and RTSN Ethernet devices on > the SoC. > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> > --- > * Changes since v1 > - Rename node ptp. Thanks for the update! > --- a/arch/arm64/boot/dts/renesas/r8a779g0.dtsi > +++ b/arch/arm64/boot/dts/renesas/r8a779g0.dtsi > @@ -603,6 +603,15 @@ tsn0: ethernet@e6460000 { > status = "disabled"; > }; > > + gptp: ptp@e6449000 { Please preserve sort order (by unit-address). > + compatible = "renesas,r8a779g0-gptp", "renesas,rcar-gen4-gptp"; > + reg = <0 0xe6449000 0 0x500>; > + clocks = <&cpg CPG_MOD 2723>; > + power-domains = <&sysc R8A779G0_PD_ALWAYS_ON>; > + resets = <&cpg 2723>; > + status = "disabled"; > + }; > + > i2c0: i2c@e6500000 { > compatible = "renesas,i2c-r8a779g0", > "renesas,rcar-gen4-i2c"; Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v2 3/3] arm64: dts: renesas: r8a779g0: Add gPTP node 2026-06-12 9:28 ` [PATCH net-next v2 3/3] arm64: dts: renesas: r8a779g0: Add gPTP node Niklas Söderlund 2026-06-12 9:44 ` Geert Uytterhoeven @ 2026-06-13 9:29 ` sashiko-bot 1 sibling, 0 replies; 9+ messages in thread From: sashiko-bot @ 2026-06-13 9:29 UTC (permalink / raw) To: Niklas Söderlund; +Cc: devicetree, robh, wsa+renesas, conor+dt Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: - [High] Adding the standalone `gptp` node without updating the `tsn0` node creates overlapping `reg` memory regions in the device tree, which will cause `-EBUSY` probe failures. - [Low] The `gptp: ptp@e6449000` node is placed out of order with respect to its unit address. -- commit b1efd0e5ff9459d7a25c1c76a2bb7ef3ccffd5d2 Author: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> arm64: dts: renesas: r8a779g0: Add gPTP node This commit adds the gPTP module node to the r8a779g0 device tree, sharing it between the RAVB and RTSN Ethernet devices on the SoC. > diff --git a/arch/arm64/boot/dts/renesas/r8a779g0.dtsi b/arch/arm64/boot/dts/renesas/r8a779g0.dtsi > index 82a7278836e57..4f2844995c44d 100644 > --- a/arch/arm64/boot/dts/renesas/r8a779g0.dtsi > +++ b/arch/arm64/boot/dts/renesas/r8a779g0.dtsi [ ... ] > @@ -603,6 +603,15 @@ tsn0: ethernet@e6460000 { > status = "disabled"; > }; > > + gptp: ptp@e6449000 { [Severity: Low] This isn't a bug, but should the gptp node be placed before the tsn0 node? Device tree nodes within a simple-bus are conventionally sorted in ascending order by their unit address. Placing ptp@e6449000 after ethernet@e6460000 violates this ascending unit address order. > + compatible = "renesas,r8a779g0-gptp", "renesas,rcar-gen4-gptp"; > + reg = <0 0xe6449000 0 0x500>; [Severity: High] Will this cause a resource request conflict with the tsn0 node? The tsn0 node currently defines the same memory region: tsn0: ethernet@e6460000 { compatible = "renesas,r8a779g0-ethertsn", "renesas,rcar-gen4-ethertsn"; reg = <0 0xe6460000 0 0x7000>, <0 0xe6449000 0 0x500>; reg-names = "tsnes", "gptp"; When both nodes are enabled, their respective drivers will attempt to request exclusive access to the 0xe6449000 region. This will result in an -EBUSY probe failure for whichever driver initializes second. Does the tsn0 node need to be updated to remove this overlapping region now that a standalone gptp node is being added? > + clocks = <&cpg CPG_MOD 2723>; > + power-domains = <&sysc R8A779G0_PD_ALWAYS_ON>; > + resets = <&cpg 2723>; > + status = "disabled"; > + }; -- Sashiko AI review · https://sashiko.dev/#/patchset/20260612092851.2141782-1-niklas.soderlund+renesas@ragnatech.se?part=3 ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-06-13 9:29 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-06-12 9:28 [PATCH net-next v2 0/3] ptp: Add driver for R-Car Gen4 gPTP timer Niklas Söderlund 2026-06-12 9:28 ` [PATCH net-next v2 1/3] dt-bindings: ptp: renesas,rcar-gen4-gptp: Add R-Car Gen4 Niklas Söderlund 2026-06-13 8:11 ` Krzysztof Kozlowski 2026-06-13 9:29 ` sashiko-bot 2026-06-12 9:28 ` [PATCH net-next v2 2/3] ptp: Add driver for " Niklas Söderlund 2026-06-13 9:29 ` sashiko-bot 2026-06-12 9:28 ` [PATCH net-next v2 3/3] arm64: dts: renesas: r8a779g0: Add gPTP node Niklas Söderlund 2026-06-12 9:44 ` Geert Uytterhoeven 2026-06-13 9:29 ` sashiko-bot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox