On Nov 14 2022 13:56, Sibi Sankar wrote: (snip) > +static irqreturn_t qcom_scm_irq_handler(int irq, void *data) > +{ > + int ret; > + struct qcom_scm *scm = data; > + struct completion *wq_to_wake; > + u32 wq_ctx, flags, more_pending = 0; > + > + do { > + ret = scm_get_wq_ctx(&wq_ctx, &flags, &more_pending); > + if (ret) { > + dev_err(scm->dev, "GET_WQ_CTX SMC call failed: %d\n", ret); > + goto out; > + } > + > + wq_to_wake = qcom_scm_lookup_wq(scm, wq_ctx); > + if (IS_ERR_OR_NULL(wq_to_wake)) { > + dev_err(scm->dev, "No waitqueue found for wq_ctx %d: %ld\n", > + wq_ctx, PTR_ERR(wq_to_wake)); > + goto out; > + } > + > + if (flags != QCOM_SMC_WAITQ_FLAG_WAKE_ONE && > + flags != QCOM_SMC_WAITQ_FLAG_WAKE_ALL) { > + dev_err(scm->dev, "Invalid Flags found for wq_ctx: %u\n", flags); > + goto out; > + } > + > + complete(wq_to_wake); Need to call complete() or complete_all() based on the flags. > + } while (more_pending); > + > +out: > + return IRQ_HANDLED; > +}