mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 05:41:55 +00:00
spi: Fixes for v6.1
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. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmNuPWkACgkQJNaLcl1U h9BZJQf/Rj3kjTdwjccp+QXTrXQZVMjkXYUuLHbUokO2Mzy+U3mNCkJuvLJjAvSw kqFBbJNYIm1jItRoqOkwlnNb0hw+QZAzBivi4DLPZJUwEeT6LxQdlYvepy6bEjCW XJpTMFxDDaWkFUftl+tLZFN2VxHaVHEVTJ5aMu2ija0mjG1M5vrYtgVemyJ+v2/o 0nhXgnRe7Fq2+MqJazVzYs6ZxCvpIiU18a4WLD5BPGTIZhdfE0UXG+QGqWV4toHI uZWnV+NWEKNzMGS/QdcHZYQHWlcQBR/g5kPFQFCl2D+aK9CmakHc6Bk99H6tRdLn xYHjHafs6BwCG3eBfE/hxD8rsfTNmw== =UfdB -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
a83e18ccc4
@ -9341,7 +9341,7 @@ S: Maintained
|
||||
F: drivers/crypto/hisilicon/trng/trng.c
|
||||
|
||||
HISILICON V3XX SPI NOR FLASH Controller Driver
|
||||
M: John Garry <john.garry@huawei.com>
|
||||
M: Jay Fang <f.fangjian@huawei.com>
|
||||
S: Maintained
|
||||
W: http://www.hisilicon.com
|
||||
F: drivers/spi/spi-hisi-sfc-v3xx.c
|
||||
|
@ -65,7 +65,7 @@ enum amd_spi_speed {
|
||||
F_16_66MHz,
|
||||
F_100MHz,
|
||||
F_800KHz,
|
||||
SPI_SPD7,
|
||||
SPI_SPD7 = 0x7,
|
||||
F_50MHz = 0x4,
|
||||
F_4MHz = 0x32,
|
||||
F_3_17MHz = 0x3F
|
||||
|
@ -52,17 +52,17 @@
|
||||
#define FRACC 0x50
|
||||
|
||||
#define FREG(n) (0x54 + ((n) * 4))
|
||||
#define FREG_BASE_MASK 0x3fff
|
||||
#define FREG_BASE_MASK GENMASK(14, 0)
|
||||
#define FREG_LIMIT_SHIFT 16
|
||||
#define FREG_LIMIT_MASK (0x03fff << FREG_LIMIT_SHIFT)
|
||||
#define FREG_LIMIT_MASK GENMASK(30, 16)
|
||||
|
||||
/* Offset is from @ispi->pregs */
|
||||
#define PR(n) ((n) * 4)
|
||||
#define PR_WPE BIT(31)
|
||||
#define PR_LIMIT_SHIFT 16
|
||||
#define PR_LIMIT_MASK (0x3fff << PR_LIMIT_SHIFT)
|
||||
#define PR_LIMIT_MASK GENMASK(30, 16)
|
||||
#define PR_RPE BIT(15)
|
||||
#define PR_BASE_MASK 0x3fff
|
||||
#define PR_BASE_MASK GENMASK(14, 0)
|
||||
|
||||
/* Offsets are from @ispi->sregs */
|
||||
#define SSFSTS_CTL 0x00
|
||||
|
@ -160,6 +160,7 @@ struct meson_spicc_device {
|
||||
struct clk *clk;
|
||||
struct spi_message *message;
|
||||
struct spi_transfer *xfer;
|
||||
struct completion done;
|
||||
const struct meson_spicc_data *data;
|
||||
u8 *tx_buf;
|
||||
u8 *rx_buf;
|
||||
@ -282,7 +283,7 @@ static irqreturn_t meson_spicc_irq(int irq, void *data)
|
||||
/* Disable all IRQs */
|
||||
writel(0, spicc->base + SPICC_INTREG);
|
||||
|
||||
spi_finalize_current_transfer(spicc->master);
|
||||
complete(&spicc->done);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@ -386,6 +387,7 @@ static int meson_spicc_transfer_one(struct spi_master *master,
|
||||
struct spi_transfer *xfer)
|
||||
{
|
||||
struct meson_spicc_device *spicc = spi_master_get_devdata(master);
|
||||
uint64_t timeout;
|
||||
|
||||
/* Store current transfer */
|
||||
spicc->xfer = xfer;
|
||||
@ -410,13 +412,29 @@ static int meson_spicc_transfer_one(struct spi_master *master,
|
||||
/* Setup burst */
|
||||
meson_spicc_setup_burst(spicc);
|
||||
|
||||
/* Setup wait for completion */
|
||||
reinit_completion(&spicc->done);
|
||||
|
||||
/* For each byte we wait for 8 cycles of the SPI clock */
|
||||
timeout = 8LL * MSEC_PER_SEC * xfer->len;
|
||||
do_div(timeout, xfer->speed_hz);
|
||||
|
||||
/* Add 10us delay between each fifo bursts */
|
||||
timeout += ((xfer->len >> 4) * 10) / MSEC_PER_SEC;
|
||||
|
||||
/* Increase it twice and add 200 ms tolerance */
|
||||
timeout += timeout + 200;
|
||||
|
||||
/* Start burst */
|
||||
writel_bits_relaxed(SPICC_XCH, SPICC_XCH, spicc->base + SPICC_CONREG);
|
||||
|
||||
/* Enable interrupts */
|
||||
writel_relaxed(SPICC_TC_EN, spicc->base + SPICC_INTREG);
|
||||
|
||||
return 1;
|
||||
if (!wait_for_completion_timeout(&spicc->done, msecs_to_jiffies(timeout)))
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int meson_spicc_prepare_message(struct spi_master *master,
|
||||
@ -743,6 +761,8 @@ static int meson_spicc_probe(struct platform_device *pdev)
|
||||
spicc->pdev = pdev;
|
||||
platform_set_drvdata(pdev, spicc);
|
||||
|
||||
init_completion(&spicc->done);
|
||||
|
||||
spicc->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(spicc->base)) {
|
||||
dev_err(&pdev->dev, "io resource mapping failed\n");
|
||||
|
@ -551,14 +551,17 @@ static void mtk_spi_enable_transfer(struct spi_master *master)
|
||||
writel(cmd, mdata->base + SPI_CMD_REG);
|
||||
}
|
||||
|
||||
static int mtk_spi_get_mult_delta(u32 xfer_len)
|
||||
static int mtk_spi_get_mult_delta(struct mtk_spi *mdata, u32 xfer_len)
|
||||
{
|
||||
u32 mult_delta;
|
||||
u32 mult_delta = 0;
|
||||
|
||||
if (xfer_len > MTK_SPI_PACKET_SIZE)
|
||||
mult_delta = xfer_len % MTK_SPI_PACKET_SIZE;
|
||||
else
|
||||
mult_delta = 0;
|
||||
if (mdata->dev_comp->ipm_design) {
|
||||
if (xfer_len > MTK_SPI_IPM_PACKET_SIZE)
|
||||
mult_delta = xfer_len % MTK_SPI_IPM_PACKET_SIZE;
|
||||
} else {
|
||||
if (xfer_len > MTK_SPI_PACKET_SIZE)
|
||||
mult_delta = xfer_len % MTK_SPI_PACKET_SIZE;
|
||||
}
|
||||
|
||||
return mult_delta;
|
||||
}
|
||||
@ -570,22 +573,22 @@ static void mtk_spi_update_mdata_len(struct spi_master *master)
|
||||
|
||||
if (mdata->tx_sgl_len && mdata->rx_sgl_len) {
|
||||
if (mdata->tx_sgl_len > mdata->rx_sgl_len) {
|
||||
mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len);
|
||||
mult_delta = mtk_spi_get_mult_delta(mdata, mdata->rx_sgl_len);
|
||||
mdata->xfer_len = mdata->rx_sgl_len - mult_delta;
|
||||
mdata->rx_sgl_len = mult_delta;
|
||||
mdata->tx_sgl_len -= mdata->xfer_len;
|
||||
} else {
|
||||
mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len);
|
||||
mult_delta = mtk_spi_get_mult_delta(mdata, mdata->tx_sgl_len);
|
||||
mdata->xfer_len = mdata->tx_sgl_len - mult_delta;
|
||||
mdata->tx_sgl_len = mult_delta;
|
||||
mdata->rx_sgl_len -= mdata->xfer_len;
|
||||
}
|
||||
} else if (mdata->tx_sgl_len) {
|
||||
mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len);
|
||||
mult_delta = mtk_spi_get_mult_delta(mdata, mdata->tx_sgl_len);
|
||||
mdata->xfer_len = mdata->tx_sgl_len - mult_delta;
|
||||
mdata->tx_sgl_len = mult_delta;
|
||||
} else if (mdata->rx_sgl_len) {
|
||||
mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len);
|
||||
mult_delta = mtk_spi_get_mult_delta(mdata, mdata->rx_sgl_len);
|
||||
mdata->xfer_len = mdata->rx_sgl_len - mult_delta;
|
||||
mdata->rx_sgl_len = mult_delta;
|
||||
}
|
||||
|
@ -434,7 +434,7 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz,
|
||||
u32 div, mbrdiv;
|
||||
|
||||
/* Ensure spi->clk_rate is even */
|
||||
div = DIV_ROUND_UP(spi->clk_rate & ~0x1, speed_hz);
|
||||
div = DIV_ROUND_CLOSEST(spi->clk_rate & ~0x1, speed_hz);
|
||||
|
||||
/*
|
||||
* 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)
|
||||
static DEFINE_RATELIMIT_STATE(rs,
|
||||
DEFAULT_RATELIMIT_INTERVAL * 10,
|
||||
1);
|
||||
ratelimit_set_flags(&rs, RATELIMIT_MSG_ON_RELEASE);
|
||||
if (__ratelimit(&rs))
|
||||
dev_dbg_ratelimited(spi->dev, "Communication suspended\n");
|
||||
if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))
|
||||
|
@ -720,6 +720,9 @@ static int tegra_qspi_start_cpu_based_transfer(struct tegra_qspi *qspi, struct s
|
||||
|
||||
static void tegra_qspi_deinit_dma(struct tegra_qspi *tqspi)
|
||||
{
|
||||
if (!tqspi->soc_data->has_dma)
|
||||
return;
|
||||
|
||||
if (tqspi->tx_dma_buf) {
|
||||
dma_free_coherent(tqspi->dev, tqspi->dma_buf_size,
|
||||
tqspi->tx_dma_buf, tqspi->tx_dma_phys);
|
||||
@ -750,6 +753,9 @@ static int tegra_qspi_init_dma(struct tegra_qspi *tqspi)
|
||||
u32 *dma_buf;
|
||||
int err;
|
||||
|
||||
if (!tqspi->soc_data->has_dma)
|
||||
return 0;
|
||||
|
||||
dma_chan = dma_request_chan(tqspi->dev, "rx");
|
||||
if (IS_ERR(dma_chan)) {
|
||||
err = PTR_ERR(dma_chan);
|
||||
|
Loading…
Reference in New Issue
Block a user