FAILED: patch "[PATCH] spi: bcm-qspi: clear MSPI spifie interrupt during probe" failed to apply to 5.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 75b3cb97eb1f05042745c0655a7145b0262d4c5c Mon Sep 17 00:00:00 2001
From: Kamal Dasu <[email protected]>
Date: Fri, 8 Oct 2021 16:36:02 -0400
Subject: [PATCH] spi: bcm-qspi: clear MSPI spifie interrupt during probe
Intermittent Kernel crash has been observed on probe in bcm_qspi_mspi_l2_isr() handler when the MSPI spifie interrupt bit has not been cleared before registering for interrupts. Fix the driver to move SoC specific custom interrupt handling code before we register IRQ in probe. Also clear MSPI interrupt status resgiter prior to registering IRQ handlers.
drivers/spi/spi-bcm-qspi.c +45 -32
@@ -1250,10 +1250,14 @@ static void bcm_qspi_hw_init(struct bcm_qspi *qspi)static void bcm_qspi_hw_uninit (struct bcm_qspi *qspi) { +u32 status =bcm_qspi_read (qspi,MSPI ,MSPI_MSPI_STATUS ); +bcm_qspi_write (qspi,MSPI ,MSPI_SPCR2 ,0 );if (has_bspi (qspi))bcm_qspi_write (qspi,MSPI ,MSPI_WRITE_LOCK ,0 ); +/* clear interrupt */ +bcm_qspi_write (qspi,MSPI ,MSPI_MSPI_STATUS , status & ~1 ); }static const struct spi_controller_mem_ops bcm_qspi_mem_ops = {
@@ -1397,6 +1401,47 @@ int bcm_qspi_probe(struct platform_device *pdev,if (!qspi->dev_ids)return -ENOMEM ; +/* +* Some SoCs integrate spi controller (e.g., its interrupt bits) +* in specific ways +*/ +if (soc_intc) { + qspi->soc_intc = soc_intc; + soc_intc->bcm_qspi_int_set (soc_intc,MSPI_DONE , true); + }else { + qspi->soc_intc =NULL ; + } + +if (qspi->clk) { + ret =clk_prepare_enable (qspi->clk); +if (ret) { +dev_err (dev,"failed to prepare clock\n" ); + goto qspi_probe_err; + } + qspi->base_clk =clk_get_rate (qspi->clk); + }else { + qspi->base_clk =MSPI_BASE_FREQ ; + } + +if (data->has_mspi_rev) { + rev =bcm_qspi_read (qspi,MSPI ,MSPI_REV ); +/* some older revs do not have a MSPI_REV register */ +if ((rev &0xff ) ==0xff ) + rev =0 ; + } + + qspi->mspi_maj_rev = (rev >>4 ) &0xf ; + qspi->mspi_min_rev = rev &0xf ; + qspi->mspi_spcr3_sysclk = data->has_spcr3_sysclk; + + qspi->max_speed_hz = qspi->base_clk / (bcm_qspi_spbr_min (qspi) *2 ); + +/* +* On SW resets it is possible to have the mask still enabled +* Need to disable the mask and clear the status while we init +*/ +bcm_qspi_hw_uninit (qspi); +for (val =0 ; val < num_irqs; val++) { irq =-1 ; name = qspi_irq_tab[val].irq_name;
@@ -1433,38 +1478,6 @@ int bcm_qspi_probe(struct platform_device *pdev, goto qspi_probe_err; } -/* -* Some SoCs integrate spi controller (e.g., its interrupt bits) -* in specific ways -*/ -if (soc_intc) { - qspi->soc_intc = soc_intc; - soc_intc->bcm_qspi_int_set (soc_intc,MSPI_DONE , true); - }else { - qspi->soc_intc =NULL ; - } - - ret =clk_prepare_enable (qspi->clk); -if (ret) { -dev_err (dev,"failed to prepare clock\n" ); - goto qspi_probe_err; - } - - qspi->base_clk =clk_get_rate (qspi->clk); - -if (data->has_mspi_rev) { - rev =bcm_qspi_read (qspi,MSPI ,MSPI_REV ); -/* some older revs do not have a MSPI_REV register */ -if ((rev &0xff ) ==0xff ) - rev =0 ; - } - - qspi->mspi_maj_rev = (rev >>4 ) &0xf ; - qspi->mspi_min_rev = rev &0xf ; - qspi->mspi_spcr3_sysclk = data->has_spcr3_sysclk; - - qspi->max_speed_hz = qspi->base_clk / (bcm_qspi_spbr_min (qspi) *2 ); -bcm_qspi_hw_init (qspi);init_completion (&qspi->mspi_done);init_completion (&qspi->bspi_done);