diff options
| author | SARTRE Leo <lsartre@adeneo-embedded.com> | 2013-04-30 16:57:25 +0200 | 
|---|---|---|
| committer | Joe Hershberger <joe.hershberger@ni.com> | 2013-06-24 19:11:16 -0500 | 
| commit | 42a7cb50a96e95cdca26607727c6767876414ced (patch) | |
| tree | 2bcbc6917575511d34d95c9c65ce9e25298fb2a3 | |
| parent | d256be29f86b7c4e98435f7047a3e9c44dd7e0f4 (diff) | |
| download | olio-uboot-2014.01-42a7cb50a96e95cdca26607727c6767876414ced.tar.xz olio-uboot-2014.01-42a7cb50a96e95cdca26607727c6767876414ced.zip | |
net: phy: supplement support for Micrel's KSZ9031
Add function ksz9031_phy_extended_write and ksz9031_phy_extended_read
Signed-off-by: Leo Sartre <lsartre@adeneo-embedded.com>
| -rw-r--r-- | drivers/net/phy/micrel.c | 36 | ||||
| -rw-r--r-- | include/micrel.h | 11 | 
2 files changed, 46 insertions, 1 deletions
| diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 2a8b6cb94..aa9cbcfff 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -148,9 +148,43 @@ static struct phy_driver ksz9021_driver = {  };  #endif -/* +/**   * KSZ9031   */ +/* PHY Registers */ +#define MII_KSZ9031_MMD_ACCES_CTRL	0x0d +#define MII_KSZ9031_MMD_REG_DATA	0x0e + +/* Accessors to extended registers*/ +int ksz9031_phy_extended_write(struct phy_device *phydev, +			       int devaddr, int regnum, u16 mode, u16 val) +{ +	/*select register addr for mmd*/ +	phy_write(phydev, MDIO_DEVAD_NONE, +		  MII_KSZ9031_MMD_ACCES_CTRL, devaddr); +	/*select register for mmd*/ +	phy_write(phydev, MDIO_DEVAD_NONE, +		  MII_KSZ9031_MMD_REG_DATA, regnum); +	/*setup mode*/ +	phy_write(phydev, MDIO_DEVAD_NONE, +		  MII_KSZ9031_MMD_ACCES_CTRL, (mode | devaddr)); +	/*write the value*/ +	return	phy_write(phydev, MDIO_DEVAD_NONE, +		MII_KSZ9031_MMD_REG_DATA, val); +} + +int ksz9031_phy_extended_read(struct phy_device *phydev, int devaddr, +			      int regnum, u16 mode) +{ +	phy_write(phydev, MDIO_DEVAD_NONE, +		  MII_KSZ9031_MMD_ACCES_CTRL, devaddr); +	phy_write(phydev, MDIO_DEVAD_NONE, +		  MII_KSZ9031_MMD_REG_DATA, regnum); +	phy_write(phydev, MDIO_DEVAD_NONE, +		  MII_KSZ9031_MMD_ACCES_CTRL, (devaddr | mode)); +	return phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZ9031_MMD_REG_DATA); +} +  static struct phy_driver ksz9031_driver = {  	.name = "Micrel ksz9031",  	.uid  = 0x221620, diff --git a/include/micrel.h b/include/micrel.h index 25e8a4624..e1c62d83c 100644 --- a/include/micrel.h +++ b/include/micrel.h @@ -8,9 +8,20 @@  #define MII_KSZ9021_EXT_RGMII_RX_DATA_SKEW	0x105  #define MII_KSZ9021_EXT_RGMII_TX_DATA_SKEW	0x106  #define MII_KSZ9021_EXT_ANALOG_TEST		0x107 +/* Register operations */ +#define MII_KSZ9031_MOD_REG			0x0000 +/* Data operations */ +#define MII_KSZ9031_MOD_DATA_NO_POST_INC	0x4000 +#define MII_KSZ9031_MOD_DATA_POST_INC_RW	0x8000 +#define MII_KSZ9031_MOD_DATA_POST_INC_W		0xC000  struct phy_device;  int ksz9021_phy_extended_write(struct phy_device *phydev, int regnum, u16 val);  int ksz9021_phy_extended_read(struct phy_device *phydev, int regnum); +int ksz9031_phy_extended_write(struct phy_device *phydev, int devaddr, +			       int regnum, u16 mode, u16 val); +int ksz9031_phy_extended_read(struct phy_device *phydev, int devaddr, +			      int regnum, u16 mode); +  #endif |