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 f996c600eb8..163fd802b7a 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -543,17 +543,16 @@ static void spi_pump_messages(struct kthread_work *work)  	/* Lock queue and check for queue work */  	spin_lock_irqsave(&master->queue_lock, flags);  	if (list_empty(&master->queue) || !master->running) { -		if (master->busy && master->unprepare_transfer_hardware) { -			ret = master->unprepare_transfer_hardware(master); -			if (ret) { -				spin_unlock_irqrestore(&master->queue_lock, flags); -				dev_err(&master->dev, -					"failed to unprepare transfer hardware\n"); -				return; -			} +		if (!master->busy) { +			spin_unlock_irqrestore(&master->queue_lock, flags); +			return;  		}  		master->busy = false;  		spin_unlock_irqrestore(&master->queue_lock, flags); +		if (master->unprepare_transfer_hardware && +		    master->unprepare_transfer_hardware(master)) +			dev_err(&master->dev, +				"failed to unprepare transfer hardware\n");  		return;  	} @@ -984,7 +983,7 @@ static void acpi_register_spi_devices(struct spi_master *master)  	acpi_status status;  	acpi_handle handle; -	handle = ACPI_HANDLE(&master->dev); +	handle = ACPI_HANDLE(master->dev.parent);  	if (!handle)  		return; @@ -1377,6 +1376,14 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)  			xfer->bits_per_word = spi->bits_per_word;  		if (!xfer->speed_hz)  			xfer->speed_hz = spi->max_speed_hz; +		if (master->bits_per_word_mask) { +			/* Only 32 bits fit in the mask */ +			if (xfer->bits_per_word > 32) +				return -EINVAL; +			if (!(master->bits_per_word_mask & +					BIT(xfer->bits_per_word - 1))) +				return -EINVAL; +		}  	}  	message->spi = spi;  |