}
 EXPORT_SYMBOL_GPL(hisi_sas_scan_finished);
 
-static void hisi_sas_phyup_work(struct work_struct *work)
+static void hisi_sas_phyup_work_common(struct work_struct *work,
+               enum hisi_sas_phy_event event)
 {
        struct hisi_sas_phy *phy =
-               container_of(work, typeof(*phy), works[HISI_PHYE_PHY_UP]);
+               container_of(work, typeof(*phy), works[event]);
        struct hisi_hba *hisi_hba = phy->hisi_hba;
        struct asd_sas_phy *sas_phy = &phy->sas_phy;
        int phy_no = sas_phy->id;
        hisi_sas_bytes_dmaed(hisi_hba, phy_no, GFP_KERNEL);
 }
 
+static void hisi_sas_phyup_work(struct work_struct *work)
+{
+       hisi_sas_phyup_work_common(work, HISI_PHYE_PHY_UP);
+}
+
 static void hisi_sas_linkreset_work(struct work_struct *work)
 {
        struct hisi_sas_phy *phy =
        hisi_sas_control_phy(sas_phy, PHY_FUNC_LINK_RESET, NULL);
 }
 
+static void hisi_sas_phyup_pm_work(struct work_struct *work)
+{
+       struct hisi_sas_phy *phy =
+               container_of(work, typeof(*phy), works[HISI_PHYE_PHY_UP_PM]);
+       struct hisi_hba *hisi_hba = phy->hisi_hba;
+       struct device *dev = hisi_hba->dev;
+
+       hisi_sas_phyup_work_common(work, HISI_PHYE_PHY_UP_PM);
+       pm_runtime_put_sync(dev);
+}
+
 static const work_func_t hisi_sas_phye_fns[HISI_PHYES_NUM] = {
        [HISI_PHYE_PHY_UP] = hisi_sas_phyup_work,
        [HISI_PHYE_LINK_RESET] = hisi_sas_linkreset_work,
+       [HISI_PHYE_PHY_UP_PM] = hisi_sas_phyup_pm_work,
 };
 
 bool hisi_sas_notify_phy_event(struct hisi_sas_phy *phy,