Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit d5931dd

Browse files
committed
Merge tag 'spi-fix-v6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
Pull spi fixes from Mark Brown: "A series of fixes that came in since the merge window, the main thing being the fixes Andy did for DMA sync where we were calling into the DMA API in suprising ways and causing issues as a result, the main thing being confusing the IOMMU code. We've also got some fairly important fixes for the stm32 driver, it supports a wide range of hardware and some optimisations that were done recently have broken on some systems, and a fix to prevent glitched signals on the bus in the cadence driver" * tag 'spi-fix-v6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: stm32: Don't warn about spurious interrupts spi: Assign dummy scatterlist to unidirectional transfers spi: cadence: Ensure data lines set to low during dummy-cycle period spi: stm32: Revert change that enabled controller before asserting CS spi: Check if transfer is mapped before calling DMA sync APIs spi: Don't mark message DMA mapped when no transfer in it is
2 parents 28add42 + 95d7c45 commit d5931dd

File tree

3 files changed

+54
-13
lines changed

3 files changed

+54
-13
lines changed

drivers/spi/spi-cadence-xspi.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@
145145
#define CDNS_XSPI_STIG_DONE_FLAG BIT(0)
146146
#define CDNS_XSPI_TRD_STATUS 0x0104
147147

148+
#define MODE_NO_OF_BYTES GENMASK(25, 24)
149+
#define MODEBYTES_COUNT 1
150+
148151
/* Helper macros for filling command registers */
149152
#define CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_1(op, data_phase) ( \
150153
FIELD_PREP(CDNS_XSPI_CMD_INSTR_TYPE, (data_phase) ? \
@@ -157,9 +160,10 @@
157160
FIELD_PREP(CDNS_XSPI_CMD_P1_R2_ADDR3, ((op)->addr.val >> 24) & 0xFF) | \
158161
FIELD_PREP(CDNS_XSPI_CMD_P1_R2_ADDR4, ((op)->addr.val >> 32) & 0xFF))
159162

160-
#define CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op) ( \
163+
#define CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op, modebytes) ( \
161164
FIELD_PREP(CDNS_XSPI_CMD_P1_R3_ADDR5, ((op)->addr.val >> 40) & 0xFF) | \
162165
FIELD_PREP(CDNS_XSPI_CMD_P1_R3_CMD, (op)->cmd.opcode) | \
166+
FIELD_PREP(MODE_NO_OF_BYTES, modebytes) | \
163167
FIELD_PREP(CDNS_XSPI_CMD_P1_R3_NUM_ADDR_BYTES, (op)->addr.nbytes))
164168

165169
#define CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_4(op, chipsel) ( \
@@ -173,12 +177,12 @@
173177
#define CDNS_XSPI_CMD_FLD_DSEQ_CMD_2(op) \
174178
FIELD_PREP(CDNS_XSPI_CMD_DSEQ_R2_DCNT_L, (op)->data.nbytes & 0xFFFF)
175179

176-
#define CDNS_XSPI_CMD_FLD_DSEQ_CMD_3(op) ( \
180+
#define CDNS_XSPI_CMD_FLD_DSEQ_CMD_3(op, dummybytes) ( \
177181
FIELD_PREP(CDNS_XSPI_CMD_DSEQ_R3_DCNT_H, \
178182
((op)->data.nbytes >> 16) & 0xffff) | \
179183
FIELD_PREP(CDNS_XSPI_CMD_DSEQ_R3_NUM_OF_DUMMY, \
180184
(op)->dummy.buswidth != 0 ? \
181-
(((op)->dummy.nbytes * 8) / (op)->dummy.buswidth) : \
185+
(((dummybytes) * 8) / (op)->dummy.buswidth) : \
182186
0))
183187

184188
#define CDNS_XSPI_CMD_FLD_DSEQ_CMD_4(op, chipsel) ( \
@@ -351,6 +355,7 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
351355
u32 cmd_regs[6];
352356
u32 cmd_status;
353357
int ret;
358+
int dummybytes = op->dummy.nbytes;
354359

355360
ret = cdns_xspi_wait_for_controller_idle(cdns_xspi);
356361
if (ret < 0)
@@ -365,7 +370,12 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
365370
memset(cmd_regs, 0, sizeof(cmd_regs));
366371
cmd_regs[1] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_1(op, data_phase);
367372
cmd_regs[2] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_2(op);
368-
cmd_regs[3] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op);
373+
if (dummybytes != 0) {
374+
cmd_regs[3] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op, 1);
375+
dummybytes--;
376+
} else {
377+
cmd_regs[3] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op, 0);
378+
}
369379
cmd_regs[4] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_4(op,
370380
cdns_xspi->cur_cs);
371381

