Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: stm32-qspi: Update spi registering

Some device driver need to communicate to qspi device during the remove
process, qspi controller must be functional when spi_unregister_master()
is called.

To ensure this, replace devm_spi_register_master() by spi_register_master()
and spi_unregister_master() is called directly in .remove callback before
stopping the qspi controller.

This issue was put in evidence using kernel v5.11 and later
with a spi-nor which supports the software reset feature introduced
by commit d73ee7534cc5 ("mtd: spi-nor: core: perform a Soft Reset on
shutdown")

Fixes: c530cd1d9d5e ("spi: spi-mem: add stm32 qspi controller")

Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
Cc: <stable@vger.kernel.org> # 5.8.x
Reviewed-by: Lukas Wunner <lukas@wunner.de>
Link: https://lore.kernel.org/r/20220117121744.29729-1-patrice.chotard@foss.st.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Patrice Chotard and committed by
Mark Brown
e4d63473 44ea6281

+17 -30
+17 -30
drivers/spi/spi-stm32-qspi.c
··· 688 688 struct resource *res; 689 689 int ret, irq; 690 690 691 - ctrl = spi_alloc_master(dev, sizeof(*qspi)); 691 + ctrl = devm_spi_alloc_master(dev, sizeof(*qspi)); 692 692 if (!ctrl) 693 693 return -ENOMEM; 694 694 ··· 697 697 698 698 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi"); 699 699 qspi->io_base = devm_ioremap_resource(dev, res); 700 - if (IS_ERR(qspi->io_base)) { 701 - ret = PTR_ERR(qspi->io_base); 702 - goto err_master_put; 703 - } 700 + if (IS_ERR(qspi->io_base)) 701 + return PTR_ERR(qspi->io_base); 704 702 705 703 qspi->phys_base = res->start; 706 704 707 705 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi_mm"); 708 706 qspi->mm_base = devm_ioremap_resource(dev, res); 709 - if (IS_ERR(qspi->mm_base)) { 710 - ret = PTR_ERR(qspi->mm_base); 711 - goto err_master_put; 712 - } 707 + if (IS_ERR(qspi->mm_base)) 708 + return PTR_ERR(qspi->mm_base); 713 709 714 710 qspi->mm_size = resource_size(res); 715 - if (qspi->mm_size > STM32_QSPI_MAX_MMAP_SZ) { 716 - ret = -EINVAL; 717 - goto err_master_put; 718 - } 711 + if (qspi->mm_size > STM32_QSPI_MAX_MMAP_SZ) 712 + return -EINVAL; 719 713 720 714 irq = platform_get_irq(pdev, 0); 721 - if (irq < 0) { 722 - ret = irq; 723 - goto err_master_put; 724 - } 715 + if (irq < 0) 716 + return irq; 725 717 726 718 ret = devm_request_irq(dev, irq, stm32_qspi_irq, 0, 727 719 dev_name(dev), qspi); 728 720 if (ret) { 729 721 dev_err(dev, "failed to request irq\n"); 730 - goto err_master_put; 722 + return ret; 731 723 } 732 724 733 725 init_completion(&qspi->data_completion); 734 726 init_completion(&qspi->match_completion); 735 727 736 728 qspi->clk = devm_clk_get(dev, NULL); 737 - if (IS_ERR(qspi->clk)) { 738 - ret = PTR_ERR(qspi->clk); 739 - goto err_master_put; 740 - } 729 + if (IS_ERR(qspi->clk)) 730 + return PTR_ERR(qspi->clk); 741 731 742 732 qspi->clk_rate = clk_get_rate(qspi->clk); 743 - if (!qspi->clk_rate) { 744 - ret = -EINVAL; 745 - goto err_master_put; 746 - } 733 + if (!qspi->clk_rate) 734 + return -EINVAL; 747 735 748 736 ret = clk_prepare_enable(qspi->clk); 749 737 if (ret) { 750 738 dev_err(dev, "can not enable the clock\n"); 751 - goto err_master_put; 739 + return ret; 752 740 } 753 741 754 742 rstc = devm_reset_control_get_exclusive(dev, NULL); ··· 772 784 pm_runtime_enable(dev); 773 785 pm_runtime_get_noresume(dev); 774 786 775 - ret = devm_spi_register_master(dev, ctrl); 787 + ret = spi_register_master(ctrl); 776 788 if (ret) 777 789 goto err_pm_runtime_free; 778 790 ··· 794 806 stm32_qspi_dma_free(qspi); 795 807 err_clk_disable: 796 808 clk_disable_unprepare(qspi->clk); 797 - err_master_put: 798 - spi_master_put(qspi->ctrl); 799 809 800 810 return ret; 801 811 } ··· 803 817 struct stm32_qspi *qspi = platform_get_drvdata(pdev); 804 818 805 819 pm_runtime_get_sync(qspi->dev); 820 + spi_unregister_master(qspi->ctrl); 806 821 /* disable qspi */ 807 822 writel_relaxed(0, qspi->io_base + QSPI_CR); 808 823 stm32_qspi_dma_free(qspi);