u-boot.lists.denx.de archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] net: phy: Add support for ethernet-phy-id
@ 2022-02-23 14:45 Michal Simek
  2022-02-23 14:45 ` [PATCH 1/3] net: phy: Add new read ethernet phy id function Michal Simek
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Michal Simek @ 2022-02-23 14:45 UTC (permalink / raw)
  To: u-boot, git
  Cc: Bin Meng, Christian Gmeiner, Dominic Rath, Joe Hershberger,
	Kuldeep Singh, Michal Simek, Priyanka Jain, Radu Pirea (NXP OSS),
	Ramon Fried, Samuel Holland, Simon Glass, T Karthik Reddy,
	Vladimir Oltean, Wolfgang Denk

Hi,

this series is adding support for ethernet-phy-id with reset gpio support.
There is another series related to DM_ETH_PHY but it is missing creating
phy devices based on decoded phy IDs from compatible string.
We would like to adopt DM_ETH_PHY in our driver but still this series can
be useful for other drivers which are not DM_ETH_PHY ready.
At the end this same file should be used also for DM_ETH_PHY driver.

The reason for complete separatation from phy.c is that there is
requirement for gpio headers which is not done by all arch. That's why new
symbol and separate file is the way to go.

Thanks,
Michal


Michal Simek (3):
  net: phy: Add new read ethernet phy id function
  net: phy: Remove static return type for phy_device_create()
  net: phy: Add support for ethernet-phy-id with gpio reset

 MAINTAINERS                   |  1 +
 drivers/core/ofnode.c         | 36 ++++++++++++++++++
 drivers/net/phy/Kconfig       |  8 ++++
 drivers/net/phy/Makefile      |  1 +
 drivers/net/phy/ethernet_id.c | 69 +++++++++++++++++++++++++++++++++++
 drivers/net/phy/phy.c         | 11 ++++--
 include/dm/ofnode.h           | 13 +++++++
 include/phy.h                 | 26 +++++++++++++
 8 files changed, 162 insertions(+), 3 deletions(-)
 create mode 100644 drivers/net/phy/ethernet_id.c

-- 
2.35.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] net: phy: Add new read ethernet phy id function
  2022-02-23 14:45 [PATCH 0/3] net: phy: Add support for ethernet-phy-id Michal Simek
@ 2022-02-23 14:45 ` Michal Simek
  2022-02-23 14:45 ` [PATCH 2/3] net: phy: Remove static return type for phy_device_create() Michal Simek
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Michal Simek @ 2022-02-23 14:45 UTC (permalink / raw)
  To: u-boot, git; +Cc: Joe Hershberger, Simon Glass

Add new function to get ethernet phy id from compatible property
of the mdio phy node.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: T Karthik Reddy <t.karthik.reddy@xilinx.com>
---

 drivers/core/ofnode.c | 36 ++++++++++++++++++++++++++++++++++++
 include/dm/ofnode.h   | 13 +++++++++++++
 2 files changed, 49 insertions(+)

diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c
index 709bea272a6e..8042847f3c14 100644
--- a/drivers/core/ofnode.c
+++ b/drivers/core/ofnode.c
@@ -898,6 +898,42 @@ int ofnode_read_pci_vendev(ofnode node, u16 *vendor, u16 *device)
 	return -ENOENT;
 }
 
+int ofnode_read_eth_phy_id(ofnode node, u16 *vendor, u16 *device)
+{
+	const char *list, *end;
+	int len;
+
+	list = ofnode_get_property(node, "compatible", &len);
+
+	if (!list)
+		return -ENOENT;
+
+	end = list + len;
+	while (list < end) {
+		len = strlen(list);
+
+		if (len >= strlen("ethernet-phy-idVVVV,DDDD")) {
+			char *s = strstr(list, "ethernet-phy-id");
+
+			/*
+			 * check if the string is something like
+			 * ethernet-phy-idVVVV,DDDD
+			 */
+			if (s && s[19] == '.') {
+				s += strlen("ethernet-phy-id");
+				*vendor = simple_strtol(s, NULL, 16);
+				s += 5;
+				*device = simple_strtol(s, NULL, 16);
+
+				return 0;
+			}
+		}
+		list += (len + 1);
+	}
+
+	return -ENOENT;
+}
+
 int ofnode_read_addr_cells(ofnode node)
 {
 	if (ofnode_is_np(node)) {
diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h
index 0cb324c8b0c1..744dffe0a2dd 100644
--- a/include/dm/ofnode.h
+++ b/include/dm/ofnode.h
@@ -894,6 +894,19 @@ int ofnode_read_pci_addr(ofnode node, enum fdt_pci_space type,
  */
 int ofnode_read_pci_vendev(ofnode node, u16 *vendor, u16 *device);
 
+/**
+ * ofnode_read_eth_phy_id() - look up eth phy vendor and device id
+ *
+ * Look at the compatible property of a device node that represents a eth phy
+ * device and extract phy vendor id and device id from it.
+ *
+ * @param node		node to examine
+ * @param vendor	vendor id of the eth phy device
+ * @param device	device id of the eth phy device
+ * @return 0 if ok, negative on error
+ */
+int ofnode_read_eth_phy_id(ofnode node, u16 *vendor, u16 *device);
+
 /**
  * ofnode_read_addr_cells() - Get the number of address cells for a node
  *
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] net: phy: Remove static return type for phy_device_create()
  2022-02-23 14:45 [PATCH 0/3] net: phy: Add support for ethernet-phy-id Michal Simek
  2022-02-23 14:45 ` [PATCH 1/3] net: phy: Add new read ethernet phy id function Michal Simek
