Message ID | 1723554938-23852-2-git-send-email-quic_msarkar@quicinc.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Fix unmasking interrupt bit and remove watermark interrupt enablement | expand |
Hi Mrinmay On Tue, Aug 13, 2024 at 06:45:37PM +0530, Mrinmay Sarkar wrote: > The current logic is enabling both STOP_INT_MASK and ABORT_INT_MASK > bit. This is apparently masking those particular interrupts rather than > unmasking the same. If the interrupts are masked, they would never get > triggered. > > So fix the issue by unmasking the STOP and ABORT interrupts properly. > > Fixes: e74c39573d35 ("dmaengine: dw-edma: Add support for native HDMA") > cc: stable@vger.kernel.org > Signed-off-by: Mrinmay Sarkar <quic_msarkar@quicinc.com> > Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> > --- > drivers/dma/dw-edma/dw-hdma-v0-core.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/drivers/dma/dw-edma/dw-hdma-v0-core.c b/drivers/dma/dw-edma/dw-hdma-v0-core.c > index 10e8f07..a0aabdd 100644 > --- a/drivers/dma/dw-edma/dw-hdma-v0-core.c > +++ b/drivers/dma/dw-edma/dw-hdma-v0-core.c > @@ -247,10 +247,11 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk *chunk, bool first) > if (first) { > /* Enable engine */ > SET_CH_32(dw, chan->dir, chan->id, ch_en, BIT(0)); > - /* Interrupt enable&unmask - done, abort */ > - tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup) | > - HDMA_V0_STOP_INT_MASK | HDMA_V0_ABORT_INT_MASK | > - HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; > + /* Interrupt unmask - stop, abort */ > + tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup) & > + ~HDMA_V0_STOP_INT_MASK & ~HDMA_V0_ABORT_INT_MASK; The gist of my v2 comment was to convert the chunk above to: tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup); tmp &= ~(HDMA_V0_STOP_INT_MASK | HDMA_V0_ABORT_INT_MASK); This is a clearer representation of the IRQs _unmasking_. Moreover the code will turn to looking a bit more like what is implemented in the similar part of the dw-edma-v0-core.c driver. -Serge(y) > + /* Interrupt enable - stop, abort */ > + tmp |= HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; > if (!(dw->chip->flags & DW_EDMA_CHIP_LOCAL)) > tmp |= HDMA_V0_REMOTE_STOP_INT_EN | HDMA_V0_REMOTE_ABORT_INT_EN; > SET_CH_32(dw, chan->dir, chan->id, int_setup, tmp); > -- > 2.7.4 >
diff --git a/drivers/dma/dw-edma/dw-hdma-v0-core.c b/drivers/dma/dw-edma/dw-hdma-v0-core.c index 10e8f07..a0aabdd 100644 --- a/drivers/dma/dw-edma/dw-hdma-v0-core.c +++ b/drivers/dma/dw-edma/dw-hdma-v0-core.c @@ -247,10 +247,11 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk *chunk, bool first) if (first) { /* Enable engine */ SET_CH_32(dw, chan->dir, chan->id, ch_en, BIT(0)); - /* Interrupt enable&unmask - done, abort */ - tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup) | - HDMA_V0_STOP_INT_MASK | HDMA_V0_ABORT_INT_MASK | - HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; + /* Interrupt unmask - stop, abort */ + tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup) & + ~HDMA_V0_STOP_INT_MASK & ~HDMA_V0_ABORT_INT_MASK; + /* Interrupt enable - stop, abort */ + tmp |= HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; if (!(dw->chip->flags & DW_EDMA_CHIP_LOCAL)) tmp |= HDMA_V0_REMOTE_STOP_INT_EN | HDMA_V0_REMOTE_ABORT_INT_EN; SET_CH_32(dw, chan->dir, chan->id, int_setup, tmp);