diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index e43c46c8acc2..09edf862f896 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -3213,6 +3213,7 @@ int gsi_stop_channel(unsigned long chan_hdl) int res; uint32_t val; struct gsi_chan_ctx *ctx; + unsigned long flags; if (!gsi_ctx) { pr_err("%s:%d gsi context not allocated\n", __func__, __LINE__); @@ -3279,6 +3280,15 @@ int gsi_stop_channel(unsigned long chan_hdl) goto free_lock; } + /* If channel is stopped succesfully and has an event with IRQ type MSI + - clear IEOB */ + if (ctx->evtr && ctx->evtr->props.intr == GSI_INTR_MSI) { + spin_lock_irqsave(&ctx->evtr->ring.slock, flags); + gsi_writel(1 << ctx->evtr->id, gsi_ctx->base + + GSI_EE_n_CNTXT_SRC_IEOB_IRQ_CLR_OFFS(gsi_ctx->per.ee)); + spin_unlock_irqrestore(&ctx->evtr->ring.slock, flags); + } + res = GSI_STATUS_SUCCESS; free_lock: