linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Alexandru Ardelean <alexandru.ardelean@analog.com>
To: <netdev@vger.kernel.org>, <devicetree@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>
Cc: <davem@davemloft.net>, <robh+dt@kernel.org>,
	<mark.rutland@arm.com>, <f.fainelli@gmail.com>,
	<hkallweit1@gmail.com>, <andrew@lunn.ch>,
	Alexandru Ardelean <alexandru.ardelean@analog.com>
Subject: [PATCH 06/16] net: phy: adin: support PHY mode converters
Date: Mon, 5 Aug 2019 19:54:43 +0300	[thread overview]
Message-ID: <20190805165453.3989-7-alexandru.ardelean@analog.com> (raw)
In-Reply-To: <20190805165453.3989-1-alexandru.ardelean@analog.com>

Sometimes, the connection between a MAC and PHY is done via a
mode/interface converter. An example is a GMII-to-RGMII converter, which
would mean that the MAC operates in GMII mode while the PHY operates in
RGMII. In this case there is a discrepancy between what the MAC expects &
what the PHY expects and both need to be configured in their respective
modes.

Sometimes, this converter is specified via a board/system configuration (in
the device-tree for example). But, other times it can be left unspecified.
The use of these converters is common in boards that have FPGA on them.

This patch also adds support for a `adi,phy-mode-internal` property that
can be used in these (implicit convert) cases. The internal PHY mode will
be used to specify the correct register settings for the PHY.

`fwnode_handle` is used, since this property may be specified via ACPI as
well in other setups, but testing has been done in DT context.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
---
 drivers/net/phy/adin.c | 39 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/drivers/net/phy/adin.c b/drivers/net/phy/adin.c
index dbdb8f60741c..e3d2ff8cc09c 100644
--- a/drivers/net/phy/adin.c
+++ b/drivers/net/phy/adin.c
@@ -10,6 +10,7 @@
 #include <linux/module.h>
 #include <linux/mii.h>
 #include <linux/phy.h>
+#include <linux/property.h>
 
 #define PHY_ID_ADIN1200				0x0283bc20
 #define PHY_ID_ADIN1300				0x0283bc30
@@ -41,6 +42,31 @@
 #define ADIN1300_GE_RMII_CFG_REG		0xff24
 #define   ADIN1300_GE_RMII_EN			BIT(0)
 
+static int adin_get_phy_internal_mode(struct phy_device *phydev)
+{
+	struct device *dev = &phydev->mdio.dev;
+	const char *pm;
+	int i;
+
+	if (device_property_read_string(dev, "adi,phy-mode-internal", &pm))
+		return phydev->interface;
+
+	/**
+	 * Getting here assumes that there is converter in-between the actual
+	 * PHY, for example a GMII-to-RGMII converter. In this case the MAC
+	 * talks GMII and PHY talks RGMII, so the PHY needs to be set in RGMII
+	 * while the MAC can work in GMII mode.
+	 */
+
+	for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++)
+		if (!strcasecmp(pm, phy_modes(i)))
+			return i;
+
+	dev_err(dev, "Invalid value for 'phy-mode-internal': '%s'\n", pm);
+
+	return -EINVAL;
+}
+
 static int adin_config_rgmii_mode(struct phy_device *phydev,
 				  phy_interface_t intf)
 {
@@ -105,7 +131,9 @@ static int adin_config_init(struct phy_device *phydev)
 	if (rc < 0)
 		return rc;
 
-	interface = phydev->interface;
+	interface = adin_get_phy_internal_mode(phydev);
+	if (interface < 0)
+		return interface;
 
 	rc = adin_config_rgmii_mode(phydev, interface);
 	if (rc < 0)
@@ -115,8 +143,13 @@ static int adin_config_init(struct phy_device *phydev)
 	if (rc < 0)
 		return rc;
 
-	dev_info(&phydev->mdio.dev, "PHY is using mode '%s'\n",
-		 phy_modes(phydev->interface));
+	if (phydev->interface == interface)
+		dev_info(&phydev->mdio.dev, "PHY is using mode '%s'\n",
+			 phy_modes(phydev->interface));
+	else
+		dev_info(&phydev->mdio.dev,
+			 "PHY is using mode '%s', MAC is using mode '%s'\n",
+			 phy_modes(interface), phy_modes(phydev->interface));
 
 	return 0;
 }
