board: verdin-imx8mm: Add KSZ9131 phy skew settings
authorPhilippe Schenker <philippe.schenker@toradex.com>
Wed, 11 Mar 2020 10:59:25 +0000 (11:59 +0100)
committerStefano Babic <sbabic@denx.de>
Fri, 1 May 2020 11:46:22 +0000 (13:46 +0200)
This patch determines which phy is placed on the board with the PHY ID
then it sets the same settings for KSZ9031 as before but for KSZ9131
it enables both RXC and TXC delay lines in the PHY.
This will compensate the missing delay from the MAC. Other skew
settings are not needed as the traces on board are routed exactly the
same length

Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>
Tested-by: Igor Opaniuk <igor.opaniuk@toradex.com>
Acked-by: Igor Opaniuk <igor.opaniuk@toradex.com>
board/toradex/verdin-imx8mm/verdin-imx8mm.c

index 15ae21c03c1485a485df627d0913a528df030e86..35866e096a3294ada1e285687d01062dd00daf50 100644 (file)
@@ -38,29 +38,62 @@ static int setup_fec(void)
 
 int board_phy_config(struct phy_device *phydev)
 {
-       /*
-        * The PHY adds 1.2ns for the RXC and 0ns for TXC clock by
-        * default. The MAC and the layout don't add a skew between
-        * clock and data.
-        * Add 0.3ns for the RXC path and 0.96 + 0.42 ns (1.38 ns) for
-        * the TXC path to get the required clock skews.
-        */
-       /* control data pad skew - devaddr = 0x02, register = 0x04 */
-       ksz9031_phy_extended_write(phydev, 0x02,
-                               MII_KSZ9031_EXT_RGMII_CTRL_SIG_SKEW,
-                               MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0070);
-       /* rx data pad skew - devaddr = 0x02, register = 0x05 */
-       ksz9031_phy_extended_write(phydev, 0x02,
-                               MII_KSZ9031_EXT_RGMII_RX_DATA_SKEW,
-                               MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x7777);
-       /* tx data pad skew - devaddr = 0x02, register = 0x06 */
-       ksz9031_phy_extended_write(phydev, 0x02,
-                               MII_KSZ9031_EXT_RGMII_TX_DATA_SKEW,
-                               MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000);
-       /* gtx and rx clock pad skew - devaddr = 0x02, register = 0x08 */
-       ksz9031_phy_extended_write(phydev, 0x02,
-                               MII_KSZ9031_EXT_RGMII_CLOCK_SKEW,
-                               MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x03f4);
+       int tmp;
+
+       switch (ksz9xx1_phy_get_id(phydev) & MII_KSZ9x31_SILICON_REV_MASK) {
+       case PHY_ID_KSZ9031:
+               /*
+                * The PHY adds 1.2ns for the RXC and 0ns for TXC clock by
+                * default. The MAC and the layout don't add a skew between
+                * clock and data.
+                * Add 0.3ns for the RXC path and 0.96 + 0.42 ns (1.38 ns) for
+                * the TXC path to get the required clock skews.
+                */
+               /* control data pad skew - devaddr = 0x02, register = 0x04 */
+               ksz9031_phy_extended_write(phydev, 0x02,
+                                          MII_KSZ9031_EXT_RGMII_CTRL_SIG_SKEW,
+                                          MII_KSZ9031_MOD_DATA_NO_POST_INC,
+                                          0x0070);
+               /* rx data pad skew - devaddr = 0x02, register = 0x05 */
+               ksz9031_phy_extended_write(phydev, 0x02,
+                                          MII_KSZ9031_EXT_RGMII_RX_DATA_SKEW,
+                                          MII_KSZ9031_MOD_DATA_NO_POST_INC,
+                                          0x7777);
+               /* tx data pad skew - devaddr = 0x02, register = 0x06 */
+               ksz9031_phy_extended_write(phydev, 0x02,
+                                          MII_KSZ9031_EXT_RGMII_TX_DATA_SKEW,
+                                          MII_KSZ9031_MOD_DATA_NO_POST_INC,
+                                          0x0000);
+               /* gtx and rx clock pad skew - devaddr = 0x02,register = 0x08 */
+               ksz9031_phy_extended_write(phydev, 0x02,
+                                          MII_KSZ9031_EXT_RGMII_CLOCK_SKEW,
+                                          MII_KSZ9031_MOD_DATA_NO_POST_INC,
+                                          0x03f4);
+               break;
+       case PHY_ID_KSZ9131:
+       default:
+               /* read rxc dll control - devaddr = 0x2, register = 0x4c */
+               tmp = ksz9031_phy_extended_read(phydev, 0x02,
+                                       MII_KSZ9131_EXT_RGMII_2NS_SKEW_RXDLL,
+                                       MII_KSZ9031_MOD_DATA_NO_POST_INC);
+               /* disable rxdll bypass (enable 2ns skew delay on RXC) */
+               tmp &= ~MII_KSZ9131_RXTXDLL_BYPASS;
+               /* rxc data pad skew 2ns - devaddr = 0x02, register = 0x4c */
+               tmp = ksz9031_phy_extended_write(phydev, 0x02,
+                                       MII_KSZ9131_EXT_RGMII_2NS_SKEW_RXDLL,
+                                       MII_KSZ9031_MOD_DATA_NO_POST_INC, tmp);
+               /* read txc dll control - devaddr = 0x02, register = 0x4d */
+               tmp = ksz9031_phy_extended_read(phydev, 0x02,
+                                       MII_KSZ9131_EXT_RGMII_2NS_SKEW_TXDLL,
+                                       MII_KSZ9031_MOD_DATA_NO_POST_INC);
+               /* disable txdll bypass (enable 2ns skew delay on TXC) */
+               tmp &= ~MII_KSZ9131_RXTXDLL_BYPASS;
+               /* rxc data pad skew 2ns - devaddr = 0x02, register = 0x4d */
+               tmp = ksz9031_phy_extended_write(phydev, 0x02,
+                                       MII_KSZ9131_EXT_RGMII_2NS_SKEW_TXDLL,
+                                       MII_KSZ9031_MOD_DATA_NO_POST_INC, tmp);
+               break;
+       }
 
        if (phydev->drv->config)
                phydev->drv->config(phydev);