diff options
Diffstat (limited to 'drivers/spi/spidev.c')
| -rw-r--r-- | drivers/spi/spidev.c | 36 | 
1 files changed, 18 insertions, 18 deletions
| diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 6313e7d0cdf8..1935ca613447 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c @@ -68,7 +68,7 @@ static_assert(N_SPI_MINORS > 0 && N_SPI_MINORS <= 256);  struct spidev_data {  	dev_t			devt; -	spinlock_t		spi_lock; +	struct mutex		spi_lock;  	struct spi_device	*spi;  	struct list_head	device_entry; @@ -95,9 +95,8 @@ spidev_sync(struct spidev_data *spidev, struct spi_message *message)  	int status;  	struct spi_device *spi; -	spin_lock_irq(&spidev->spi_lock); +	mutex_lock(&spidev->spi_lock);  	spi = spidev->spi; -	spin_unlock_irq(&spidev->spi_lock);  	if (spi == NULL)  		status = -ESHUTDOWN; @@ -107,6 +106,7 @@ spidev_sync(struct spidev_data *spidev, struct spi_message *message)  	if (status == 0)  		status = message->actual_length; +	mutex_unlock(&spidev->spi_lock);  	return status;  } @@ -359,12 +359,12 @@ spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  	 * we issue this ioctl.  	 */  	spidev = filp->private_data; -	spin_lock_irq(&spidev->spi_lock); +	mutex_lock(&spidev->spi_lock);  	spi = spi_dev_get(spidev->spi); -	spin_unlock_irq(&spidev->spi_lock); - -	if (spi == NULL) +	if (spi == NULL) { +		mutex_unlock(&spidev->spi_lock);  		return -ESHUTDOWN; +	}  	/* use the buffer lock here for triple duty:  	 *  - prevent I/O (from us) so calling spi_setup() is safe; @@ -508,6 +508,7 @@ spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  	mutex_unlock(&spidev->buf_lock);  	spi_dev_put(spi); +	mutex_unlock(&spidev->spi_lock);  	return retval;  } @@ -529,12 +530,12 @@ spidev_compat_ioc_message(struct file *filp, unsigned int cmd,  	 * we issue this ioctl.  	 */  	spidev = filp->private_data; -	spin_lock_irq(&spidev->spi_lock); +	mutex_lock(&spidev->spi_lock);  	spi = spi_dev_get(spidev->spi); -	spin_unlock_irq(&spidev->spi_lock); - -	if (spi == NULL) +	if (spi == NULL) { +		mutex_unlock(&spidev->spi_lock);  		return -ESHUTDOWN; +	}  	/* SPI_IOC_MESSAGE needs the buffer locked "normally" */  	mutex_lock(&spidev->buf_lock); @@ -561,6 +562,7 @@ spidev_compat_ioc_message(struct file *filp, unsigned int cmd,  done:  	mutex_unlock(&spidev->buf_lock);  	spi_dev_put(spi); +	mutex_unlock(&spidev->spi_lock);  	return retval;  } @@ -601,7 +603,6 @@ static int spidev_open(struct inode *inode, struct file *filp)  	if (!spidev->tx_buffer) {  		spidev->tx_buffer = kmalloc(bufsiz, GFP_KERNEL);  		if (!spidev->tx_buffer) { -			dev_dbg(&spidev->spi->dev, "open/ENOMEM\n");  			status = -ENOMEM;  			goto err_find_dev;  		} @@ -610,7 +611,6 @@ static int spidev_open(struct inode *inode, struct file *filp)  	if (!spidev->rx_buffer) {  		spidev->rx_buffer = kmalloc(bufsiz, GFP_KERNEL);  		if (!spidev->rx_buffer) { -			dev_dbg(&spidev->spi->dev, "open/ENOMEM\n");  			status = -ENOMEM;  			goto err_alloc_rx_buf;  		} @@ -640,10 +640,10 @@ static int spidev_release(struct inode *inode, struct file *filp)  	spidev = filp->private_data;  	filp->private_data = NULL; -	spin_lock_irq(&spidev->spi_lock); +	mutex_lock(&spidev->spi_lock);  	/* ... after we unbound from the underlying device? */  	dofree = (spidev->spi == NULL); -	spin_unlock_irq(&spidev->spi_lock); +	mutex_unlock(&spidev->spi_lock);  	/* last close? */  	spidev->users--; @@ -776,7 +776,7 @@ static int spidev_probe(struct spi_device *spi)  	/* Initialize the driver data */  	spidev->spi = spi; -	spin_lock_init(&spidev->spi_lock); +	mutex_init(&spidev->spi_lock);  	mutex_init(&spidev->buf_lock);  	INIT_LIST_HEAD(&spidev->device_entry); @@ -821,9 +821,9 @@ static void spidev_remove(struct spi_device *spi)  	/* prevent new opens */  	mutex_lock(&device_list_lock);  	/* make sure ops on existing fds can abort cleanly */ -	spin_lock_irq(&spidev->spi_lock); +	mutex_lock(&spidev->spi_lock);  	spidev->spi = NULL; -	spin_unlock_irq(&spidev->spi_lock); +	mutex_unlock(&spidev->spi_lock);  	list_del(&spidev->device_entry);  	device_destroy(spidev_class, spidev->devt); | 
