Commit edecfa98 authored by Helmut Grohne's avatar Helmut Grohne Committed by David S. Miller

net: dsa: microchip: look for phy-mode in port nodes

Documentation/devicetree/bindings/net/dsa/dsa.txt says that the phy-mode
property should be specified on port nodes. However, the microchip
drivers read it from the switch node.

Let the driver use the per-port property and fall back to the old
location with a warning.

Fix in-tree users.
Signed-off-by: default avatarHelmut Grohne <helmut.grohne@intenta.de>
Link: https://lore.kernel.org/netdev/20200617082235.GA1523@laureti-dev/Acked-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f612eb76
...@@ -116,7 +116,6 @@ spi2: spi@400 { ...@@ -116,7 +116,6 @@ spi2: spi@400 {
switch0: ksz8563@0 { switch0: ksz8563@0 {
compatible = "microchip,ksz8563"; compatible = "microchip,ksz8563";
reg = <0>; reg = <0>;
phy-mode = "mii";
reset-gpios = <&pioA PIN_PD4 GPIO_ACTIVE_LOW>; reset-gpios = <&pioA PIN_PD4 GPIO_ACTIVE_LOW>;
spi-max-frequency = <500000>; spi-max-frequency = <500000>;
...@@ -140,6 +139,7 @@ port@2 { ...@@ -140,6 +139,7 @@ port@2 {
reg = <2>; reg = <2>;
label = "cpu"; label = "cpu";
ethernet = <&macb0>; ethernet = <&macb0>;
phy-mode = "mii";
fixed-link { fixed-link {
speed = <100>; speed = <100>;
full-duplex; full-duplex;
......
...@@ -932,11 +932,19 @@ static void ksz8795_port_setup(struct ksz_device *dev, int port, bool cpu_port) ...@@ -932,11 +932,19 @@ static void ksz8795_port_setup(struct ksz_device *dev, int port, bool cpu_port)
ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true); ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true);
if (cpu_port) { if (cpu_port) {
if (!p->interface && dev->compat_interface) {
dev_warn(dev->dev,
"Using legacy switch \"phy-mode\" property, because it is missing on port %d node. "
"Please update your device tree.\n",
port);
p->interface = dev->compat_interface;
}
/* Configure MII interface for proper network communication. */ /* Configure MII interface for proper network communication. */
ksz_read8(dev, REG_PORT_5_CTRL_6, &data8); ksz_read8(dev, REG_PORT_5_CTRL_6, &data8);
data8 &= ~PORT_INTERFACE_TYPE; data8 &= ~PORT_INTERFACE_TYPE;
data8 &= ~PORT_GMII_1GPS_MODE; data8 &= ~PORT_GMII_1GPS_MODE;
switch (dev->interface) { switch (p->interface) {
case PHY_INTERFACE_MODE_MII: case PHY_INTERFACE_MODE_MII:
p->phydev.speed = SPEED_100; p->phydev.speed = SPEED_100;
break; break;
...@@ -952,11 +960,11 @@ static void ksz8795_port_setup(struct ksz_device *dev, int port, bool cpu_port) ...@@ -952,11 +960,11 @@ static void ksz8795_port_setup(struct ksz_device *dev, int port, bool cpu_port)
default: default:
data8 &= ~PORT_RGMII_ID_IN_ENABLE; data8 &= ~PORT_RGMII_ID_IN_ENABLE;
data8 &= ~PORT_RGMII_ID_OUT_ENABLE; data8 &= ~PORT_RGMII_ID_OUT_ENABLE;
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID || if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
dev->interface == PHY_INTERFACE_MODE_RGMII_RXID) p->interface == PHY_INTERFACE_MODE_RGMII_RXID)
data8 |= PORT_RGMII_ID_IN_ENABLE; data8 |= PORT_RGMII_ID_IN_ENABLE;
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID || if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
dev->interface == PHY_INTERFACE_MODE_RGMII_TXID) p->interface == PHY_INTERFACE_MODE_RGMII_TXID)
data8 |= PORT_RGMII_ID_OUT_ENABLE; data8 |= PORT_RGMII_ID_OUT_ENABLE;
data8 |= PORT_GMII_1GPS_MODE; data8 |= PORT_GMII_1GPS_MODE;
data8 |= PORT_INTERFACE_RGMII; data8 |= PORT_INTERFACE_RGMII;
......
...@@ -1208,7 +1208,7 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port) ...@@ -1208,7 +1208,7 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)
/* configure MAC to 1G & RGMII mode */ /* configure MAC to 1G & RGMII mode */
ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8); ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8);
switch (dev->interface) { switch (p->interface) {
case PHY_INTERFACE_MODE_MII: case PHY_INTERFACE_MODE_MII:
ksz9477_set_xmii(dev, 0, &data8); ksz9477_set_xmii(dev, 0, &data8);
ksz9477_set_gbit(dev, false, &data8); ksz9477_set_gbit(dev, false, &data8);
...@@ -1229,11 +1229,11 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port) ...@@ -1229,11 +1229,11 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)
ksz9477_set_gbit(dev, true, &data8); ksz9477_set_gbit(dev, true, &data8);
data8 &= ~PORT_RGMII_ID_IG_ENABLE; data8 &= ~PORT_RGMII_ID_IG_ENABLE;
data8 &= ~PORT_RGMII_ID_EG_ENABLE; data8 &= ~PORT_RGMII_ID_EG_ENABLE;
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID || if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
dev->interface == PHY_INTERFACE_MODE_RGMII_RXID) p->interface == PHY_INTERFACE_MODE_RGMII_RXID)
data8 |= PORT_RGMII_ID_IG_ENABLE; data8 |= PORT_RGMII_ID_IG_ENABLE;
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID || if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
dev->interface == PHY_INTERFACE_MODE_RGMII_TXID) p->interface == PHY_INTERFACE_MODE_RGMII_TXID)
data8 |= PORT_RGMII_ID_EG_ENABLE; data8 |= PORT_RGMII_ID_EG_ENABLE;
p->phydev.speed = SPEED_1000; p->phydev.speed = SPEED_1000;
break; break;
...@@ -1269,23 +1269,32 @@ static void ksz9477_config_cpu_port(struct dsa_switch *ds) ...@@ -1269,23 +1269,32 @@ static void ksz9477_config_cpu_port(struct dsa_switch *ds)
dev->cpu_port = i; dev->cpu_port = i;
dev->host_mask = (1 << dev->cpu_port); dev->host_mask = (1 << dev->cpu_port);
dev->port_mask |= dev->host_mask; dev->port_mask |= dev->host_mask;
p = &dev->ports[i];
/* Read from XMII register to determine host port /* Read from XMII register to determine host port
* interface. If set specifically in device tree * interface. If set specifically in device tree
* note the difference to help debugging. * note the difference to help debugging.
*/ */
interface = ksz9477_get_interface(dev, i); interface = ksz9477_get_interface(dev, i);
if (!dev->interface) if (!p->interface) {
dev->interface = interface; if (dev->compat_interface) {
if (interface && interface != dev->interface) dev_warn(dev->dev,
"Using legacy switch \"phy-mode\" property, because it is missing on port %d node. "
"Please update your device tree.\n",
i);
p->interface = dev->compat_interface;
} else {
p->interface = interface;
}
}
if (interface && interface != p->interface)
dev_info(dev->dev, dev_info(dev->dev,
"use %s instead of %s\n", "use %s instead of %s\n",
phy_modes(dev->interface), phy_modes(p->interface),
phy_modes(interface)); phy_modes(interface));
/* enable cpu port */ /* enable cpu port */
ksz9477_port_setup(dev, i, true); ksz9477_port_setup(dev, i, true);
p = &dev->ports[dev->cpu_port];
p->vid_member = dev->port_mask; p->vid_member = dev->port_mask;
p->on = 1; p->on = 1;
} }
......
...@@ -388,6 +388,8 @@ int ksz_switch_register(struct ksz_device *dev, ...@@ -388,6 +388,8 @@ int ksz_switch_register(struct ksz_device *dev,
const struct ksz_dev_ops *ops) const struct ksz_dev_ops *ops)
{ {
phy_interface_t interface; phy_interface_t interface;
struct device_node *port;
unsigned int port_num;
int ret; int ret;
if (dev->pdata) if (dev->pdata)
...@@ -421,10 +423,19 @@ int ksz_switch_register(struct ksz_device *dev, ...@@ -421,10 +423,19 @@ int ksz_switch_register(struct ksz_device *dev,
/* Host port interface will be self detected, or specifically set in /* Host port interface will be self detected, or specifically set in
* device tree. * device tree.
*/ */
for (port_num = 0; port_num < dev->port_cnt; ++port_num)
dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA;
if (dev->dev->of_node) { if (dev->dev->of_node) {
ret = of_get_phy_mode(dev->dev->of_node, &interface); ret = of_get_phy_mode(dev->dev->of_node, &interface);
if (ret == 0) if (ret == 0)
dev->interface = interface; dev->compat_interface = interface;
for_each_available_child_of_node(dev->dev->of_node, port) {
if (of_property_read_u32(port, "reg", &port_num))
continue;
if (port_num >= dev->port_cnt)
return -EINVAL;
of_get_phy_mode(port, &dev->ports[port_num].interface);
}
dev->synclko_125 = of_property_read_bool(dev->dev->of_node, dev->synclko_125 = of_property_read_bool(dev->dev->of_node,
"microchip,synclko-125"); "microchip,synclko-125");
} }
......
...@@ -39,6 +39,7 @@ struct ksz_port { ...@@ -39,6 +39,7 @@ struct ksz_port {
u32 freeze:1; /* MIB counter freeze is enabled */ u32 freeze:1; /* MIB counter freeze is enabled */
struct ksz_port_mib mib; struct ksz_port_mib mib;
phy_interface_t interface;
}; };
struct ksz_device { struct ksz_device {
...@@ -72,7 +73,7 @@ struct ksz_device { ...@@ -72,7 +73,7 @@ struct ksz_device {
int mib_cnt; int mib_cnt;
int mib_port_cnt; int mib_port_cnt;
int last_port; /* ports after that not used */ int last_port; /* ports after that not used */
phy_interface_t interface; phy_interface_t compat_interface;
u32 regs_size; u32 regs_size;
bool phy_errata_9477; bool phy_errata_9477;
bool synclko_125; bool synclko_125;
......
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