mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 12:24:37 -04:00
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>
This commit is contained in:
@@ -11,7 +11,6 @@ maintainers:
|
||||
- Woojung Huh <Woojung.Huh@microchip.com>
|
||||
|
||||
allOf:
|
||||
- $ref: dsa.yaml#/$defs/ethernet-ports
|
||||
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||
|
||||
properties:
|
||||
@@ -78,6 +77,39 @@ required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
if:
|
||||
not:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- microchip,ksz8863
|
||||
- microchip,ksz8873
|
||||
then:
|
||||
$ref: dsa.yaml#/$defs/ethernet-ports
|
||||
else:
|
||||
patternProperties:
|
||||
"^(ethernet-)?ports$":
|
||||
patternProperties:
|
||||
"^(ethernet-)?port@[0-2]$":
|
||||
$ref: dsa-port.yaml#
|
||||
unevaluatedProperties: false
|
||||
properties:
|
||||
microchip,rmii-clk-internal:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description:
|
||||
When ksz88x3 is acting as clock provier (via REFCLKO) it
|
||||
can select between internal and external RMII reference
|
||||
clock. Internal reference clock means that the clock for
|
||||
the RMII of ksz88x3 is provided by the ksz88x3 internally
|
||||
and the REFCLKI pin is unconnected. For the external
|
||||
reference clock, the clock needs to be fed back to ksz88x3
|
||||
via REFCLKI.
|
||||
If microchip,rmii-clk-internal is set, ksz88x3 will provide
|
||||
rmii reference clock internally, otherwise reference clock
|
||||
should be provided externally.
|
||||
dependencies:
|
||||
microchip,rmii-clk-internal: [ethernet]
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
|
||||
@@ -1358,6 +1358,9 @@ static void ksz8795_cpu_interface_select(struct ksz_device *dev, int port)
|
||||
{
|
||||
struct ksz_port *p = &dev->ports[port];
|
||||
|
||||
if (!ksz_is_ksz87xx(dev))
|
||||
return;
|
||||
|
||||
if (!p->interface && dev->compat_interface) {
|
||||
dev_warn(dev->dev,
|
||||
"Using legacy switch \"phy-mode\" property, because it is missing on port %d node. "
|
||||
@@ -1391,18 +1394,29 @@ void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port)
|
||||
/* enable 802.1p priority */
|
||||
ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true);
|
||||
|
||||
if (cpu_port) {
|
||||
if (!ksz_is_ksz88x3(dev))
|
||||
ksz8795_cpu_interface_select(dev, port);
|
||||
|
||||
if (cpu_port)
|
||||
member = dsa_user_ports(ds);
|
||||
} else {
|
||||
else
|
||||
member = BIT(dsa_upstream_port(ds, port));
|
||||
}
|
||||
|
||||
ksz8_cfg_port_member(dev, port, member);
|
||||
}
|
||||
|
||||
static void ksz88x3_config_rmii_clk(struct ksz_device *dev)
|
||||
{
|
||||
struct dsa_port *cpu_dp = dsa_to_port(dev->ds, dev->cpu_port);
|
||||
bool rmii_clk_internal;
|
||||
|
||||
if (!ksz_is_ksz88x3(dev))
|
||||
return;
|
||||
|
||||
rmii_clk_internal = of_property_read_bool(cpu_dp->dn,
|
||||
"microchip,rmii-clk-internal");
|
||||
|
||||
ksz_cfg(dev, KSZ88X3_REG_FVID_AND_HOST_MODE,
|
||||
KSZ88X3_PORT3_RMII_CLK_INTERNAL, rmii_clk_internal);
|
||||
}
|
||||
|
||||
void ksz8_config_cpu_port(struct dsa_switch *ds)
|
||||
{
|
||||
struct ksz_device *dev = ds->priv;
|
||||
@@ -1419,6 +1433,9 @@ void ksz8_config_cpu_port(struct dsa_switch *ds)
|
||||
|
||||
ksz8_port_setup(dev, dev->cpu_port, true);
|
||||
|
||||
ksz8795_cpu_interface_select(dev, dev->cpu_port);
|
||||
ksz88x3_config_rmii_clk(dev);
|
||||
|
||||
for (i = 0; i < dev->phy_port_cnt; i++) {
|
||||
ksz_port_stp_state_set(ds, i, BR_STATE_DISABLED);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
#define KSZ8863_GLOBAL_SOFTWARE_RESET BIT(4)
|
||||
#define KSZ8863_PCS_RESET BIT(0)
|
||||
|
||||
#define KSZ88X3_REG_FVID_AND_HOST_MODE 0xC6
|
||||
#define KSZ88X3_PORT3_RMII_CLK_INTERNAL BIT(3)
|
||||
|
||||
#define REG_SW_CTRL_0 0x02
|
||||
|
||||
#define SW_NEW_BACKOFF BIT(7)
|
||||
|
||||
Reference in New Issue
Block a user