diff options
Diffstat (limited to 'drivers/spi/spi.c')
-rw-r--r-- | drivers/spi/spi.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index f996c600eb8c..163fd802b7ac 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -543,17 +543,16 @@ static void spi_pump_messages(struct kthread_work *work) | |||
543 | /* Lock queue and check for queue work */ | 543 | /* Lock queue and check for queue work */ |
544 | spin_lock_irqsave(&master->queue_lock, flags); | 544 | spin_lock_irqsave(&master->queue_lock, flags); |
545 | if (list_empty(&master->queue) || !master->running) { | 545 | if (list_empty(&master->queue) || !master->running) { |
546 | if (master->busy && master->unprepare_transfer_hardware) { | 546 | if (!master->busy) { |
547 | ret = master->unprepare_transfer_hardware(master); | 547 | spin_unlock_irqrestore(&master->queue_lock, flags); |
548 | if (ret) { | 548 | return; |
549 | spin_unlock_irqrestore(&master->queue_lock, flags); | ||
550 | dev_err(&master->dev, | ||
551 | "failed to unprepare transfer hardware\n"); | ||
552 | return; | ||
553 | } | ||
554 | } | 549 | } |
555 | master->busy = false; | 550 | master->busy = false; |
556 | spin_unlock_irqrestore(&master->queue_lock, flags); | 551 | spin_unlock_irqrestore(&master->queue_lock, flags); |
552 | if (master->unprepare_transfer_hardware && | ||
553 | master->unprepare_transfer_hardware(master)) | ||
554 | dev_err(&master->dev, | ||
555 | "failed to unprepare transfer hardware\n"); | ||
557 | return; | 556 | return; |
558 | } | 557 | } |
559 | 558 | ||
@@ -984,7 +983,7 @@ static void acpi_register_spi_devices(struct spi_master *master) | |||
984 | acpi_status status; | 983 | acpi_status status; |
985 | acpi_handle handle; | 984 | acpi_handle handle; |
986 | 985 | ||
987 | handle = ACPI_HANDLE(&master->dev); | 986 | handle = ACPI_HANDLE(master->dev.parent); |
988 | if (!handle) | 987 | if (!handle) |
989 | return; | 988 | return; |
990 | 989 | ||
@@ -1377,6 +1376,14 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message) | |||
1377 | xfer->bits_per_word = spi->bits_per_word; | 1376 | xfer->bits_per_word = spi->bits_per_word; |
1378 | if (!xfer->speed_hz) | 1377 | if (!xfer->speed_hz) |
1379 | xfer->speed_hz = spi->max_speed_hz; | 1378 | xfer->speed_hz = spi->max_speed_hz; |
1379 | if (master->bits_per_word_mask) { | ||
1380 | /* Only 32 bits fit in the mask */ | ||
1381 | if (xfer->bits_per_word > 32) | ||
1382 | return -EINVAL; | ||
1383 | if (!(master->bits_per_word_mask & | ||
1384 | BIT(xfer->bits_per_word - 1))) | ||
1385 | return -EINVAL; | ||
1386 | } | ||
1380 | } | 1387 | } |
1381 | 1388 | ||
1382 | message->spi = spi; | 1389 | message->spi = spi; |