net: phy: supplement support for Micrel's KSZ9031
authorSARTRE Leo <lsartre@adeneo-embedded.com>
Tue, 30 Apr 2013 14:57:25 +0000 (16:57 +0200)
committerJoe Hershberger <joe.hershberger@ni.com>
Tue, 25 Jun 2013 00:11:16 +0000 (19:11 -0500)
Add function ksz9031_phy_extended_write and ksz9031_phy_extended_read

Signed-off-by: Leo Sartre <lsartre@adeneo-embedded.com>
drivers/net/phy/micrel.c
include/micrel.h

index 2a8b6cb9479c716dd61ff8046dd38c27729fb77d..aa9cbcfffc0465075ed7574e7ac76ffea908db48 100644 (file)
@@ -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,
index 25e8a4624b75978c2af1f38508d9fc369c0e6db7..e1c62d83cb3d6a0cc890f7b696d6905b49c17ee7 100644 (file)
@@ -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