#include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
+#include <linux/pm_wakeirq.h>
 #include <linux/slimbus.h>
 #include <linux/soundwire/sdw.h>
 #include <linux/soundwire/sdw_registers.h>
        u8 rd_cmd_id;
        int irq;
        unsigned int version;
+       int wake_irq;
        int num_din_ports;
        int num_dout_ports;
        int cols_index;
        return 0;
 }
 
+static irqreturn_t qcom_swrm_wake_irq_handler(int irq, void *dev_id)
+{
+       struct qcom_swrm_ctrl *swrm = dev_id;
+       int ret;
+
+       ret = pm_runtime_get_sync(swrm->dev);
+       if (ret < 0 && ret != -EACCES) {
+               dev_err_ratelimited(swrm->dev,
+                                   "pm_runtime_get_sync failed in %s, ret %d\n",
+                                   __func__, ret);
+               pm_runtime_put_noidle(swrm->dev);
+       }
+
+       if (swrm->wake_irq > 0) {
+               if (!irqd_irq_disabled(irq_get_irq_data(swrm->wake_irq)))
+                       disable_irq_nosync(swrm->wake_irq);
+       }
+
+       pm_runtime_mark_last_busy(swrm->dev);
+       pm_runtime_put_autosuspend(swrm->dev);
+
+       return IRQ_HANDLED;
+}
+
 static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
 {
        struct qcom_swrm_ctrl *swrm = dev_id;
                goto err_clk;
        }
 
+       ctrl->wake_irq = of_irq_get(dev->of_node, 1);
+       if (ctrl->wake_irq > 0) {
+               ret = devm_request_threaded_irq(dev, ctrl->wake_irq, NULL,
+                                               qcom_swrm_wake_irq_handler,
+                                               IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
+                                               "swr_wake_irq", ctrl);
+               if (ret) {
+                       dev_err(dev, "Failed to request soundwire wake irq\n");
+                       goto err_init;
+               }
+       }
+
        ret = sdw_bus_master_add(&ctrl->bus, dev, dev->fwnode);
        if (ret) {
                dev_err(dev, "Failed to register Soundwire controller (%d)\n",
        struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dev);
        int ret;
 
+       if (ctrl->wake_irq > 0) {
+               if (!irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq)))
+                       disable_irq_nosync(ctrl->wake_irq);
+       }
+
        clk_prepare_enable(ctrl->hclk);
 
        if (ctrl->clock_stop_not_supported) {
 
        usleep_range(300, 305);
 
+       if (ctrl->wake_irq > 0) {
+               if (irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq)))
+                       enable_irq(ctrl->wake_irq);
+       }
+
        return 0;
 }