};
 MODULE_DEVICE_TABLE(mhi, qcom_mhi_qrtr_id_table);
 
+static int __maybe_unused qcom_mhi_qrtr_pm_suspend_late(struct device *dev)
+{
+       struct mhi_device *mhi_dev = container_of(dev, struct mhi_device, dev);
+       enum mhi_state state;
+
+       state = mhi_get_mhi_state(mhi_dev->mhi_cntrl);
+       /*
+        * If the device is in suspend state, then no need for the
+        * client driver to unprepare the channels.
+        */
+       if (state == MHI_STATE_M3)
+               return 0;
+
+       mhi_unprepare_from_transfer(mhi_dev);
+
+       return 0;
+}
+
+static int __maybe_unused qcom_mhi_qrtr_pm_resume_early(struct device *dev)
+{
+       struct mhi_device *mhi_dev = container_of(dev, struct mhi_device, dev);
+       enum mhi_state state;
+       int rc;
+
+       state = mhi_get_mhi_state(mhi_dev->mhi_cntrl);
+       /*
+        * If the device is in suspend state, we won't unprepare channels
+        * in suspend callback, therefore no need to prepare channels when
+        * resume.
+        */
+       if (state == MHI_STATE_M3)
+               return 0;
+
+       rc = mhi_prepare_for_transfer_autoqueue(mhi_dev);
+       if (rc)
+               dev_err(dev, "failed to prepare for autoqueue transfer %d\n", rc);
+
+       return rc;
+}
+
+static const struct dev_pm_ops qcom_mhi_qrtr_pm_ops = {
+       SET_LATE_SYSTEM_SLEEP_PM_OPS(qcom_mhi_qrtr_pm_suspend_late,
+                                    qcom_mhi_qrtr_pm_resume_early)
+};
+
 static struct mhi_driver qcom_mhi_qrtr_driver = {
        .probe = qcom_mhi_qrtr_probe,
        .remove = qcom_mhi_qrtr_remove,
        .id_table = qcom_mhi_qrtr_id_table,
        .driver = {
                .name = "qcom_mhi_qrtr",
+               .pm = &qcom_mhi_qrtr_pm_ops,
        },
 };