@ 2022-02-23 14:45 ` Michal Simek
  2022-02-23 14:45 ` [PATCH 3/3] net: phy: Add support for ethernet-phy-id with gpio reset Michal Simek
  2022-03-09 11:44 ` [PATCH 0/3] net: phy: Add support for ethernet-phy-id Michal Simek
  3 siblings, 0 replies; 5+ messages in thread
From: Michal Simek @ 2022-02-23 14:45 UTC (permalink / raw)
  To: u-boot, git
  Cc: Bin Meng, Joe Hershberger, Priyanka Jain, Radu Pirea (NXP OSS),
	Ramon Fried, T Karthik Reddy, Vladimir Oltean, Wolfgang Denk

Remove static return type for phy_device_create() to avoid file scope for
this function. Also add required prototype in phy.h.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: T Karthik Reddy <t.karthik.reddy@xilinx.com>
---

 drivers/net/phy/phy.c |  6 +++---
 include/phy.h         | 13 +++++++++++++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index c9fc20855ba1..f63705e1b9a1 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -659,9 +659,9 @@ static struct phy_driver *get_phy_driver(struct phy_device *phydev,
 	return generic_for_interface(interface);
 }
 
-static struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
-					    u32 phy_id, bool is_c45,
-					    phy_interface_t interface)
+struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
+				     u32 phy_id, bool is_c45,
+				     phy_interface_t interface)
 {
 	struct phy_device *dev;
 
diff --git a/include/phy.h b/include/phy.h
index c66fd43ea887..832d7a169578 100644
--- a/include/phy.h
+++ b/include/phy.h
@@ -454,6 +454,19 @@ void phy_connect_dev(struct phy_device *phydev, struct udevice *dev);
 struct phy_device *phy_connect(struct mii_dev *bus, int addr,
 				struct udevice *dev,
 				phy_interface_t interface);
+/**
+ * phy_device_create() - Create a PHY device
+ *
+ * @bus:		MII/MDIO bus that hosts the PHY
+ * @addr:		PHY address on MDIO bus
+ * @phy_id:		where to store the ID retrieved
+ * @is_c45:		Device Identifiers if is_c45
+ * @interface:		interface between the MAC and PHY
+ * @return: pointer to phy_device if a PHY is found, or NULL otherwise
+ */
+struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
+				     u32 phy_id, bool is_c45,
+				     phy_interface_t interface);
 
 static inline ofnode phy_get_ofnode(struct phy_device *phydev)
 {
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] net: phy: Add support for ethernet-phy-id with gpio reset
  2022-02-23 14:45 [PATCH 0/3] net: phy: Add support for ethernet-phy-id Michal Simek
  2022-02-23 14:45 ` [PATCH 1/3] net: phy: Add new read ethernet phy id function Michal Simek
  2022-02-23 14:45 ` [PATCH 2/3] net: phy: Remove static return type for phy_device_create() Michal Simek
@ 2022-02-23 14:45 ` Michal Simek
  2022-03-09 11:44 ` [PATCH 0/3] net: phy: Add support for ethernet-phy-id Michal Simek
  3 siblings, 0 replies; 5+ messages in thread
From: Michal Simek @ 2022-02-23 14:45 UTC (permalink / raw)
  To: u-boot, git
  Cc: Bin Meng, Christian Gmeiner, Dominic Rath, Joe Hershberger,
	Kuldeep Singh, Michal Simek, Priyanka Jain, Radu Pirea (NXP OSS),
	Ramon Fried, Samuel Holland, T Karthik Reddy, Vladimir Oltean,
	Wolfgang Denk

Ethernet phy like dp83867 is using strapping resistors to setup PHY
address. On Xilinx boards strapping is setup on wires which are connected
to SOC where internal pull ups/downs influnce phy address. That's why there
is a need to setup pins properly (via pinctrl driver for example) and then
perform phy reset. I can be workarounded by reset gpio done for mdio bus
but this is not working properly when multiply phys sitting on the same
bus. That's why it needs to be done via ethernet-phy-id driver where dt
binding has gpio reset per phy.

DT binding is available here:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/net/ethernet-phy.yaml

The driver is are reading the vendor and device id from valid phy node
using ofnode_read_eth_phy_id() and creating a phy device.
Kconfig PHY_ETHERNET_ID symbol is used because not every platform has gpio
support.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: T Karthik Reddy <t.karthik.reddy@xilinx.com>
---

 MAINTAINERS                   |  1 +
 drivers/net/phy/Kconfig       |  8 ++++
 drivers/net/phy/Makefile      |  1 +
 drivers/net/phy/ethernet_id.c | 69 +++++++++++++++++++++++++++++++++++
 drivers/net/phy/phy.c         |  5 +++
 include/phy.h                 | 13 +++++++
 6 files changed, 97 insertions(+)
 create mode 100644 drivers/net/phy/ethernet_id.c

diff --git a/MAINTAINERS b/MAINTAINERS
index c1a5ac95f295..a75f429cb972 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -617,6 +617,7 @@ F:	drivers/i2c/muxes/pca954x.c
 F:	drivers/i2c/zynq_i2c.c
 F:	drivers/mmc/zynq_sdhci.c
 F:	drivers/mtd/nand/raw/zynq_nand.c
+F:	drivers/net/phy/ethernet_id.c
 F:	drivers/net/phy/xilinx_phy.c
 F:	drivers/net/zynq_gem.c
 F:	drivers/pinctrl/pinctrl-zynqmp.c
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index 4f8d33ce8fd5..74339a25ca53 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -307,6 +307,14 @@ config PHY_XILINX_GMII2RGMII
 	  as bridge between MAC connected over GMII and external phy that
 	  is connected over RGMII interface.
 
+config PHY_ETHERNET_ID
+	bool "Read ethernet PHY id"
+	depends on DM_GPIO
+	default y if ZYNQ_GEM
+	help
+	  Enable this config to read ethernet phy id from the phy node of DT
+	  and create a phy device using id.
+
 config PHY_FIXED
 	bool "Fixed-Link PHY"
 	depends on DM_ETH
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
index 77f7f606215c..b28440bc4e52 100644
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -32,6 +32,7 @@ obj-$(CONFIG_PHY_TI_DP83867) += dp83867.o
 obj-$(CONFIG_PHY_TI_DP83869) += dp83869.o
 obj-$(CONFIG_PHY_XILINX) += xilinx_phy.o
 obj-$(CONFIG_PHY_XILINX_GMII2RGMII) += xilinx_gmii2rgmii.o
+obj-$(CONFIG_PHY_ETHERNET_ID) += ethernet_id.o
 obj-$(CONFIG_PHY_VITESSE) += vitesse.o
 obj-$(CONFIG_PHY_MSCC) += mscc.o
 obj-$(CONFIG_PHY_FIXED) += fixed.o
diff --git a/drivers/net/phy/ethernet_id.c b/drivers/net/phy/ethernet_id.c
new file mode 100644
index 000000000000..5617ac3ad62f
--- /dev/null
+++ b/drivers/net/phy/ethernet_id.c
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Xilinx ethernet phy reset driver
+ *
+ * Copyright (C) 2022 Xilinx, Inc.
+ */
+
+#include <common.h>
+#include <dm/device_compat.h>
+#include <phy.h>
+#include <linux/delay.h>
+#include <asm/gpio.h>
+
+struct phy_device *phy_connect_phy_id(struct mii_dev *bus, struct udevice *dev,
+				      phy_interface_t interface)
+{
+	struct phy_device *phydev;
+	struct ofnode_phandle_args phandle_args;
+	struct gpio_desc gpio;
+	ofnode node;
+	u32 id, assert, deassert;
+	u16 vendor, device;
+	int ret;
+
+	if (dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
+				       &phandle_args))
+		return NULL;
+
+	if (!ofnode_valid(phandle_args.node))
+		return NULL;
+
+	node = phandle_args.node;
+
+	ret = ofnode_read_eth_phy_id(node, &vendor, &device);
+	if (ret) {
+		dev_err(dev, "Failed to read eth PHY id, err: %d\n", ret);
+		return NULL;
+	}
+
+	ret = gpio_request_by_name_nodev(node, "reset-gpios", 0, &gpio,
+					 GPIOD_ACTIVE_LOW);
+	if (!ret) {
+		assert = ofnode_read_u32_default(node, "reset-assert-us", 0);
+		deassert = ofnode_read_u32_default(node,
+						   "reset-deassert-us", 0);
+		ret = dm_gpio_set_value(&gpio, 1);
+		if (ret) {
+			dev_err(dev, "Failed assert gpio, err: %d\n", ret);
+			return NULL;
+		}
+
+		udelay(assert);
+
+		ret = dm_gpio_set_value(&gpio, 0);
+		if (ret) {
+			dev_err(dev, "Failed deassert gpio, err: %d\n", ret);
+			return NULL;
+		}
+
+		udelay(deassert);
+	}
+
+	id =  vendor << 16 | device;
+	phydev = phy_device_create(bus, 0, id, false, interface);
+	if (phydev)
+		phydev->node = node;
+
+	return phydev;
+}
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index f63705e1b9a1..fffa10f68b3c 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -1047,6 +1047,11 @@ struct phy_device *phy_connect(struct mii_dev *bus, int addr,
 		phydev = phy_device_create(bus, 0, PHY_NCSI_ID, false, interface);
 #endif
 
+#ifdef CONFIG_PHY_ETHERNET_ID
+	if (!phydev)
+		phydev = phy_connect_phy_id(bus, dev, interface);
+#endif
+
 #ifdef CONFIG_PHY_XILINX_GMII2RGMII
 	if (!phydev)
 		phydev = phy_connect_gmii2rgmii(bus, dev, interface);
diff --git a/include/phy.h b/include/phy.h
index 832d7a169578..9ea4bd42db4d 100644
--- a/include/phy.h
+++ b/include/phy.h
@@ -468,6 +468,19 @@ struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
 				     u32 phy_id, bool is_c45,
 				     phy_interface_t interface);
 
+/**
+ * phy_connect_phy_id() - Connect to phy device by reading PHY id
+ *			  from phy node.
+ *
+ * @bus:		MII/MDIO bus that hosts the PHY
+ * @dev:		Ethernet device to associate to the PHY
+ * @interface:		Interface between the MAC and PHY
+ * @return:		pointer to phy_device if a PHY is found,
+ *			or NULL otherwise
+ */
+struct phy_device *phy_connect_phy_id(struct mii_dev *bus, struct udevice *dev,
+				      phy_interface_t interface);
+
 static inline ofnode phy_get_ofnode(struct phy_device *phydev)
 {
 	if (ofnode_valid(phydev->node))
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/3] net: phy: Add support for ethernet-phy-id
  2022-02-23 14:45 [PATCH 0/3] net: phy: Add support for ethernet-phy-id Michal Simek
                   ` (2 preceding siblings ...)
  2022-02-23 14:45 ` [PATCH 3/3] net: phy: Add support for ethernet-phy-id with gpio reset Michal Simek
@ 2022-03-09 11:44 ` Michal Simek
  3 siblings, 0 replies; 5+ messages in thread
