Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: dsa: microchip: add property to select internal RMII reference clock

Microchip KSZ8863/KSZ8873 have the ability to select between internal
and external RMII reference clock. By default, reference clock
needs to be provided via REFCLKI_3 pin. If required, device can be
setup to provide RMII clock internally so that REFCLKI_3 pin can be
left unconnected.
Add a new "microchip,rmii-clk-internal" property which will set
RMII clock reference to internal. If property is not set, reference
clock needs to be provided externally.

While at it, move the ksz8795_cpu_interface_select() to
ksz8_config_cpu_port() to get a cleaner call path for cpu port.

Signed-off-by: Ante Knezic <ante.knezic@helmholz.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Ante Knezic and committed by
David S. Miller
9f19a4eb 8e3bfaab

+26 -6
+23 -6
drivers/net/dsa/microchip/ksz8795.c
··· 1358 1358 { 1359 1359 struct ksz_port *p = &dev->ports[port]; 1360 1360 1361 + if (!ksz_is_ksz87xx(dev)) 1362 + return; 1363 + 1361 1364 if (!p->interface && dev->compat_interface) { 1362 1365 dev_warn(dev->dev, 1363 1366 "Using legacy switch \"phy-mode\" property, because it is missing on port %d node. " ··· 1394 1391 /* enable 802.1p priority */ 1395 1392 ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true); 1396 1393 1397 - if (cpu_port) { 1398 - if (!ksz_is_ksz88x3(dev)) 1399 - ksz8795_cpu_interface_select(dev, port); 1400 - 1394 + if (cpu_port) 1401 1395 member = dsa_user_ports(ds); 1402 - } else { 1396 + else 1403 1397 member = BIT(dsa_upstream_port(ds, port)); 1404 - } 1405 1398 1406 1399 ksz8_cfg_port_member(dev, port, member); 1400 + } 1401 + 1402 + static void ksz88x3_config_rmii_clk(struct ksz_device *dev) 1403 + { 1404 + struct dsa_port *cpu_dp = dsa_to_port(dev->ds, dev->cpu_port); 1405 + bool rmii_clk_internal; 1406 + 1407 + if (!ksz_is_ksz88x3(dev)) 1408 + return; 1409 + 1410 + rmii_clk_internal = of_property_read_bool(cpu_dp->dn, 1411 + "microchip,rmii-clk-internal"); 1412 + 1413 + ksz_cfg(dev, KSZ88X3_REG_FVID_AND_HOST_MODE, 1414 + KSZ88X3_PORT3_RMII_CLK_INTERNAL, rmii_clk_internal); 1407 1415 } 1408 1416 1409 1417 void ksz8_config_cpu_port(struct dsa_switch *ds) ··· 1432 1418 ksz_cfg(dev, regs[S_TAIL_TAG_CTRL], masks[SW_TAIL_TAG_ENABLE], true); 1433 1419 1434 1420 ksz8_port_setup(dev, dev->cpu_port, true); 1421 + 1422 + ksz8795_cpu_interface_select(dev, dev->cpu_port); 1423 + ksz88x3_config_rmii_clk(dev); 1435 1424 1436 1425 for (i = 0; i < dev->phy_port_cnt; i++) { 1437 1426 ksz_port_stp_state_set(ds, i, BR_STATE_DISABLED);
+3
drivers/net/dsa/microchip/ksz8795_reg.h
··· 22 22 #define KSZ8863_GLOBAL_SOFTWARE_RESET BIT(4) 23 23 #define KSZ8863_PCS_RESET BIT(0) 24 24 25 + #define KSZ88X3_REG_FVID_AND_HOST_MODE 0xC6 26 + #define KSZ88X3_PORT3_RMII_CLK_INTERNAL BIT(3) 27 + 25 28 #define REG_SW_CTRL_0 0x02 26 29 27 30 #define SW_NEW_BACKOFF BIT(7)