mirror of
https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
synced 2025-09-26 10:28:29 +10:00
spi: Fixes for v6.6
A small collection of fixes, plus a new device ID for Intel Granite Rapids systems. The fix for the i.MX driver is fairly urgent, it's fixing a data corruption issue when bits per word isn't 8. There's also one fix which was queued but not sent for v6.4 due to being minor and arriving at the end of the release. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmUK64oACgkQJNaLcl1U h9AbJgf9F4aRSuHTYThemL6PRHpW2b0QCRFe4rbeho+H3JPmgQBPlrnriwbnL2kL oTcPQJgrP7wPQxoN4MSJ4JRh8Rkj7v5I9KOxe+TeIsxGeYpDnyLUDnhOAP6f2FZZ nlJ0fUKFRzobqAd2n9Wb15hF08rf/fFSI0KSjyN2EHCj02OLSu+IJQReXHvtbuZ3 TX3gW7FAgFqV/YzR3A2IBLteMhJPqQAY5U6x3DlIAVhgafww9nj4OyVjP5HftRSv zArx+mRoeaqqsUd/oodyPpMSuaspMyathdWvPfpNkGiRJgCVZ2FB3pfZbyK7tTk2 hAxGPpfe8WRMD4JpifSJggm4HR46Ng== =WxRo -----END PGP SIGNATURE----- Merge tag 'spi-fix-v6.6-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi Pull spi fixes from Mark Brown: "A small collection of fixes, plus a new device ID for Intel Granite Rapids systems. The fix for the i.MX driver is fairly urgent, it's fixing a data corruption issue when bits per word isn't 8. There's also one fix which was queued but not sent for v6.4 due to being minor and arriving at the end of the release" * tag 'spi-fix-v6.6-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: imx: Take in account bits per word instead of assuming 8-bits spi: intel-pci: Add support for Granite Rapids SPI serial flash spi: stm32: add a delay before SPI disable spi: nxp-fspi: reset the FLSHxCR1 registers spi: zynqmp-gqspi: fix clock imbalance on probe failure
This commit is contained in:
commit
5d2f53532e
@ -662,7 +662,7 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
|
||||
if (spi_imx->count >= 512)
|
||||
ctrl |= 0xFFF << MX51_ECSPI_CTRL_BL_OFFSET;
|
||||
else
|
||||
ctrl |= (spi_imx->count*8 - 1)
|
||||
ctrl |= (spi_imx->count * spi_imx->bits_per_word - 1)
|
||||
<< MX51_ECSPI_CTRL_BL_OFFSET;
|
||||
}
|
||||
|
||||
|
@ -72,6 +72,7 @@ static const struct pci_device_id intel_spi_pci_ids[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x4da4), (unsigned long)&bxt_info },
|
||||
{ PCI_VDEVICE(INTEL, 0x51a4), (unsigned long)&cnl_info },
|
||||
{ PCI_VDEVICE(INTEL, 0x54a4), (unsigned long)&cnl_info },
|
||||
{ PCI_VDEVICE(INTEL, 0x5794), (unsigned long)&cnl_info },
|
||||
{ PCI_VDEVICE(INTEL, 0x7a24), (unsigned long)&cnl_info },
|
||||
{ PCI_VDEVICE(INTEL, 0x7aa4), (unsigned long)&cnl_info },
|
||||
{ PCI_VDEVICE(INTEL, 0x7e23), (unsigned long)&cnl_info },
|
||||
|
@ -1084,6 +1084,13 @@ static int nxp_fspi_default_setup(struct nxp_fspi *f)
|
||||
fspi_writel(f, FSPI_AHBCR_PREF_EN | FSPI_AHBCR_RDADDROPT,
|
||||
base + FSPI_AHBCR);
|
||||
|
||||
/* Reset the FLSHxCR1 registers. */
|
||||
reg = FSPI_FLSHXCR1_TCSH(0x3) | FSPI_FLSHXCR1_TCSS(0x3);
|
||||
fspi_writel(f, reg, base + FSPI_FLSHA1CR1);
|
||||
fspi_writel(f, reg, base + FSPI_FLSHA2CR1);
|
||||
fspi_writel(f, reg, base + FSPI_FLSHB1CR1);
|
||||
fspi_writel(f, reg, base + FSPI_FLSHB2CR1);
|
||||
|
||||
/* AHB Read - Set lut sequence ID for all CS. */
|
||||
fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA1CR2);
|
||||
fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA2CR2);
|
||||
|
@ -277,6 +277,7 @@ struct stm32_spi_cfg {
|
||||
* @fifo_size: size of the embedded fifo in bytes
|
||||
* @cur_midi: master inter-data idleness in ns
|
||||
* @cur_speed: speed configured in Hz
|
||||
* @cur_half_period: time of a half bit in us
|
||||
* @cur_bpw: number of bits in a single SPI data frame
|
||||
* @cur_fthlv: fifo threshold level (data frames in a single data packet)
|
||||
* @cur_comm: SPI communication mode
|
||||
@ -304,6 +305,7 @@ struct stm32_spi {
|
||||
|
||||
unsigned int cur_midi;
|
||||
unsigned int cur_speed;
|
||||
unsigned int cur_half_period;
|
||||
unsigned int cur_bpw;
|
||||
unsigned int cur_fthlv;
|
||||
unsigned int cur_comm;
|
||||
@ -468,6 +470,8 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz,
|
||||
|
||||
spi->cur_speed = spi->clk_rate / (1 << mbrdiv);
|
||||
|
||||
spi->cur_half_period = DIV_ROUND_CLOSEST(USEC_PER_SEC, 2 * spi->cur_speed);
|
||||
|
||||
return mbrdiv - 1;
|
||||
}
|
||||
|
||||
@ -709,6 +713,10 @@ static void stm32h7_spi_disable(struct stm32_spi *spi)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Add a delay to make sure that transmission is ended. */
|
||||
if (spi->cur_half_period)
|
||||
udelay(spi->cur_half_period);
|
||||
|
||||
if (spi->cur_usedma && spi->dma_tx)
|
||||
dmaengine_terminate_async(spi->dma_tx);
|
||||
if (spi->cur_usedma && spi->dma_rx)
|
||||
|
@ -1340,9 +1340,9 @@ static int zynqmp_qspi_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
clk_dis_all:
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
clk_disable_unprepare(xqspi->refclk);
|
||||
clk_dis_pclk:
|
||||
clk_disable_unprepare(xqspi->pclk);
|
||||
@ -1366,11 +1366,15 @@ static void zynqmp_qspi_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct zynqmp_qspi *xqspi = platform_get_drvdata(pdev);
|
||||
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, 0x0);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
clk_disable_unprepare(xqspi->refclk);
|
||||
clk_disable_unprepare(xqspi->pclk);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
}
|
||||
|
||||
MODULE_DEVICE_TABLE(of, zynqmp_qspi_of_match);
|
||||
|
Loading…
Reference in New Issue
Block a user