-- 
2.20.1


  parent reply	other threads:[~2019-08-05 13:56 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-05 16:54 [PATCH 00/16] net: phy: adin: add support for Analog Devices PHYs Alexandru Ardelean
2019-08-05 16:54 ` [PATCH 01/16] " Alexandru Ardelean
2019-08-05 14:16   ` Andrew Lunn
2019-08-06  6:32     ` Ardelean, Alexandru
2019-08-05 15:17   ` Andrew Lunn
2019-08-06  6:35     ` Ardelean, Alexandru
2019-08-05 20:54   ` Heiner Kallweit
2019-08-06  6:35     ` Ardelean, Alexandru
2019-08-05 16:54 ` [PATCH 02/16] net: phy: adin: hook genphy_{suspend,resume} into the driver Alexandru Ardelean
2019-08-05 14:17   ` Andrew Lunn
2019-08-05 16:54 ` [PATCH 03/16] net: phy: adin: add support for interrupts Alexandru Ardelean
2019-08-05 14:21   ` Andrew Lunn
2019-08-06  6:37     ` Ardelean, Alexandru
2019-08-05 21:02   ` Heiner Kallweit
2019-08-06  6:38     ` Ardelean, Alexandru
2019-08-05 16:54 ` [PATCH 04/16] net: phy: adin: add {write,read}_mmd hooks Alexandru Ardelean
2019-08-05 14:25   ` Andrew Lunn
2019-08-06  6:38     ` Ardelean, Alexandru
2019-08-05 16:54 ` [PATCH 05/16] net: phy: adin: configure RGMII/RMII/MII modes on config Alexandru Ardelean
2019-08-05 14:39   ` Andrew Lunn
2019-08-06  6:43     ` Ardelean, Alexandru
2019-08-05 16:54 ` Alexandru Ardelean [this message]
2019-08-05 14:51   ` [PATCH 06/16] net: phy: adin: support PHY mode converters Andrew Lunn
2019-08-06  6:47     ` Ardelean, Alexandru
2019-08-06 15:39       ` Andrew Lunn
2019-08-07  8:00         ` Ardelean, Alexandru
2019-08-07 13:20           ` Andrew Lunn
2019-08-05 16:54 ` [PATCH 07/16] net: phy: adin: make RGMII internal delays configurable Alexandru Ardelean
2019-08-05 16:54 ` [PATCH 08/16] net: phy: adin: make RMII fifo depth configurable Alexandru Ardelean
2019-08-05 16:54 ` [PATCH 09/16] net: phy: adin: add support MDI/MDIX/Auto-MDI selection Alexandru Ardelean
2019-08-05 16:54 ` [PATCH 10/16] net: phy: adin: add EEE translation layer for Clause 22 Alexandru Ardelean
2019-08-05 22:11   ` Andrew Lunn
2019-08-06  6:47     ` Ardelean, Alexandru
2019-08-05 16:54 ` [PATCH 11/16] net: phy: adin: PHY reset mechanisms Alexandru Ardelean
2019-08-05 15:15   ` Andrew Lunn
2019-08-06  6:50     ` Ardelean, Alexandru
2019-08-05 16:54 ` [PATCH 12/16] net: phy: adin: read EEE setting from device-tree Alexandru Ardelean
2019-08-05 15:19   ` Andrew Lunn
2019-08-06  6:52     ` Ardelean, Alexandru
2019-08-05 16:54 ` [PATCH 13/16] net: phy: adin: implement Energy Detect Powerdown mode Alexandru Ardelean
2019-08-05 16:54 ` [PATCH 14/16] net: phy: adin: make sure down-speed auto-neg is enabled Alexandru Ardelean
2019-08-05 15:22   ` Andrew Lunn
2019-08-06  6:53     ` Ardelean, Alexandru
2019-08-06  5:52   ` Heiner Kallweit
2019-08-06  6:53     ` Ardelean, Alexandru
2019-08-05 16:54 ` [PATCH 15/16] net: phy: adin: add ethtool get_stats support Alexandru Ardelean
2019-08-05 15:28   ` Andrew Lunn
2019-08-06  7:11     ` Ardelean, Alexandru
2019-08-06 15:46       ` Andrew Lunn
2019-08-07  7:52         ` Ardelean, Alexandru
2019-08-05 15:30   ` Andrew Lunn
2019-08-06  7:18     ` Ardelean, Alexandru
2019-08-05 16:54 ` [PATCH 16/16] dt-bindings: net: add bindings for ADIN PHY driver Alexandru Ardelean
2019-08-05 14:11   ` Andrew Lunn
2019-08-06  7:03     ` Ardelean, Alexandru
2019-08-06 11:47     ` Ardelean, Alexandru
2019-08-05 14:27   ` Andrew Lunn
2019-08-06  6:57     ` Ardelean, Alexandru
2019-08-06 15:04   ` Rob Herring

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=20190805165453.3989-7-alexandru.ardelean@analog.com \
    --to=alexandru.ardelean@analog.com \
    --cc=andrew@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=f.fainelli@gmail.com \
    --cc=hkallweit1@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=netdev@vger.kernel.org \
    --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).