From: Michal Simek @ 2022-03-09 11:44 UTC (permalink / raw)
  To: U-Boot, git
  Cc: Bin Meng, Christian Gmeiner, Dominic Rath, Joe Hershberger,
	Kuldeep Singh, Priyanka Jain, Radu Pirea (NXP OSS),
	Ramon Fried, Samuel Holland, Simon Glass, T Karthik Reddy,
	Vladimir Oltean, Wolfgang Denk

st 23. 2. 2022 v 15:45 odesílatel Michal Simek <michal.simek@xilinx.com> napsal:
>
> Hi,
>
> this series is adding support for ethernet-phy-id with reset gpio support.
> There is another series related to DM_ETH_PHY but it is missing creating
> phy devices based on decoded phy IDs from compatible string.
> We would like to adopt DM_ETH_PHY in our driver but still this series can
> be useful for other drivers which are not DM_ETH_PHY ready.
> At the end this same file should be used also for DM_ETH_PHY driver.
>
> The reason for complete separatation from phy.c is that there is
> requirement for gpio headers which is not done by all arch. That's why new
> symbol and separate file is the way to go.
>
> Thanks,
> Michal
>
>
> Michal Simek (3):
>   net: phy: Add new read ethernet phy id function
>   net: phy: Remove static return type for phy_device_create()
>   net: phy: Add support for ethernet-phy-id with gpio reset
>
>  MAINTAINERS                   |  1 +
>  drivers/core/ofnode.c         | 36 ++++++++++++++++++
>  drivers/net/phy/Kconfig       |  8 ++++
>  drivers/net/phy/Makefile      |  1 +
>  drivers/net/phy/ethernet_id.c | 69 +++++++++++++++++++++++++++++++++++
>  drivers/net/phy/phy.c         | 11 ++++--
>  include/dm/ofnode.h           | 13 +++++++
>  include/phy.h                 | 26 +++++++++++++
>  8 files changed, 162 insertions(+), 3 deletions(-)
>  create mode 100644 drivers/net/phy/ethernet_id.c
>
> --
> 2.35.1
>

Applied.
M

-- 
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Xilinx Microblaze
Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP ARM64 SoCs
U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP/Versal SoCs

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-03-09 11:44 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-23 14:45 [PATCH 0/3] net: phy: Add support for ethernet-phy-id Michal Simek
2022-02-23 14:45 ` [PATCH 1/3] net: phy: Add new read ethernet phy id function Michal Simek
2022-02-23 14:45 ` [PATCH 2/3] net: phy: Remove static return type for phy_device_create() Michal Simek
2022-02-23 14:45 ` [PATCH 3/3] net: phy: Add support for ethernet-phy-id with gpio reset Michal Simek
2022-03-09 11:44 ` [PATCH 0/3] net: phy: Add support for ethernet-phy-id Michal Simek

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).