/* Timeout values */
 #define TIMEOUT_US                     1000
 
+/* Lane 0/1/2/3 offset */
+#define DIG_8(n)               ((0x4000 * (n)) + 0x1074)
+#define ILL13(n)               ((0x4000 * (n)) + 0x1994)
+#define DIG_10(n)              ((0x4000 * (n)) + 0x107c)
+#define RST_DLY(n)             ((0x4000 * (n)) + 0x19a4)
+#define BYP_15(n)              ((0x4000 * (n)) + 0x1038)
+#define BYP_12(n)              ((0x4000 * (n)) + 0x102c)
+#define MISC3(n)               ((0x4000 * (n)) + 0x19ac)
+#define EQ11(n)                        ((0x4000 * (n)) + 0x1978)
+
+static u32 save_reg_address[] = {
+       /* Lane 0/1/2/3 Register */
+       DIG_8(0), ILL13(0), DIG_10(0), RST_DLY(0), BYP_15(0), BYP_12(0), MISC3(0), EQ11(0),
+       DIG_8(1), ILL13(1), DIG_10(1), RST_DLY(1), BYP_15(1), BYP_12(1), MISC3(1), EQ11(1),
+       DIG_8(2), ILL13(2), DIG_10(2), RST_DLY(2), BYP_15(2), BYP_12(2), MISC3(2), EQ11(2),
+       DIG_8(3), ILL13(3), DIG_10(3), RST_DLY(3), BYP_15(3), BYP_12(3), MISC3(3), EQ11(3),
+};
+
 struct xpsgtr_dev;
 
 /**
  * @tx_term_fix: fix for GT issue
  * @saved_icm_cfg0: stored value of ICM CFG0 register
  * @saved_icm_cfg1: stored value of ICM CFG1 register
+ * @saved_regs: registers to be saved/restored during suspend/resume
  */
 struct xpsgtr_dev {
        struct device *dev;
        bool tx_term_fix;
        unsigned int saved_icm_cfg0;
        unsigned int saved_icm_cfg1;
+       u32 *saved_regs;
 };
 
 /*
        writel((readl(addr) & ~clr) | set, addr);
 }
 
+/**
+ * xpsgtr_save_lane_regs - Saves registers on suspend
+ * @gtr_dev: pointer to phy controller context structure
+ */
+static void xpsgtr_save_lane_regs(struct xpsgtr_dev *gtr_dev)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(save_reg_address); i++)
+               gtr_dev->saved_regs[i] = xpsgtr_read(gtr_dev,
+                                                    save_reg_address[i]);
+}
+
+/**
+ * xpsgtr_restore_lane_regs - Restores registers on resume
+ * @gtr_dev: pointer to phy controller context structure
+ */
+static void xpsgtr_restore_lane_regs(struct xpsgtr_dev *gtr_dev)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(save_reg_address); i++)
+               xpsgtr_write(gtr_dev, save_reg_address[i],
+                            gtr_dev->saved_regs[i]);
+}
+
 /*
  * Hardware Configuration
  */
        gtr_dev->saved_icm_cfg0 = xpsgtr_read(gtr_dev, ICM_CFG0);
        gtr_dev->saved_icm_cfg1 = xpsgtr_read(gtr_dev, ICM_CFG1);
 
+       xpsgtr_save_lane_regs(gtr_dev);
+
        return 0;
 }
 
        unsigned int i;
        bool skip_phy_init;
 
+       xpsgtr_restore_lane_regs(gtr_dev);
+
        icm_cfg0 = xpsgtr_read(gtr_dev, ICM_CFG0);
        icm_cfg1 = xpsgtr_read(gtr_dev, ICM_CFG1);
 
                return ret;
        }
 
+       gtr_dev->saved_regs = devm_kmalloc(gtr_dev->dev,
+                                          sizeof(save_reg_address),
+                                          GFP_KERNEL);
+       if (!gtr_dev->saved_regs)
+               return -ENOMEM;
+
        return 0;
 }