mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH v1 0/7] net/phy: marvell: add support for 88e1510
@ 2017-01-11 15:59 Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 1/7] net/phy: marvell: rename 88E1545 to 88E1540 Uwe Kleine-König
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Uwe Kleine-König @ 2017-01-11 15:59 UTC (permalink / raw)
  To: barebox

Hello,

this series targets to add support for the Marvell phy 88e1510 to the
marvell phy driver. To make this and future additions easy there are
several preparing patches that make the barebox driver very similar to
the Linux driver. This allows to have the two drivers open side by side
(I use vim -d) to add new features to the barebox driver that are
already present in Linux.

Best regards
Uwe

Uwe Kleine-König (7):
  net/phy: marvell: rename 88E1545 to 88E1540
  net/phy: marvell: 88E1540 LED registers already exist on 88E1121
  net/phy: marvell: rename phy_driver array to match Linux driver
  net/phy: marvell: change spacing to be more similar to the Linux
    driver
  net/phy: marvell: align definition of MII_88E1121_PHY_MSCR to Linux
    driver
  net/phy: marvell: improve config_aneg for 88E1121R and 88E1318S
  net/phy: marvell: add support for 88e1510 to marvell phy driver

 drivers/net/phy/marvell.c   | 353 +++++++++++++++++++++++++++++++++++++++-----
 include/linux/marvell_phy.h |   2 +-
 2 files changed, 314 insertions(+), 41 deletions(-)

-- 
2.11.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH v1 1/7] net/phy: marvell: rename 88E1545 to 88E1540
  2017-01-11 15:59 [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Uwe Kleine-König
@ 2017-01-11 15:59 ` Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 2/7] net/phy: marvell: 88E1540 LED registers already exist on 88E1121 Uwe Kleine-König
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Uwe Kleine-König @ 2017-01-11 15:59 UTC (permalink / raw)
  To: barebox

The Linux driver calls it 88E1540 so do it here, too.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/net/phy/marvell.c   | 4 ++--
 include/linux/marvell_phy.h | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index 9a963f6d5e61..4bf8bae59a95 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -266,9 +266,9 @@ static struct phy_driver marvell_phys[] = {
 		.read_status	= marvell_read_status,
 	},
 	{
-		.phy_id		= MARVELL_PHY_ID_88E1545,
+		.phy_id		= MARVELL_PHY_ID_88E1540,
 		.phy_id_mask	= MARVELL_PHY_ID_MASK,
-		.drv.name	= "Marvell 88E1545",
+		.drv.name	= "Marvell 88E1540",
 		.features	= PHY_GBIT_FEATURES,
 		.config_init	= m88e1540_config_init,
 		.config_aneg	= genphy_config_aneg,
diff --git a/include/linux/marvell_phy.h b/include/linux/marvell_phy.h
index b7baae137d18..9e7c8b7596b1 100644
--- a/include/linux/marvell_phy.h
+++ b/include/linux/marvell_phy.h
@@ -27,8 +27,8 @@
 #define MARVELL_PHY_ID_88E1318S		0x01410e90
 #define MARVELL_PHY_ID_88E1116R		0x01410e40
 #define MARVELL_PHY_ID_88E1510		0x01410dd0
+#define MARVELL_PHY_ID_88E1540		0x01410eb0
 #define MARVELL_PHY_ID_88E1543		0x01410ea0
-#define MARVELL_PHY_ID_88E1545		0x01410eb0
 
 /* Mask used for ID comparisons */
 #define MARVELL_PHY_ID_MASK		0xfffffff0
-- 
2.11.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH v1 2/7] net/phy: marvell: 88E1540 LED registers already exist on 88E1121
  2017-01-11 15:59 [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 1/7] net/phy: marvell: rename 88E1545 to 88E1540 Uwe Kleine-König
@ 2017-01-11 15:59 ` Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 3/7] net/phy: marvell: rename phy_driver array to match Linux driver Uwe Kleine-König
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Uwe Kleine-König @ 2017-01-11 15:59 UTC (permalink / raw)
  To: barebox

