Skip to content

Commit 7490a42

Browse files
author
Paolo Abeni
committed
Merge branch 'net-ethernet-renesas-rcar_gen4_ptp-add-v4h-support'
Niklas Söderlund says: ==================== net: ethernet: renesas: rcar_gen4_ptp: Add V4H support This small series prepares the rcar_gen4_ptp to be useable both on both R-Car S4 and V4H. The only in-tree driver that make use of this is rswtich on S4. A new Ethernet (R-Car Ethernet TSN) driver for V4H is on it's way that also will make use of rcar_gen4_ptp functionality. Patch 1-2 are small improvements to the existing driver. While patch 3-4 adds V4H support. Finally patch 5 turns rcar_gen4_ptp into a separate module to allow the gPTP functionality to be shared between the two users without having to duplicate the code in each. See each patch for changelog. ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
2 parents 750011e + 8c1c662 commit 7490a42

File tree

5 files changed

+49
-18
lines changed

5 files changed

+49
-18
lines changed

drivers/net/ethernet/renesas/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,16 @@ config RENESAS_ETHER_SWITCH
4444
select CRC32
4545
select MII
4646
select PHYLINK
47+
select RENESAS_GEN4_PTP
4748
help
4849
Renesas Ethernet Switch device driver.
4950

51+
config RENESAS_GEN4_PTP
52+
tristate "Renesas R-Car Gen4 gPTP support" if COMPILE_TEST
53+
select CRC32
54+
select MII
55+
select PHYLIB
56+
help
57+
Renesas R-Car Gen4 gPTP device driver.
58+
5059
endif # NET_VENDOR_RENESAS

drivers/net/ethernet/renesas/Makefile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ obj-$(CONFIG_SH_ETH) += sh_eth.o
88
ravb-objs := ravb_main.o ravb_ptp.o
99
obj-$(CONFIG_RAVB) += ravb.o
1010

11-
rswitch_drv-objs := rswitch.o rcar_gen4_ptp.o
12-
obj-$(CONFIG_RENESAS_ETHER_SWITCH) += rswitch_drv.o
11+
obj-$(CONFIG_RENESAS_ETHER_SWITCH) += rswitch.o
12+
13+
obj-$(CONFIG_RENESAS_GEN4_PTP) += rcar_gen4_ptp.o

drivers/net/ethernet/renesas/rcar_gen4_ptp.c

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include "rcar_gen4_ptp.h"
1515
#define ptp_to_priv(ptp) container_of(ptp, struct rcar_gen4_ptp_private, info)
1616

