On Tue, Dec 01, 2020 at 01:12:44PM -0800, Sowjanya Komatineni wrote: > + ret = devm_spi_register_master(&pdev->dev, master); [...] > +static int tegra_qspi_remove(struct platform_device *pdev) > +{ > + struct spi_master *master = platform_get_drvdata(pdev); > + struct tegra_qspi_data *tqspi = spi_master_get_devdata(master); > + > + free_irq(tqspi->irq, tqspi); > + > + tegra_qspi_deinit_dma_param(tqspi, false); > + tegra_qspi_deinit_dma_param(tqspi, true); > + > + pm_runtime_disable(&pdev->dev); > + if (!pm_runtime_status_suspended(&pdev->dev)) > + tegra_qspi_runtime_suspend(&pdev->dev); > + > + return 0; > +}
With devm_spi_register_master(), the SPI controller is unregistered *after* tegra_qspi_remove(). SPI transactions may still be ongoing until the SPI controller is unregistered, yet you perform teardown steps (such as freeing the IRQ) while it is still registered. Bottom line is, you can't use devm_spi_register_master() in this case. You need to use spi_register_master() and explicitly call spi_unregister_master() in tegra_qspi_remove() *before* performing teardown steps. However, be sure to use the devm variant to *allocate* the SPI controller, i.e. use devm_spi_alloc_master() instead of spi_alloc_master(). Thanks, Lukas