struct qcom_ethqos {
        struct platform_device *pdev;
        void __iomem *rgmii_base;
+       int (*configure_func)(struct qcom_ethqos *ethqos);
 
        unsigned int link_clk_rate;
        struct clk *link_clk;
        struct phy *serdes_phy;
        unsigned int speed;
+       int phy_mode;
 
        const struct ethqos_emac_por *por;
        unsigned int num_por;
 {
        struct device *dev = ðqos->pdev->dev;
        int phase_shift;
-       int phy_mode;
        int loopback;
 
        /* Determine if the PHY adds a 2 ns TX delay or the MAC handles it */
-       phy_mode = device_get_phy_mode(dev);
-       if (phy_mode == PHY_INTERFACE_MODE_RGMII_ID ||
-           phy_mode == PHY_INTERFACE_MODE_RGMII_TXID)
+       if (ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_ID ||
+           ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_TXID)
                phase_shift = 0;
        else
                phase_shift = RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN;
        return 0;
 }
 
-static int ethqos_configure(struct qcom_ethqos *ethqos)
+static int ethqos_configure_rgmii(struct qcom_ethqos *ethqos)
 {
        struct device *dev = ðqos->pdev->dev;
        volatile unsigned int dll_lock;
        return 0;
 }
 
+static int ethqos_configure(struct qcom_ethqos *ethqos)
+{
+       return ethqos->configure_func(ethqos);
+}
+
 static void ethqos_fix_mac_speed(void *priv, unsigned int speed)
 {
        struct qcom_ethqos *ethqos = priv;
                goto out_config_dt;
        }
 
+       ethqos->phy_mode = device_get_phy_mode(dev);
+       switch (ethqos->phy_mode) {
+       case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+       case PHY_INTERFACE_MODE_RGMII_TXID:
+               ethqos->configure_func = ethqos_configure_rgmii;
+               break;
+       case -ENODEV:
+               ret = -ENODEV;
+               goto out_config_dt;
+       default:
+               ret = -EINVAL;
+               goto out_config_dt;
+       }
+
        ethqos->pdev = pdev;
        ethqos->rgmii_base = devm_platform_ioremap_resource_byname(pdev, "rgmii");
        if (IS_ERR(ethqos->rgmii_base)) {