So rename accordingly to match the definition used by Linux

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/net/phy/marvell.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index 4bf8bae59a95..c4d9c7fe493a 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -19,6 +19,9 @@
 #define MII_M1011_PHY_SCR		0x10
 #define MII_M1011_PHY_SCR_AUTO_CROSS	0x0060
 
+#define MII_88E1121_PHY_LED_CTRL	16
+#define MII_88E1121_PHY_LED_PAGE	3
+
 #define MII_M1011_PHY_STATUS		0x11
 #define MII_M1011_PHY_STATUS_1000	BIT(15)
 #define MII_M1011_PHY_STATUS_100	BIT(14)
@@ -38,9 +41,6 @@
 #define MII_88E1318S_PHY_MSCR1_REG	16
 #define MII_88E1318S_PHY_MSCR1_PAD_ODD	BIT(6)
 
-#define MII_88E1540_LED_PAGE		0x3
-#define MII_88E1540_LED_CONTROL		0x10
-
 #define MII_88E1540_QSGMII_PAGE		0x4
 #define MII_88E1540_QSGMII_CONTROL	0x0
 #define MII_88E1540_QSGMII_AUTONEG_EN	BIT(12)
@@ -157,8 +157,8 @@ static int m88e1540_config_init(struct phy_device *phydev)
 	 * Link:     On
 	 * No Link:  Off
 	 */
