|
@@ -1596,15 +1596,11 @@ int spi_setup(struct spi_device *spi)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(spi_setup);
|
|
EXPORT_SYMBOL_GPL(spi_setup);
|
|
|
|
|
|
-static int __spi_async(struct spi_device *spi, struct spi_message *message)
|
|
|
|
|
|
+static int __spi_validate(struct spi_device *spi, struct spi_message *message)
|
|
{
|
|
{
|
|
struct spi_master *master = spi->master;
|
|
struct spi_master *master = spi->master;
|
|
struct spi_transfer *xfer;
|
|
struct spi_transfer *xfer;
|
|
|
|
|
|
- message->spi = spi;
|
|
|
|
-
|
|
|
|
- trace_spi_message_submit(message);
|
|
|
|
-
|
|
|
|
if (list_empty(&message->transfers))
|
|
if (list_empty(&message->transfers))
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
if (!message->complete)
|
|
if (!message->complete)
|
|
@@ -1705,6 +1701,18 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)
|
|
}
|
|
}
|
|
|
|
|
|
message->status = -EINPROGRESS;
|
|
message->status = -EINPROGRESS;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int __spi_async(struct spi_device *spi, struct spi_message *message)
|
|
|
|
+{
|
|
|
|
+ struct spi_master *master = spi->master;
|
|
|
|
+
|
|
|
|
+ message->spi = spi;
|
|
|
|
+
|
|
|
|
+ trace_spi_message_submit(message);
|
|
|
|
+
|
|
return master->transfer(spi, message);
|
|
return master->transfer(spi, message);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1743,6 +1751,10 @@ int spi_async(struct spi_device *spi, struct spi_message *message)
|
|
int ret;
|
|
int ret;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
|
|
+ ret = __spi_validate(spi, message);
|
|
|
|
+ if (ret != 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
spin_lock_irqsave(&master->bus_lock_spinlock, flags);
|
|
spin_lock_irqsave(&master->bus_lock_spinlock, flags);
|
|
|
|
|
|
if (master->bus_lock_flag)
|
|
if (master->bus_lock_flag)
|
|
@@ -1791,6 +1803,10 @@ int spi_async_locked(struct spi_device *spi, struct spi_message *message)
|
|
int ret;
|
|
int ret;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
|
|
+ ret = __spi_validate(spi, message);
|
|
|
|
+ if (ret != 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
spin_lock_irqsave(&master->bus_lock_spinlock, flags);
|
|
spin_lock_irqsave(&master->bus_lock_spinlock, flags);
|
|
|
|
|
|
ret = __spi_async(spi, message);
|
|
ret = __spi_async(spi, message);
|