From: Christian Marangi <ansuelsmth@gmail.com>
To: "David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Conor Dooley <conor+dt@kernel.org>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konrad.dybcio@linaro.org>,
Andrew Lunn <andrew@lunn.ch>,
Heiner Kallweit <hkallweit1@gmail.com>,
Russell King <linux@armlinux.org.uk>,
Frank Rowand <frowand.list@gmail.com>,
Christian Marangi <ansuelsmth@gmail.com>,
Robert Marko <robert.marko@sartura.hr>,
netdev@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org
Subject: [net-next PATCH v5 2/9] net: phy: add support for scanning PHY in PHY packages nodes
Date: Thu, 1 Feb 2024 16:17:28 +0100 [thread overview]
Message-ID: <20240201151747.7524-3-ansuelsmth@gmail.com> (raw)
In-Reply-To: <20240201151747.7524-1-ansuelsmth@gmail.com>
Add support for scanning PHY in PHY packages nodes. PHY packages nodes
are just container for actual PHY on the MDIO bus.
Their PHY address is defined as offset of the PHY package base address
defined in DT. of_mdio_parse_addr_offset helper is introduced to
validate the final address is correct.
mdio_bus.c and of_mdio.c is updated to now support and parse also
PHY package subnote by checking if the node name match
"ethernet-phy-package".
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
drivers/net/mdio/of_mdio.c | 75 +++++++++++++++++++++++++++-----------
drivers/net/phy/mdio_bus.c | 44 +++++++++++++++++-----
include/linux/of_mdio.h | 26 +++++++++++++
3 files changed, 115 insertions(+), 30 deletions(-)
diff --git a/drivers/net/mdio/of_mdio.c b/drivers/net/mdio/of_mdio.c
index 64ebcb6d235c..58b54c644f11 100644
--- a/drivers/net/mdio/of_mdio.c
+++ b/drivers/net/mdio/of_mdio.c
@@ -139,6 +139,54 @@ bool of_mdiobus_child_is_phy(struct device_node *child)
}
EXPORT_SYMBOL(of_mdiobus_child_is_phy);
+static int __of_mdiobus_parse_phys(struct mii_bus *mdio, struct device_node *np,
+ int base_addr, bool *scanphys)
+{
+ struct device_node *child;
+ int addr, rc = 0;
+
+ /* Loop over the child nodes and register a phy_device for each phy */
+ for_each_available_child_of_node(np, child) {
+ if (of_node_name_eq(child, "ethernet-phy-package")) {
+ rc = of_property_read_u32(child, "reg", &addr);
+ if (rc)
+ goto exit;
+
+ rc = __of_mdiobus_parse_phys(mdio, child, addr, scanphys);
+ if (rc && rc != -ENODEV)
+ goto exit;
+
+ continue;
+ }
+
+ if (base_addr)
+ addr = of_mdio_parse_addr_offset(&mdio->dev, child, base_addr);
+ else
+ addr = of_mdio_parse_addr(&mdio->dev, child);
+ if (addr < 0) {
+ *scanphys = true;
+ continue;
+ }
+
+ if (of_mdiobus_child_is_phy(child))
+ rc = of_mdiobus_register_phy(mdio, child, addr);
+ else
+ rc = of_mdiobus_register_device(mdio, child, addr);
+
+ if (rc == -ENODEV)
+ dev_err(&mdio->dev,
+ "MDIO device at address %d is missing.\n",
+ addr);
+ else if (rc)
+ goto exit;
+ }
+
+ return 0;
+exit:
+ of_node_put(child);
+ return rc;
+}
+
/**
* __of_mdiobus_register - Register mii_bus and create PHYs from the device tree
* @mdio: pointer to mii_bus structure
@@ -180,25 +228,9 @@ int __of_mdiobus_register(struct mii_bus *mdio, struct device_node *np,
return rc;
/* Loop over the child nodes and register a phy_device for each phy */
- for_each_available_child_of_node(np, child) {
- addr = of_mdio_parse_addr(&mdio->dev, child);
- if (addr < 0) {
- scanphys = true;
- continue;
- }
-
- if (of_mdiobus_child_is_phy(child))
- rc = of_mdiobus_register_phy(mdio, child, addr);
- else
- rc = of_mdiobus_register_device(mdio, child, addr);
-
- if (rc == -ENODEV)
- dev_err(&mdio->dev,
- "MDIO device at address %d is missing.\n",
- addr);
- else if (rc)
- goto unregister;
- }
+ rc = __of_mdiobus_parse_phys(mdio, np, 0, &scanphys);
+ if (rc)
+ goto unregister;
if (!scanphys)
return 0;
@@ -227,15 +259,16 @@ int __of_mdiobus_register(struct mii_bus *mdio, struct device_node *np,
if (!rc)
break;
if (rc != -ENODEV)
- goto unregister;
+ goto put_unregister;
}
}
}
return 0;
-unregister:
+put_unregister:
of_node_put(child);
+unregister:
mdiobus_unregister(mdio);
return rc;
}
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index afbad1ad8683..7737d0101d7b 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -459,20 +459,33 @@ EXPORT_SYMBOL(of_mdio_find_bus);
* found, set the of_node pointer for the mdio device. This allows
* auto-probed phy devices to be supplied with information passed in
* via DT.
+ * If a PHY package is found, PHY is searched also there.
*/
-static void of_mdiobus_link_mdiodev(struct mii_bus *bus,
- struct mdio_device *mdiodev)
+static int of_mdiobus_find_phy(struct device *dev, struct mdio_device *mdiodev,
+ struct device_node *np, int base_addr)
{
- struct device *dev = &mdiodev->dev;
struct device_node *child;
- if (dev->of_node || !bus->dev.of_node)
- return;
+ for_each_available_child_of_node(np, child) {
+ int addr, ret;
- for_each_available_child_of_node(bus->dev.of_node, child) {
- int addr;
+ if (of_node_name_eq(child, "ethernet-phy-package")) {
+ ret = of_property_read_u32(child, "reg", &addr);
+ if (ret)
+ return ret;
- addr = of_mdio_parse_addr(dev, child);
+ if (!of_mdiobus_find_phy(dev, mdiodev, child, addr)) {
+ of_node_put(child);
+ return 0;
+ }
+
+ continue;
+ }
+
+ if (base_addr)
+ addr = of_mdio_parse_addr_offset(dev, child, base_addr);
+ else
+ addr = of_mdio_parse_addr(dev, child);
if (addr < 0)
continue;
@@ -481,9 +494,22 @@ static void of_mdiobus_link_mdiodev(struct mii_bus *bus,
/* The refcount on "child" is passed to the mdio
* device. Do _not_ use of_node_put(child) here.
*/
- return;
+ return 0;
}
}
+
+ return -ENODEV;
+}
+
+static void of_mdiobus_link_mdiodev(struct mii_bus *bus,
+ struct mdio_device *mdiodev)
+{
+ struct device *dev = &mdiodev->dev;
+
+ if (dev->of_node || !bus->dev.of_node)
+ return;
+
+ of_mdiobus_find_phy(dev, mdiodev, bus->dev.of_node, 0);
}
#else /* !IS_ENABLED(CONFIG_OF_MDIO) */
static inline void of_mdiobus_link_mdiodev(struct mii_bus *mdio,
diff --git a/include/linux/of_mdio.h b/include/linux/of_mdio.h
index 8a52ef2e6fa6..8566df2afbe6 100644
--- a/include/linux/of_mdio.h
+++ b/include/linux/of_mdio.h
@@ -72,6 +72,27 @@ static inline int of_mdio_parse_addr(struct device *dev,
return addr;
}
+static inline int of_mdio_parse_addr_offset(struct device *dev,
+ const struct device_node *np,
+ u16 offset)
+{
+ int addr;
+
+ addr = of_mdio_parse_addr(dev, np);
+ if (addr < 0)
+ return addr;
+
+ /* Validate final address with offset */
+ addr += offset;
+ if (addr >= PHY_MAX_ADDR) {
+ dev_err(dev, "%s PHY address offset %i is too large\n",
+ np->full_name, addr);
+ return -EINVAL;
+ }
+
+ return addr;
+}
+
#else /* CONFIG_OF_MDIO */
static inline bool of_mdiobus_child_is_phy(struct device_node *child)
{
@@ -130,6 +151,11 @@ static inline int of_mdio_parse_addr(struct device *dev,
{
return -ENOSYS;
}
+static inline int of_mdio_parse_addr_offset(struct device *dev,
+ const struct device_node *np)
+{
+ return -ENOSYS;
+}
static inline int of_phy_register_fixed_link(struct device_node *np)
{
return -ENOSYS;
--
2.43.0
next prev parent reply other threads:[~2024-02-01 15:18 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-01 15:17 [net-next PATCH v5 0/9] net: phy: Introduce PHY Package concept Christian Marangi
2024-02-01 15:17 ` [net-next PATCH v5 1/9] dt-bindings: net: document ethernet PHY package nodes Christian Marangi
2024-02-02 20:52 ` Rob Herring
2024-02-02 20:58 ` Christian Marangi
2024-02-01 15:17 ` Christian Marangi [this message]
2024-02-01 16:25 ` [net-next PATCH v5 2/9] net: phy: add support for scanning PHY in PHY packages nodes Antoine Tenart
2024-02-01 17:20 ` Christian Marangi
2024-02-02 1:02 ` Andrew Lunn
2024-02-02 10:05 ` Antoine Tenart
2024-02-01 15:17 ` [net-next PATCH v5 3/9] net: phy: add devm/of_phy_package_join helper Christian Marangi
2024-02-01 16:40 ` Antoine Tenart
2024-02-01 16:48 ` Christian Marangi
2024-02-01 15:17 ` [net-next PATCH v5 4/9] net: phy: qcom: move more function to shared library Christian Marangi
2024-02-01 15:17 ` [net-next PATCH v5 5/9] dt-bindings: net: add QCA807x PHY defines Christian Marangi
2024-02-02 7:41 ` Krzysztof Kozlowski
2024-02-02 15:19 ` Christian Marangi
2024-02-02 16:58 ` Conor Dooley
2024-02-02 17:03 ` Christian Marangi
2024-02-01 15:17 ` [net-next PATCH v5 6/9] dt-bindings: net: Document Qcom QCA807x PHY package Christian Marangi
2024-02-02 1:16 ` Andrew Lunn
2024-02-02 7:45 ` Krzysztof Kozlowski
2024-02-02 15:12 ` Christian Marangi
2024-02-02 20:39 ` Rob Herring
2024-02-02 20:47 ` Christian Marangi
2024-02-02 20:45 ` Rob Herring
2024-02-02 21:50 ` Andrew Lunn
2024-02-01 15:17 ` [net-next PATCH v5 7/9] net: phy: qcom: add support for QCA807x PHY Family Christian Marangi
2024-02-02 1:35 ` Andrew Lunn
2024-02-02 17:44 ` Christian Marangi
2024-02-03 16:25 ` Andrew Lunn
2024-02-03 16:28 ` Christian Marangi
2024-02-01 15:17 ` [net-next PATCH v5 8/9] net: phy: qcom: generalize some qca808x LED functions Christian Marangi
2024-02-02 1:38 ` Andrew Lunn
2024-02-01 15:17 ` [net-next PATCH v5 9/9] net: phy: qca807x: add support for configurable LED Christian Marangi
2024-02-02 1:43 ` Andrew Lunn
2024-02-02 16:40 ` Christian Marangi
2024-02-02 17:04 ` Russell King (Oracle)
2024-02-02 17:07 ` Christian Marangi
2024-02-02 17:08 ` Andrew Lunn
2024-02-02 17:13 ` Christian Marangi
2024-02-02 17:30 ` Russell King (Oracle)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240201151747.7524-3-ansuelsmth@gmail.com \
--to=ansuelsmth@gmail.com \
--cc=andersson@kernel.org \
--cc=andrew@lunn.ch \
--cc=conor+dt@kernel.org \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=edumazet@google.com \
--cc=frowand.list@gmail.com \
--cc=hkallweit1@gmail.com \
--cc=konrad.dybcio@linaro.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=kuba@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=robert.marko@sartura.hr \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).