1 From c96a1cff5d03a56f380ce761aec9d11fcf61c7f1 Mon Sep 17 00:00:00 2001
2 From: Vladimir Oltean <vladimir.oltean@nxp.com>
3 Date: Thu, 14 Nov 2019 17:03:26 +0200
4 Subject: [PATCH] net: mscc: ocelot: separate the implementation of switch
7 The Felix switch has a different reset procedure, so a function pointer
8 needs to be created and added to the ocelot_ops structure.
10 The reset procedure has been moved into ocelot_init.
12 Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
13 Reviewed-by: Andrew Lunn <andrew@lunn.ch>
14 Signed-off-by: David S. Miller <davem@davemloft.net>
16 drivers/net/ethernet/mscc/ocelot.c | 8 +++++++
17 drivers/net/ethernet/mscc/ocelot.h | 1 +
18 drivers/net/ethernet/mscc/ocelot_board.c | 37 +++++++++++++++++++++-----------
19 3 files changed, 33 insertions(+), 13 deletions(-)
21 --- a/drivers/net/ethernet/mscc/ocelot.c
22 +++ b/drivers/net/ethernet/mscc/ocelot.c
23 @@ -2271,6 +2271,14 @@ int ocelot_init(struct ocelot *ocelot)
27 + if (ocelot->ops->reset) {
28 + ret = ocelot->ops->reset(ocelot);
30 + dev_err(ocelot->dev, "Switch reset failed\n");
35 ocelot->lags = devm_kcalloc(ocelot->dev, ocelot->num_phys_ports,
36 sizeof(u32), GFP_KERNEL);
38 --- a/drivers/net/ethernet/mscc/ocelot.h
39 +++ b/drivers/net/ethernet/mscc/ocelot.h
40 @@ -446,6 +446,7 @@ struct ocelot_stat_layout {
43 void (*pcs_init)(struct ocelot *ocelot, int port);
44 + int (*reset)(struct ocelot *ocelot);
48 --- a/drivers/net/ethernet/mscc/ocelot_board.c
49 +++ b/drivers/net/ethernet/mscc/ocelot_board.c
50 @@ -285,8 +285,32 @@ static void ocelot_port_pcs_init(struct
51 ocelot_port_writel(ocelot_port, 0, PCS1G_LB_CFG);
54 +static int ocelot_reset(struct ocelot *ocelot)
59 + regmap_field_write(ocelot->regfields[SYS_RESET_CFG_MEM_INIT], 1);
60 + regmap_field_write(ocelot->regfields[SYS_RESET_CFG_MEM_ENA], 1);
64 + regmap_field_read(ocelot->regfields[SYS_RESET_CFG_MEM_INIT],
66 + } while (val && --retries);
71 + regmap_field_write(ocelot->regfields[SYS_RESET_CFG_MEM_ENA], 1);
72 + regmap_field_write(ocelot->regfields[SYS_RESET_CFG_CORE_ENA], 1);
77 static const struct ocelot_ops ocelot_ops = {
78 .pcs_init = ocelot_port_pcs_init,
79 + .reset = ocelot_reset,
82 static int mscc_ocelot_probe(struct platform_device *pdev)
83 @@ -297,7 +321,6 @@ static int mscc_ocelot_probe(struct plat
84 struct ocelot *ocelot;
90 enum ocelot_target id;
91 @@ -377,18 +400,6 @@ static int mscc_ocelot_probe(struct plat
95 - regmap_field_write(ocelot->regfields[SYS_RESET_CFG_MEM_INIT], 1);
96 - regmap_field_write(ocelot->regfields[SYS_RESET_CFG_MEM_ENA], 1);
100 - regmap_field_read(ocelot->regfields[SYS_RESET_CFG_MEM_INIT],
104 - regmap_field_write(ocelot->regfields[SYS_RESET_CFG_MEM_ENA], 1);
105 - regmap_field_write(ocelot->regfields[SYS_RESET_CFG_CORE_ENA], 1);
107 ocelot->num_cpu_ports = 1; /* 1 port on the switch, two groups */
109 ports = of_get_child_by_name(np, "ethernet-ports");