17-
static const struct rcar_gen4_ptp_reg_offset s4_offs = {
17+
static const struct rcar_gen4_ptp_reg_offset gen4_offs = {
1818
.enable = PTPTMEC,
1919
.disable = PTPTMDC,
2020
.increment = PTPTIVC0,
@@ -130,25 +130,42 @@ static struct ptp_clock_info rcar_gen4_ptp_info = {
130130
.enable = rcar_gen4_ptp_enable,
131131
};
132132

133-
static void rcar_gen4_ptp_set_offs(struct rcar_gen4_ptp_private *ptp_priv,
134-
enum rcar_gen4_ptp_reg_layout layout)
133+
static int rcar_gen4_ptp_set_offs(struct rcar_gen4_ptp_private *ptp_priv,
134+
enum rcar_gen4_ptp_reg_layout layout)
135135
{
136-
WARN_ON(layout != RCAR_GEN4_PTP_REG_LAYOUT_S4);
136+
if (layout != RCAR_GEN4_PTP_REG_LAYOUT)
137+
return -EINVAL;
137138

138-
ptp_priv->offs = &s4_offs;
139+
ptp_priv->offs = &gen4_offs;
140+
141+
return 0;
142+
}
143+
144+
static s64 rcar_gen4_ptp_rate_to_increment(u32 rate)
145+
{
146+
/* Timer increment in ns.
147+
* bit[31:27] - integer
148+
* bit[26:0] - decimal
149+
* increment[ns] = perid[ns] * 2^27 => (1ns * 2^27) / rate[hz]
150+
*/
151+
return div_s64(1000000000LL << 27, rate);
139152
}
140153

141154
int rcar_gen4_ptp_register(struct rcar_gen4_ptp_private *ptp_priv,
142-
enum rcar_gen4_ptp_reg_layout layout, u32 clock)
155+
enum rcar_gen4_ptp_reg_layout layout, u32 rate)
143156
{
157+
int ret;
158+
144159
if (ptp_priv->initialized)
145160
return 0;
146161

147162
spin_lock_init(&ptp_priv->lock);
148163

149-
rcar_gen4_ptp_set_offs(ptp_priv, layout);
164+
ret = rcar_gen4_ptp_set_offs(ptp_priv, layout);
165+
if (ret)
166+
return ret;
150167

151-
ptp_priv->default_addend = clock;
168+
ptp_priv->default_addend = rcar_gen4_ptp_rate_to_increment(rate);
152169
iowrite32(ptp_priv->default_addend, ptp_priv->addr + ptp_priv->offs->increment);
153170
ptp_priv->clock = ptp_clock_register(&ptp_priv->info, NULL);
154171
if (IS_ERR(ptp_priv->clock))
@@ -159,13 +176,15 @@ int rcar_gen4_ptp_register(struct rcar_gen4_ptp_private *ptp_priv,
159176

160177
return 0;
161178
}
179+
EXPORT_SYMBOL_GPL(rcar_gen4_ptp_register);
162180

163181
int rcar_gen4_ptp_unregister(struct rcar_gen4_ptp_private *ptp_priv)
164182
{
165183
iowrite32(1, ptp_priv->addr + ptp_priv->offs->disable);
166184

167185
return ptp_clock_unregister(ptp_priv->clock);
168186
}
187+
EXPORT_SYMBOL_GPL(rcar_gen4_ptp_unregister);
169188

170189
struct rcar_gen4_ptp_private *rcar_gen4_ptp_alloc(struct platform_device *pdev)
171190
{
@@ -179,3 +198,8 @@ struct rcar_gen4_ptp_private *rcar_gen4_ptp_alloc(struct platform_device *pdev)
179198

180199
return ptp;
181200
}
201+
EXPORT_SYMBOL_GPL(rcar_gen4_ptp_alloc);
202+
203+
MODULE_AUTHOR("Yoshihiro Shimoda");
204+
MODULE_DESCRIPTION("Renesas R-Car Gen4 gPTP driver");
205+
MODULE_LICENSE("GPL");

drivers/net/ethernet/renesas/rcar_gen4_ptp.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,10 @@
99

1010
#include <linux/ptp_clock_kernel.h>
1111

12-
#define PTPTIVC_INIT 0x19000000 /* 320MHz */
13-
#define RCAR_GEN4_PTP_CLOCK_S4 PTPTIVC_INIT
1412
#define RCAR_GEN4_GPTP_OFFSET_S4 0x00018000
1513

16-
/* for rcar_gen4_ptp_init */
1714
enum rcar_gen4_ptp_reg_layout {
18-
RCAR_GEN4_PTP_REG_LAYOUT_S4
15+
RCAR_GEN4_PTP_REG_LAYOUT
1916
};
2017

2118
/* driver's definitions */
@@ -28,7 +25,7 @@ enum rcar_gen4_ptp_reg_layout {
2825

2926
#define PTPRO 0
3027

31-
enum rcar_gen4_ptp_reg_s4 {
28+
enum rcar_gen4_ptp_reg {
3229
PTPTMEC = PTPRO + 0x0010,
3330
PTPTMDC = PTPRO + 0x0014,
3431
PTPTIVC0 = PTPRO + 0x0020,
@@ -65,7 +62,7 @@ struct rcar_gen4_ptp_private {
6562
};
6663

6764
int rcar_gen4_ptp_register(struct rcar_gen4_ptp_private *ptp_priv,
68-
enum rcar_gen4_ptp_reg_layout layout, u32 clock);
65+
enum rcar_gen4_ptp_reg_layout layout, u32 rate);
6966
int rcar_gen4_ptp_unregister(struct rcar_gen4_ptp_private *ptp_priv);
7067
struct rcar_gen4_ptp_private *rcar_gen4_ptp_alloc(struct platform_device *pdev);
7168

drivers/net/ethernet/renesas/rswitch.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1828,8 +1828,8 @@ static int rswitch_init(struct rswitch_private *priv)
18281828

18291829
rswitch_fwd_init(priv);
18301830

1831-
err = rcar_gen4_ptp_register(priv->ptp_priv, RCAR_GEN4_PTP_REG_LAYOUT_S4,
1832-
RCAR_GEN4_PTP_CLOCK_S4);
1831+
err = rcar_gen4_ptp_register(priv->ptp_priv, RCAR_GEN4_PTP_REG_LAYOUT,
1832+
clk_get_rate(priv->clk));
18331833
if (err < 0)
18341834
goto err_ptp_register;
18351835

0 commit comments

Comments
 (0)