spi: Fixes for v7.3

A few driver specific fixes, none of them particularly severe or
 unusual.
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmqvmVMACgkQJNaLcl1U
 h9AOdwf/aRa54oHd6iLCPXNAbZLDie0pnJa/Q/5sjpJoVY9ofKc2XM9djmy60YdF
 /VGIphT8gr6at6fLZHEBbLanu2MQC2vxW9zDh5n+Xe8HUS3sdrwtBJPSv74Mcfrf
 OIv6nFrVsbo1IMF7x4ncYOhOBGKyOSqhsVdt+k6jl1wuTDJBHyFs7sdL1DGRCRu/
 ba4n2W+kSxVeFx3ACFyDJ8l8vLqtyotFKkpmslrPmT0yHFwOr8SOMbyQ5MPxITpx
 gqgLikR3OW5alOLxy1U2nWCdjNsc8UWBhx1sCnByYrUO3VmRIEx4j1l2wSVX0J7E
 Ck7/pSpg1NGkxVYSLCTBufqq8kgPTQ==
 =iy0J
 -----END PGP SIGNATURE-----

Merge tag 'spi-fix-v7.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Pull spi fixes from Mark Brown:
 "A few driver specific fixes, none of them particularly severe or
  unusual"

* tag 'spi-fix-v7.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
  spi: fsl-qspi: Reprogram the clock rate when the operation frequency changes
  spi: spi-zynqmp-gqspi: stop the controller on shutdown
  spi: virtio: Use the per-transfer bits per word
  spi: spi-qpic-snand: avoid writing QPIC_EBI2_ECC_BUF_CFG register
This commit is contained in:
Linus Torvalds 2026-09-20 08:08:54 -07:00
commit 5bf70485f9
4 changed files with 39 additions and 6 deletions

View File

@ -289,6 +289,7 @@ struct fsl_qspi {
struct pm_qos_request pm_qos_req;
struct device *dev;
int selected;
u32 selected_freq;
u32 memmap_phy;
};
@ -551,7 +552,8 @@ static void fsl_qspi_select_mem(struct fsl_qspi *q, struct spi_device *spi,
unsigned long rate = op->max_freq;
int ret;
if (q->selected == spi_get_chipselect(spi, 0))
if (q->selected == spi_get_chipselect(spi, 0) &&
q->selected_freq == op->max_freq)
return;
if (needs_4x_clock(q))
@ -571,6 +573,7 @@ static void fsl_qspi_select_mem(struct fsl_qspi *q, struct spi_device *spi,
}
q->selected = spi_get_chipselect(spi, 0);
q->selected_freq = op->max_freq;
fsl_qspi_invalidate(q);
}

View File

@ -765,8 +765,6 @@ static int qcom_spi_read_cw_raw(struct qcom_nand_controller *snandc, u8 *data_bu
qcom_write_reg_dma(snandc, &snandc->regs->addr0, NAND_ADDR0, 2, 0);
qcom_write_reg_dma(snandc, &snandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
qcom_write_reg_dma(snandc, &snandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1, 0);
qcom_write_reg_dma(snandc, &snandc->regs->erased_cw_detect_cfg_clr,
NAND_ERASED_CW_DETECT_CFG, 1, 0);
qcom_write_reg_dma(snandc, &snandc->regs->erased_cw_detect_cfg_set,
@ -1104,8 +1102,6 @@ static void qcom_spi_config_page_write(struct qcom_nand_controller *snandc)
{
qcom_write_reg_dma(snandc, &snandc->regs->addr0, NAND_ADDR0, 2, 0);
qcom_write_reg_dma(snandc, &snandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
qcom_write_reg_dma(snandc, &snandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG,
1, NAND_BAM_NEXT_SGL);
}
static void qcom_spi_config_cw_write(struct qcom_nand_controller *snandc)

View File

@ -168,7 +168,7 @@ static int virtio_spi_transfer_one(struct spi_controller *ctrl,
/* Fill struct spi_transfer_head */
th->chip_select_id = spi_get_chipselect(spi, 0);
th->bits_per_word = spi->bits_per_word;
th->bits_per_word = xfer->bits_per_word;
th->cs_change = xfer->cs_change;
th->tx_nbits = xfer->tx_nbits;
th->rx_nbits = xfer->rx_nbits;

View File

@ -1373,11 +1373,45 @@ static void zynqmp_qspi_remove(struct platform_device *pdev)
clk_disable_unprepare(xqspi->pclk);
}
static void zynqmp_qspi_shutdown(struct platform_device *pdev)
{
struct zynqmp_qspi *xqspi = platform_get_drvdata(pdev);
int ret;
/*
* Stop the queue and reject any later transfer first, so the write
* below cannot cut into a message that is still being executed.
* Unlike ->suspend this cannot abort on error: a controller left
* mastering the bus is worse than a truncated transfer.
*/
ret = spi_controller_suspend(xqspi->ctlr);
if (ret)
dev_warn(&pdev->dev, "could not stop the queue: %d\n", ret);
/*
* Only a runtime suspended controller can be left alone: its clocks
* are gated, so it cannot be mastering the bus, and its registers
* must not be accessed either. Any other answer means it may be
* running and has to be stopped. In particular, on a kernel built
* without runtime PM this returns -EINVAL, and there the clocks
* enabled in probe() are never gated at all.
*/
ret = pm_runtime_get_if_in_use(&pdev->dev);
if (!ret)
return;
zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, 0x0);
if (ret > 0)
pm_runtime_put_noidle(&pdev->dev);
}
MODULE_DEVICE_TABLE(of, zynqmp_qspi_of_match);
static struct platform_driver zynqmp_qspi_driver = {
.probe = zynqmp_qspi_probe,
.remove = zynqmp_qspi_remove,
.shutdown = zynqmp_qspi_shutdown,
.driver = {
.name = "zynqmp-qspi",
.of_match_table = zynqmp_qspi_of_match,