@@ -375,7 +385,7 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
375385
cmd_regs[0] = CDNS_XSPI_STIG_DONE_FLAG;
376386
cmd_regs[1] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_1(op);
377387
cmd_regs[2] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_2(op);
378-
cmd_regs[3] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_3(op);
388+
cmd_regs[3] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_3(op, dummybytes);
379389
cmd_regs[4] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_4(op,
380390
cdns_xspi->cur_cs);
381391

drivers/spi/spi-stm32.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,8 +1016,10 @@ static irqreturn_t stm32fx_spi_irq_event(int irq, void *dev_id)
10161016
static irqreturn_t stm32fx_spi_irq_thread(int irq, void *dev_id)
10171017
{
10181018
struct spi_controller *ctrl = dev_id;
1019+
struct stm32_spi *spi = spi_controller_get_devdata(ctrl);
10191020

10201021
spi_finalize_current_transfer(ctrl);
1022+
stm32fx_spi_disable(spi);
10211023

10221024
return IRQ_HANDLED;
10231025
}
@@ -1055,7 +1057,7 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id)
10551057
mask |= STM32H7_SPI_SR_TXP | STM32H7_SPI_SR_RXP;
10561058

10571059
if (!(sr & mask)) {
1058-
dev_warn(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n",
1060+
dev_vdbg(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n",
10591061
sr, ier);
10601062
spin_unlock_irqrestore(&spi->lock, flags);
10611063
return IRQ_NONE;
@@ -1185,8 +1187,6 @@ static int stm32_spi_prepare_msg(struct spi_controller *ctrl,
11851187
~clrb) | setb,
11861188
spi->base + spi->cfg->regs->cpol.reg);
11871189

1188-
stm32_spi_enable(spi);
1189-
11901190
spin_unlock_irqrestore(&spi->lock, flags);
11911191

11921192
return 0;
@@ -1204,6 +1204,7 @@ static void stm32fx_spi_dma_tx_cb(void *data)
12041204

12051205
if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) {
12061206
spi_finalize_current_transfer(spi->ctrl);
1207+
stm32fx_spi_disable(spi);
12071208
}
12081209
}
12091210

@@ -1218,6 +1219,7 @@ static void stm32_spi_dma_rx_cb(void *data)
12181219
struct stm32_spi *spi = data;
12191220

12201221
spi_finalize_current_transfer(spi->ctrl);
1222+
spi->cfg->disable(spi);
12211223
}
12221224

12231225
/**
@@ -1305,6 +1307,8 @@ static int stm32fx_spi_transfer_one_irq(struct stm32_spi *spi)
13051307

13061308
stm32_spi_set_bits(spi, STM32FX_SPI_CR2, cr2);
13071309

1310+
stm32_spi_enable(spi);
1311+
13081312
/* starting data transfer when buffer is loaded */
13091313
if (spi->tx_buf)
13101314
spi->cfg->write_tx(spi);
@@ -1341,6 +1345,8 @@ static int stm32h7_spi_transfer_one_irq(struct stm32_spi *spi)
13411345

13421346
spin_lock_irqsave(&spi->lock, flags);
13431347

1348+
stm32_spi_enable(spi);
1349+
13441350
/* Be sure to have data in fifo before starting data transfer */
13451351
if (spi->tx_buf)
13461352
stm32h7_spi_write_txfifo(spi);
@@ -1372,6 +1378,8 @@ static void stm32fx_spi_transfer_one_dma_start(struct stm32_spi *spi)
13721378
*/
13731379
stm32_spi_set_bits(spi, STM32FX_SPI_CR2, STM32FX_SPI_CR2_ERRIE);
13741380
}
1381+
1382+
stm32_spi_enable(spi);
13751383
}
13761384

13771385
/**
@@ -1405,6 +1413,8 @@ static void stm32h7_spi_transfer_one_dma_start(struct stm32_spi *spi)
14051413

14061414
stm32_spi_set_bits(spi, STM32H7_SPI_IER, ier);
14071415

1416+
stm32_spi_enable(spi);
1417+
14081418
if (STM32_SPI_HOST_MODE(spi))
14091419
stm32_spi_set_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_CSTART);
14101420
}

drivers/spi/spi.c

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,11 @@ void spi_unmap_buf(struct spi_controller *ctlr, struct device *dev,
12201220
spi_unmap_buf_attrs(ctlr, dev, sgt, dir, 0);
12211221
}
12221222

1223+
/* Dummy SG for unidirect transfers */
1224+
static struct scatterlist dummy_sg = {
1225+
.page_link = SG_END,
1226+
};
1227+
12231228
static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
12241229
{
12251230
struct device *tx_dev, *rx_dev;
@@ -1243,6 +1248,7 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
12431248
else
12441249
rx_dev = ctlr->dev.parent;
12451250

1251+
ret = -ENOMSG;
12461252
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
12471253
/* The sync is done before each transfer. */
12481254
unsigned long attrs = DMA_ATTR_SKIP_CPU_SYNC;
@@ -1257,6 +1263,8 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
12571263
attrs);
12581264
if (ret != 0)
12591265
return ret;
1266+
} else {
1267+
xfer->tx_sg.sgl = &dummy_sg;
12601268
}
12611269

