mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-27 20:08:26 -04:00
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user