From nobody Sat Nov 30 00:49:57 2024 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E166F1D6C5F for ; Fri, 13 Sep 2024 08:40:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726216854; cv=none; b=i72eLYar6woTD62/kxLJumTCU4Yz4zAOGZwpinwkt1B2FyVZwdP3rh9iqZKS3qeACPHtbBndIyv8e3mxaPzM+TuqIW/JvxAz9930PpuHSdmO3FG/+S7xhfs8zvr0Z1zXLHJmwU90Pjp+IKiV0oMzlNlFTliYcPgZU9gmkRklJAg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726216854; c=relaxed/simple; bh=bodaKALT9TM72QCQde0I+7qUFSBBobplX4Jvc2+Rz9c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=aY/ltv9MErIBRQIt6V5T7bbh77g+EZaJhlvyptNNycGsQnXNtP7Uoif4G1RdtuVqnt+R0jd6UyRaza5Mo4fWUgO2tGutyi6I4O5h9BEXYk+hIrhPzGbiDVhEQ5cJzpuACWQE+kj1OZOUNGpOqyhteRoZqfw5lg8uNNmdZq51bas= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1sp1qr-0005n8-L3; Fri, 13 Sep 2024 10:40:25 +0200 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sp1qp-007a7Y-SH; Fri, 13 Sep 2024 10:40:23 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1sp1qp-00E1uS-2b; Fri, 13 Sep 2024 10:40:23 +0200 From: Oleksij Rempel To: Andrew Lunn , Heiner Kallweit , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Russell King , devicetree@vger.kernel.org Subject: [PATCH net-next v3 1/2] dt-bindings: net: ethernet-phy: Add timing-role role property for ethernet PHYs Date: Fri, 13 Sep 2024 10:40:21 +0200 Message-Id: <20240913084022.3343903-2-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240913084022.3343903-1-o.rempel@pengutronix.de> References: <20240913084022.3343903-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch introduces a new `timing-role` property in the device tree bindings for configuring the master/slave role of PHYs. This is essential for scenarios where hardware strap pins are unavailable or incorrectly configured. The `timing-role` property supports the following values: - `force-master`: Forces the PHY to operate as a master (clock source). - `force-slave`: Forces the PHY to operate as a slave (clock receiver). - `prefer-master`: Prefers the PHY to be master but allows negotiation. - `prefer-slave`: Prefers the PHY to be slave but allows negotiation. The terms "master" and "slave" are retained in this context to align with the IEEE 802.3 standards, where they are used to describe the roles of PHY devices in managing clock signals for data transmission. In particular, the terms are used in specifications for 1000Base-T and MultiGBASE-T PHYs, among others. Although there is an effort to adopt more inclusive terminology, replacing these terms could create discrepancies between the Linux kernel and the established standards, documentation, and existing hardware interfaces. Signed-off-by: Oleksij Rempel Reviewed-by: Rob Herring (Arm) --- changes v3: - rename "master-slave" to "timing-role" changes v2: - use string property instead of multiple flags --- .../devicetree/bindings/net/ethernet-phy.yaml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Documentation/devicetree/bindings/net/ethernet-phy.yaml b/Docu= mentation/devicetree/bindings/net/ethernet-phy.yaml index d9b62741a2259..da9eaa811d70f 100644 --- a/Documentation/devicetree/bindings/net/ethernet-phy.yaml +++ b/Documentation/devicetree/bindings/net/ethernet-phy.yaml @@ -158,6 +158,27 @@ properties: Mark the corresponding energy efficient ethernet mode as broken and request the ethernet to stop advertising it. =20 + timing-role: + $ref: /schemas/types.yaml#/definitions/string + enum: + - force-master + - force-slave + - prefer-master + - prefer-slave + description: | + Specifies the timing role of the PHY in the network link. This prope= rty is + required for setups where the role must be explicitly assigned via t= he + device tree due to limitations in hardware strapping or incorrect st= rap + configurations. + It is applicable to Single Pair Ethernet (1000/100/10Base-T1) and ot= her + PHY types, including 1000Base-T, where it controls whether the PHY s= hould + be a master (clock source) or a slave (clock receiver). + + - 'force-master': The PHY is forced to operate as a master. + - 'force-slave': The PHY is forced to operate as a slave. + - 'prefer-master': Prefer the PHY to be master but allow negotiation. + - 'prefer-slave': Prefer the PHY to be slave but allow negotiation. + pses: $ref: /schemas/types.yaml#/definitions/phandle-array maxItems: 1 --=20 2.39.2 From nobody Sat Nov 30 00:49:57 2024 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AF1AE1D6C62 for ; Fri, 13 Sep 2024 08:40:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726216855; cv=none; b=DW9hMjcAAyfOXydPeWLLjvbTq596c2QXKSZ7JV6AJ7hzugtApKHr8uKSqG8825O1VyPGLVvNDWMn+TOAedcZG3jChjBDrHeO2ayd5V+i8DbSoJLYhebiXViY8kEBV4Emk4pDCQKKZDQz0X2Nk9FoM91IGg5AainD1yS5pXCdddI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726216855; c=relaxed/simple; bh=laoe3SnMaiPWtPOUgZ8i4FpD13PW4kdI6pvhyusMybw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=cIzB1J9xUCnsNjVHH6tvzGcNwyX4pcjqz/bMvZ5h2tctfEPkf1Ej6NrF7petPzmXHbSlJwlIj3NL1OqLwAnKolQdpZPXBVUUeXw0p3x6NyzWxMlOpsaWKLB/D4fBU0hR8ywgA1QuETcFNgCyWXaS0uN7itEYAi8rc3q9YMNP0dg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1sp1qr-0005nB-L3; Fri, 13 Sep 2024 10:40:25 +0200 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sp1qp-007a7Z-TJ; Fri, 13 Sep 2024 10:40:23 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1sp1qp-00E1uc-2g; Fri, 13 Sep 2024 10:40:23 +0200 From: Oleksij Rempel To: Andrew Lunn , Heiner Kallweit , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Russell King , devicetree@vger.kernel.org Subject: [PATCH net-next v3 2/2] net: phy: Add support for PHY timing-role configuration via device tree Date: Fri, 13 Sep 2024 10:40:22 +0200 Message-Id: <20240913084022.3343903-3-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240913084022.3343903-1-o.rempel@pengutronix.de> References: <20240913084022.3343903-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Introduce support for configuring the master/slave role of PHYs based on the `timing-role` property in the device tree. While this functionality is necessary for Single Pair Ethernet (SPE) PHYs (1000/100/10Base-T1) where hardware strap pins may be unavailable or incorrectly set, it works for any PHY type. Signed-off-by: Oleksij Rempel Reviewed-by: Russell King (Oracle) --- changes v3: - rename master-slave to timing-role --- drivers/net/phy/phy-core.c | 33 +++++++++++++++++++++++++++++++++ drivers/net/phy/phy_device.c | 3 +++ include/linux/phy.h | 1 + 3 files changed, 37 insertions(+) diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c index 1f98b6a96c153..97ff10e226180 100644 --- a/drivers/net/phy/phy-core.c +++ b/drivers/net/phy/phy-core.c @@ -412,6 +412,39 @@ void of_set_phy_eee_broken(struct phy_device *phydev) phydev->eee_broken_modes =3D broken; } =20 +/** + * of_set_phy_timing_role - Set the master/slave mode of the PHY + * + * @phydev: The phy_device struct + * + * Set master/slave configuration of the PHY based on the device tree. + */ +void of_set_phy_timing_role(struct phy_device *phydev) +{ + struct device_node *node =3D phydev->mdio.dev.of_node; + const char *master; + + if (!IS_ENABLED(CONFIG_OF_MDIO)) + return; + + if (!node) + return; + + if (of_property_read_string(node, "timing-role", &master)) + return; + + if (strcmp(master, "force-master") =3D=3D 0) + phydev->master_slave_set =3D MASTER_SLAVE_CFG_MASTER_FORCE; + else if (strcmp(master, "force-slave") =3D=3D 0) + phydev->master_slave_set =3D MASTER_SLAVE_CFG_SLAVE_FORCE; + else if (strcmp(master, "prefer-master") =3D=3D 0) + phydev->master_slave_set =3D MASTER_SLAVE_CFG_MASTER_PREFERRED; + else if (strcmp(master, "prefer-slave") =3D=3D 0) + phydev->master_slave_set =3D MASTER_SLAVE_CFG_SLAVE_PREFERRED; + else + phydev_warn(phydev, "Unknown master-slave mode %s\n", master); +} + /** * phy_resolve_aneg_pause - Determine pause autoneg results * diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 560e338b307a4..4ccf504a8b2c2 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -3608,6 +3608,9 @@ static int phy_probe(struct device *dev) */ of_set_phy_eee_broken(phydev); =20 + /* Get master/slave strap overrides */ + of_set_phy_timing_role(phydev); + /* The Pause Frame bits indicate that the PHY can support passing * pause frames. During autonegotiation, the PHYs will determine if * they should allow pause frames to pass. The MAC driver should then diff --git a/include/linux/phy.h b/include/linux/phy.h index 4a9a11749c554..898ea2e316d2c 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1260,6 +1260,7 @@ size_t phy_speeds(unsigned int *speeds, size_t size, unsigned long *mask); void of_set_phy_supported(struct phy_device *phydev); void of_set_phy_eee_broken(struct phy_device *phydev); +void of_set_phy_timing_role(struct phy_device *phydev); int phy_speed_down_core(struct phy_device *phydev); =20 /** --=20 2.39.2