Skip to content

Commit 5003bc6

Browse files
committed
Merge tag 'spi-fix-v4.6-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
Pull spi fixes from Mark Brown: "A couple of driver specific fixes here that came in since the merge window plus one core fix for locking in cases where a client driver grabs a lock on the whole bus for an extended series of operations that was introduced by the changes to support accelerated flash operations" * tag 'spi-fix-v4.6-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: rockchip: fix probe deferral handling spi: omap2-mcspi: fix dma transfer for vmalloced buffer spi: fix possible deadlock between internal bus locks and bus_lock_flag spi: imx: Fix possible NULL pointer deref spi: imx: only do necessary changes to ECSPIx_CONFIGREG spi: rockchip: Spelling s/divsor/divisor/
2 parents 1b5caa3 + cb39f73 commit 5003bc6

File tree

4 files changed

+43
-55
lines changed

4 files changed

+43
-55
lines changed

drivers/spi/spi-imx.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,15 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
211211
struct spi_transfer *transfer)
212212
{
213213
struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
214-
unsigned int bpw = transfer->bits_per_word;
214+
unsigned int bpw;
215215

216216
if (!master->dma_rx)
217217
return false;
218218

219+
if (!transfer)
220+
return false;
221+
222+
bpw = transfer->bits_per_word;
219223
if (!bpw)
220224
bpw = spi->bits_per_word;
221225

@@ -333,8 +337,9 @@ static void __maybe_unused mx51_ecspi_trigger(struct spi_imx_data *spi_imx)
333337
static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
334338
struct spi_imx_config *config)
335339
{
336-
u32 ctrl = MX51_ECSPI_CTRL_ENABLE, cfg = 0;
340+
u32 ctrl = MX51_ECSPI_CTRL_ENABLE;
337341
u32 clk = config->speed_hz, delay, reg;
342+
u32 cfg = readl(spi_imx->base + MX51_ECSPI_CONFIG);
338343

339344
/*
340345
* The hardware seems to have a race condition when changing modes. The
@@ -358,13 +363,20 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
358363

359364
if (config->mode & SPI_CPHA)
360365
cfg |= MX51_ECSPI_CONFIG_SCLKPHA(config->cs);
366+
else
367+
cfg &= ~MX51_ECSPI_CONFIG_SCLKPHA(config->cs);
361368

362369
if (config->mode & SPI_CPOL) {
363370
cfg |= MX51_ECSPI_CONFIG_SCLKPOL(config->cs);
364371
cfg |= MX51_ECSPI_CONFIG_SCLKCTL(config->cs);
372+
} else {
373+
cfg &= ~MX51_ECSPI_CONFIG_SCLKPOL(config->cs);
374+
cfg &= ~MX51_ECSPI_CONFIG_SCLKCTL(config->cs);
365375
}
366376
if (config->mode & SPI_CS_HIGH)
367377
cfg |= MX51_ECSPI_CONFIG_SSBPOL(config->cs);
378+
else
379+
cfg &= ~MX51_ECSPI_CONFIG_SSBPOL(config->cs);
368380

369381
if (spi_imx->usedma)
370382
ctrl |= MX51_ECSPI_CTRL_SMC;

drivers/spi/spi-omap2-mcspi.c

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -423,16 +423,12 @@ 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;
427426

428427
dmaengine_slave_config(mcspi_dma->dma_tx, &cfg);
429428

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);
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);
436432
if (tx) {
437433
tx->callback = omap2_mcspi_tx_callback;
438434
tx->callback_param = spi;
@@ -478,20 +474,15 @@ omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer,
478474

479475
if (mcspi_dma->dma_rx) {
480476
struct dma_async_tx_descriptor *tx;
481-
struct scatterlist sg;
482477

483478
dmaengine_slave_config(mcspi_dma->dma_rx, &cfg);
484479

485480
if ((l & OMAP2_MCSPI_CHCONF_TURBO) && mcspi->fifo_depth == 0)
486481
dma_count -= es;
487482

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);
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);
495486
if (tx) {
496487
tx->callback = omap2_mcspi_rx_callback;
497488
tx->callback_param = spi;
@@ -505,8 +496,6 @@ omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer,
505496
omap2_mcspi_set_dma_req(spi, 1, 1);
506497

507498
wait_for_completion(&mcspi_dma->dma_rx_completion);
508-
dma_unmap_single(mcspi->dev, xfer->rx_dma, count,
509-
DMA_FROM_DEVICE);
510499

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

620609
if (tx != NULL) {
621610
wait_for_completion(&mcspi_dma->dma_tx_completion);
622-
dma_unmap_single(mcspi->dev, xfer->tx_dma, xfer->len,
623-
DMA_TO_DEVICE);
624611

625612
if (mcspi->fifo_depth > 0) {
626613
irqstat_reg = mcspi->base + OMAP2_MCSPI_IRQSTATUS;
@@ -1087,6 +1074,16 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
10871074
gpio_free(spi->cs_gpio);
10881075
}
10891076

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+
10901087
static int omap2_mcspi_work_one(struct omap2_mcspi *mcspi,
10911088
struct spi_device *spi, struct spi_transfer *t)
10921089
{
@@ -1268,32 +1265,6 @@ static int omap2_mcspi_transfer_one(struct spi_master *master,
12681265
return -EINVAL;
12691266
}
12701267

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:
12971268
return omap2_mcspi_work_one(mcspi, spi, t);
12981269
}
12991270

@@ -1377,6 +1348,7 @@ static int omap2_mcspi_probe(struct platform_device *pdev)
13771348
master->transfer_one = omap2_mcspi_transfer_one;
13781349
master->set_cs = omap2_mcspi_set_cs;
13791350
master->cleanup = omap2_mcspi_cleanup;
1351+
master->can_dma = omap2_mcspi_can_dma;
13801352
master->dev.of_node = node;
13811353
master->max_speed_hz = OMAP2_MCSPI_MAX_FREQ;
13821354
master->min_speed_hz = OMAP2_MCSPI_MAX_FREQ >> 15;

drivers/spi/spi-rockchip.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ static void rockchip_spi_config(struct rockchip_spi *rs)
534534
if (WARN_ON(rs->speed > MAX_SCLK_OUT))
535535
rs->speed = MAX_SCLK_OUT;
536536

537-
/* the minimum divsor is 2 */
537+
/* the minimum divisor is 2 */
538538
if (rs->max_freq < 2 * rs->speed) {
539539
clk_set_rate(rs->spiclk, 2 * rs->speed);
540540
rs->max_freq = clk_get_rate(rs->spiclk);
@@ -730,23 +730,27 @@ static int rockchip_spi_probe(struct platform_device *pdev)
730730
master->transfer_one = rockchip_spi_transfer_one;
731731
master->handle_err = rockchip_spi_handle_err;
732732

733-
rs->dma_tx.ch = dma_request_slave_channel(rs->dev, "tx");
734-
if (IS_ERR_OR_NULL(rs->dma_tx.ch)) {
733+
rs->dma_tx.ch = dma_request_chan(rs->dev, "tx");
734+
if (IS_ERR(rs->dma_tx.ch)) {
735735
/* Check tx to see if we need defer probing driver */
736736
if (PTR_ERR(rs->dma_tx.ch) == -EPROBE_DEFER) {
737737
ret = -EPROBE_DEFER;
738738
goto err_get_fifo_len;
739739
}
740740
dev_warn(rs->dev, "Failed to request TX DMA channel\n");
741+
rs->dma_tx.ch = NULL;
741742
}
742743

743-
rs->dma_rx.ch = dma_request_slave_channel(rs->dev, "rx");
744-
if (!rs->dma_rx.ch) {
745-
if (rs->dma_tx.ch) {
744+
rs->dma_rx.ch = dma_request_chan(rs->dev, "rx");
745+
if (IS_ERR(rs->dma_rx.ch)) {
746+
if (PTR_ERR(rs->dma_rx.ch) == -EPROBE_DEFER) {
746747
dma_release_channel(rs->dma_tx.ch);
747748
rs->dma_tx.ch = NULL;
749+
ret = -EPROBE_DEFER;
750+
goto err_get_fifo_len;
748751
}
749752
dev_warn(rs->dev, "Failed to request RX DMA channel\n");
753+
rs->dma_rx.ch = NULL;
750754
}
751755

752756
if (rs->dma_tx.ch && rs->dma_rx.ch) {

drivers/spi/spi.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,7 +1209,7 @@ static void spi_pump_messages(struct kthread_work *work)
12091209
struct spi_master *master =
12101210
container_of(work, struct spi_master, pump_messages);
12111211

1212-
__spi_pump_messages(master, true, false);
1212+
__spi_pump_messages(master, true, master->bus_lock_flag);
12131213
}
12141214

12151215
static int spi_init_queue(struct spi_master *master)
@@ -2853,7 +2853,7 @@ static int __spi_sync(struct spi_device *spi, struct spi_message *message,
28532853
*/
28542854
int spi_sync(struct spi_device *spi, struct spi_message *message)
28552855
{
2856-
return __spi_sync(spi, message, 0);
2856+
return __spi_sync(spi, message, spi->master->bus_lock_flag);
28572857
}
28582858
EXPORT_SYMBOL_GPL(spi_sync);
28592859

0 commit comments

Comments
 (0)