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

Reply via email to