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

Merge branch 'dsa-microchip-rmii-reference'

Ante Knezic says:

====================
net: dsa: microchip: enable setting rmii reference

KSZ88X3 devices can select between internal and external RMII reference clock.
This patch series introduces new device tree property for setting reference
clock to internal.

---
V5:
- move rmii-clk-internal to be a port device tree property.
V4:
- remove rmii_clk_internal from ksz_device, as its not needed any more
- move rmii clk config as well as ksz8795_cpu_interface_select to
ksz8_config_cpu_port
V3:
- move ksz_cfg from global switch config to port config as suggested by Vladimir
Oltean
- reverse patch order as suggested by Vladimir Oltean
- adapt dt schema as suggested by Conor Dooley
V2:
- don't rely on default register settings - enforce set/clear property as
suggested by Andrew Lunn
- enforce dt schema as suggested by Conor Dooley
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+59 -7
+33 -1
Documentation/devicetree/bindings/net/dsa/microchip,ksz.yaml
··· 11 11 - Woojung Huh <Woojung.Huh@microchip.com> 12 12 13 13 allOf: 14 - - $ref: dsa.yaml#/$defs/ethernet-ports 15 14 - $ref: /schemas/spi/spi-peripheral-props.yaml# 16 15 17 16 properties: ··· 76 77 required: 77 78 - compatible 78 79 - reg 80 + 81 + if: 82 + not: 83 + properties: 84 + compatible: 85 + enum: 86 + - microchip,ksz8863 87 + - microchip,ksz8873 88 + then: 89 + $ref: dsa.yaml#/$defs/ethernet-ports 90 + else: 91 + patternProperties: 92 + "^(ethernet-)?ports$": 93 + patternProperties: 94 + "^(ethernet-)?port@[0-2]$": 95 + $ref: dsa-port.yaml# 96 + unevaluatedProperties: false 97 + properties: 98 + microchip,rmii-clk-internal: 99 + $ref: /schemas/types.yaml#/definitions/flag 100 + description: 101 + When ksz88x3 is acting as clock provier (via REFCLKO) it 102 + can select between internal and external RMII reference 103 + clock. Internal reference clock means that the clock for 104 + the RMII of ksz88x3 is provided by the ksz88x3 internally 105 + and the REFCLKI pin is unconnected. For the external 106 + reference clock, the clock needs to be fed back to ksz88x3 107 + via REFCLKI. 108 + If microchip,rmii-clk-internal is set, ksz88x3 will provide 109 + rmii reference clock internally, otherwise reference clock 110 + should be provided externally. 111 + dependencies: 112 + microchip,rmii-clk-internal: [ethernet] 79 113 80 114 unevaluatedProperties: false 81 115
+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)