Commit 5d2f5353 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 1c0a21da 4221a2be
...@@ -662,7 +662,7 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx, ...@@ -662,7 +662,7 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
if (spi_imx->count >= 512) if (spi_imx->count >= 512)
ctrl |= 0xFFF << MX51_ECSPI_CTRL_BL_OFFSET; ctrl |= 0xFFF << MX51_ECSPI_CTRL_BL_OFFSET;
else else
ctrl |= (spi_imx->count*8 - 1) ctrl |= (spi_imx->count * spi_imx->bits_per_word - 1)
<< MX51_ECSPI_CTRL_BL_OFFSET; << MX51_ECSPI_CTRL_BL_OFFSET;
} }
......
...@@ -72,6 +72,7 @@ static const struct pci_device_id intel_spi_pci_ids[] = { ...@@ -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, 0x4da4), (unsigned long)&bxt_info },
{ PCI_VDEVICE(INTEL, 0x51a4), (unsigned long)&cnl_info }, { PCI_VDEVICE(INTEL, 0x51a4), (unsigned long)&cnl_info },
{ PCI_VDEVICE(INTEL, 0x54a4), (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, 0x7a24), (unsigned long)&cnl_info },
{ PCI_VDEVICE(INTEL, 0x7aa4), (unsigned long)&cnl_info }, { PCI_VDEVICE(INTEL, 0x7aa4), (unsigned long)&cnl_info },
{ PCI_VDEVICE(INTEL, 0x7e23), (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) ...@@ -1084,6 +1084,13 @@ static int nxp_fspi_default_setup(struct nxp_fspi *f)
fspi_writel(f, FSPI_AHBCR_PREF_EN | FSPI_AHBCR_RDADDROPT, fspi_writel(f, FSPI_AHBCR_PREF_EN | FSPI_AHBCR_RDADDROPT,
base + FSPI_AHBCR); 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. */ /* AHB Read - Set lut sequence ID for all CS. */
fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA1CR2); fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA1CR2);
fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA2CR2); fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA2CR2);
......
...@@ -277,6 +277,7 @@ struct stm32_spi_cfg { ...@@ -277,6 +277,7 @@ struct stm32_spi_cfg {
* @fifo_size: size of the embedded fifo in bytes * @fifo_size: size of the embedded fifo in bytes
* @cur_midi: master inter-data idleness in ns * @cur_midi: master inter-data idleness in ns
* @cur_speed: speed configured in Hz * @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_bpw: number of bits in a single SPI data frame
* @cur_fthlv: fifo threshold level (data frames in a single data packet) * @cur_fthlv: fifo threshold level (data frames in a single data packet)
* @cur_comm: SPI communication mode * @cur_comm: SPI communication mode
...@@ -304,6 +305,7 @@ struct stm32_spi { ...@@ -304,6 +305,7 @@ struct stm32_spi {
unsigned int cur_midi; unsigned int cur_midi;
unsigned int cur_speed; unsigned int cur_speed;
unsigned int cur_half_period;
unsigned int cur_bpw; unsigned int cur_bpw;
unsigned int cur_fthlv; unsigned int cur_fthlv;
unsigned int cur_comm; unsigned int cur_comm;
...@@ -468,6 +470,8 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz, ...@@ -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_speed = spi->clk_rate / (1 << mbrdiv);
spi->cur_half_period = DIV_ROUND_CLOSEST(USEC_PER_SEC, 2 * spi->cur_speed);
return mbrdiv - 1; return mbrdiv - 1;
} }
...@@ -709,6 +713,10 @@ static void stm32h7_spi_disable(struct stm32_spi *spi) ...@@ -709,6 +713,10 @@ static void stm32h7_spi_disable(struct stm32_spi *spi)
return; 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) if (spi->cur_usedma && spi->dma_tx)
dmaengine_terminate_async(spi->dma_tx); dmaengine_terminate_async(spi->dma_tx);
if (spi->cur_usedma && spi->dma_rx) if (spi->cur_usedma && spi->dma_rx)
......
...@@ -1340,9 +1340,9 @@ static int zynqmp_qspi_probe(struct platform_device *pdev) ...@@ -1340,9 +1340,9 @@ static int zynqmp_qspi_probe(struct platform_device *pdev)
return 0; return 0;
clk_dis_all: clk_dis_all:
pm_runtime_put_sync(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
pm_runtime_disable(&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_disable_unprepare(xqspi->refclk);
clk_dis_pclk: clk_dis_pclk:
clk_disable_unprepare(xqspi->pclk); clk_disable_unprepare(xqspi->pclk);
...@@ -1366,11 +1366,15 @@ static void zynqmp_qspi_remove(struct platform_device *pdev) ...@@ -1366,11 +1366,15 @@ static void zynqmp_qspi_remove(struct platform_device *pdev)
{ {
struct zynqmp_qspi *xqspi = platform_get_drvdata(pdev); struct zynqmp_qspi *xqspi = platform_get_drvdata(pdev);
pm_runtime_get_sync(&pdev->dev);
zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, 0x0); 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->refclk);
clk_disable_unprepare(xqspi->pclk); clk_disable_unprepare(xqspi->pclk);
pm_runtime_set_suspended(&pdev->dev);
pm_runtime_disable(&pdev->dev);
} }
MODULE_DEVICE_TABLE(of, zynqmp_qspi_of_match); MODULE_DEVICE_TABLE(of, zynqmp_qspi_of_match);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment