diff options
Diffstat (limited to 'drivers/spi/spi.c')
| -rw-r--r-- | drivers/spi/spi.c | 27 | 
1 files changed, 11 insertions, 16 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index aea037c65985..926b68aa45d3 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -478,12 +478,6 @@ static LIST_HEAD(spi_controller_list);   */  static DEFINE_MUTEX(board_lock); -/* - * Prevents addition of devices with same chip select and - * addition of devices below an unregistering controller. - */ -static DEFINE_MUTEX(spi_add_lock); -  /**   * spi_alloc_device - Allocate a new SPI device   * @ctlr: Controller to which device is connected @@ -636,9 +630,9 @@ int spi_add_device(struct spi_device *spi)  	 * chipselect **BEFORE** we call setup(), else we'll trash  	 * its configuration.  Lock against concurrent add() calls.  	 */ -	mutex_lock(&spi_add_lock); +	mutex_lock(&ctlr->add_lock);  	status = __spi_add_device(spi); -	mutex_unlock(&spi_add_lock); +	mutex_unlock(&ctlr->add_lock);  	return status;  }  EXPORT_SYMBOL_GPL(spi_add_device); @@ -658,7 +652,7 @@ static int spi_add_device_locked(struct spi_device *spi)  	/* Set the bus ID string */  	spi_dev_set_name(spi); -	WARN_ON(!mutex_is_locked(&spi_add_lock)); +	WARN_ON(!mutex_is_locked(&ctlr->add_lock));  	return __spi_add_device(spi);  } @@ -2553,6 +2547,12 @@ struct spi_controller *__spi_alloc_controller(struct device *dev,  		return NULL;  	device_initialize(&ctlr->dev); +	INIT_LIST_HEAD(&ctlr->queue); +	spin_lock_init(&ctlr->queue_lock); +	spin_lock_init(&ctlr->bus_lock_spinlock); +	mutex_init(&ctlr->bus_lock_mutex); +	mutex_init(&ctlr->io_mutex); +	mutex_init(&ctlr->add_lock);  	ctlr->bus_num = -1;  	ctlr->num_chipselect = 1;  	ctlr->slave = slave; @@ -2825,11 +2825,6 @@ int spi_register_controller(struct spi_controller *ctlr)  			return id;  		ctlr->bus_num = id;  	} -	INIT_LIST_HEAD(&ctlr->queue); -	spin_lock_init(&ctlr->queue_lock); -	spin_lock_init(&ctlr->bus_lock_spinlock); -	mutex_init(&ctlr->bus_lock_mutex); -	mutex_init(&ctlr->io_mutex);  	ctlr->bus_lock_flag = 0;  	init_completion(&ctlr->xfer_completion);  	if (!ctlr->max_dma_len) @@ -2966,7 +2961,7 @@ void spi_unregister_controller(struct spi_controller *ctlr)  	/* Prevent addition of new devices, unregister existing ones */  	if (IS_ENABLED(CONFIG_SPI_DYNAMIC)) -		mutex_lock(&spi_add_lock); +		mutex_lock(&ctlr->add_lock);  	device_for_each_child(&ctlr->dev, NULL, __unregister); @@ -2997,7 +2992,7 @@ void spi_unregister_controller(struct spi_controller *ctlr)  	mutex_unlock(&board_lock);  	if (IS_ENABLED(CONFIG_SPI_DYNAMIC)) -		mutex_unlock(&spi_add_lock); +		mutex_unlock(&ctlr->add_lock);  }  EXPORT_SYMBOL_GPL(spi_unregister_controller);  | 