12621270
if (xfer->rx_buf != NULL) {
@@ -1270,8 +1278,13 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
12701278

12711279
return ret;
12721280
}
1281+
} else {
1282+
xfer->rx_sg.sgl = &dummy_sg;
12731283
}
12741284
}
1285+
/* No transfer has been mapped, bail out with success */
1286+
if (ret)
1287+
return 0;
12751288

12761289
ctlr->cur_rx_dma_dev = rx_dev;
12771290
ctlr->cur_tx_dma_dev = tx_dev;
@@ -1307,7 +1320,7 @@ static int __spi_unmap_msg(struct spi_controller *ctlr, struct spi_message *msg)
13071320
return 0;
13081321
}
13091322

1310-
static void spi_dma_sync_for_device(struct spi_controller *ctlr,
1323+
static void spi_dma_sync_for_device(struct spi_controller *ctlr, struct spi_message *msg,
13111324
struct spi_transfer *xfer)
13121325
{
13131326
struct device *rx_dev = ctlr->cur_rx_dma_dev;
@@ -1316,11 +1329,14 @@ static void spi_dma_sync_for_device(struct spi_controller *ctlr,
13161329
if (!ctlr->cur_msg_mapped)
13171330
return;
13181331

1332+
if (!ctlr->can_dma(ctlr, msg->spi, xfer))
1333+
return;
1334+
13191335
dma_sync_sgtable_for_device(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
13201336
dma_sync_sgtable_for_device(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE);
13211337
}
13221338

1323-
static void spi_dma_sync_for_cpu(struct spi_controller *ctlr,
1339+
static void spi_dma_sync_for_cpu(struct spi_controller *ctlr, struct spi_message *msg,
13241340
struct spi_transfer *xfer)
13251341
{
13261342
struct device *rx_dev = ctlr->cur_rx_dma_dev;
@@ -1329,6 +1345,9 @@ static void spi_dma_sync_for_cpu(struct spi_controller *ctlr,
13291345
if (!ctlr->cur_msg_mapped)
13301346
return;
13311347

1348+
if (!ctlr->can_dma(ctlr, msg->spi, xfer))
1349+
return;
1350+
13321351
dma_sync_sgtable_for_cpu(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE);
13331352
dma_sync_sgtable_for_cpu(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
13341353
}
@@ -1346,11 +1365,13 @@ static inline int __spi_unmap_msg(struct spi_controller *ctlr,
13461365
}
13471366

13481367
static void spi_dma_sync_for_device(struct spi_controller *ctrl,
1368+
struct spi_message *msg,
13491369
struct spi_transfer *xfer)
13501370
{
13511371
}
13521372

13531373
static void spi_dma_sync_for_cpu(struct spi_controller *ctrl,
1374+
struct spi_message *msg,
13541375
struct spi_transfer *xfer)
13551376
{
13561377
}
@@ -1622,10 +1643,10 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
16221643
reinit_completion(&ctlr->xfer_completion);
16231644

16241645
fallback_pio:
1625-
spi_dma_sync_for_device(ctlr, xfer);
1646+
spi_dma_sync_for_device(ctlr, msg, xfer);
16261647
ret = ctlr->transfer_one(ctlr, msg->spi, xfer);
16271648
if (ret < 0) {
1628-
spi_dma_sync_for_cpu(ctlr, xfer);
1649+
spi_dma_sync_for_cpu(ctlr, msg, xfer);
16291650

16301651
if (ctlr->cur_msg_mapped &&
16311652
(xfer->error & SPI_TRANS_FAIL_NO_START)) {
@@ -1650,7 +1671,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
16501671
msg->status = ret;
16511672
}
16521673

1653-
spi_dma_sync_for_cpu(ctlr, xfer);
1674+
spi_dma_sync_for_cpu(ctlr, msg, xfer);
16541675
} else {
16551676
if (xfer->len)
16561677
dev_err(&msg->spi->dev,

0 commit comments

Comments
 (0)