#include <linux/reset.h>
 #include <linux/slab.h>
 
+#include <ufs/unipro.h>
 #include "phy-qcom-qmp.h"
 #include "phy-qcom-qmp-pcs-ufs-v2.h"
 #include "phy-qcom-qmp-pcs-ufs-v3.h"
        const struct qmp_phy_cfg_tbls tbls;
        /* Additional sequence for HS Series B */
        const struct qmp_phy_cfg_tbls tbls_hs_b;
+       /* Additional sequence for HS G4 */
+       const struct qmp_phy_cfg_tbls tbls_hs_g4;
 
        /* clock ids to be requested */
        const char * const *clk_list;
 
        struct phy *phy;
        u32 mode;
+       u32 submode;
 };
 
 static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
        if (qmp->mode == PHY_MODE_UFS_HS_B)
                qmp_ufs_serdes_init(qmp, &cfg->tbls_hs_b);
        qmp_ufs_lanes_init(qmp, &cfg->tbls);
+       if (qmp->submode == UFS_HS_G4)
+               qmp_ufs_lanes_init(qmp, &cfg->tbls_hs_g4);
        qmp_ufs_pcs_init(qmp, &cfg->tbls);
+       if (qmp->submode == UFS_HS_G4)
+               qmp_ufs_pcs_init(qmp, &cfg->tbls_hs_g4);
 }
 
 static int qmp_ufs_com_init(struct qmp_ufs *qmp)
        struct qmp_ufs *qmp = phy_get_drvdata(phy);
 
        qmp->mode = mode;
+       qmp->submode = submode;
 
        return 0;
 }