On Sat, Oct 19, 2019 at 11:26 AM Jarkko Nikula <jarkko.nikula@xxxxxxxxxxxxxxx> wrote: > > After commit 1e6959832510 ("spi: dw: Add basic runtime PM support") > there is following warning from PCI enumerated DesignWare SPI controller > during probe: > > dw_spi_pci 0000:00:13.0: Unbalanced pm_runtime_enable! > > Runtime PM is already enabled for PCI devices by the PCI core and doing > it again in common DW SPI code leads to unbalanced enable calls. > > Fix this by moving the runtime PM enable/disable calls to the platform > driver part of the driver. > Reviewed-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx> > Cc: Phil Edworthy <phil.edworthy@xxxxxxxxxxx> > Signed-off-by: Jarkko Nikula <jarkko.nikula@xxxxxxxxxxxxxxx> > --- > drivers/spi/spi-dw-mmio.c | 5 +++++ > drivers/spi/spi-dw.c | 7 ------- > 2 files changed, 5 insertions(+), 7 deletions(-) > > diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c > index b5ce8bd58d9e..384a3ab6dc2d 100644 > --- a/drivers/spi/spi-dw-mmio.c > +++ b/drivers/spi/spi-dw-mmio.c > @@ -9,6 +9,7 @@ > #include <linux/err.h> > #include <linux/interrupt.h> > #include <linux/platform_device.h> > +#include <linux/pm_runtime.h> > #include <linux/slab.h> > #include <linux/spi/spi.h> > #include <linux/scatterlist.h> > @@ -193,6 +194,8 @@ static int dw_spi_mmio_probe(struct platform_device *pdev) > goto out; > } > > + pm_runtime_enable(&pdev->dev); > + > ret = dw_spi_add_host(&pdev->dev, dws); > if (ret) > goto out; > @@ -201,6 +204,7 @@ static int dw_spi_mmio_probe(struct platform_device *pdev) > return 0; > > out: > + pm_runtime_disable(&pdev->dev); > clk_disable_unprepare(dwsmmio->pclk); > out_clk: > clk_disable_unprepare(dwsmmio->clk); > @@ -212,6 +216,7 @@ static int dw_spi_mmio_remove(struct platform_device *pdev) > struct dw_spi_mmio *dwsmmio = platform_get_drvdata(pdev); > > dw_spi_remove_host(&dwsmmio->dws); > + pm_runtime_disable(&pdev->dev); > clk_disable_unprepare(dwsmmio->pclk); > clk_disable_unprepare(dwsmmio->clk); > > diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c > index 54ed6eb3e252..466f5c67843b 100644 > --- a/drivers/spi/spi-dw.c > +++ b/drivers/spi/spi-dw.c > @@ -10,7 +10,6 @@ > #include <linux/module.h> > #include <linux/highmem.h> > #include <linux/delay.h> > -#include <linux/pm_runtime.h> > #include <linux/slab.h> > #include <linux/spi/spi.h> > > @@ -499,8 +498,6 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) > if (dws->set_cs) > master->set_cs = dws->set_cs; > > - pm_runtime_enable(dev); > - > /* Basic HW init */ > spi_hw_init(dev, dws); > > @@ -529,7 +526,6 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) > spi_enable_chip(dws, 0); > free_irq(dws->irq, master); > err_free_master: > - pm_runtime_disable(dev); > spi_controller_put(master); > return ret; > } > @@ -544,9 +540,6 @@ void dw_spi_remove_host(struct dw_spi *dws) > > spi_shutdown_chip(dws); > > - if (dws->master) > - pm_runtime_disable(&dws->master->dev); > - > free_irq(dws->irq, dws->master); > } > EXPORT_SYMBOL_GPL(dw_spi_remove_host); > -- > 2.23.0 > -- With Best Regards, Andy Shevchenko