*/
 
 #include <dt-bindings/phy/phy.h>
+#include <linux/clk.h>
 #include <linux/bitfield.h>
 #include <linux/bitops.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/sys_soc.h>
-#include <mt7621.h>
-#include <ralink_regs.h>
 
 #define RG_PE1_PIPE_REG                                0x02c
 #define RG_PE1_PIPE_RST                                BIT(12)
 
 #define RG_PE1_FRC_MSTCKDIV                    BIT(5)
 
-#define XTAL_MASK                              GENMASK(8, 6)
-
 #define MAX_PHYS       2
 
 /**
  * @dev: pointer to device
  * @regmap: kernel regmap pointer
  * @phy: pointer to the kernel PHY device
+ * @sys_clk: pointer to the system XTAL clock
  * @port_base: base register
  * @has_dual_port: if the phy has dual ports.
  * @bypass_pipe_rst: mark if 'mt7621_bypass_pipe_rst'
        struct device *dev;
        struct regmap *regmap;
        struct phy *phy;
+       struct clk *sys_clk;
        void __iomem *port_base;
        bool has_dual_port;
        bool bypass_pipe_rst;
        }
 }
 
-static void mt7621_set_phy_for_ssc(struct mt7621_pci_phy *phy)
+static int mt7621_set_phy_for_ssc(struct mt7621_pci_phy *phy)
 {
        struct device *dev = phy->dev;
-       u32 xtal_mode;
+       unsigned long clk_rate;
 
-       xtal_mode = FIELD_GET(XTAL_MASK, rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG0));
+       clk_rate = clk_get_rate(phy->sys_clk);
+       if (!clk_rate)
+               return -EINVAL;
 
        /* Set PCIe Port PHY to disable SSC */
        /* Debug Xtal Type */
                               RG_PE1_PHY_EN, RG_PE1_FRC_PHY_EN);
        }
 
-       if (xtal_mode <= 5 && xtal_mode >= 3) { /* 40MHz Xtal */
+       if (clk_rate == 40000000) { /* 40MHz Xtal */
                /* Set Pre-divider ratio (for host mode) */
                mt7621_phy_rmw(phy, RG_PE1_H_PLL_REG, RG_PE1_H_PLL_PREDIV,
                               FIELD_PREP(RG_PE1_H_PLL_PREDIV, 0x01));
 
                dev_dbg(dev, "Xtal is 40MHz\n");
-       } else if (xtal_mode >= 6) { /* 25MHz Xal */
+       } else if (clk_rate == 25000000) { /* 25MHz Xal */
                mt7621_phy_rmw(phy, RG_PE1_H_PLL_REG, RG_PE1_H_PLL_PREDIV,
                               FIELD_PREP(RG_PE1_H_PLL_PREDIV, 0x00));
 
        mt7621_phy_rmw(phy, RG_PE1_H_PLL_BR_REG, RG_PE1_H_PLL_BR,
                       FIELD_PREP(RG_PE1_H_PLL_BR, 0x00));
 
-       if (xtal_mode <= 5 && xtal_mode >= 3) { /* 40MHz Xtal */
+       if (clk_rate == 40000000) { /* 40MHz Xtal */
                /* set force mode enable of da_pe1_mstckdiv */
                mt7621_phy_rmw(phy, RG_PE1_MSTCKDIV_REG,
                               RG_PE1_MSTCKDIV | RG_PE1_FRC_MSTCKDIV,
                               FIELD_PREP(RG_PE1_MSTCKDIV, 0x01) |
                               RG_PE1_FRC_MSTCKDIV);
        }
+
+       return 0;
 }
 
 static int mt7621_pci_phy_init(struct phy *phy)
        if (mphy->bypass_pipe_rst)
                mt7621_bypass_pipe_rst(mphy);
 
-       mt7621_set_phy_for_ssc(mphy);
-
-       return 0;
+       return mt7621_set_phy_for_ssc(mphy);
 }
 
 static int mt7621_pci_phy_power_on(struct phy *phy)
                return PTR_ERR(phy->phy);
        }
 
+       phy->sys_clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(phy->sys_clk)) {
+               dev_err(dev, "failed to get phy clock\n");
+               return PTR_ERR(phy->sys_clk);
+       }
+
        phy_set_drvdata(phy->phy, phy);
 
        provider = devm_of_phy_provider_register(dev, mt7621_pcie_phy_of_xlate);