OSDN Git Service

spi: img-spfi: Reset controller after each message
authorAndrew Bresticker <abrestic@chromium.org>
Wed, 8 Apr 2015 17:03:15 +0000 (10:03 -0700)
committerMark Brown <broonie@kernel.org>
Wed, 8 Apr 2015 20:04:28 +0000 (21:04 +0100)
Imagination has recommended that the SPFI controller be reset after
each message, regardless of success or failure.  Do this in an
unprepare_message() callback.

Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-img-spfi.c

index 3fd7b07..c37f6e5 100644 (file)
@@ -414,8 +414,6 @@ static void img_spfi_handle_err(struct spi_master *master,
                dmaengine_terminate_all(spfi->rx_ch);
        }
        spin_unlock_irqrestore(&spfi->lock, flags);
-
-       spfi_reset(spfi);
 }
 
 static int img_spfi_prepare(struct spi_master *master, struct spi_message *msg)
@@ -437,6 +435,16 @@ static int img_spfi_prepare(struct spi_master *master, struct spi_message *msg)
        return 0;
 }
 
+static int img_spfi_unprepare(struct spi_master *master,
+                             struct spi_message *msg)
+{
+       struct img_spfi *spfi = spi_master_get_devdata(master);
+
+       spfi_reset(spfi);
+
+       return 0;
+}
+
 static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
                            struct spi_transfer *xfer)
 {
@@ -610,6 +618,7 @@ static int img_spfi_probe(struct platform_device *pdev)
        master->set_cs = img_spfi_set_cs;
        master->transfer_one = img_spfi_transfer_one;
        master->prepare_message = img_spfi_prepare;
+       master->unprepare_message = img_spfi_unprepare;
        master->handle_err = img_spfi_handle_err;
 
        spfi->tx_ch = dma_request_slave_channel(spfi->dev, "tx");