Commit dc3de2a2 authored by Claudiu Manoil's avatar Claudiu Manoil Committed by David S. Miller

net: mscc: ocelot: filter out ocelot SoC specific PCS config from common path

The adjust_link routine should be generic enough to be (re)used by
any SoC that integrates a switch core compatible with the Ocelot
core switch driver.  Currently all configurations are generic except
for the PCS settings that are SoC specific.  Move these out to the
Ocelot SoC/board instance.
Signed-off-by: default avatarClaudiu Manoil <claudiu.manoil@nxp.com>
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 259630e0
...@@ -455,23 +455,8 @@ static void ocelot_adjust_link(struct ocelot *ocelot, int port, ...@@ -455,23 +455,8 @@ static void ocelot_adjust_link(struct ocelot *ocelot, int port,
ocelot_port_writel(ocelot_port, DEV_MAC_HDX_CFG_LATE_COL_POS(67), ocelot_port_writel(ocelot_port, DEV_MAC_HDX_CFG_LATE_COL_POS(67),
DEV_MAC_HDX_CFG); DEV_MAC_HDX_CFG);
/* Disable HDX fast control */ if (ocelot->ops->pcs_init)
ocelot_port_writel(ocelot_port, DEV_PORT_MISC_HDX_FAST_DIS, ocelot->ops->pcs_init(ocelot, port);
DEV_PORT_MISC);
/* SGMII only for now */
ocelot_port_writel(ocelot_port, PCS1G_MODE_CFG_SGMII_MODE_ENA,
PCS1G_MODE_CFG);
ocelot_port_writel(ocelot_port, PCS1G_SD_CFG_SD_SEL, PCS1G_SD_CFG);
/* Enable PCS */
ocelot_port_writel(ocelot_port, PCS1G_CFG_PCS_ENA, PCS1G_CFG);
/* No aneg on SGMII */
ocelot_port_writel(ocelot_port, 0, PCS1G_ANEG_CFG);
/* No loopback */
ocelot_port_writel(ocelot_port, 0, PCS1G_LB_CFG);
/* Set Max Length and maximum tags allowed */ /* Set Max Length and maximum tags allowed */
ocelot_port_writel(ocelot_port, VLAN_ETH_FRAME_LEN, ocelot_port_writel(ocelot_port, VLAN_ETH_FRAME_LEN,
......
...@@ -435,13 +435,19 @@ enum ocelot_tag_prefix { ...@@ -435,13 +435,19 @@ enum ocelot_tag_prefix {
}; };
struct ocelot_port; struct ocelot_port;
struct ocelot;
struct ocelot_stat_layout { struct ocelot_stat_layout {
u32 offset; u32 offset;
char name[ETH_GSTRING_LEN]; char name[ETH_GSTRING_LEN];
}; };
struct ocelot_ops {
void (*pcs_init)(struct ocelot *ocelot, int port);
};
struct ocelot { struct ocelot {
const struct ocelot_ops *ops;
struct device *dev; struct device *dev;
struct regmap *targets[TARGET_MAX]; struct regmap *targets[TARGET_MAX];
...@@ -553,7 +559,7 @@ struct regmap *ocelot_regmap_init(struct ocelot *ocelot, struct resource *res); ...@@ -553,7 +559,7 @@ struct regmap *ocelot_regmap_init(struct ocelot *ocelot, struct resource *res);
int ocelot_init(struct ocelot *ocelot); int ocelot_init(struct ocelot *ocelot);
void ocelot_deinit(struct ocelot *ocelot); void ocelot_deinit(struct ocelot *ocelot);
int ocelot_chip_init(struct ocelot *ocelot); int ocelot_chip_init(struct ocelot *ocelot, const struct ocelot_ops *ops);
int ocelot_probe_port(struct ocelot *ocelot, u8 port, int ocelot_probe_port(struct ocelot *ocelot, u8 port,
void __iomem *regs, void __iomem *regs,
struct phy_device *phy); struct phy_device *phy);
......
...@@ -254,6 +254,33 @@ static const struct of_device_id mscc_ocelot_match[] = { ...@@ -254,6 +254,33 @@ static const struct of_device_id mscc_ocelot_match[] = {
}; };
MODULE_DEVICE_TABLE(of, mscc_ocelot_match); MODULE_DEVICE_TABLE(of, mscc_ocelot_match);
static void ocelot_port_pcs_init(struct ocelot *ocelot, int port)
{
struct ocelot_port *ocelot_port = ocelot->ports[port];
/* Disable HDX fast control */
ocelot_port_writel(ocelot_port, DEV_PORT_MISC_HDX_FAST_DIS,
DEV_PORT_MISC);
/* SGMII only for now */
ocelot_port_writel(ocelot_port, PCS1G_MODE_CFG_SGMII_MODE_ENA,
PCS1G_MODE_CFG);
ocelot_port_writel(ocelot_port, PCS1G_SD_CFG_SD_SEL, PCS1G_SD_CFG);
/* Enable PCS */
ocelot_port_writel(ocelot_port, PCS1G_CFG_PCS_ENA, PCS1G_CFG);
/* No aneg on SGMII */
ocelot_port_writel(ocelot_port, 0, PCS1G_ANEG_CFG);
/* No loopback */
ocelot_port_writel(ocelot_port, 0, PCS1G_LB_CFG);
}
static const struct ocelot_ops ocelot_ops = {
.pcs_init = ocelot_port_pcs_init,
};
static int mscc_ocelot_probe(struct platform_device *pdev) static int mscc_ocelot_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
...@@ -315,7 +342,7 @@ static int mscc_ocelot_probe(struct platform_device *pdev) ...@@ -315,7 +342,7 @@ static int mscc_ocelot_probe(struct platform_device *pdev)
ocelot->targets[HSIO] = hsio; ocelot->targets[HSIO] = hsio;
err = ocelot_chip_init(ocelot); err = ocelot_chip_init(ocelot, &ocelot_ops);
if (err) if (err)
return err; return err;
......
...@@ -423,7 +423,7 @@ static void ocelot_pll5_init(struct ocelot *ocelot) ...@@ -423,7 +423,7 @@ static void ocelot_pll5_init(struct ocelot *ocelot)
HSIO_PLL5G_CFG2_AMPC_SEL(0x10)); HSIO_PLL5G_CFG2_AMPC_SEL(0x10));
} }
int ocelot_chip_init(struct ocelot *ocelot) int ocelot_chip_init(struct ocelot *ocelot, const struct ocelot_ops *ops)
{ {
int ret; int ret;
...@@ -431,6 +431,7 @@ int ocelot_chip_init(struct ocelot *ocelot) ...@@ -431,6 +431,7 @@ int ocelot_chip_init(struct ocelot *ocelot)
ocelot->stats_layout = ocelot_stats_layout; ocelot->stats_layout = ocelot_stats_layout;
ocelot->num_stats = ARRAY_SIZE(ocelot_stats_layout); ocelot->num_stats = ARRAY_SIZE(ocelot_stats_layout);
ocelot->shared_queue_sz = 224 * 1024; ocelot->shared_queue_sz = 224 * 1024;
ocelot->ops = ops;
ret = ocelot_regfields_init(ocelot, ocelot_regfields); ret = ocelot_regfields_init(ocelot, ocelot_regfields);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment