Patchwork [U-Boot,v2] PHY: micrel.c: add support for KSZ9031

login
register
mail settings
Submitter David Andrey
Date Feb. 6, 2013, 9:18 p.m.
Message ID <1360185517-9317-1-git-send-email-david.andrey@netmodule.com>
Download mbox | patch
Permalink /patch/218793/
State Accepted
Delegated to: Joe Hershberger
Headers show

Comments

David Andrey - Feb. 6, 2013, 9:18 p.m.
Add support for Micrel PHY KSZ9031 in phylib,
including small rework for KSZ9021 to avoid
code duplication

Signed-off-by: David Andrey <david.andrey@netmodule.com>
Cc: Troy Kisky <troy.kisky@boundarydevices.com>
Cc: Joe Herschberger <joe.hershberger@gmail.com>
Cc: Andy Fleming <afleming@freescale.com>

---

Changes for v2:
	- Same startup function for KSZ9021 and 9031
---
 drivers/net/phy/micrel.c |   79 ++++++++++++++++++++++++++++++----------------
 1 files changed, 52 insertions(+), 27 deletions(-)
Stefan Roese - March 7, 2013, 12:44 p.m.
Hi David,

On 06.02.2013 22:18, David Andrey wrote:
> Add support for Micrel PHY KSZ9031 in phylib,
> including small rework for KSZ9021 to avoid
> code duplication
> 
> Signed-off-by: David Andrey <david.andrey@netmodule.com>
> Cc: Troy Kisky <troy.kisky@boundarydevices.com>
> Cc: Joe Herschberger <joe.hershberger@gmail.com>
> Cc: Andy Fleming <afleming@freescale.com>
> 
> ---
> 
> Changes for v2:
> 	- Same startup function for KSZ9021 and 9031
> ---
>  drivers/net/phy/micrel.c |   79 ++++++++++++++++++++++++++++++----------------
>  1 files changed, 52 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
> index 30f3264..2a8b6cb 100644
> --- a/drivers/net/phy/micrel.c
> +++ b/drivers/net/phy/micrel.c
> @@ -18,6 +18,7 @@
>   *
>   * Copyright 2010-2011 Freescale Semiconductor, Inc.
>   * author Andy Fleming
> + * (C) 2012 NetModule AG, David Andrey, added KSZ9031
>   *
>   */
>  #include <config.h>
> @@ -52,16 +53,46 @@ static struct phy_driver KS8721_driver = {
>  };
>  #endif
>  
> +
> +/**
> + * KSZ9021 - KSZ9031 common
> + */
> +
> +#define MII_KSZ90xx_PHY_CTL		0x1f
> +#define MIIM_KSZ90xx_PHYCTL_1000	(1 << 6)
> +#define MIIM_KSZ90xx_PHYCTL_100		(1 << 5)
> +#define MIIM_KSZ90xx_PHYCTL_10		(1 << 4)
> +#define MIIM_KSZ90xx_PHYCTL_DUPLEX	(1 << 3)
> +
> +static int ksz90xx_startup(struct phy_device *phydev)
> +{
> +	unsigned phy_ctl;
> +	genphy_update_link(phydev);
> +	phy_ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZ90xx_PHY_CTL);
> +
> +	if (phy_ctl & MIIM_KSZ90xx_PHYCTL_DUPLEX)
> +		phydev->duplex = DUPLEX_FULL;
> +	else
> +		phydev->duplex = DUPLEX_HALF;
> +
> +	if (phy_ctl & MIIM_KSZ90xx_PHYCTL_1000)
> +		phydev->speed = SPEED_1000;
> +	else if (phy_ctl & MIIM_KSZ90xx_PHYCTL_100)
> +		phydev->speed = SPEED_100;
> +	else if (phy_ctl & MIIM_KSZ90xx_PHYCTL_10)
> +		phydev->speed = SPEED_10;
> +	return 0;
> +}
>  #ifdef CONFIG_PHY_MICREL_KSZ9021
> -/* ksz9021 PHY Registers */
> +
> +/*
> + * KSZ9021
> + */
> +
> +/* PHY Registers */
>  #define MII_KSZ9021_EXTENDED_CTRL	0x0b
>  #define MII_KSZ9021_EXTENDED_DATAW	0x0c
>  #define MII_KSZ9021_EXTENDED_DATAR	0x0d
> -#define MII_KSZ9021_PHY_CTL		0x1f
> -#define MIIM_KSZ9021_PHYCTL_1000	(1 << 6)
> -#define MIIM_KSZ9021_PHYCTL_100		(1 << 5)
> -#define MIIM_KSZ9021_PHYCTL_10		(1 << 4)
> -#define MIIM_KSZ9021_PHYCTL_DUPLEX	(1 << 3)
>  
>  #define CTRL1000_PREFER_MASTER		(1 << 10)
>  #define CTRL1000_CONFIG_MASTER		(1 << 11)
> @@ -106,37 +137,30 @@ static int ksz9021_config(struct phy_device *phydev)
>  	return 0;
>  }
>  
> -static int ksz9021_startup(struct phy_device *phydev)
> -{
> -	unsigned phy_ctl;
> -	genphy_update_link(phydev);
> -	phy_ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZ9021_PHY_CTL);
> -
> -	if (phy_ctl & MIIM_KSZ9021_PHYCTL_DUPLEX)
> -		phydev->duplex = DUPLEX_FULL;
> -	else
> -		phydev->duplex = DUPLEX_HALF;
> -
> -	if (phy_ctl & MIIM_KSZ9021_PHYCTL_1000)
> -		phydev->speed = SPEED_1000;
> -	else if (phy_ctl & MIIM_KSZ9021_PHYCTL_100)
> -		phydev->speed = SPEED_100;
> -	else if (phy_ctl & MIIM_KSZ9021_PHYCTL_10)
> -		phydev->speed = SPEED_10;
> -	return 0;
> -}
> -
>  static struct phy_driver ksz9021_driver = {
>  	.name = "Micrel ksz9021",
>  	.uid  = 0x221610,
>  	.mask = 0xfffff0,

Why don't you just change the mask to support both PHY's with one struct
here? Something like this:

 static struct phy_driver ksz9021_driver = {
-	.name = "Micrel ksz9021",
+	.name = "Micrel ksz90x1",
 	.uid  = 0x221610,
-	.mask = 0xfffff0,
+	.mask = 0xffffc0,

This would be much "simpler". Does it work for you?

Best regards,
Stefan

--
DENX Software Engineering GmbH,      MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich,  Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: office@denx.de
David Andrey - March 25, 2013, 8:39 p.m.
Hi Stefan,

> Why don't you just change the mask to support both PHY's with one
struct here? Something like this:
>
>  static struct phy_driver ksz9021_driver = {
> -	.name = "Micrel ksz9021",
> +	.name = "Micrel ksz90x1",
>  	.uid  = 0x221610,
> -	.mask = 0xfffff0,
> +	.mask = 0xffffc0,
>
> This would be much "simpler". Does it work for you?

Well, because the ksz9031 works well with the generic phy config
function. See ksz9021_config vs genphy_config

Regards
David
Stefan Roese - April 2, 2013, 12:04 p.m.
Hi David,

On 25.03.2013 21:39, David Andrey wrote:
>> Why don't you just change the mask to support both PHY's with one
> struct here? Something like this:
>>
>>  static struct phy_driver ksz9021_driver = {
>> -	.name = "Micrel ksz9021",
>> +	.name = "Micrel ksz90x1",
>>  	.uid  = 0x221610,
>> -	.mask = 0xfffff0,
>> +	.mask = 0xffffc0,
>>
>> This would be much "simpler". Does it work for you?
> 
> Well, because the ksz9031 works well with the generic phy config
> function. See ksz9021_config vs genphy_config

Okay, I see. Thanks.

Acked-by: Stefan Roese <sr@denx.de>

Thanks,
Stefan
Fabio Estevam - June 18, 2013, 3:31 p.m.
Hi Joe,

On Wed, Feb 6, 2013 at 7:18 PM, David Andrey <david.andrey@netmodule.com> wrote:
> Add support for Micrel PHY KSZ9031 in phylib,
> including small rework for KSZ9021 to avoid
> code duplication
>
> Signed-off-by: David Andrey <david.andrey@netmodule.com>
> Cc: Troy Kisky <troy.kisky@boundarydevices.com>
> Cc: Joe Herschberger <joe.hershberger@gmail.com>
> Cc: Andy Fleming <afleming@freescale.com>

Can we get this one applied for the upcoming 2013.04?

Regards,

Fabio Estevam
Joe Hershberger - June 22, 2013, 12:18 p.m.
On Tue, Jun 18, 2013 at 10:31 AM, Fabio Estevam <festevam@gmail.com> wrote:
> Hi Joe,
>
> On Wed, Feb 6, 2013 at 7:18 PM, David Andrey <david.andrey@netmodule.com> wrote:
>> Add support for Micrel PHY KSZ9031 in phylib,
>> including small rework for KSZ9021 to avoid
>> code duplication
>>
>> Signed-off-by: David Andrey <david.andrey@netmodule.com>
>> Cc: Troy Kisky <troy.kisky@boundarydevices.com>
>> Cc: Joe Herschberger <joe.hershberger@gmail.com>
>> Cc: Andy Fleming <afleming@freescale.com>
>
> Can we get this one applied for the upcoming 2013.04?

I have this in a branch, but I'm fixing problems with a few patches.
I'll send a PR soon that should include this.

Cheers,
-Joe
Joe Hershberger - July 8, 2013, 4:06 p.m.
On Wed, Feb 6, 2013 at 3:18 PM, David Andrey <david.andrey@netmodule.com> wrote:
> Add support for Micrel PHY KSZ9031 in phylib,
> including small rework for KSZ9021 to avoid
> code duplication
>
> Signed-off-by: David Andrey <david.andrey@netmodule.com>
> Cc: Troy Kisky <troy.kisky@boundarydevices.com>
> Cc: Joe Herschberger <joe.hershberger@gmail.com>
> Cc: Andy Fleming <afleming@freescale.com>

Applied, Thanks.
-Joe

Patch

diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
index 30f3264..2a8b6cb 100644
--- a/drivers/net/phy/micrel.c
+++ b/drivers/net/phy/micrel.c
@@ -18,6 +18,7 @@ 
  *
  * Copyright 2010-2011 Freescale Semiconductor, Inc.
  * author Andy Fleming
+ * (C) 2012 NetModule AG, David Andrey, added KSZ9031
  *
  */
 #include <config.h>
@@ -52,16 +53,46 @@  static struct phy_driver KS8721_driver = {
 };
 #endif
 
+
+/**
+ * KSZ9021 - KSZ9031 common
+ */
+
+#define MII_KSZ90xx_PHY_CTL		0x1f
+#define MIIM_KSZ90xx_PHYCTL_1000	(1 << 6)
+#define MIIM_KSZ90xx_PHYCTL_100		(1 << 5)
+#define MIIM_KSZ90xx_PHYCTL_10		(1 << 4)
+#define MIIM_KSZ90xx_PHYCTL_DUPLEX	(1 << 3)
+
+static int ksz90xx_startup(struct phy_device *phydev)
+{
+	unsigned phy_ctl;
+	genphy_update_link(phydev);
+	phy_ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZ90xx_PHY_CTL);
+
+	if (phy_ctl & MIIM_KSZ90xx_PHYCTL_DUPLEX)
+		phydev->duplex = DUPLEX_FULL;
+	else
+		phydev->duplex = DUPLEX_HALF;
+
+	if (phy_ctl & MIIM_KSZ90xx_PHYCTL_1000)
+		phydev->speed = SPEED_1000;
+	else if (phy_ctl & MIIM_KSZ90xx_PHYCTL_100)
+		phydev->speed = SPEED_100;
+	else if (phy_ctl & MIIM_KSZ90xx_PHYCTL_10)
+		phydev->speed = SPEED_10;
+	return 0;
+}
 #ifdef CONFIG_PHY_MICREL_KSZ9021
-/* ksz9021 PHY Registers */
+
+/*
+ * KSZ9021
+ */
+
+/* PHY Registers */
 #define MII_KSZ9021_EXTENDED_CTRL	0x0b
 #define MII_KSZ9021_EXTENDED_DATAW	0x0c
 #define MII_KSZ9021_EXTENDED_DATAR	0x0d
-#define MII_KSZ9021_PHY_CTL		0x1f
-#define MIIM_KSZ9021_PHYCTL_1000	(1 << 6)
-#define MIIM_KSZ9021_PHYCTL_100		(1 << 5)
-#define MIIM_KSZ9021_PHYCTL_10		(1 << 4)
-#define MIIM_KSZ9021_PHYCTL_DUPLEX	(1 << 3)
 
 #define CTRL1000_PREFER_MASTER		(1 << 10)
 #define CTRL1000_CONFIG_MASTER		(1 << 11)
@@ -106,37 +137,30 @@  static int ksz9021_config(struct phy_device *phydev)
 	return 0;
 }
 
-static int ksz9021_startup(struct phy_device *phydev)
-{
-	unsigned phy_ctl;
-	genphy_update_link(phydev);
-	phy_ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZ9021_PHY_CTL);
-
-	if (phy_ctl & MIIM_KSZ9021_PHYCTL_DUPLEX)
-		phydev->duplex = DUPLEX_FULL;
-	else
-		phydev->duplex = DUPLEX_HALF;
-
-	if (phy_ctl & MIIM_KSZ9021_PHYCTL_1000)
-		phydev->speed = SPEED_1000;
-	else if (phy_ctl & MIIM_KSZ9021_PHYCTL_100)
-		phydev->speed = SPEED_100;
-	else if (phy_ctl & MIIM_KSZ9021_PHYCTL_10)
-		phydev->speed = SPEED_10;
-	return 0;
-}
-
 static struct phy_driver ksz9021_driver = {
 	.name = "Micrel ksz9021",
 	.uid  = 0x221610,
 	.mask = 0xfffff0,
 	.features = PHY_GBIT_FEATURES,
 	.config = &ksz9021_config,
-	.startup = &ksz9021_startup,
+	.startup = &ksz90xx_startup,
 	.shutdown = &genphy_shutdown,
 };
 #endif
 
+/*
+ * KSZ9031
+ */
+static struct phy_driver ksz9031_driver = {
+	.name = "Micrel ksz9031",
+	.uid  = 0x221620,
+	.mask = 0xfffffe,
+	.features = PHY_GBIT_FEATURES,
+	.config   = &genphy_config,
+	.startup  = &ksz90xx_startup,
+	.shutdown = &genphy_shutdown,
+};
+
 int phy_micrel_init(void)
 {
 	phy_register(&KSZ804_driver);
@@ -145,5 +169,6 @@  int phy_micrel_init(void)
 #else
 	phy_register(&KS8721_driver);
 #endif
+	phy_register(&ksz9031_driver);
 	return 0;
 }