Message ID | 1622117044-7583-1-git-send-email-qii.wang@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | i2c: mediatek: Disable i2c start_en and clear intr_stat brfore reset | expand |
On Thu, May 27, 2021 at 08:04:04PM +0800, qii.wang@mediatek.com wrote: > From: Qii Wang <qii.wang@mediatek.com> > > The i2c controller driver do dma reset after transfer timeout, > but sometimes dma reset will trigger an unexpected DMA_ERR irq. > It will cause the i2c controller to continuously send interrupts > to the system and cause soft lock-up. So we need to disable i2c > start_en and clear intr_stat to stop i2c controller before dma > reset when transfer timeout. > > Signed-off-by: Qii Wang <qii.wang@mediatek.com> Is there a suitable Fixes tag for this?
On Thu, 2021-05-27 at 22:14 +0200, Wolfram Sang wrote: > On Thu, May 27, 2021 at 08:04:04PM +0800, qii.wang@mediatek.com wrote: > > From: Qii Wang <qii.wang@mediatek.com> > > > > The i2c controller driver do dma reset after transfer timeout, > > but sometimes dma reset will trigger an unexpected DMA_ERR irq. > > It will cause the i2c controller to continuously send interrupts > > to the system and cause soft lock-up. So we need to disable i2c > > start_en and clear intr_stat to stop i2c controller before dma > > reset when transfer timeout. > > > > Signed-off-by: Qii Wang <qii.wang@mediatek.com> > > Is there a suitable Fixes tag for this? > Can you help to add the following tag, thanks Fixes: aafced673c06("i2c: mediatek: move dma reset before i2c reset")
On Fri, May 28, 2021 at 09:37:43AM +0800, Qii Wang wrote: > On Thu, 2021-05-27 at 22:14 +0200, Wolfram Sang wrote: > > On Thu, May 27, 2021 at 08:04:04PM +0800, qii.wang@mediatek.com wrote: > > > From: Qii Wang <qii.wang@mediatek.com> > > > > > > The i2c controller driver do dma reset after transfer timeout, > > > but sometimes dma reset will trigger an unexpected DMA_ERR irq. > > > It will cause the i2c controller to continuously send interrupts > > > to the system and cause soft lock-up. So we need to disable i2c > > > start_en and clear intr_stat to stop i2c controller before dma > > > reset when transfer timeout. > > > > > > Signed-off-by: Qii Wang <qii.wang@mediatek.com> > > > > Is there a suitable Fixes tag for this? > > > > Can you help to add the following tag, thanks > Fixes: aafced673c06("i2c: mediatek: move dma reset before i2c reset") Added this tag and applied to for-current, thanks!
diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c index ea337ba..bfd80b2 100644 --- a/drivers/i2c/busses/i2c-mt65xx.c +++ b/drivers/i2c/busses/i2c-mt65xx.c @@ -479,6 +479,11 @@ static void mtk_i2c_clock_disable(struct mtk_i2c *i2c) static void mtk_i2c_init_hw(struct mtk_i2c *i2c) { u16 control_reg; + u16 intr_stat_reg; + + mtk_i2c_writew(i2c, I2C_CHN_CLR_FLAG, OFFSET_START); + intr_stat_reg = mtk_i2c_readw(i2c, OFFSET_INTR_STAT); + mtk_i2c_writew(i2c, intr_stat_reg, OFFSET_INTR_STAT); if (i2c->dev_comp->apdma_sync) { writel(I2C_DMA_WARM_RST, i2c->pdmabase + OFFSET_RST);