]> git.karo-electronics.de Git - linux-beck.git/commitdiff
spi: spidev: use spi_sync instead of spi_async
authorMartin Sperl <kernel@martin.sperl.org>
Thu, 23 Apr 2015 07:56:01 +0000 (07:56 +0000)
committerMark Brown <broonie@kernel.org>
Thu, 23 Apr 2015 09:34:39 +0000 (10:34 +0100)
This has the benefit that the "optimization" of the framework in regards
to spi_sync will also benefit spidev users directly and allow running
spi transfers without a necessary context-switch to message-pump.

Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spidev.c

index 4eb7a980e67075a018a9be2dd4146927a3f38a6c..eb0a075b23a2222eba583225afc3844b455cfb96 100644 (file)
@@ -95,37 +95,25 @@ MODULE_PARM_DESC(bufsiz, "data bytes in biggest supported SPI message");
 
 /*-------------------------------------------------------------------------*/
 
-/*
- * We can't use the standard synchronous wrappers for file I/O; we
- * need to protect against async removal of the underlying spi_device.
- */
-static void spidev_complete(void *arg)
-{
-       complete(arg);
-}
-
 static ssize_t
 spidev_sync(struct spidev_data *spidev, struct spi_message *message)
 {
        DECLARE_COMPLETION_ONSTACK(done);
        int status;
-
-       message->complete = spidev_complete;
-       message->context = &done;
+       struct spi_device *spi;
 
        spin_lock_irq(&spidev->spi_lock);
-       if (spidev->spi == NULL)
+       spi = spidev->spi;
+       spin_unlock_irq(&spidev->spi_lock);
+
+       if (spi == NULL)
                status = -ESHUTDOWN;
        else
-               status = spi_async(spidev->spi, message);
-       spin_unlock_irq(&spidev->spi_lock);
+               status = spi_sync(spi, message);
+
+       if (status == 0)
+               status = message->actual_length;
 
-       if (status == 0) {
-               wait_for_completion(&done);
-               status = message->status;
-               if (status == 0)
-                       status = message->actual_length;
-       }
        return status;
 }