-	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_88E1540_LED_PAGE);
-	phy_write(phydev, MII_88E1540_LED_CONTROL, 0x1111);
+	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_88E1121_PHY_LED_PAGE);
+	phy_write(phydev, MII_88E1121_PHY_LED_CTRL, 0x1111);
 
 	/* Power-up the PHY. When going from power down to normal operation,
 	 * software reset and auto-negotiation restart are also performed.
-- 
2.11.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH v1 3/7] net/phy: marvell: rename phy_driver array to match Linux driver
  2017-01-11 15:59 [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 1/7] net/phy: marvell: rename 88E1545 to 88E1540 Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 2/7] net/phy: marvell: 88E1540 LED registers already exist on 88E1121 Uwe Kleine-König
@ 2017-01-11 15:59 ` Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 4/7] net/phy: marvell: change spacing to be more similar to the " Uwe Kleine-König
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Uwe Kleine-König @ 2017-01-11 15:59 UTC (permalink / raw)
  To: barebox

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/net/phy/marvell.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index c4d9c7fe493a..ee95c2db570c 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -237,7 +237,7 @@ static int m88e1318s_config_init(struct phy_device *phydev)
 	return m88e1121_config_init(phydev);
 }
 
-static struct phy_driver marvell_phys[] = {
+static struct phy_driver marvell_drivers[] = {
 	{
 		.phy_id		= MARVELL_PHY_ID_88E1121R,
 		.phy_id_mask	= MARVELL_PHY_ID_MASK,
@@ -278,6 +278,7 @@ static struct phy_driver marvell_phys[] = {
 
 static int __init marvell_phy_init(void)
 {
-	return phy_drivers_register(marvell_phys, ARRAY_SIZE(marvell_phys));
+	return phy_drivers_register(marvell_drivers,
+				    ARRAY_SIZE(marvell_drivers));
 }
 fs_initcall(marvell_phy_init);
-- 
2.11.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH v1 4/7] net/phy: marvell: change spacing to be more similar to the Linux driver
  2017-01-11 15:59 [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Uwe Kleine-König
                   ` (2 preceding siblings ...)
  2017-01-11 15:59 ` [PATCH v1 3/7] net/phy: marvell: rename phy_driver array to match Linux driver Uwe Kleine-König
@ 2017-01-11 15:59 ` Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 5/7] net/phy: marvell: align definition of MII_88E1121_PHY_MSCR to " Uwe Kleine-König
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Uwe Kleine-König @ 2017-01-11 15:59 UTC (permalink / raw)
  To: barebox

To make the barebox driver more similar to the Linux driver, only use a
single space before the = in member initialisation.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/net/phy/marvell.c | 56 +++++++++++++++++++++++------------------------
 1 file changed, 28 insertions(+), 28 deletions(-)

diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index ee95c2db570c..e01538067622 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -239,40 +239,40 @@ static int m88e1318s_config_init(struct phy_device *phydev)
 
 static struct phy_driver marvell_drivers[] = {
 	{
-		.phy_id		= MARVELL_PHY_ID_88E1121R,
-		.phy_id_mask	= MARVELL_PHY_ID_MASK,
-		.drv.name	= "Marvell 88E1121R",
-		.features	= PHY_GBIT_FEATURES,
-		.config_init	= m88e1121_config_init,
-		.config_aneg	= genphy_config_aneg,
-		.read_status	= marvell_read_status,
+		.phy_id = MARVELL_PHY_ID_88E1121R,
+		.phy_id_mask = MARVELL_PHY_ID_MASK,
+		.drv.name = "Marvell 88E1121R",
+		.features = PHY_GBIT_FEATURES,
+		.config_init = &m88e1121_config_init,
+		.config_aneg = &genphy_config_aneg,
+		.read_status = &marvell_read_status,
 	},
 	{
-		.phy_id		= MARVELL_PHY_ID_88E1318S,
-		.phy_id_mask	= MARVELL_PHY_ID_MASK,
-		.drv.name	= "Marvell 88E1318S",
-		.features	= PHY_GBIT_FEATURES,
-		.config_init	= m88e1318s_config_init,
-		.config_aneg	= genphy_config_aneg,
-		.read_status	= marvell_read_status,
+		.phy_id = MARVELL_PHY_ID_88E1318S,
+		.phy_id_mask = MARVELL_PHY_ID_MASK,
+		.drv.name = "Marvell 88E1318S",
+		.features = PHY_GBIT_FEATURES,
+		.config_init = &m88e1318s_config_init,
+		.config_aneg = &genphy_config_aneg,
+		.read_status = &marvell_read_status,
 	},
 	{
-		.phy_id		= MARVELL_PHY_ID_88E1543,
-		.phy_id_mask	= MARVELL_PHY_ID_MASK,
-		.drv.name	= "Marvell 88E1543",
-		.features	= PHY_GBIT_FEATURES,
-		.config_init	= m88e1540_config_init,
-		.config_aneg	= genphy_config_aneg,
-		.read_status	= marvell_read_status,
+		.phy_id = MARVELL_PHY_ID_88E1543,
+		.phy_id_mask = MARVELL_PHY_ID_MASK,
+		.drv.name = "Marvell 88E1543",
+		.features = PHY_GBIT_FEATURES,
+		.config_init = &m88e1540_config_init,
+		.config_aneg = &genphy_config_aneg,
+		.read_status = &marvell_read_status,
 	},
 	{
-		.phy_id		= MARVELL_PHY_ID_88E1540,
-		.phy_id_mask	= MARVELL_PHY_ID_MASK,
-		.drv.name	= "Marvell 88E1540",
-		.features	= PHY_GBIT_FEATURES,
-		.config_init	= m88e1540_config_init,
-		.config_aneg	= genphy_config_aneg,
-		.read_status	= marvell_read_status,
+		.phy_id = MARVELL_PHY_ID_88E1540,
+		.phy_id_mask = MARVELL_PHY_ID_MASK,
+		.drv.name = "Marvell 88E1540",
+		.features = PHY_GBIT_FEATURES,
+		.config_init = &m88e1540_config_init,
+		.config_aneg = &genphy_config_aneg,
+		.read_status = &marvell_read_status,
 	},
 };
 
-- 
2.11.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH v1 5/7] net/phy: marvell: align definition of MII_88E1121_PHY_MSCR to Linux driver
  2017-01-11 15:59 [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Uwe Kleine-König
                   ` (3 preceding siblings ...)
  2017-01-11 15:59 ` [PATCH v1 4/7] net/phy: marvell: change spacing to be more similar to the " Uwe Kleine-König
@ 2017-01-11 15:59 ` Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 6/7] net/phy: marvell: improve config_aneg for 88E1121R and 88E1318S Uwe Kleine-König
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Uwe Kleine-König @ 2017-01-11 15:59 UTC (permalink / raw)
  To: barebox

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/net/phy/marvell.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index e01538067622..d504cf85a1da 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -32,7 +32,7 @@
 #define MII_M1011_PHY_STATUS_LINK	BIT(10)
 
 #define MII_88E1121_PHY_MSCR_PAGE	2
-#define MII_88E1121_PHY_MSCR		0x15
+#define MII_88E1121_PHY_MSCR_REG	21
 #define MII_88E1121_PHY_MSCR_TX_DELAY	BIT(4)
 #define MII_88E1121_PHY_MSCR_RX_DELAY	BIT(5)
 #define MII_88E1121_PHY_MSCR_DELAY_MASK	\
@@ -186,7 +186,7 @@ static int m88e1121_config_init(struct phy_device *phydev)
 		return ret;
 
 	/* Setup RGMII TX/RX delay */
