Skip to content

Commit a83e18c

Browse files
committed
Merge tag 'spi-fix-v6.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
Pull spi fixes from Mark Brown: "A relatively large batch of fixes here but all device specific, plus an update to MAINTAINERS. The summary print change to the STM32 driver is fixing an issue where the driver could easily end up spamming the logs with something that should be a debug message" * tag 'spi-fix-v6.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: amd: Fix SPI_SPD7 value spi: stm32: fix stm32_spi_prepare_mbr() that halves spi clk for every run spi: meson-spicc: fix do_div build error on non-arm64 spi: intel: Use correct mask for flash and protected regions spi: mediatek: Fix package division error spi: tegra210-quad: Don't initialise DMA if not supported MAINTAINERS: Update HiSilicon SFC Driver maintainer spi: meson-spicc: move wait completion in driver to take bursts delay in account spi: stm32: Print summary 'callbacks suppressed' message
2 parents 7c42d6f + bff6bef commit a83e18c

7 files changed

Lines changed: 49 additions & 19 deletions

File tree

MAINTAINERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9341,7 +9341,7 @@ S: Maintained
93419341
F: drivers/crypto/hisilicon/trng/trng.c
93429342

93439343
HISILICON V3XX SPI NOR FLASH Controller Driver
9344-
M: John Garry <john.garry@huawei.com>
9344+
M: Jay Fang <f.fangjian@huawei.com>
93459345
S: Maintained
93469346
W: http://www.hisilicon.com
93479347
F: drivers/spi/spi-hisi-sfc-v3xx.c

drivers/spi/spi-amd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ enum amd_spi_speed {
6565
F_16_66MHz,
6666
F_100MHz,
6767
F_800KHz,
68-
SPI_SPD7,
68+
SPI_SPD7 = 0x7,
6969
F_50MHz = 0x4,
7070
F_4MHz = 0x32,
7171
F_3_17MHz = 0x3F

drivers/spi/spi-intel.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,17 @@
5252
#define FRACC 0x50
5353

5454
#define FREG(n) (0x54 + ((n) * 4))
55-
#define FREG_BASE_MASK 0x3fff
55+
#define FREG_BASE_MASK GENMASK(14, 0)
5656
#define FREG_LIMIT_SHIFT 16
57-
#define FREG_LIMIT_MASK (0x03fff << FREG_LIMIT_SHIFT)
57+
#define FREG_LIMIT_MASK GENMASK(30, 16)
5858

5959
/* Offset is from @ispi->pregs */
6060
#define PR(n) ((n) * 4)
6161
#define PR_WPE BIT(31)
6262
#define PR_LIMIT_SHIFT 16
63-
#define PR_LIMIT_MASK (0x3fff << PR_LIMIT_SHIFT)
63+
#define PR_LIMIT_MASK GENMASK(30, 16)
6464
#define PR_RPE BIT(15)
65-
#define PR_BASE_MASK 0x3fff
65+
#define PR_BASE_MASK GENMASK(14, 0)
6666

6767
/* Offsets are from @ispi->sregs */
6868
#define SSFSTS_CTL 0x00

drivers/spi/spi-meson-spicc.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ struct meson_spicc_device {
160160
struct clk *clk;
161161
struct spi_message *message;
162162
struct spi_transfer *xfer;
163+
struct completion done;
163164
const struct meson_spicc_data *data;
164165
u8 *tx_buf;
165166
u8 *rx_buf;
@@ -282,7 +283,7 @@ static irqreturn_t meson_spicc_irq(int irq, void *data)
282283
/* Disable all IRQs */
283284
writel(0, spicc->base + SPICC_INTREG);
284285

285-
spi_finalize_current_transfer(spicc->master);
286+
complete(&spicc->done);
286287

287288
return IRQ_HANDLED;
288289
}
@@ -386,6 +387,7 @@ static int meson_spicc_transfer_one(struct spi_master *master,
386387
struct spi_transfer *xfer)
387388
{
388389
struct meson_spicc_device *spicc = spi_master_get_devdata(master);
390+
uint64_t timeout;
389391

390392
/* Store current transfer */
391393
spicc->xfer = xfer;
@@ -410,13 +412,29 @@ static int meson_spicc_transfer_one(struct spi_master *master,
410412
/* Setup burst */
411413
meson_spicc_setup_burst(spicc);
412414

415+
/* Setup wait for completion */
416+
reinit_completion(&spicc->done);
417+
418+
/* For each byte we wait for 8 cycles of the SPI clock */
419+
timeout = 8LL * MSEC_PER_SEC * xfer->len;
420+
do_div(timeout, xfer->speed_hz);
421+
422+
/* Add 10us delay between each fifo bursts */
423+
timeout += ((xfer->len >> 4) * 10) / MSEC_PER_SEC;
424+
425+
/* Increase it twice and add 200 ms tolerance */
426+
timeout += timeout + 200;
427+
413428
/* Start burst */
414429
writel_bits_relaxed(SPICC_XCH, SPICC_XCH, spicc->base + SPICC_CONREG);
415430

416431
/* Enable interrupts */
417432
writel_relaxed(SPICC_TC_EN, spicc->base + SPICC_INTREG);
418433

419-
return 1;
434+
if (!wait_for_completion_timeout(&spicc->done, msecs_to_jiffies(timeout)))
435+
return -ETIMEDOUT;
436+
437+
return 0;
420438
}
421439

422440
static int meson_spicc_prepare_message(struct spi_master *master,
@@ -743,6 +761,8 @@ static int meson_spicc_probe(struct platform_device *pdev)
743761
spicc->pdev = pdev;
744762
platform_set_drvdata(pdev, spicc);
745763

764+
init_completion(&spicc->done);
765+
746766
spicc->base = devm_platform_ioremap_resource(pdev, 0);
747767
if (IS_ERR(spicc->base)) {
748768
dev_err(&pdev->dev, "io resource mapping failed\n");

drivers/spi/spi-mt65xx.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -551,14 +551,17 @@ static void mtk_spi_enable_transfer(struct spi_master *master)
551551
writel(cmd, mdata->base + SPI_CMD_REG);
552552
}
553553

554-
static int mtk_spi_get_mult_delta(u32 xfer_len)
554+
static int mtk_spi_get_mult_delta(struct mtk_spi *mdata, u32 xfer_len)
555555
{
556-
u32 mult_delta;
556+
u32 mult_delta = 0;
557557

558-
if (xfer_len > MTK_SPI_PACKET_SIZE)
559-
mult_delta = xfer_len % MTK_SPI_PACKET_SIZE;
560-
else
561-
mult_delta = 0;
558+
if (mdata->dev_comp->ipm_design) {
559+
if (xfer_len > MTK_SPI_IPM_PACKET_SIZE)
560+
mult_delta = xfer_len % MTK_SPI_IPM_PACKET_SIZE;
561+
} else {
562+
if (xfer_len > MTK_SPI_PACKET_SIZE)
563+
mult_delta = xfer_len % MTK_SPI_PACKET_SIZE;
564+
}
562565

563566
return mult_delta;
564567
}
@@ -570,22 +573,22 @@ static void mtk_spi_update_mdata_len(struct spi_master *master)
570573

571574
if (mdata->tx_sgl_len && mdata->rx_sgl_len) {
572575
if (mdata->tx_sgl_len > mdata->rx_sgl_len) {
573-
mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len);
576+
mult_delta = mtk_spi_get_mult_delta(mdata, mdata->rx_sgl_len);
574577
mdata->xfer_len = mdata->rx_sgl_len - mult_delta;
575578
mdata->rx_sgl_len = mult_delta;
576579
mdata->tx_sgl_len -= mdata->xfer_len;
577580
} else {
578-
mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len);
581+
mult_delta = mtk_spi_get_mult_delta(mdata, mdata->tx_sgl_len);
579582
mdata->xfer_len = mdata->tx_sgl_len - mult_delta;
580583
mdata->tx_sgl_len = mult_delta;
581584
mdata->rx_sgl_len -= mdata->xfer_len;
582585
}
583586
} else if (mdata->tx_sgl_len) {
584-
mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len);
587+
mult_delta = mtk_spi_get_mult_delta(mdata, mdata->tx_sgl_len);
585588
mdata->xfer_len = mdata->tx_sgl_len - mult_delta;
586589
mdata->tx_sgl_len = mult_delta;
587590
} else if (mdata->rx_sgl_len) {
588-
mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len);
591+
mult_delta = mtk_spi_get_mult_delta(mdata, mdata->rx_sgl_len);
589592
mdata->xfer_len = mdata->rx_sgl_len - mult_delta;
590593
mdata->rx_sgl_len = mult_delta;
591594
}

