phy_interface_t                 phy_mode;
        struct clk                      *rgmii_tx_clk;
        u32                             tx_delay_ns;
+       u32                             rx_delay_ns;
        struct clk                      *timing_adj_clk;
 };
 
 
 static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac)
 {
+       u32 tx_dly_config, rx_dly_config, delay_config;
        int ret;
-       u8 tx_dly_val = 0;
+
+       tx_dly_config = FIELD_PREP(PRG_ETH0_TXDLY_MASK,
+                                  dwmac->tx_delay_ns >> 1);
+
+       if (dwmac->rx_delay_ns == 2)
+               rx_dly_config = PRG_ETH0_ADJ_ENABLE | PRG_ETH0_ADJ_SETUP;
+       else
+               rx_dly_config = 0;
 
        switch (dwmac->phy_mode) {
        case PHY_INTERFACE_MODE_RGMII:
+               delay_config = tx_dly_config | rx_dly_config;
+               break;
        case PHY_INTERFACE_MODE_RGMII_RXID:
-               tx_dly_val = dwmac->tx_delay_ns >> 1;
-               /* fall through */
-
-       case PHY_INTERFACE_MODE_RGMII_ID:
+               delay_config = tx_dly_config;
+               break;
        case PHY_INTERFACE_MODE_RGMII_TXID:
+               delay_config = rx_dly_config;
+               break;
+       case PHY_INTERFACE_MODE_RGMII_ID:
+       case PHY_INTERFACE_MODE_RMII:
+               delay_config = 0;
+               break;
+       default:
+               dev_err(dwmac->dev, "unsupported phy-mode %s\n",
+                       phy_modes(dwmac->phy_mode));
+               return -EINVAL;
+       };
+
+       if (rx_dly_config & PRG_ETH0_ADJ_ENABLE) {
+               if (!dwmac->timing_adj_clk) {
+                       dev_err(dwmac->dev,
+                               "The timing-adjustment clock is mandatory for the RX delay re-timing\n");
+                       return -EINVAL;
+               }
+
+               /* The timing adjustment logic is driven by a separate clock */
+               ret = meson8b_devm_clk_prepare_enable(dwmac,
+                                                     dwmac->timing_adj_clk);
+               if (ret) {
+                       dev_err(dwmac->dev,
+                               "Failed to enable the timing-adjustment clock\n");
+                       return ret;
+               }
+       }
+
+       meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK |
+                               PRG_ETH0_ADJ_ENABLE | PRG_ETH0_ADJ_SETUP |
+                               PRG_ETH0_ADJ_DELAY | PRG_ETH0_ADJ_SKEW,
+                               delay_config);
+
+       if (phy_interface_mode_is_rgmii(dwmac->phy_mode)) {
                /* only relevant for RMII mode -> disable in RGMII mode */
                meson8b_dwmac_mask_bits(dwmac, PRG_ETH0,
                                        PRG_ETH0_INVERTED_RMII_CLK, 0);
 
-               meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK,
-                                       FIELD_PREP(PRG_ETH0_TXDLY_MASK,
-                                                  tx_dly_val));
-
                /* Configure the 125MHz RGMII TX clock, the IP block changes
                 * the output automatically (= without us having to configure
                 * a register) based on the line-speed (125MHz for Gbit speeds,
                                "failed to enable the RGMII TX clock\n");
                        return ret;
                }
-               break;
-
-       case PHY_INTERFACE_MODE_RMII:
+       } else {
                /* invert internal clk_rmii_i to generate 25/2.5 tx_rx_clk */
                meson8b_dwmac_mask_bits(dwmac, PRG_ETH0,
                                        PRG_ETH0_INVERTED_RMII_CLK,
                                        PRG_ETH0_INVERTED_RMII_CLK);
-
-               /* TX clock delay cannot be configured in RMII mode */
-               meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK,
-                                       0);
-
-               break;
-
-       default:
-               dev_err(dwmac->dev, "unsupported phy-mode %s\n",
-                       phy_modes(dwmac->phy_mode));
-               return -EINVAL;
        }
 
        /* enable TX_CLK and PHY_REF_CLK generator */
                                 &dwmac->tx_delay_ns))
                dwmac->tx_delay_ns = 2;
 
+       /* use 0ns as fallback since this is what most boards actually use */
+       if (of_property_read_u32(pdev->dev.of_node, "amlogic,rx-delay-ns",
+                                &dwmac->rx_delay_ns))
+               dwmac->rx_delay_ns = 0;
+
+       if (dwmac->rx_delay_ns != 0 && dwmac->rx_delay_ns != 2) {
+               dev_err(&pdev->dev,
+                       "The only allowed RX delays values are: 0ns, 2ns");
+               ret = -EINVAL;
+               goto err_remove_config_dt;
+       }
+
        dwmac->timing_adj_clk = devm_clk_get_optional(dwmac->dev,
                                                      "timing-adjustment");
        if (IS_ERR(dwmac->timing_adj_clk)) {