-	reg = phy_read(phydev, MII_88E1121_PHY_MSCR) &
+	reg = phy_read(phydev, MII_88E1121_PHY_MSCR_REG) &
 		~MII_88E1121_PHY_MSCR_DELAY_MASK;
 	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
 	    phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
@@ -194,7 +194,7 @@ static int m88e1121_config_init(struct phy_device *phydev)
 	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
 	    phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
 		reg |= MII_88E1121_PHY_MSCR_TX_DELAY;
-	ret = phy_write(phydev, MII_88E1121_PHY_MSCR, reg);
+	ret = phy_write(phydev, MII_88E1121_PHY_MSCR_REG, reg);
 	if (ret < 0)
 		return ret;
 
-- 
2.11.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH v1 6/7] net/phy: marvell: improve config_aneg for 88E1121R and 88E1318S
  2017-01-11 15:59 [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Uwe Kleine-König
                   ` (4 preceding siblings ...)
  2017-01-11 15:59 ` [PATCH v1 5/7] net/phy: marvell: align definition of MII_88E1121_PHY_MSCR to " Uwe Kleine-König
@ 2017-01-11 15:59 ` Uwe Kleine-König
  2017-01-11 15:59 ` [PATCH v1 7/7] net/phy: marvell: add support for 88e1510 to marvell phy driver Uwe Kleine-König
  2017-01-13  6:54 ` [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Sascha Hauer
  7 siblings, 0 replies; 9+ messages in thread
From: Uwe Kleine-König @ 2017-01-11 15:59 UTC (permalink / raw)
  To: barebox

This is taken from the Linux driver

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/net/phy/marvell.c | 78 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 76 insertions(+), 2 deletions(-)

diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index d504cf85a1da..6bb50a3a1f4c 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -133,6 +133,80 @@ static int marvell_read_status(struct phy_device *phydev)
 	return 0;
 }
 
+static inline bool phy_interface_is_rgmii(struct phy_device *phydev)
+{
+	return phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
+		phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID;
+};
+
+static int m88e1121_config_aneg(struct phy_device *phydev)
+{
+	int err, oldpage, mscr;
+
+	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE);
+
+	err = phy_write(phydev, MII_MARVELL_PHY_PAGE,
+			MII_88E1121_PHY_MSCR_PAGE);
+	if (err < 0)
+		return err;
+
+	if (phy_interface_is_rgmii(phydev)) {
+
+		mscr = phy_read(phydev, MII_88E1121_PHY_MSCR_REG) &
+			MII_88E1121_PHY_MSCR_DELAY_MASK;
+
+		if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
+			mscr |= (MII_88E1121_PHY_MSCR_RX_DELAY |
+				 MII_88E1121_PHY_MSCR_TX_DELAY);
+		else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
+			mscr |= MII_88E1121_PHY_MSCR_RX_DELAY;
+		else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
+			mscr |= MII_88E1121_PHY_MSCR_TX_DELAY;
+
+		err = phy_write(phydev, MII_88E1121_PHY_MSCR_REG, mscr);
+		if (err < 0)
+			return err;
+	}
+
+	phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage);
+
+	err = phy_write(phydev, MII_BMCR, BMCR_RESET);
+	if (err < 0)
+		return err;
+
+	err = phy_write(phydev, MII_M1011_PHY_SCR,
+			MII_M1011_PHY_SCR_AUTO_CROSS);
+	if (err < 0)
+		return err;
+
+	return genphy_config_aneg(phydev);
+}
+
+static int m88e1318_config_aneg(struct phy_device *phydev)
+{
+	int err, oldpage, mscr;
+
+	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE);
+
+	err = phy_write(phydev, MII_MARVELL_PHY_PAGE,
+			MII_88E1121_PHY_MSCR_PAGE);
+	if (err < 0)
+		return err;
+
+	mscr = phy_read(phydev, MII_88E1318S_PHY_MSCR1_REG);
+	mscr |= MII_88E1318S_PHY_MSCR1_PAD_ODD;
+
+	err = phy_write(phydev, MII_88E1318S_PHY_MSCR1_REG, mscr);
+	if (err < 0)
+		return err;
+
+	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage);
+	if (err < 0)
+		return err;
+
+	return m88e1121_config_aneg(phydev);
+}
+
 static int m88e1540_config_init(struct phy_device *phydev)
 {
 	u16 reg;
@@ -244,7 +318,7 @@ static struct phy_driver marvell_drivers[] = {
 		.drv.name = "Marvell 88E1121R",
 		.features = PHY_GBIT_FEATURES,
 		.config_init = &m88e1121_config_init,
-		.config_aneg = &genphy_config_aneg,
+		.config_aneg = &m88e1121_config_aneg,
 		.read_status = &marvell_read_status,
 	},
 	{
@@ -253,7 +327,7 @@ static struct phy_driver marvell_drivers[] = {
 		.drv.name = "Marvell 88E1318S",
 		.features = PHY_GBIT_FEATURES,
 		.config_init = &m88e1318s_config_init,
-		.config_aneg = &genphy_config_aneg,
+		.config_aneg = &m88e1318_config_aneg,
 		.read_status = &marvell_read_status,
 	},
 	{
-- 
2.11.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH v1 7/7] net/phy: marvell: add support for 88e1510 to marvell phy driver
  2017-01-11 15:59 [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Uwe Kleine-König
                   ` (5 preceding siblings ...)
  2017-01-11 15:59 ` [PATCH v1 6/7] net/phy: marvell: improve config_aneg for 88E1121R and 88E1318S Uwe Kleine-König
@ 2017-01-11 15:59 ` Uwe Kleine-König
  2017-01-13  6:54 ` [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Sascha Hauer
  7 siblings, 0 replies; 9+ messages in thread
From: Uwe Kleine-König @ 2017-01-11 15:59 UTC (permalink / raw)
  To: barebox

This is mostly copied verbatim from the Linux driver.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/net/phy/marvell.c | 204 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 201 insertions(+), 3 deletions(-)

diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index 6bb50a3a1f4c..38b2ad31f893 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -31,6 +31,9 @@
 #define MII_M1011_PHY_STATUS_RESOLVED	BIT(11)
 #define MII_M1011_PHY_STATUS_LINK	BIT(10)
 
+#define MII_M1111_COPPER		0
+#define MII_M1111_FIBER			1
+
 #define MII_88E1121_PHY_MSCR_PAGE	2
 #define MII_88E1121_PHY_MSCR_REG	21
 #define MII_88E1121_PHY_MSCR_TX_DELAY	BIT(4)
@@ -45,6 +48,20 @@
 #define MII_88E1540_QSGMII_CONTROL	0x0
 #define MII_88E1540_QSGMII_AUTONEG_EN	BIT(12)
 
+#define MII_88E1510_GEN_CTRL_REG_1              0x14
+#define MII_88E1510_GEN_CTRL_REG_1_MODE_MASK    0x7
+#define MII_88E1510_GEN_CTRL_REG_1_MODE_SGMII   0x1     /* SGMII to copper */
+#define MII_88E1510_GEN_CTRL_REG_1_RESET        0x8000  /* Soft reset */
+
+#define LPA_PAUSE_FIBER	0x180
+#define LPA_PAUSE_ASYM_FIBER	0x100
+
+#define ADVERTISE_FIBER_1000HALF	0x40
+#define ADVERTISE_FIBER_1000FULL	0x20
+
+#define ADVERTISE_PAUSE_FIBER		0x180
+#define ADVERTISE_PAUSE_ASYM_FIBER	0x100
+
 /*
  * marvell_read_status
  *
@@ -133,12 +150,24 @@ static int marvell_read_status(struct phy_device *phydev)
 	return 0;
 }
 
+#define MII_88E1510_GEN_CTRL_REG_1              0x14
+
 static inline bool phy_interface_is_rgmii(struct phy_device *phydev)
 {
 	return phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
 		phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID;
 };
 
+/*
+ * This same function in the Linux kernel parses the marvell,reg-init dt
+ * property and does the necessary register writes. It's kept as an exercise for
+ * a future user to implement this. :-)
+ */
+static int marvell_of_reg_init(struct phy_device *phydev)
+{
+	return 0;
+}
+
 static int m88e1121_config_aneg(struct phy_device *phydev)
 {
 	int err, oldpage, mscr;
@@ -207,6 +236,130 @@ static int m88e1318_config_aneg(struct phy_device *phydev)
 	return m88e1121_config_aneg(phydev);
 }
 
+/**
+ * ethtool_adv_to_fiber_adv_t
+ * @ethadv: the ethtool advertisement settings
+ *
+ * A small helper function that translates ethtool advertisement
+ * settings to phy autonegotiation advertisements for the
+ * MII_ADV register for fiber link.
+ */
+static inline u32 ethtool_adv_to_fiber_adv_t(u32 ethadv)
+{
+	u32 result = 0;
+
+	if (ethadv & ADVERTISED_1000baseT_Half)
+		result |= ADVERTISE_FIBER_1000HALF;
+	if (ethadv & ADVERTISED_1000baseT_Full)
+		result |= ADVERTISE_FIBER_1000FULL;
+
+	if ((ethadv & ADVERTISE_PAUSE_ASYM) && (ethadv & ADVERTISE_PAUSE_CAP))
+		result |= LPA_PAUSE_ASYM_FIBER;
+	else if (ethadv & ADVERTISE_PAUSE_CAP)
+		result |= (ADVERTISE_PAUSE_FIBER
+			   & (~ADVERTISE_PAUSE_ASYM_FIBER));
+
+	return result;
+}
+
+/**
+ * marvell_config_aneg_fiber - restart auto-negotiation or write BMCR
+ * @phydev: target phy_device struct
+ *
+ * Description: If auto-negotiation is enabled, we configure the
+ *   advertising, and then restart auto-negotiation.  If it is not
+ *   enabled, then we write the BMCR. Adapted for fiber link in
+ *   some Marvell's devices.
+ */
+static int marvell_config_aneg_fiber(struct phy_device *phydev)
+{
+	int changed = 0;
+	int err;
+	int adv, oldadv;
+	u32 advertise;
+
+	if (phydev->autoneg != AUTONEG_ENABLE)
+		return genphy_setup_forced(phydev);
+
+	/* Only allow advertising what this PHY supports */
+	phydev->advertising &= phydev->supported;
+	advertise = phydev->advertising;
+
+	/* Setup fiber advertisement */
+	adv = phy_read(phydev, MII_ADVERTISE);
+	if (adv < 0)
+		return adv;
+
+	oldadv = adv;
+	adv &= ~(ADVERTISE_FIBER_1000HALF | ADVERTISE_FIBER_1000FULL
+		| LPA_PAUSE_FIBER);
+	adv |= ethtool_adv_to_fiber_adv_t(advertise);
+
+	if (adv != oldadv) {
+		err = phy_write(phydev, MII_ADVERTISE, adv);
+		if (err < 0)
+			return err;
+
+		changed = 1;
+	}
+
+	if (changed == 0) {
+		/* Advertisement hasn't changed, but maybe aneg was never on to
+		 * begin with?  Or maybe phy was isolated?
+		 */
+		int ctl = phy_read(phydev, MII_BMCR);
+
+		if (ctl < 0)
+			return ctl;
+
+		if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
+			changed = 1; /* do restart aneg */
+	}
+
+	/* Only restart aneg if we are advertising something different
+	 * than we were before.
+	 */
+	if (changed > 0)
+		changed = genphy_restart_aneg(phydev);
+
+	return changed;
+}
+
+static int m88e1510_config_aneg(struct phy_device *phydev)
+{
+	int err;
+
+	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
+	if (err < 0)
+		goto error;
+
+	/* Configure the copper link first */
+	err = m88e1318_config_aneg(phydev);
+	if (err < 0)
+		goto error;
+
+	/* Then the fiber link */
+	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER);
+	if (err < 0)
+		goto error;
+
+	err = marvell_config_aneg_fiber(phydev);
+	if (err < 0)
+		goto error;
+
+	return phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
+
+error:
+	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
+	return err;
+}
+
+static int marvell_config_init(struct phy_device *phydev)
+{
+	/* Set registers from marvell,reg-init DT property */
+	return marvell_of_reg_init(phydev);
+}
+
 static int m88e1540_config_init(struct phy_device *phydev)
 {
 	u16 reg;
@@ -246,7 +399,7 @@ static int m88e1540_config_init(struct phy_device *phydev)
 	if (ret < 0)
 		return ret;
 
-	return 0;
+	return marvell_config_init(phydev);
 }
 
 static int m88e1121_config_init(struct phy_device *phydev)
@@ -289,9 +442,10 @@ static int m88e1121_config_init(struct phy_device *phydev)
 	if (ret < 0)
 		return ret;
 
-	return 0;
+	return marvell_config_init(phydev);
 }
 
+
 static int m88e1318s_config_init(struct phy_device *phydev)
 {
 	u16 reg;
@@ -311,6 +465,41 @@ static int m88e1318s_config_init(struct phy_device *phydev)
 	return m88e1121_config_init(phydev);
 }
 
+static int m88e1510_config_init(struct phy_device *phydev)
+{
+	int err;
+	int temp;
+
+	/* SGMII-to-Copper mode initialization */
+	if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
+		/* Select page 18 */
+		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 18);
+		if (err < 0)
+			return err;
+
+		/* In reg 20, write MODE[2:0] = 0x1 (SGMII to Copper) */
+		temp = phy_read(phydev, MII_88E1510_GEN_CTRL_REG_1);
+		temp &= ~MII_88E1510_GEN_CTRL_REG_1_MODE_MASK;
+		temp |= MII_88E1510_GEN_CTRL_REG_1_MODE_SGMII;
+		err = phy_write(phydev, MII_88E1510_GEN_CTRL_REG_1, temp);
+		if (err < 0)
+			return err;
+
+		/* PHY reset is necessary after changing MODE[2:0] */
+		temp |= MII_88E1510_GEN_CTRL_REG_1_RESET;
+		err = phy_write(phydev, MII_88E1510_GEN_CTRL_REG_1, temp);
+		if (err < 0)
+			return err;
+
+		/* Reset page selection */
+		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0);
+		if (err < 0)
+			return err;
+	}
+
+	return m88e1121_config_init(phydev);
+}
+
 static struct phy_driver marvell_drivers[] = {
 	{
 		.phy_id = MARVELL_PHY_ID_88E1121R,
@@ -340,12 +529,21 @@ static struct phy_driver marvell_drivers[] = {
 		.read_status = &marvell_read_status,
 	},
 	{
+		.phy_id = MARVELL_PHY_ID_88E1510,
+		.phy_id_mask = MARVELL_PHY_ID_MASK,
+		.drv.name = "Marvell 88E1510",
+		.features = PHY_GBIT_FEATURES | SUPPORTED_FIBRE,
+		.config_init = &m88e1510_config_init,
+		.config_aneg = &m88e1510_config_aneg,
+		.read_status = &marvell_read_status,
+	},
+	{
 		.phy_id = MARVELL_PHY_ID_88E1540,
 		.phy_id_mask = MARVELL_PHY_ID_MASK,
 		.drv.name = "Marvell 88E1540",
 		.features = PHY_GBIT_FEATURES,
 		.config_init = &m88e1540_config_init,
-		.config_aneg = &genphy_config_aneg,
+		.config_aneg = &m88e1510_config_aneg,
 		.read_status = &marvell_read_status,
 	},
 };
-- 
2.11.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH v1 0/7] net/phy: marvell: add support for 88e1510
  2017-01-11 15:59 [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Uwe Kleine-König
                   ` (6 preceding siblings ...)
  2017-01-11 15:59 ` [PATCH v1 7/7] net/phy: marvell: add support for 88e1510 to marvell phy driver Uwe Kleine-König
@ 2017-01-13  6:54 ` Sascha Hauer
  7 siblings, 0 replies; 9+ messages in thread
From: Sascha Hauer @ 2017-01-13  6:54 UTC (permalink / raw)
  To: Uwe Kleine-König; +Cc: barebox

On Wed, Jan 11, 2017 at 04:59:13PM +0100, Uwe Kleine-König wrote:
> Hello,
> 
> this series targets to add support for the Marvell phy 88e1510 to the
> marvell phy driver. To make this and future additions easy there are
> several preparing patches that make the barebox driver very similar to
> the Linux driver. This allows to have the two drivers open side by side
> (I use vim -d) to add new features to the barebox driver that are
> already present in Linux.
> 
> Best regards
> Uwe
> 
> Uwe Kleine-König (7):
>   net/phy: marvell: rename 88E1545 to 88E1540
>   net/phy: marvell: 88E1540 LED registers already exist on 88E1121
>   net/phy: marvell: rename phy_driver array to match Linux driver
>   net/phy: marvell: change spacing to be more similar to the Linux
>     driver
>   net/phy: marvell: align definition of MII_88E1121_PHY_MSCR to Linux
>     driver
>   net/phy: marvell: improve config_aneg for 88E1121R and 88E1318S
>   net/phy: marvell: add support for 88e1510 to marvell phy driver
> 
>  drivers/net/phy/marvell.c   | 353 +++++++++++++++++++++++++++++++++++++++-----
>  include/linux/marvell_phy.h |   2 +-
>  2 files changed, 314 insertions(+), 41 deletions(-)

Applied, thanks

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

end of thread, other threads:[~2017-01-13  6:55 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-11 15:59 [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Uwe Kleine-König
2017-01-11 15:59 ` [PATCH v1 1/7] net/phy: marvell: rename 88E1545 to 88E1540 Uwe Kleine-König
2017-01-11 15:59 ` [PATCH v1 2/7] net/phy: marvell: 88E1540 LED registers already exist on 88E1121 Uwe Kleine-König
2017-01-11 15:59 ` [PATCH v1 3/7] net/phy: marvell: rename phy_driver array to match Linux driver Uwe Kleine-König
2017-01-11 15:59 ` [PATCH v1 4/7] net/phy: marvell: change spacing to be more similar to the " Uwe Kleine-König
2017-01-11 15:59 ` [PATCH v1 5/7] net/phy: marvell: align definition of MII_88E1121_PHY_MSCR to " Uwe Kleine-König
2017-01-11 15:59 ` [PATCH v1 6/7] net/phy: marvell: improve config_aneg for 88E1121R and 88E1318S Uwe Kleine-König
2017-01-11 15:59 ` [PATCH v1 7/7] net/phy: marvell: add support for 88e1510 to marvell phy driver Uwe Kleine-König
2017-01-13  6:54 ` [PATCH v1 0/7] net/phy: marvell: add support for 88e1510 Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox