|
@@ -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;
|
|
|
}
|
|
|
|