Message ID | 1610180990-23496-1-git-send-email-qii.wang@mediatek.com |
---|---|
State | Accepted |
Commit | de96c3943f591018727b862f51953c1b6c55bcc3 |
Headers | show |
Series | [RESEND,V2] i2c: mediatek: Move suspend and resume handling to NOIRQ phase | expand |
Hi Wolfram, On Sat, 2021-01-09 at 16:29 +0800, qii.wang@mediatek.com wrote: > From: Qii Wang <qii.wang@mediatek.com> > > Some i2c device driver indirectly uses I2C driver when it is now > being suspended. The i2c devices driver is suspended during the > NOIRQ phase and this cannot be changed due to other dependencies. > Therefore, we also need to move the suspend handling for the I2C > controller driver to the NOIRQ phase as well. > > Signed-off-by: Qii Wang <qii.wang@mediatek.com> > --- > > Changes in v2: > - Replied some comments > - Fixed the wrong spelling medaitek to mediatek > > drivers/i2c/busses/i2c-mt65xx.c | 19 ++++++++++++++++--- > 1 file changed, 16 insertions(+), 3 deletions(-) > I haven't seen any new comments, can it go into 5.11? Thanks Qii
On Tue, Jan 26, 2021 at 07:37:00PM +0800, Qii Wang wrote: > Hi Wolfram, > > On Sat, 2021-01-09 at 16:29 +0800, qii.wang@mediatek.com wrote: > > From: Qii Wang <qii.wang@mediatek.com> > > > > Some i2c device driver indirectly uses I2C driver when it is now > > being suspended. The i2c devices driver is suspended during the > > NOIRQ phase and this cannot be changed due to other dependencies. > > Therefore, we also need to move the suspend handling for the I2C > > controller driver to the NOIRQ phase as well. > > > > Signed-off-by: Qii Wang <qii.wang@mediatek.com> Applied to for-current, thanks!
diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c index 0818d3e..2ffd2f3 100644 --- a/drivers/i2c/busses/i2c-mt65xx.c +++ b/drivers/i2c/busses/i2c-mt65xx.c @@ -1275,7 +1275,8 @@ static int mtk_i2c_probe(struct platform_device *pdev) mtk_i2c_clock_disable(i2c); ret = devm_request_irq(&pdev->dev, irq, mtk_i2c_irq, - IRQF_TRIGGER_NONE, I2C_DRV_NAME, i2c); + IRQF_NO_SUSPEND | IRQF_TRIGGER_NONE, + I2C_DRV_NAME, i2c); if (ret < 0) { dev_err(&pdev->dev, "Request I2C IRQ %d fail\n", irq); @@ -1302,7 +1303,16 @@ static int mtk_i2c_remove(struct platform_device *pdev) } #ifdef CONFIG_PM_SLEEP -static int mtk_i2c_resume(struct device *dev) +static int mtk_i2c_suspend_noirq(struct device *dev) +{ + struct mtk_i2c *i2c = dev_get_drvdata(dev); + + i2c_mark_adapter_suspended(&i2c->adap); + + return 0; +} + +static int mtk_i2c_resume_noirq(struct device *dev) { int ret; struct mtk_i2c *i2c = dev_get_drvdata(dev); @@ -1317,12 +1327,15 @@ static int mtk_i2c_resume(struct device *dev) mtk_i2c_clock_disable(i2c); + i2c_mark_adapter_resumed(&i2c->adap); + return 0; } #endif static const struct dev_pm_ops mtk_i2c_pm = { - SET_SYSTEM_SLEEP_PM_OPS(NULL, mtk_i2c_resume) + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(mtk_i2c_suspend_noirq, + mtk_i2c_resume_noirq) }; static struct platform_driver mtk_i2c_driver = {