Skip to content

Commit e0d09e3

Browse files
committed
Merge tag 'spi-fix-v4.6-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
Pull spi fixes from Mark Brown: "A bunch of small driver specific fixes that have come up, none of them remarkable in themselves. One fixes a regression introduced in the merge window and another two are targetted at stable" * tag 'spi-fix-v4.6-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: pxa2xx: Do not detect number of enabled chip selects on Intel SPT spi: spi-ti-qspi: Handle truncated frames properly spi: spi-ti-qspi: Fix FLEN and WLEN settings if bits_per_word is overridden spi: omap2-mcspi: Undo broken fix for dma transfer of vmalloced buffer spi: spi-fsl-dspi: Fix cs_change handling in message transfer
2 parents d32917e + 9b1f189 commit e0d09e3

File tree

4 files changed

+76
-37
lines changed

4 files changed

+76
-37
lines changed

drivers/spi/spi-fsl-dspi.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,8 @@ static int dspi_transfer_one_message(struct spi_master *master,
385385
dspi->cur_chip = spi_get_ctldata(spi);
386386
dspi->cs = spi->chip_select;
387387
dspi->cs_change = 0;
388-
if (dspi->cur_transfer->transfer_list.next
389-
== &dspi->cur_msg->transfers)
388+
if (list_is_last(&dspi->cur_transfer->transfer_list,
389+
&dspi->cur_msg->transfers) || transfer->cs_change)
390390
dspi->cs_change = 1;
391391
dspi->void_write_data = dspi->cur_chip->void_write_data;
392392

drivers/spi/spi-omap2-mcspi.c

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -423,12 +423,16 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi,
423423

424424
if (mcspi_dma->dma_tx) {
425425
struct dma_async_tx_descriptor *tx;
426+
struct scatterlist sg;
426427

427428
dmaengine_slave_config(mcspi_dma->dma_tx, &cfg);
428429

429-
tx = dmaengine_prep_slave_sg(mcspi_dma->dma_tx, xfer->tx_sg.sgl,
430-
xfer->tx_sg.nents, DMA_MEM_TO_DEV,
431-
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
430+
sg_init_table(&sg, 1);
431+
sg_dma_address(&sg) = xfer->tx_dma;
432+
sg_dma_len(&sg) = xfer->len;
433+
434+
tx = dmaengine_prep_slave_sg(mcspi_dma->dma_tx, &sg, 1,
435+
DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
432436
if (tx) {
433437
tx->callback = omap2_mcspi_tx_callback;
434438
tx->callback_param = spi;
@@ -474,15 +478,20 @@ omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer,
474478

475479
if (mcspi_dma->dma_rx) {
476480
struct dma_async_tx_descriptor *tx;
481+
struct scatterlist sg;
477482

478483
dmaengine_slave_config(mcspi_dma->dma_rx, &cfg);
479484

480485
if ((l & OMAP2_MCSPI_CHCONF_TURBO) && mcspi->fifo_depth == 0)
481486
dma_count -= es;
482487

483-
tx = dmaengine_prep_slave_sg(mcspi_dma->dma_rx, xfer->rx_sg.sgl,
484-
xfer->rx_sg.nents, DMA_DEV_TO_MEM,
485-
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
488+
sg_init_table(&sg, 1);
489+
sg_dma_address(&sg) = xfer->rx_dma;
490+
sg_dma_len(&sg) = dma_count;
491+
492+
tx = dmaengine_prep_slave_sg(mcspi_dma->dma_rx, &sg, 1,
493+
DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT |
494+
DMA_CTRL_ACK);
486495
if (tx) {
487496
tx->callback = omap2_mcspi_rx_callback;
488497
tx->callback_param = spi;
@@ -496,6 +505,8 @@ omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer,
496505
omap2_mcspi_set_dma_req(spi, 1, 1);
497506

498507
wait_for_completion(&mcspi_dma->dma_rx_completion);
508+
dma_unmap_single(mcspi->dev, xfer->rx_dma, count,
509+
DMA_FROM_DEVICE);
499510

500511
if (mcspi->fifo_depth > 0)
501512
return count;
@@ -608,6 +619,8 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
608619

609620
if (tx != NULL) {
610621
wait_for_completion(&mcspi_dma->dma_tx_completion);
622+
dma_unmap_single(mcspi->dev, xfer->tx_dma, xfer->len,
623+
DMA_TO_DEVICE);
611624

612625
if (mcspi->fifo_depth > 0) {
613626
irqstat_reg = mcspi->base + OMAP2_MCSPI_IRQSTATUS;
@@ -1074,16 +1087,6 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
10741087
gpio_free(spi->cs_gpio);
10751088
}
10761089

1077-
static bool omap2_mcspi_can_dma(struct spi_master *master,
1078-
struct spi_device *spi,
1079-
struct spi_transfer *xfer)
1080-
{
1081-
if (xfer->len < DMA_MIN_BYTES)
1082-
return false;
1083-
1084-
return true;
1085-
}
1086-
10871090
static int omap2_mcspi_work_one(struct omap2_mcspi *mcspi,
10881091
struct spi_device *spi, struct spi_transfer *t)
10891092
{
@@ -1265,6 +1268,32 @@ static int omap2_mcspi_transfer_one(struct spi_master *master,
12651268
return -EINVAL;
12661269
}
12671270

1271+
if (len < DMA_MIN_BYTES)
1272+
goto skip_dma_map;
1273+
1274+
if (mcspi_dma->dma_tx && tx_buf != NULL) {
1275+
t->tx_dma = dma_map_single(mcspi->dev, (void *) tx_buf,
1276+
len, DMA_TO_DEVICE);
1277+
if (dma_mapping_error(mcspi->dev, t->tx_dma)) {
1278+
dev_dbg(mcspi->dev, "dma %cX %d bytes error\n",
1279+
'T', len);
1280+
return -EINVAL;
1281+
}
1282+
}
1283+
if (mcspi_dma->dma_rx && rx_buf != NULL) {
1284+
t->rx_dma = dma_map_single(mcspi->dev, rx_buf, t->len,
1285+
DMA_FROM_DEVICE);
1286+
if (dma_mapping_error(mcspi->dev, t->rx_dma)) {
1287+
dev_dbg(mcspi->dev, "dma %cX %d bytes error\n",
1288+
'R', len);
1289+
if (tx_buf != NULL)
1290+
dma_unmap_single(mcspi->dev, t->tx_dma,
1291+
len, DMA_TO_DEVICE);
1292+
return -EINVAL;
1293+
}
1294+
}
1295+
1296+
skip_dma_map:
12681297
return omap2_mcspi_work_one(mcspi, spi, t);
12691298
}
12701299

@@ -1348,7 +1377,6 @@ static int omap2_mcspi_probe(struct platform_device *pdev)
13481377
master->transfer_one = omap2_mcspi_transfer_one;
13491378
master->set_cs = omap2_mcspi_set_cs;
13501379
master->cleanup = omap2_mcspi_cleanup;
1351-
master->can_dma = omap2_mcspi_can_dma;
13521380
master->dev.of_node = node;
13531381
master->max_speed_hz = OMAP2_MCSPI_MAX_FREQ;
13541382
master->min_speed_hz = OMAP2_MCSPI_MAX_FREQ >> 15;

drivers/spi/spi-pxa2xx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ static const struct lpss_config lpss_platforms[] = {
126126
.reg_general = -1,
127127
.reg_ssp = 0x20,
128128
.reg_cs_ctrl = 0x24,
129-
.reg_capabilities = 0xfc,
129+
.reg_capabilities = -1,
130130
.rx_threshold = 1,
131131
.tx_threshold_lo = 32,
132132
.tx_threshold_hi = 56,

drivers/spi/spi-ti-qspi.c

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ struct ti_qspi {
9494
#define QSPI_FLEN(n) ((n - 1) << 0)
9595
#define QSPI_WLEN_MAX_BITS 128
9696
#define QSPI_WLEN_MAX_BYTES 16
97+
#define QSPI_WLEN_MASK QSPI_WLEN(QSPI_WLEN_MAX_BITS)
9798

9899
/* STATUS REGISTER */
99100
#define BUSY 0x01
@@ -235,16 +236,16 @@ static inline int ti_qspi_poll_wc(struct ti_qspi *qspi)
235236
return -ETIMEDOUT;
236237
}
237238

238-
static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t)
239+
static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t,
240+
int count)
239241
{
240-
int wlen, count, xfer_len;
242+
int wlen, xfer_len;
241243
unsigned int cmd;
242244
const u8 *txbuf;
243245
u32 data;
244246

245247
txbuf = t->tx_buf;
246248
cmd = qspi->cmd | QSPI_WR_SNGL;
247-
count = t->len;
248249
wlen = t->bits_per_word >> 3; /* in bytes */
249250
xfer_len = wlen;
250251

@@ -304,9 +305,10 @@ static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t)
304305
return 0;
305306
}
306307

307-
static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t)
308+
static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t,
309+
int count)
308310
{
309-
int wlen, count;
311+
int wlen;
310312
unsigned int cmd;
311313
u8 *rxbuf;
312314

@@ -323,7 +325,6 @@ static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t)
323325
cmd |= QSPI_RD_SNGL;
324326
break;
325327
}
326-
count = t->len;
327328
wlen = t->bits_per_word >> 3; /* in bytes */
328329

329330
while (count) {
@@ -354,20 +355,21 @@ static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t)
354355
return 0;
355356
}
356357

357-
static int qspi_transfer_msg(struct ti_qspi *qspi, struct spi_transfer *t)
358+
static int qspi_transfer_msg(struct ti_qspi *qspi, struct spi_transfer *t,
359+
int count)
358360
{
359361
int ret;
360362

361363
if (t->tx_buf) {
362-
ret = qspi_write_msg(qspi, t);
364+
ret = qspi_write_msg(qspi, t, count);
363365
if (ret) {
364366
dev_dbg(qspi->dev, "Error while writing\n");
365367
return ret;
366368
}
367369
}
368370

369371
if (t->rx_buf) {
370-
ret = qspi_read_msg(qspi, t);
372+
ret = qspi_read_msg(qspi, t, count);
371373
if (ret) {
372374
dev_dbg(qspi->dev, "Error while reading\n");
373375
return ret;
@@ -450,7 +452,8 @@ static int ti_qspi_start_transfer_one(struct spi_master *master,
450452
struct spi_device *spi = m->spi;
451453
struct spi_transfer *t;
452454
int status = 0, ret;
453-
int frame_length;
455+
unsigned int frame_len_words, transfer_len_words;
456+
int wlen;
454457

455458
/* setup device control reg */
456459
qspi->dc = 0;
@@ -462,14 +465,15 @@ static int ti_qspi_start_transfer_one(struct spi_master *master,
462465
if (spi->mode & SPI_CS_HIGH)
463466
qspi->dc |= QSPI_CSPOL(spi->chip_select);
464467

465-
frame_length = (m->frame_length << 3) / spi->bits_per_word;
466-
467-
frame_length = clamp(frame_length, 0, QSPI_FRAME);
468+
frame_len_words = 0;
469+
list_for_each_entry(t, &m->transfers, transfer_list)
470+
frame_len_words += t->len / (t->bits_per_word >> 3);
471+
frame_len_words = min_t(unsigned int, frame_len_words, QSPI_FRAME);
468472

469473
/* setup command reg */
470474
qspi->cmd = 0;
471475
qspi->cmd |= QSPI_EN_CS(spi->chip_select);
472-
qspi->cmd |= QSPI_FLEN(frame_length);
476+
qspi->cmd |= QSPI_FLEN(frame_len_words);
473477

474478
ti_qspi_write(qspi, qspi->dc, QSPI_SPI_DC_REG);
475479

@@ -479,16 +483,23 @@ static int ti_qspi_start_transfer_one(struct spi_master *master,
479483
ti_qspi_disable_memory_map(spi);
480484

481485
list_for_each_entry(t, &m->transfers, transfer_list) {
482-
qspi->cmd |= QSPI_WLEN(t->bits_per_word);
486+
qspi->cmd = ((qspi->cmd & ~QSPI_WLEN_MASK) |
487+
QSPI_WLEN(t->bits_per_word));
488+
489+
wlen = t->bits_per_word >> 3;
490+
transfer_len_words = min(t->len / wlen, frame_len_words);
483491

484-
ret = qspi_transfer_msg(qspi, t);
492+
ret = qspi_transfer_msg(qspi, t, transfer_len_words * wlen);
485493
if (ret) {
486494
dev_dbg(qspi->dev, "transfer message failed\n");
487495
mutex_unlock(&qspi->list_lock);
488496
return -EINVAL;
489497
}
490498

491-
m->actual_length += t->len;
499+
m->actual_length += transfer_len_words * wlen;
500+
frame_len_words -= transfer_len_words;
501+
if (frame_len_words == 0)
502+
break;
492503
}
493504

494505
mutex_unlock(&qspi->list_lock);

0 commit comments

Comments
 (0)