According to the R-Car Gen3 Hardware Manual Errata for Rev 1.00 of
August 24, 2018, the TX clock internal delay mode isn't supported
on R-Car E3 (r8a77990) and D3 (r8a77995).

Based on work by Kazuya Mizuguchi.

Signed-off-by: Simon Horman <horms+rene...@verge.net.au>
---
 drivers/net/ethernet/renesas/ravb_main.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/renesas/ravb_main.c 
b/drivers/net/ethernet/renesas/ravb_main.c
index 4f648394e645..be8af4a382cf 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -1969,6 +1969,12 @@ static void ravb_set_config_mode(struct net_device *ndev)
        }
 }
 
+static const struct soc_device_attribute ravb_delay_mode_quirk_match[] = {
+       { .soc_id = "r8a77990", .revision = "ES1.*" },
+       { .soc_id = "r8a77995", .revision = "ES1.*" },
+       { /* sentinel */ }
+};
+
 /* Set tx and rx clock internal delay modes */
 static void ravb_set_delay_mode(struct net_device *ndev)
 {
@@ -1979,8 +1985,9 @@ static void ravb_set_delay_mode(struct net_device *ndev)
            priv->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
                set |= APSR_DM_RDM;
 
-       if (priv->phy_interface == PHY_INTERFACE_MODE_RGMII_ID ||
-           priv->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID)
+       if ((priv->phy_interface == PHY_INTERFACE_MODE_RGMII_ID ||
+            priv->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID) &&
+           !soc_device_match(ravb_delay_mode_quirk_match))
                set |= APSR_DM_TDM;
 
        ravb_modify(ndev, APSR, APSR_DM, set);
-- 
2.11.0

Reply via email to