aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-img-spfi.c
diff options
context:
space:
mode:
authorEzequiel Garcia <ezequiel.garcia@imgtec.com>2015-04-08 13:03:14 -0400
committerMark Brown <broonie@kernel.org>2015-04-08 16:04:28 -0400
commit824ab37df006ea2d06e4c4817344c0e8c056b744 (patch)
treed114e45f4949bdf93564efec4f43e342cd027421 /drivers/spi/spi-img-spfi.c
parent89cda06d7f9c3c111a81fcdf5464926f5f984ebc (diff)
spi: img-spfi: Implement a handle_err() callback
The driver can be greatly simplified by moving the transfer timeout handling to a handle_err() callback. Signed-off-by: Ezequiel Garcia <ezequiel.garcia@imgtec.com> Signed-off-by: Andrew Bresticker <abrestic@chromium.org> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-img-spfi.c')
-rw-r--r--drivers/spi/spi-img-spfi.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/drivers/spi/spi-img-spfi.c b/drivers/spi/spi-img-spfi.c
index c9f3bca988d7..3fd7b07c3eef 100644
--- a/drivers/spi/spi-img-spfi.c
+++ b/drivers/spi/spi-img-spfi.c
@@ -270,7 +270,6 @@ static int img_spfi_start_pio(struct spi_master *master,
270 270
271 if (rx_bytes > 0 || tx_bytes > 0) { 271 if (rx_bytes > 0 || tx_bytes > 0) {
272 dev_err(spfi->dev, "PIO transfer timed out\n"); 272 dev_err(spfi->dev, "PIO transfer timed out\n");
273 spfi_reset(spfi);
274 return -ETIMEDOUT; 273 return -ETIMEDOUT;
275 } 274 }
276 275
@@ -396,6 +395,29 @@ stop_dma:
396 return -EIO; 395 return -EIO;
397} 396}
398 397
398static void img_spfi_handle_err(struct spi_master *master,
399 struct spi_message *msg)
400{
401 struct img_spfi *spfi = spi_master_get_devdata(master);
402 unsigned long flags;
403
404 /*
405 * Stop all DMA and reset the controller if the previous transaction
406 * timed-out and never completed it's DMA.
407 */
408 spin_lock_irqsave(&spfi->lock, flags);
409 if (spfi->tx_dma_busy || spfi->rx_dma_busy) {
410 spfi->tx_dma_busy = false;
411 spfi->rx_dma_busy = false;
412
413 dmaengine_terminate_all(spfi->tx_ch);
414 dmaengine_terminate_all(spfi->rx_ch);
415 }
416 spin_unlock_irqrestore(&spfi->lock, flags);
417
418 spfi_reset(spfi);
419}
420
399static int img_spfi_prepare(struct spi_master *master, struct spi_message *msg) 421static int img_spfi_prepare(struct spi_master *master, struct spi_message *msg)
400{ 422{
401 struct img_spfi *spfi = spi_master_get_devdata(master); 423 struct img_spfi *spfi = spi_master_get_devdata(master);
@@ -462,8 +484,6 @@ static int img_spfi_transfer_one(struct spi_master *master,
462 struct spi_transfer *xfer) 484 struct spi_transfer *xfer)
463{ 485{
464 struct img_spfi *spfi = spi_master_get_devdata(spi->master); 486 struct img_spfi *spfi = spi_master_get_devdata(spi->master);
465 bool dma_reset = false;
466 unsigned long flags;
467 int ret; 487 int ret;
468 488
469 if (xfer->len > SPFI_TRANSACTION_TSIZE_MASK) { 489 if (xfer->len > SPFI_TRANSACTION_TSIZE_MASK) {
@@ -473,23 +493,6 @@ static int img_spfi_transfer_one(struct spi_master *master,
473 return -EINVAL; 493 return -EINVAL;
474 } 494 }
475 495
476 /*
477 * Stop all DMA and reset the controller if the previous transaction
478 * timed-out and never completed it's DMA.
479 */
480 spin_lock_irqsave(&spfi->lock, flags);
481 if (spfi->tx_dma_busy || spfi->rx_dma_busy) {
482 dev_err(spfi->dev, "SPI DMA still busy\n");
483 dma_reset = true;
484 }
485 spin_unlock_irqrestore(&spfi->lock, flags);
486
487 if (dma_reset) {
488 dmaengine_terminate_all(spfi->tx_ch);
489 dmaengine_terminate_all(spfi->rx_ch);
490 spfi_reset(spfi);
491 }
492
493 img_spfi_config(master, spi, xfer); 496 img_spfi_config(master, spi, xfer);
494 if (master->can_dma && master->can_dma(master, spi, xfer)) 497 if (master->can_dma && master->can_dma(master, spi, xfer))
495 ret = img_spfi_start_dma(master, spi, xfer); 498 ret = img_spfi_start_dma(master, spi, xfer);
@@ -607,6 +610,7 @@ static int img_spfi_probe(struct platform_device *pdev)
607 master->set_cs = img_spfi_set_cs; 610 master->set_cs = img_spfi_set_cs;
608 master->transfer_one = img_spfi_transfer_one; 611 master->transfer_one = img_spfi_transfer_one;
609 master->prepare_message = img_spfi_prepare; 612 master->prepare_message = img_spfi_prepare;
613 master->handle_err = img_spfi_handle_err;
610 614
611 spfi->tx_ch = dma_request_slave_channel(spfi->dev, "tx"); 615 spfi->tx_ch = dma_request_slave_channel(spfi->dev, "tx");
612 spfi->rx_ch = dma_request_slave_channel(spfi->dev, "rx"); 616 spfi->rx_ch = dma_request_slave_channel(spfi->dev, "rx");