drivers/spi/spi-stm32.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz,
434434
u32 div, mbrdiv;
435435

436436
/* Ensure spi->clk_rate is even */
437-
div = DIV_ROUND_UP(spi->clk_rate & ~0x1, speed_hz);
437+
div = DIV_ROUND_CLOSEST(spi->clk_rate & ~0x1, speed_hz);
438438

439439
/*
440440
* SPI framework set xfer->speed_hz to master->max_speed_hz if
@@ -886,6 +886,7 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id)
886886
static DEFINE_RATELIMIT_STATE(rs,
887887
DEFAULT_RATELIMIT_INTERVAL * 10,
888888
1);
889+
ratelimit_set_flags(&rs, RATELIMIT_MSG_ON_RELEASE);
889890
if (__ratelimit(&rs))
890891
dev_dbg_ratelimited(spi->dev, "Communication suspended\n");
891892
if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))

drivers/spi/spi-tegra210-quad.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,9 @@ static int tegra_qspi_start_cpu_based_transfer(struct tegra_qspi *qspi, struct s
720720

721721
static void tegra_qspi_deinit_dma(struct tegra_qspi *tqspi)
722722
{
723+
if (!tqspi->soc_data->has_dma)
724+
return;
725+
723726
if (tqspi->tx_dma_buf) {
724727
dma_free_coherent(tqspi->dev, tqspi->dma_buf_size,
725728
tqspi->tx_dma_buf, tqspi->tx_dma_phys);
@@ -750,6 +753,9 @@ static int tegra_qspi_init_dma(struct tegra_qspi *tqspi)
750753
u32 *dma_buf;
751754
int err;
752755

756+
if (!tqspi->soc_data->has_dma)
757+
return 0;
758+
753759
dma_chan = dma_request_chan(tqspi->dev, "rx");
754760
if (IS_ERR(dma_chan)) {
755761
err = PTR_ERR(dma_chan);

0 commit comments

Comments
 (0)