diff options
Diffstat (limited to 'drivers/spi/spi.c')
| -rw-r--r-- | drivers/spi/spi.c | 1332 | 
1 files changed, 764 insertions, 568 deletions
| diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 89254a55eb2e..6e65524cbfd9 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -40,19 +40,24 @@  #include <linux/ioport.h>  #include <linux/acpi.h>  #include <linux/highmem.h> +#include <linux/idr.h> +#include <linux/platform_data/x86/apple.h>  #define CREATE_TRACE_POINTS  #include <trace/events/spi.h> +#define SPI_DYN_FIRST_BUS_NUM 0 + +static DEFINE_IDR(spi_master_idr);  static void spidev_release(struct device *dev)  {  	struct spi_device	*spi = to_spi_device(dev); -	/* spi masters may cleanup for released devices */ -	if (spi->master->cleanup) -		spi->master->cleanup(spi); +	/* spi controllers may cleanup for released devices */ +	if (spi->controller->cleanup) +		spi->controller->cleanup(spi); -	spi_master_put(spi->master); +	spi_controller_put(spi->controller);  	kfree(spi);  } @@ -71,17 +76,17 @@ modalias_show(struct device *dev, struct device_attribute *a, char *buf)  static DEVICE_ATTR_RO(modalias);  #define SPI_STATISTICS_ATTRS(field, file)				\ -static ssize_t spi_master_##field##_show(struct device *dev,		\ -					 struct device_attribute *attr,	\ -					 char *buf)			\ +static ssize_t spi_controller_##field##_show(struct device *dev,	\ +					     struct device_attribute *attr, \ +					     char *buf)			\  {									\ -	struct spi_master *master = container_of(dev,			\ -						 struct spi_master, dev); \ -	return spi_statistics_##field##_show(&master->statistics, buf);	\ +	struct spi_controller *ctlr = container_of(dev,			\ +					 struct spi_controller, dev);	\ +	return spi_statistics_##field##_show(&ctlr->statistics, buf);	\  }									\ -static struct device_attribute dev_attr_spi_master_##field = {		\ -	.attr = { .name = file, .mode = S_IRUGO },			\ -	.show = spi_master_##field##_show,				\ +static struct device_attribute dev_attr_spi_controller_##field = {	\ +	.attr = { .name = file, .mode = 0444 },				\ +	.show = spi_controller_##field##_show,				\  };									\  static ssize_t spi_device_##field##_show(struct device *dev,		\  					 struct device_attribute *attr,	\ @@ -91,7 +96,7 @@ static ssize_t spi_device_##field##_show(struct device *dev,		\  	return spi_statistics_##field##_show(&spi->statistics, buf);	\  }									\  static struct device_attribute dev_attr_spi_device_##field = {		\ -	.attr = { .name = file, .mode = S_IRUGO },			\ +	.attr = { .name = file, .mode = 0444 },				\  	.show = spi_device_##field##_show,				\  } @@ -201,51 +206,51 @@ static const struct attribute_group *spi_dev_groups[] = {  	NULL,  }; -static struct attribute *spi_master_statistics_attrs[] = { -	&dev_attr_spi_master_messages.attr, -	&dev_attr_spi_master_transfers.attr, -	&dev_attr_spi_master_errors.attr, -	&dev_attr_spi_master_timedout.attr, -	&dev_attr_spi_master_spi_sync.attr, -	&dev_attr_spi_master_spi_sync_immediate.attr, -	&dev_attr_spi_master_spi_async.attr, -	&dev_attr_spi_master_bytes.attr, -	&dev_attr_spi_master_bytes_rx.attr, -	&dev_attr_spi_master_bytes_tx.attr, -	&dev_attr_spi_master_transfer_bytes_histo0.attr, -	&dev_attr_spi_master_transfer_bytes_histo1.attr, -	&dev_attr_spi_master_transfer_bytes_histo2.attr, -	&dev_attr_spi_master_transfer_bytes_histo3.attr, -	&dev_attr_spi_master_transfer_bytes_histo4.attr, -	&dev_attr_spi_master_transfer_bytes_histo5.attr, -	&dev_attr_spi_master_transfer_bytes_histo6.attr, -	&dev_attr_spi_master_transfer_bytes_histo7.attr, -	&dev_attr_spi_master_transfer_bytes_histo8.attr, -	&dev_attr_spi_master_transfer_bytes_histo9.attr, -	&dev_attr_spi_master_transfer_bytes_histo10.attr, -	&dev_attr_spi_master_transfer_bytes_histo11.attr, -	&dev_attr_spi_master_transfer_bytes_histo12.attr, -	&dev_attr_spi_master_transfer_bytes_histo13.attr, -	&dev_attr_spi_master_transfer_bytes_histo14.attr, -	&dev_attr_spi_master_transfer_bytes_histo15.attr, -	&dev_attr_spi_master_transfer_bytes_histo16.attr, -	&dev_attr_spi_master_transfers_split_maxsize.attr, +static struct attribute *spi_controller_statistics_attrs[] = { +	&dev_attr_spi_controller_messages.attr, +	&dev_attr_spi_controller_transfers.attr, +	&dev_attr_spi_controller_errors.attr, +	&dev_attr_spi_controller_timedout.attr, +	&dev_attr_spi_controller_spi_sync.attr, +	&dev_attr_spi_controller_spi_sync_immediate.attr, +	&dev_attr_spi_controller_spi_async.attr, +	&dev_attr_spi_controller_bytes.attr, +	&dev_attr_spi_controller_bytes_rx.attr, +	&dev_attr_spi_controller_bytes_tx.attr, +	&dev_attr_spi_controller_transfer_bytes_histo0.attr, +	&dev_attr_spi_controller_transfer_bytes_histo1.attr, +	&dev_attr_spi_controller_transfer_bytes_histo2.attr, +	&dev_attr_spi_controller_transfer_bytes_histo3.attr, +	&dev_attr_spi_controller_transfer_bytes_histo4.attr, +	&dev_attr_spi_controller_transfer_bytes_histo5.attr, +	&dev_attr_spi_controller_transfer_bytes_histo6.attr, +	&dev_attr_spi_controller_transfer_bytes_histo7.attr, +	&dev_attr_spi_controller_transfer_bytes_histo8.attr, +	&dev_attr_spi_controller_transfer_bytes_histo9.attr, +	&dev_attr_spi_controller_transfer_bytes_histo10.attr, +	&dev_attr_spi_controller_transfer_bytes_histo11.attr, +	&dev_attr_spi_controller_transfer_bytes_histo12.attr, +	&dev_attr_spi_controller_transfer_bytes_histo13.attr, +	&dev_attr_spi_controller_transfer_bytes_histo14.attr, +	&dev_attr_spi_controller_transfer_bytes_histo15.attr, +	&dev_attr_spi_controller_transfer_bytes_histo16.attr, +	&dev_attr_spi_controller_transfers_split_maxsize.attr,  	NULL,  }; -static const struct attribute_group spi_master_statistics_group = { +static const struct attribute_group spi_controller_statistics_group = {  	.name  = "statistics", -	.attrs  = spi_master_statistics_attrs, +	.attrs  = spi_controller_statistics_attrs,  };  static const struct attribute_group *spi_master_groups[] = { -	&spi_master_statistics_group, +	&spi_controller_statistics_group,  	NULL,  };  void spi_statistics_add_transfer_stats(struct spi_statistics *stats,  				       struct spi_transfer *xfer, -				       struct spi_master *master) +				       struct spi_controller *ctlr)  {  	unsigned long flags;  	int l2len = min(fls(xfer->len), SPI_STATISTICS_HISTO_SIZE) - 1; @@ -260,10 +265,10 @@ void spi_statistics_add_transfer_stats(struct spi_statistics *stats,  	stats->bytes += xfer->len;  	if ((xfer->tx_buf) && -	    (xfer->tx_buf != master->dummy_tx)) +	    (xfer->tx_buf != ctlr->dummy_tx))  		stats->bytes_tx += xfer->len;  	if ((xfer->rx_buf) && -	    (xfer->rx_buf != master->dummy_rx)) +	    (xfer->rx_buf != ctlr->dummy_rx))  		stats->bytes_rx += xfer->len;  	spin_unlock_irqrestore(&stats->lock, flags); @@ -321,8 +326,7 @@ static int spi_uevent(struct device *dev, struct kobj_uevent_env *env)  	if (rc != -ENODEV)  		return rc; -	add_uevent_var(env, "MODALIAS=%s%s", SPI_MODULE_PREFIX, spi->modalias); -	return 0; +	return add_uevent_var(env, "MODALIAS=%s%s", SPI_MODULE_PREFIX, spi->modalias);  }  struct bus_type spi_bus_type = { @@ -405,7 +409,7 @@ EXPORT_SYMBOL_GPL(__spi_register_driver);  /*-------------------------------------------------------------------------*/  /* SPI devices should normally not be created by SPI device drivers; that - * would make them board-specific.  Similarly with SPI master drivers. + * would make them board-specific.  Similarly with SPI controller drivers.   * Device registration normally goes into like arch/.../mach.../board-YYY.c   * with other readonly (flashable) information about mainboard devices.   */ @@ -416,17 +420,18 @@ struct boardinfo {  };  static LIST_HEAD(board_list); -static LIST_HEAD(spi_master_list); +static LIST_HEAD(spi_controller_list);  /*   * Used to protect add/del opertion for board_info list and - * spi_master list, and their matching process + * spi_controller list, and their matching process + * also used to protect object of type struct idr   */  static DEFINE_MUTEX(board_lock);  /**   * spi_alloc_device - Allocate a new SPI device - * @master: Controller to which device is connected + * @ctlr: Controller to which device is connected   * Context: can sleep   *   * Allows a driver to allocate and initialize a spi_device without @@ -435,27 +440,27 @@ static DEFINE_MUTEX(board_lock);   * spi_add_device() on it.   *   * Caller is responsible to call spi_add_device() on the returned - * spi_device structure to add it to the SPI master.  If the caller + * spi_device structure to add it to the SPI controller.  If the caller   * needs to discard the spi_device without adding it, then it should   * call spi_dev_put() on it.   *   * Return: a pointer to the new device, or NULL.   */ -struct spi_device *spi_alloc_device(struct spi_master *master) +struct spi_device *spi_alloc_device(struct spi_controller *ctlr)  {  	struct spi_device	*spi; -	if (!spi_master_get(master)) +	if (!spi_controller_get(ctlr))  		return NULL;  	spi = kzalloc(sizeof(*spi), GFP_KERNEL);  	if (!spi) { -		spi_master_put(master); +		spi_controller_put(ctlr);  		return NULL;  	} -	spi->master = master; -	spi->dev.parent = &master->dev; +	spi->master = spi->controller = ctlr; +	spi->dev.parent = &ctlr->dev;  	spi->dev.bus = &spi_bus_type;  	spi->dev.release = spidev_release;  	spi->cs_gpio = -ENOENT; @@ -476,7 +481,7 @@ static void spi_dev_set_name(struct spi_device *spi)  		return;  	} -	dev_set_name(&spi->dev, "%s.%u", dev_name(&spi->master->dev), +	dev_set_name(&spi->dev, "%s.%u", dev_name(&spi->controller->dev),  		     spi->chip_select);  } @@ -485,7 +490,7 @@ static int spi_dev_check(struct device *dev, void *data)  	struct spi_device *spi = to_spi_device(dev);  	struct spi_device *new_spi = data; -	if (spi->master == new_spi->master && +	if (spi->controller == new_spi->controller &&  	    spi->chip_select == new_spi->chip_select)  		return -EBUSY;  	return 0; @@ -503,15 +508,14 @@ static int spi_dev_check(struct device *dev, void *data)  int spi_add_device(struct spi_device *spi)  {  	static DEFINE_MUTEX(spi_add_lock); -	struct spi_master *master = spi->master; -	struct device *dev = master->dev.parent; +	struct spi_controller *ctlr = spi->controller; +	struct device *dev = ctlr->dev.parent;  	int status;  	/* Chipselects are numbered 0..max; validate. */ -	if (spi->chip_select >= master->num_chipselect) { -		dev_err(dev, "cs%d >= max %d\n", -			spi->chip_select, -			master->num_chipselect); +	if (spi->chip_select >= ctlr->num_chipselect) { +		dev_err(dev, "cs%d >= max %d\n", spi->chip_select, +			ctlr->num_chipselect);  		return -EINVAL;  	} @@ -531,8 +535,8 @@ int spi_add_device(struct spi_device *spi)  		goto done;  	} -	if (master->cs_gpios) -		spi->cs_gpio = master->cs_gpios[spi->chip_select]; +	if (ctlr->cs_gpios) +		spi->cs_gpio = ctlr->cs_gpios[spi->chip_select];  	/* Drivers may modify this initial i/o setup, but will  	 * normally rely on the device being setup.  Devices @@ -561,7 +565,7 @@ EXPORT_SYMBOL_GPL(spi_add_device);  /**   * spi_new_device - instantiate one new SPI device - * @master: Controller to which device is connected + * @ctlr: Controller to which device is connected   * @chip: Describes the SPI device   * Context: can sleep   * @@ -573,7 +577,7 @@ EXPORT_SYMBOL_GPL(spi_add_device);   *   * Return: the new device, or NULL.   */ -struct spi_device *spi_new_device(struct spi_master *master, +struct spi_device *spi_new_device(struct spi_controller *ctlr,  				  struct spi_board_info *chip)  {  	struct spi_device	*proxy; @@ -586,7 +590,7 @@ struct spi_device *spi_new_device(struct spi_master *master,  	 * suggests syslogged diagnostics are best here (ugh).  	 */ -	proxy = spi_alloc_device(master); +	proxy = spi_alloc_device(ctlr);  	if (!proxy)  		return NULL; @@ -604,7 +608,7 @@ struct spi_device *spi_new_device(struct spi_master *master,  	if (chip->properties) {  		status = device_add_properties(&proxy->dev, chip->properties);  		if (status) { -			dev_err(&master->dev, +			dev_err(&ctlr->dev,  				"failed to add properties to '%s': %d\n",  				chip->modalias, status);  			goto err_dev_put; @@ -631,7 +635,7 @@ EXPORT_SYMBOL_GPL(spi_new_device);   * @spi: spi_device to unregister   *   * Start making the passed SPI device vanish. Normally this would be handled - * by spi_unregister_master(). + * by spi_unregister_controller().   */  void spi_unregister_device(struct spi_device *spi)  { @@ -648,17 +652,17 @@ void spi_unregister_device(struct spi_device *spi)  }  EXPORT_SYMBOL_GPL(spi_unregister_device); -static void spi_match_master_to_boardinfo(struct spi_master *master, -				struct spi_board_info *bi) +static void spi_match_controller_to_boardinfo(struct spi_controller *ctlr, +					      struct spi_board_info *bi)  {  	struct spi_device *dev; -	if (master->bus_num != bi->bus_num) +	if (ctlr->bus_num != bi->bus_num)  		return; -	dev = spi_new_device(master, bi); +	dev = spi_new_device(ctlr, bi);  	if (!dev) -		dev_err(master->dev.parent, "can't create new device for %s\n", +		dev_err(ctlr->dev.parent, "can't create new device for %s\n",  			bi->modalias);  } @@ -697,7 +701,7 @@ int spi_register_board_info(struct spi_board_info const *info, unsigned n)  		return -ENOMEM;  	for (i = 0; i < n; i++, bi++, info++) { -		struct spi_master *master; +		struct spi_controller *ctlr;  		memcpy(&bi->board_info, info, sizeof(*info));  		if (info->properties) { @@ -709,8 +713,9 @@ int spi_register_board_info(struct spi_board_info const *info, unsigned n)  		mutex_lock(&board_lock);  		list_add_tail(&bi->list, &board_list); -		list_for_each_entry(master, &spi_master_list, list) -			spi_match_master_to_boardinfo(master, &bi->board_info); +		list_for_each_entry(ctlr, &spi_controller_list, list) +			spi_match_controller_to_boardinfo(ctlr, +							  &bi->board_info);  		mutex_unlock(&board_lock);  	} @@ -727,16 +732,16 @@ static void spi_set_cs(struct spi_device *spi, bool enable)  	if (gpio_is_valid(spi->cs_gpio)) {  		gpio_set_value(spi->cs_gpio, !enable);  		/* Some SPI masters need both GPIO CS & slave_select */ -		if ((spi->master->flags & SPI_MASTER_GPIO_SS) && -		    spi->master->set_cs) -			spi->master->set_cs(spi, !enable); -	} else if (spi->master->set_cs) { -		spi->master->set_cs(spi, !enable); +		if ((spi->controller->flags & SPI_MASTER_GPIO_SS) && +		    spi->controller->set_cs) +			spi->controller->set_cs(spi, !enable); +	} else if (spi->controller->set_cs) { +		spi->controller->set_cs(spi, !enable);  	}  }  #ifdef CONFIG_HAS_DMA -static int spi_map_buf(struct spi_master *master, struct device *dev, +static int spi_map_buf(struct spi_controller *ctlr, struct device *dev,  		       struct sg_table *sgt, void *buf, size_t len,  		       enum dma_data_direction dir)  { @@ -761,7 +766,7 @@ static int spi_map_buf(struct spi_master *master, struct device *dev,  		desc_len = min_t(int, max_seg_size, PAGE_SIZE);  		sgs = DIV_ROUND_UP(len + offset_in_page(buf), desc_len);  	} else if (virt_addr_valid(buf)) { -		desc_len = min_t(int, max_seg_size, master->max_dma_len); +		desc_len = min_t(int, max_seg_size, ctlr->max_dma_len);  		sgs = DIV_ROUND_UP(len, desc_len);  	} else {  		return -EINVAL; @@ -811,7 +816,7 @@ static int spi_map_buf(struct spi_master *master, struct device *dev,  	return 0;  } -static void spi_unmap_buf(struct spi_master *master, struct device *dev, +static void spi_unmap_buf(struct spi_controller *ctlr, struct device *dev,  			  struct sg_table *sgt, enum dma_data_direction dir)  {  	if (sgt->orig_nents) { @@ -820,31 +825,31 @@ static void spi_unmap_buf(struct spi_master *master, struct device *dev,  	}  } -static int __spi_map_msg(struct spi_master *master, struct spi_message *msg) +static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)  {  	struct device *tx_dev, *rx_dev;  	struct spi_transfer *xfer;  	int ret; -	if (!master->can_dma) +	if (!ctlr->can_dma)  		return 0; -	if (master->dma_tx) -		tx_dev = master->dma_tx->device->dev; +	if (ctlr->dma_tx) +		tx_dev = ctlr->dma_tx->device->dev;  	else -		tx_dev = master->dev.parent; +		tx_dev = ctlr->dev.parent; -	if (master->dma_rx) -		rx_dev = master->dma_rx->device->dev; +	if (ctlr->dma_rx) +		rx_dev = ctlr->dma_rx->device->dev;  	else -		rx_dev = master->dev.parent; +		rx_dev = ctlr->dev.parent;  	list_for_each_entry(xfer, &msg->transfers, transfer_list) { -		if (!master->can_dma(master, msg->spi, xfer)) +		if (!ctlr->can_dma(ctlr, msg->spi, xfer))  			continue;  		if (xfer->tx_buf != NULL) { -			ret = spi_map_buf(master, tx_dev, &xfer->tx_sg, +			ret = spi_map_buf(ctlr, tx_dev, &xfer->tx_sg,  					  (void *)xfer->tx_buf, xfer->len,  					  DMA_TO_DEVICE);  			if (ret != 0) @@ -852,79 +857,78 @@ static int __spi_map_msg(struct spi_master *master, struct spi_message *msg)  		}  		if (xfer->rx_buf != NULL) { -			ret = spi_map_buf(master, rx_dev, &xfer->rx_sg, +			ret = spi_map_buf(ctlr, rx_dev, &xfer->rx_sg,  					  xfer->rx_buf, xfer->len,  					  DMA_FROM_DEVICE);  			if (ret != 0) { -				spi_unmap_buf(master, tx_dev, &xfer->tx_sg, +				spi_unmap_buf(ctlr, tx_dev, &xfer->tx_sg,  					      DMA_TO_DEVICE);  				return ret;  			}  		}  	} -	master->cur_msg_mapped = true; +	ctlr->cur_msg_mapped = true;  	return 0;  } -static int __spi_unmap_msg(struct spi_master *master, struct spi_message *msg) +static int __spi_unmap_msg(struct spi_controller *ctlr, struct spi_message *msg)  {  	struct spi_transfer *xfer;  	struct device *tx_dev, *rx_dev; -	if (!master->cur_msg_mapped || !master->can_dma) +	if (!ctlr->cur_msg_mapped || !ctlr->can_dma)  		return 0; -	if (master->dma_tx) -		tx_dev = master->dma_tx->device->dev; +	if (ctlr->dma_tx) +		tx_dev = ctlr->dma_tx->device->dev;  	else -		tx_dev = master->dev.parent; +		tx_dev = ctlr->dev.parent; -	if (master->dma_rx) -		rx_dev = master->dma_rx->device->dev; +	if (ctlr->dma_rx) +		rx_dev = ctlr->dma_rx->device->dev;  	else -		rx_dev = master->dev.parent; +		rx_dev = ctlr->dev.parent;  	list_for_each_entry(xfer, &msg->transfers, transfer_list) { -		if (!master->can_dma(master, msg->spi, xfer)) +		if (!ctlr->can_dma(ctlr, msg->spi, xfer))  			continue; -		spi_unmap_buf(master, rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE); -		spi_unmap_buf(master, tx_dev, &xfer->tx_sg, DMA_TO_DEVICE); +		spi_unmap_buf(ctlr, rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE); +		spi_unmap_buf(ctlr, tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);  	}  	return 0;  }  #else /* !CONFIG_HAS_DMA */ -static inline int spi_map_buf(struct spi_master *master, -			      struct device *dev, struct sg_table *sgt, -			      void *buf, size_t len, +static inline int spi_map_buf(struct spi_controller *ctlr, struct device *dev, +			      struct sg_table *sgt, void *buf, size_t len,  			      enum dma_data_direction dir)  {  	return -EINVAL;  } -static inline void spi_unmap_buf(struct spi_master *master, +static inline void spi_unmap_buf(struct spi_controller *ctlr,  				 struct device *dev, struct sg_table *sgt,  				 enum dma_data_direction dir)  {  } -static inline int __spi_map_msg(struct spi_master *master, +static inline int __spi_map_msg(struct spi_controller *ctlr,  				struct spi_message *msg)  {  	return 0;  } -static inline int __spi_unmap_msg(struct spi_master *master, +static inline int __spi_unmap_msg(struct spi_controller *ctlr,  				  struct spi_message *msg)  {  	return 0;  }  #endif /* !CONFIG_HAS_DMA */ -static inline int spi_unmap_msg(struct spi_master *master, +static inline int spi_unmap_msg(struct spi_controller *ctlr,  				struct spi_message *msg)  {  	struct spi_transfer *xfer; @@ -934,63 +938,63 @@ static inline int spi_unmap_msg(struct spi_master *master,  		 * Restore the original value of tx_buf or rx_buf if they are  		 * NULL.  		 */ -		if (xfer->tx_buf == master->dummy_tx) +		if (xfer->tx_buf == ctlr->dummy_tx)  			xfer->tx_buf = NULL; -		if (xfer->rx_buf == master->dummy_rx) +		if (xfer->rx_buf == ctlr->dummy_rx)  			xfer->rx_buf = NULL;  	} -	return __spi_unmap_msg(master, msg); +	return __spi_unmap_msg(ctlr, msg);  } -static int spi_map_msg(struct spi_master *master, struct spi_message *msg) +static int spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)  {  	struct spi_transfer *xfer;  	void *tmp;  	unsigned int max_tx, max_rx; -	if (master->flags & (SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX)) { +	if (ctlr->flags & (SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX)) {  		max_tx = 0;  		max_rx = 0;  		list_for_each_entry(xfer, &msg->transfers, transfer_list) { -			if ((master->flags & SPI_MASTER_MUST_TX) && +			if ((ctlr->flags & SPI_CONTROLLER_MUST_TX) &&  			    !xfer->tx_buf)  				max_tx = max(xfer->len, max_tx); -			if ((master->flags & SPI_MASTER_MUST_RX) && +			if ((ctlr->flags & SPI_CONTROLLER_MUST_RX) &&  			    !xfer->rx_buf)  				max_rx = max(xfer->len, max_rx);  		}  		if (max_tx) { -			tmp = krealloc(master->dummy_tx, max_tx, +			tmp = krealloc(ctlr->dummy_tx, max_tx,  				       GFP_KERNEL | GFP_DMA);  			if (!tmp)  				return -ENOMEM; -			master->dummy_tx = tmp; +			ctlr->dummy_tx = tmp;  			memset(tmp, 0, max_tx);  		}  		if (max_rx) { -			tmp = krealloc(master->dummy_rx, max_rx, +			tmp = krealloc(ctlr->dummy_rx, max_rx,  				       GFP_KERNEL | GFP_DMA);  			if (!tmp)  				return -ENOMEM; -			master->dummy_rx = tmp; +			ctlr->dummy_rx = tmp;  		}  		if (max_tx || max_rx) {  			list_for_each_entry(xfer, &msg->transfers,  					    transfer_list) {  				if (!xfer->tx_buf) -					xfer->tx_buf = master->dummy_tx; +					xfer->tx_buf = ctlr->dummy_tx;  				if (!xfer->rx_buf) -					xfer->rx_buf = master->dummy_rx; +					xfer->rx_buf = ctlr->dummy_rx;  			}  		}  	} -	return __spi_map_msg(master, msg); +	return __spi_map_msg(ctlr, msg);  }  /* @@ -1000,14 +1004,14 @@ static int spi_map_msg(struct spi_master *master, struct spi_message *msg)   * drivers which implement a transfer_one() operation.  It provides   * standard handling of delays and chip select management.   */ -static int spi_transfer_one_message(struct spi_master *master, +static int spi_transfer_one_message(struct spi_controller *ctlr,  				    struct spi_message *msg)  {  	struct spi_transfer *xfer;  	bool keep_cs = false;  	int ret = 0;  	unsigned long long ms = 1; -	struct spi_statistics *statm = &master->statistics; +	struct spi_statistics *statm = &ctlr->statistics;  	struct spi_statistics *stats = &msg->spi->statistics;  	spi_set_cs(msg->spi, true); @@ -1018,13 +1022,13 @@ static int spi_transfer_one_message(struct spi_master *master,  	list_for_each_entry(xfer, &msg->transfers, transfer_list) {  		trace_spi_transfer_start(msg, xfer); -		spi_statistics_add_transfer_stats(statm, xfer, master); -		spi_statistics_add_transfer_stats(stats, xfer, master); +		spi_statistics_add_transfer_stats(statm, xfer, ctlr); +		spi_statistics_add_transfer_stats(stats, xfer, ctlr);  		if (xfer->tx_buf || xfer->rx_buf) { -			reinit_completion(&master->xfer_completion); +			reinit_completion(&ctlr->xfer_completion); -			ret = master->transfer_one(master, msg->spi, xfer); +			ret = ctlr->transfer_one(ctlr, msg->spi, xfer);  			if (ret < 0) {  				SPI_STATISTICS_INCREMENT_FIELD(statm,  							       errors); @@ -1044,7 +1048,7 @@ static int spi_transfer_one_message(struct spi_master *master,  				if (ms > UINT_MAX)  					ms = UINT_MAX; -				ms = wait_for_completion_timeout(&master->xfer_completion, +				ms = wait_for_completion_timeout(&ctlr->xfer_completion,  								 msecs_to_jiffies(ms));  			} @@ -1099,33 +1103,33 @@ out:  	if (msg->status == -EINPROGRESS)  		msg->status = ret; -	if (msg->status && master->handle_err) -		master->handle_err(master, msg); +	if (msg->status && ctlr->handle_err) +		ctlr->handle_err(ctlr, msg); -	spi_res_release(master, msg); +	spi_res_release(ctlr, msg); -	spi_finalize_current_message(master); +	spi_finalize_current_message(ctlr);  	return ret;  }  /**   * spi_finalize_current_transfer - report completion of a transfer - * @master: the master reporting completion + * @ctlr: the controller reporting completion   *   * Called by SPI drivers using the core transfer_one_message()   * implementation to notify it that the current interrupt driven   * transfer has finished and the next one may be scheduled.   */ -void spi_finalize_current_transfer(struct spi_master *master) +void spi_finalize_current_transfer(struct spi_controller *ctlr)  { -	complete(&master->xfer_completion); +	complete(&ctlr->xfer_completion);  }  EXPORT_SYMBOL_GPL(spi_finalize_current_transfer);  /**   * __spi_pump_messages - function which processes spi message queue - * @master: master to process queue for + * @ctlr: controller to process queue for   * @in_kthread: true if we are in the context of the message pump thread   *   * This function checks if there is any spi message in the queue that @@ -1136,136 +1140,136 @@ EXPORT_SYMBOL_GPL(spi_finalize_current_transfer);   * inside spi_sync(); the queue extraction handling at the top of the   * function should deal with this safely.   */ -static void __spi_pump_messages(struct spi_master *master, bool in_kthread) +static void __spi_pump_messages(struct spi_controller *ctlr, bool in_kthread)  {  	unsigned long flags;  	bool was_busy = false;  	int ret;  	/* Lock queue */ -	spin_lock_irqsave(&master->queue_lock, flags); +	spin_lock_irqsave(&ctlr->queue_lock, flags);  	/* Make sure we are not already running a message */ -	if (master->cur_msg) { -		spin_unlock_irqrestore(&master->queue_lock, flags); +	if (ctlr->cur_msg) { +		spin_unlock_irqrestore(&ctlr->queue_lock, flags);  		return;  	}  	/* If another context is idling the device then defer */ -	if (master->idling) { -		kthread_queue_work(&master->kworker, &master->pump_messages); -		spin_unlock_irqrestore(&master->queue_lock, flags); +	if (ctlr->idling) { +		kthread_queue_work(&ctlr->kworker, &ctlr->pump_messages); +		spin_unlock_irqrestore(&ctlr->queue_lock, flags);  		return;  	}  	/* Check if the queue is idle */ -	if (list_empty(&master->queue) || !master->running) { -		if (!master->busy) { -			spin_unlock_irqrestore(&master->queue_lock, flags); +	if (list_empty(&ctlr->queue) || !ctlr->running) { +		if (!ctlr->busy) { +			spin_unlock_irqrestore(&ctlr->queue_lock, flags);  			return;  		}  		/* Only do teardown in the thread */  		if (!in_kthread) { -			kthread_queue_work(&master->kworker, -					   &master->pump_messages); -			spin_unlock_irqrestore(&master->queue_lock, flags); +			kthread_queue_work(&ctlr->kworker, +					   &ctlr->pump_messages); +			spin_unlock_irqrestore(&ctlr->queue_lock, flags);  			return;  		} -		master->busy = false; -		master->idling = true; -		spin_unlock_irqrestore(&master->queue_lock, flags); - -		kfree(master->dummy_rx); -		master->dummy_rx = NULL; -		kfree(master->dummy_tx); -		master->dummy_tx = NULL; -		if (master->unprepare_transfer_hardware && -		    master->unprepare_transfer_hardware(master)) -			dev_err(&master->dev, +		ctlr->busy = false; +		ctlr->idling = true; +		spin_unlock_irqrestore(&ctlr->queue_lock, flags); + +		kfree(ctlr->dummy_rx); +		ctlr->dummy_rx = NULL; +		kfree(ctlr->dummy_tx); +		ctlr->dummy_tx = NULL; +		if (ctlr->unprepare_transfer_hardware && +		    ctlr->unprepare_transfer_hardware(ctlr)) +			dev_err(&ctlr->dev,  				"failed to unprepare transfer hardware\n"); -		if (master->auto_runtime_pm) { -			pm_runtime_mark_last_busy(master->dev.parent); -			pm_runtime_put_autosuspend(master->dev.parent); +		if (ctlr->auto_runtime_pm) { +			pm_runtime_mark_last_busy(ctlr->dev.parent); +			pm_runtime_put_autosuspend(ctlr->dev.parent);  		} -		trace_spi_master_idle(master); +		trace_spi_controller_idle(ctlr); -		spin_lock_irqsave(&master->queue_lock, flags); -		master->idling = false; -		spin_unlock_irqrestore(&master->queue_lock, flags); +		spin_lock_irqsave(&ctlr->queue_lock, flags); +		ctlr->idling = false; +		spin_unlock_irqrestore(&ctlr->queue_lock, flags);  		return;  	}  	/* Extract head of queue */ -	master->cur_msg = -		list_first_entry(&master->queue, struct spi_message, queue); +	ctlr->cur_msg = +		list_first_entry(&ctlr->queue, struct spi_message, queue); -	list_del_init(&master->cur_msg->queue); -	if (master->busy) +	list_del_init(&ctlr->cur_msg->queue); +	if (ctlr->busy)  		was_busy = true;  	else -		master->busy = true; -	spin_unlock_irqrestore(&master->queue_lock, flags); +		ctlr->busy = true; +	spin_unlock_irqrestore(&ctlr->queue_lock, flags); -	mutex_lock(&master->io_mutex); +	mutex_lock(&ctlr->io_mutex); -	if (!was_busy && master->auto_runtime_pm) { -		ret = pm_runtime_get_sync(master->dev.parent); +	if (!was_busy && ctlr->auto_runtime_pm) { +		ret = pm_runtime_get_sync(ctlr->dev.parent);  		if (ret < 0) { -			dev_err(&master->dev, "Failed to power device: %d\n", +			dev_err(&ctlr->dev, "Failed to power device: %d\n",  				ret); -			mutex_unlock(&master->io_mutex); +			mutex_unlock(&ctlr->io_mutex);  			return;  		}  	}  	if (!was_busy) -		trace_spi_master_busy(master); +		trace_spi_controller_busy(ctlr); -	if (!was_busy && master->prepare_transfer_hardware) { -		ret = master->prepare_transfer_hardware(master); +	if (!was_busy && ctlr->prepare_transfer_hardware) { +		ret = ctlr->prepare_transfer_hardware(ctlr);  		if (ret) { -			dev_err(&master->dev, +			dev_err(&ctlr->dev,  				"failed to prepare transfer hardware\n"); -			if (master->auto_runtime_pm) -				pm_runtime_put(master->dev.parent); -			mutex_unlock(&master->io_mutex); +			if (ctlr->auto_runtime_pm) +				pm_runtime_put(ctlr->dev.parent); +			mutex_unlock(&ctlr->io_mutex);  			return;  		}  	} -	trace_spi_message_start(master->cur_msg); +	trace_spi_message_start(ctlr->cur_msg); -	if (master->prepare_message) { -		ret = master->prepare_message(master, master->cur_msg); +	if (ctlr->prepare_message) { +		ret = ctlr->prepare_message(ctlr, ctlr->cur_msg);  		if (ret) { -			dev_err(&master->dev, -				"failed to prepare message: %d\n", ret); -			master->cur_msg->status = ret; -			spi_finalize_current_message(master); +			dev_err(&ctlr->dev, "failed to prepare message: %d\n", +				ret); +			ctlr->cur_msg->status = ret; +			spi_finalize_current_message(ctlr);  			goto out;  		} -		master->cur_msg_prepared = true; +		ctlr->cur_msg_prepared = true;  	} -	ret = spi_map_msg(master, master->cur_msg); +	ret = spi_map_msg(ctlr, ctlr->cur_msg);  	if (ret) { -		master->cur_msg->status = ret; -		spi_finalize_current_message(master); +		ctlr->cur_msg->status = ret; +		spi_finalize_current_message(ctlr);  		goto out;  	} -	ret = master->transfer_one_message(master, master->cur_msg); +	ret = ctlr->transfer_one_message(ctlr, ctlr->cur_msg);  	if (ret) { -		dev_err(&master->dev, +		dev_err(&ctlr->dev,  			"failed to transfer one message from queue\n");  		goto out;  	}  out: -	mutex_unlock(&master->io_mutex); +	mutex_unlock(&ctlr->io_mutex);  	/* Prod the scheduler in case transfer_one() was busy waiting */  	if (!ret) @@ -1274,44 +1278,43 @@ out:  /**   * spi_pump_messages - kthread work function which processes spi message queue - * @work: pointer to kthread work struct contained in the master struct + * @work: pointer to kthread work struct contained in the controller struct   */  static void spi_pump_messages(struct kthread_work *work)  { -	struct spi_master *master = -		container_of(work, struct spi_master, pump_messages); +	struct spi_controller *ctlr = +		container_of(work, struct spi_controller, pump_messages); -	__spi_pump_messages(master, true); +	__spi_pump_messages(ctlr, true);  } -static int spi_init_queue(struct spi_master *master) +static int spi_init_queue(struct spi_controller *ctlr)  {  	struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 }; -	master->running = false; -	master->busy = false; +	ctlr->running = false; +	ctlr->busy = false; -	kthread_init_worker(&master->kworker); -	master->kworker_task = kthread_run(kthread_worker_fn, -					   &master->kworker, "%s", -					   dev_name(&master->dev)); -	if (IS_ERR(master->kworker_task)) { -		dev_err(&master->dev, "failed to create message pump task\n"); -		return PTR_ERR(master->kworker_task); +	kthread_init_worker(&ctlr->kworker); +	ctlr->kworker_task = kthread_run(kthread_worker_fn, &ctlr->kworker, +					 "%s", dev_name(&ctlr->dev)); +	if (IS_ERR(ctlr->kworker_task)) { +		dev_err(&ctlr->dev, "failed to create message pump task\n"); +		return PTR_ERR(ctlr->kworker_task);  	} -	kthread_init_work(&master->pump_messages, spi_pump_messages); +	kthread_init_work(&ctlr->pump_messages, spi_pump_messages);  	/* -	 * Master config will indicate if this controller should run the +	 * Controller config will indicate if this controller should run the  	 * message pump with high (realtime) priority to reduce the transfer  	 * latency on the bus by minimising the delay between a transfer  	 * request and the scheduling of the message pump thread. Without this  	 * setting the message pump thread will remain at default priority.  	 */ -	if (master->rt) { -		dev_info(&master->dev, +	if (ctlr->rt) { +		dev_info(&ctlr->dev,  			"will run message pump with realtime priority\n"); -		sched_setscheduler(master->kworker_task, SCHED_FIFO, ¶m); +		sched_setscheduler(ctlr->kworker_task, SCHED_FIFO, ¶m);  	}  	return 0; @@ -1320,23 +1323,23 @@ static int spi_init_queue(struct spi_master *master)  /**   * spi_get_next_queued_message() - called by driver to check for queued   * messages - * @master: the master to check for queued messages + * @ctlr: the controller to check for queued messages   *   * If there are more messages in the queue, the next message is returned from   * this call.   *   * Return: the next message in the queue, else NULL if the queue is empty.   */ -struct spi_message *spi_get_next_queued_message(struct spi_master *master) +struct spi_message *spi_get_next_queued_message(struct spi_controller *ctlr)  {  	struct spi_message *next;  	unsigned long flags;  	/* get a pointer to the next message, if any */ -	spin_lock_irqsave(&master->queue_lock, flags); -	next = list_first_entry_or_null(&master->queue, struct spi_message, +	spin_lock_irqsave(&ctlr->queue_lock, flags); +	next = list_first_entry_or_null(&ctlr->queue, struct spi_message,  					queue); -	spin_unlock_irqrestore(&master->queue_lock, flags); +	spin_unlock_irqrestore(&ctlr->queue_lock, flags);  	return next;  } @@ -1344,36 +1347,36 @@ EXPORT_SYMBOL_GPL(spi_get_next_queued_message);  /**   * spi_finalize_current_message() - the current message is complete - * @master: the master to return the message to + * @ctlr: the controller to return the message to   *   * Called by the driver to notify the core that the message in the front of the   * queue is complete and can be removed from the queue.   */ -void spi_finalize_current_message(struct spi_master *master) +void spi_finalize_current_message(struct spi_controller *ctlr)  {  	struct spi_message *mesg;  	unsigned long flags;  	int ret; -	spin_lock_irqsave(&master->queue_lock, flags); -	mesg = master->cur_msg; -	spin_unlock_irqrestore(&master->queue_lock, flags); +	spin_lock_irqsave(&ctlr->queue_lock, flags); +	mesg = ctlr->cur_msg; +	spin_unlock_irqrestore(&ctlr->queue_lock, flags); -	spi_unmap_msg(master, mesg); +	spi_unmap_msg(ctlr, mesg); -	if (master->cur_msg_prepared && master->unprepare_message) { -		ret = master->unprepare_message(master, mesg); +	if (ctlr->cur_msg_prepared && ctlr->unprepare_message) { +		ret = ctlr->unprepare_message(ctlr, mesg);  		if (ret) { -			dev_err(&master->dev, -				"failed to unprepare message: %d\n", ret); +			dev_err(&ctlr->dev, "failed to unprepare message: %d\n", +				ret);  		}  	} -	spin_lock_irqsave(&master->queue_lock, flags); -	master->cur_msg = NULL; -	master->cur_msg_prepared = false; -	kthread_queue_work(&master->kworker, &master->pump_messages); -	spin_unlock_irqrestore(&master->queue_lock, flags); +	spin_lock_irqsave(&ctlr->queue_lock, flags); +	ctlr->cur_msg = NULL; +	ctlr->cur_msg_prepared = false; +	kthread_queue_work(&ctlr->kworker, &ctlr->pump_messages); +	spin_unlock_irqrestore(&ctlr->queue_lock, flags);  	trace_spi_message_done(mesg); @@ -1383,66 +1386,65 @@ void spi_finalize_current_message(struct spi_master *master)  }  EXPORT_SYMBOL_GPL(spi_finalize_current_message); -static int spi_start_queue(struct spi_master *master) +static int spi_start_queue(struct spi_controller *ctlr)  {  	unsigned long flags; -	spin_lock_irqsave(&master->queue_lock, flags); +	spin_lock_irqsave(&ctlr->queue_lock, flags); -	if (master->running || master->busy) { -		spin_unlock_irqrestore(&master->queue_lock, flags); +	if (ctlr->running || ctlr->busy) { +		spin_unlock_irqrestore(&ctlr->queue_lock, flags);  		return -EBUSY;  	} -	master->running = true; -	master->cur_msg = NULL; -	spin_unlock_irqrestore(&master->queue_lock, flags); +	ctlr->running = true; +	ctlr->cur_msg = NULL; +	spin_unlock_irqrestore(&ctlr->queue_lock, flags); -	kthread_queue_work(&master->kworker, &master->pump_messages); +	kthread_queue_work(&ctlr->kworker, &ctlr->pump_messages);  	return 0;  } -static int spi_stop_queue(struct spi_master *master) +static int spi_stop_queue(struct spi_controller *ctlr)  {  	unsigned long flags;  	unsigned limit = 500;  	int ret = 0; -	spin_lock_irqsave(&master->queue_lock, flags); +	spin_lock_irqsave(&ctlr->queue_lock, flags);  	/*  	 * This is a bit lame, but is optimized for the common execution path. -	 * A wait_queue on the master->busy could be used, but then the common +	 * A wait_queue on the ctlr->busy could be used, but then the common  	 * execution path (pump_messages) would be required to call wake_up or  	 * friends on every SPI message. Do this instead.  	 */ -	while ((!list_empty(&master->queue) || master->busy) && limit--) { -		spin_unlock_irqrestore(&master->queue_lock, flags); +	while ((!list_empty(&ctlr->queue) || ctlr->busy) && limit--) { +		spin_unlock_irqrestore(&ctlr->queue_lock, flags);  		usleep_range(10000, 11000); -		spin_lock_irqsave(&master->queue_lock, flags); +		spin_lock_irqsave(&ctlr->queue_lock, flags);  	} -	if (!list_empty(&master->queue) || master->busy) +	if (!list_empty(&ctlr->queue) || ctlr->busy)  		ret = -EBUSY;  	else -		master->running = false; +		ctlr->running = false; -	spin_unlock_irqrestore(&master->queue_lock, flags); +	spin_unlock_irqrestore(&ctlr->queue_lock, flags);  	if (ret) { -		dev_warn(&master->dev, -			 "could not stop message queue\n"); +		dev_warn(&ctlr->dev, "could not stop message queue\n");  		return ret;  	}  	return ret;  } -static int spi_destroy_queue(struct spi_master *master) +static int spi_destroy_queue(struct spi_controller *ctlr)  {  	int ret; -	ret = spi_stop_queue(master); +	ret = spi_stop_queue(ctlr);  	/*  	 * kthread_flush_worker will block until all work is done. @@ -1451,12 +1453,12 @@ static int spi_destroy_queue(struct spi_master *master)  	 * return anyway.  	 */  	if (ret) { -		dev_err(&master->dev, "problem destroying queue\n"); +		dev_err(&ctlr->dev, "problem destroying queue\n");  		return ret;  	} -	kthread_flush_worker(&master->kworker); -	kthread_stop(master->kworker_task); +	kthread_flush_worker(&ctlr->kworker); +	kthread_stop(ctlr->kworker_task);  	return 0;  } @@ -1465,23 +1467,23 @@ static int __spi_queued_transfer(struct spi_device *spi,  				 struct spi_message *msg,  				 bool need_pump)  { -	struct spi_master *master = spi->master; +	struct spi_controller *ctlr = spi->controller;  	unsigned long flags; -	spin_lock_irqsave(&master->queue_lock, flags); +	spin_lock_irqsave(&ctlr->queue_lock, flags); -	if (!master->running) { -		spin_unlock_irqrestore(&master->queue_lock, flags); +	if (!ctlr->running) { +		spin_unlock_irqrestore(&ctlr->queue_lock, flags);  		return -ESHUTDOWN;  	}  	msg->actual_length = 0;  	msg->status = -EINPROGRESS; -	list_add_tail(&msg->queue, &master->queue); -	if (!master->busy && need_pump) -		kthread_queue_work(&master->kworker, &master->pump_messages); +	list_add_tail(&msg->queue, &ctlr->queue); +	if (!ctlr->busy && need_pump) +		kthread_queue_work(&ctlr->kworker, &ctlr->pump_messages); -	spin_unlock_irqrestore(&master->queue_lock, flags); +	spin_unlock_irqrestore(&ctlr->queue_lock, flags);  	return 0;  } @@ -1497,31 +1499,31 @@ static int spi_queued_transfer(struct spi_device *spi, struct spi_message *msg)  	return __spi_queued_transfer(spi, msg, true);  } -static int spi_master_initialize_queue(struct spi_master *master) +static int spi_controller_initialize_queue(struct spi_controller *ctlr)  {  	int ret; -	master->transfer = spi_queued_transfer; -	if (!master->transfer_one_message) -		master->transfer_one_message = spi_transfer_one_message; +	ctlr->transfer = spi_queued_transfer; +	if (!ctlr->transfer_one_message) +		ctlr->transfer_one_message = spi_transfer_one_message;  	/* Initialize and start queue */ -	ret = spi_init_queue(master); +	ret = spi_init_queue(ctlr);  	if (ret) { -		dev_err(&master->dev, "problem initializing queue\n"); +		dev_err(&ctlr->dev, "problem initializing queue\n");  		goto err_init_queue;  	} -	master->queued = true; -	ret = spi_start_queue(master); +	ctlr->queued = true; +	ret = spi_start_queue(ctlr);  	if (ret) { -		dev_err(&master->dev, "problem starting queue\n"); +		dev_err(&ctlr->dev, "problem starting queue\n");  		goto err_start_queue;  	}  	return 0;  err_start_queue: -	spi_destroy_queue(master); +	spi_destroy_queue(ctlr);  err_init_queue:  	return ret;  } @@ -1529,31 +1531,22 @@ err_init_queue:  /*-------------------------------------------------------------------------*/  #if defined(CONFIG_OF) -static int of_spi_parse_dt(struct spi_master *master, struct spi_device *spi, +static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi,  			   struct device_node *nc)  {  	u32 value;  	int rc; -	/* Device address */ -	rc = of_property_read_u32(nc, "reg", &value); -	if (rc) { -		dev_err(&master->dev, "%s has no valid 'reg' property (%d)\n", -			nc->full_name, rc); -		return rc; -	} -	spi->chip_select = value; -  	/* Mode (clock phase/polarity/etc.) */ -	if (of_find_property(nc, "spi-cpha", NULL)) +	if (of_property_read_bool(nc, "spi-cpha"))  		spi->mode |= SPI_CPHA; -	if (of_find_property(nc, "spi-cpol", NULL)) +	if (of_property_read_bool(nc, "spi-cpol"))  		spi->mode |= SPI_CPOL; -	if (of_find_property(nc, "spi-cs-high", NULL)) +	if (of_property_read_bool(nc, "spi-cs-high"))  		spi->mode |= SPI_CS_HIGH; -	if (of_find_property(nc, "spi-3wire", NULL)) +	if (of_property_read_bool(nc, "spi-3wire"))  		spi->mode |= SPI_3WIRE; -	if (of_find_property(nc, "spi-lsb-first", NULL)) +	if (of_property_read_bool(nc, "spi-lsb-first"))  		spi->mode |= SPI_LSB_FIRST;  	/* Device DUAL/QUAD mode */ @@ -1568,7 +1561,7 @@ static int of_spi_parse_dt(struct spi_master *master, struct spi_device *spi,  			spi->mode |= SPI_TX_QUAD;  			break;  		default: -			dev_warn(&master->dev, +			dev_warn(&ctlr->dev,  				"spi-tx-bus-width %d not supported\n",  				value);  			break; @@ -1586,18 +1579,36 @@ static int of_spi_parse_dt(struct spi_master *master, struct spi_device *spi,  			spi->mode |= SPI_RX_QUAD;  			break;  		default: -			dev_warn(&master->dev, +			dev_warn(&ctlr->dev,  				"spi-rx-bus-width %d not supported\n",  				value);  			break;  		}  	} +	if (spi_controller_is_slave(ctlr)) { +		if (strcmp(nc->name, "slave")) { +			dev_err(&ctlr->dev, "%pOF is not called 'slave'\n", +				nc); +			return -EINVAL; +		} +		return 0; +	} + +	/* Device address */ +	rc = of_property_read_u32(nc, "reg", &value); +	if (rc) { +		dev_err(&ctlr->dev, "%pOF has no valid 'reg' property (%d)\n", +			nc, rc); +		return rc; +	} +	spi->chip_select = value; +  	/* Device speed */  	rc = of_property_read_u32(nc, "spi-max-frequency", &value);  	if (rc) { -		dev_err(&master->dev, "%s has no valid 'spi-max-frequency' property (%d)\n", -			nc->full_name, rc); +		dev_err(&ctlr->dev, +			"%pOF has no valid 'spi-max-frequency' property (%d)\n", nc, rc);  		return rc;  	}  	spi->max_speed_hz = value; @@ -1606,16 +1617,15 @@ static int of_spi_parse_dt(struct spi_master *master, struct spi_device *spi,  }  static struct spi_device * -of_register_spi_device(struct spi_master *master, struct device_node *nc) +of_register_spi_device(struct spi_controller *ctlr, struct device_node *nc)  {  	struct spi_device *spi;  	int rc;  	/* Alloc an spi_device */ -	spi = spi_alloc_device(master); +	spi = spi_alloc_device(ctlr);  	if (!spi) { -		dev_err(&master->dev, "spi_device alloc error for %s\n", -			nc->full_name); +		dev_err(&ctlr->dev, "spi_device alloc error for %pOF\n", nc);  		rc = -ENOMEM;  		goto err_out;  	} @@ -1624,12 +1634,11 @@ of_register_spi_device(struct spi_master *master, struct device_node *nc)  	rc = of_modalias_node(nc, spi->modalias,  				sizeof(spi->modalias));  	if (rc < 0) { -		dev_err(&master->dev, "cannot find modalias for %s\n", -			nc->full_name); +		dev_err(&ctlr->dev, "cannot find modalias for %pOF\n", nc);  		goto err_out;  	} -	rc = of_spi_parse_dt(master, spi, nc); +	rc = of_spi_parse_dt(ctlr, spi, nc);  	if (rc)  		goto err_out; @@ -1640,8 +1649,7 @@ of_register_spi_device(struct spi_master *master, struct device_node *nc)  	/* Register the new device */  	rc = spi_add_device(spi);  	if (rc) { -		dev_err(&master->dev, "spi_device register error %s\n", -			nc->full_name); +		dev_err(&ctlr->dev, "spi_device register error %pOF\n", nc);  		goto err_of_node_put;  	} @@ -1656,39 +1664,68 @@ err_out:  /**   * of_register_spi_devices() - Register child devices onto the SPI bus - * @master:	Pointer to spi_master device + * @ctlr:	Pointer to spi_controller device   * - * Registers an spi_device for each child node of master node which has a 'reg' - * property. + * Registers an spi_device for each child node of controller node which + * represents a valid SPI slave.   */ -static void of_register_spi_devices(struct spi_master *master) +static void of_register_spi_devices(struct spi_controller *ctlr)  {  	struct spi_device *spi;  	struct device_node *nc; -	if (!master->dev.of_node) +	if (!ctlr->dev.of_node)  		return; -	for_each_available_child_of_node(master->dev.of_node, nc) { +	for_each_available_child_of_node(ctlr->dev.of_node, nc) {  		if (of_node_test_and_set_flag(nc, OF_POPULATED))  			continue; -		spi = of_register_spi_device(master, nc); +		spi = of_register_spi_device(ctlr, nc);  		if (IS_ERR(spi)) { -			dev_warn(&master->dev, "Failed to create SPI device for %s\n", -				nc->full_name); +			dev_warn(&ctlr->dev, +				 "Failed to create SPI device for %pOF\n", nc);  			of_node_clear_flag(nc, OF_POPULATED);  		}  	}  }  #else -static void of_register_spi_devices(struct spi_master *master) { } +static void of_register_spi_devices(struct spi_controller *ctlr) { }  #endif  #ifdef CONFIG_ACPI +static void acpi_spi_parse_apple_properties(struct spi_device *spi) +{ +	struct acpi_device *dev = ACPI_COMPANION(&spi->dev); +	const union acpi_object *obj; + +	if (!x86_apple_machine) +		return; + +	if (!acpi_dev_get_property(dev, "spiSclkPeriod", ACPI_TYPE_BUFFER, &obj) +	    && obj->buffer.length >= 4) +		spi->max_speed_hz  = NSEC_PER_SEC / *(u32 *)obj->buffer.pointer; + +	if (!acpi_dev_get_property(dev, "spiWordSize", ACPI_TYPE_BUFFER, &obj) +	    && obj->buffer.length == 8) +		spi->bits_per_word = *(u64 *)obj->buffer.pointer; + +	if (!acpi_dev_get_property(dev, "spiBitOrder", ACPI_TYPE_BUFFER, &obj) +	    && obj->buffer.length == 8 && !*(u64 *)obj->buffer.pointer) +		spi->mode |= SPI_LSB_FIRST; + +	if (!acpi_dev_get_property(dev, "spiSPO", ACPI_TYPE_BUFFER, &obj) +	    && obj->buffer.length == 8 &&  *(u64 *)obj->buffer.pointer) +		spi->mode |= SPI_CPOL; + +	if (!acpi_dev_get_property(dev, "spiSPH", ACPI_TYPE_BUFFER, &obj) +	    && obj->buffer.length == 8 &&  *(u64 *)obj->buffer.pointer) +		spi->mode |= SPI_CPHA; +} +  static int acpi_spi_add_resource(struct acpi_resource *ares, void *data)  {  	struct spi_device *spi = data; -	struct spi_master *master = spi->master; +	struct spi_controller *ctlr = spi->controller;  	if (ares->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {  		struct acpi_resource_spi_serialbus *sb; @@ -1702,8 +1739,8 @@ static int acpi_spi_add_resource(struct acpi_resource *ares, void *data)  			 * 0 .. max - 1 so we need to ask the driver to  			 * translate between the two schemes.  			 */ -			if (master->fw_translate_cs) { -				int cs = master->fw_translate_cs(master, +			if (ctlr->fw_translate_cs) { +				int cs = ctlr->fw_translate_cs(ctlr,  						sb->device_selection);  				if (cs < 0)  					return cs; @@ -1732,7 +1769,7 @@ static int acpi_spi_add_resource(struct acpi_resource *ares, void *data)  	return 1;  } -static acpi_status acpi_register_spi_device(struct spi_master *master, +static acpi_status acpi_register_spi_device(struct spi_controller *ctlr,  					    struct acpi_device *adev)  {  	struct list_head resource_list; @@ -1743,9 +1780,9 @@ static acpi_status acpi_register_spi_device(struct spi_master *master,  	    acpi_device_enumerated(adev))  		return AE_OK; -	spi = spi_alloc_device(master); +	spi = spi_alloc_device(ctlr);  	if (!spi) { -		dev_err(&master->dev, "failed to allocate SPI device for %s\n", +		dev_err(&ctlr->dev, "failed to allocate SPI device for %s\n",  			dev_name(&adev->dev));  		return AE_NO_MEMORY;  	} @@ -1758,6 +1795,8 @@ static acpi_status acpi_register_spi_device(struct spi_master *master,  				     acpi_spi_add_resource, spi);  	acpi_dev_free_resource_list(&resource_list); +	acpi_spi_parse_apple_properties(spi); +  	if (ret < 0 || !spi->max_speed_hz) {  		spi_dev_put(spi);  		return AE_OK; @@ -1774,7 +1813,7 @@ static acpi_status acpi_register_spi_device(struct spi_master *master,  	adev->power.flags.ignore_parent = true;  	if (spi_add_device(spi)) {  		adev->power.flags.ignore_parent = false; -		dev_err(&master->dev, "failed to add SPI device %s from ACPI\n", +		dev_err(&ctlr->dev, "failed to add SPI device %s from ACPI\n",  			dev_name(&adev->dev));  		spi_dev_put(spi);  	} @@ -1785,104 +1824,211 @@ static acpi_status acpi_register_spi_device(struct spi_master *master,  static acpi_status acpi_spi_add_device(acpi_handle handle, u32 level,  				       void *data, void **return_value)  { -	struct spi_master *master = data; +	struct spi_controller *ctlr = data;  	struct acpi_device *adev;  	if (acpi_bus_get_device(handle, &adev))  		return AE_OK; -	return acpi_register_spi_device(master, adev); +	return acpi_register_spi_device(ctlr, adev);  } -static void acpi_register_spi_devices(struct spi_master *master) +static void acpi_register_spi_devices(struct spi_controller *ctlr)  {  	acpi_status status;  	acpi_handle handle; -	handle = ACPI_HANDLE(master->dev.parent); +	handle = ACPI_HANDLE(ctlr->dev.parent);  	if (!handle)  		return;  	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1, -				     acpi_spi_add_device, NULL, -				     master, NULL); +				     acpi_spi_add_device, NULL, ctlr, NULL);  	if (ACPI_FAILURE(status)) -		dev_warn(&master->dev, "failed to enumerate SPI slaves\n"); +		dev_warn(&ctlr->dev, "failed to enumerate SPI slaves\n");  }  #else -static inline void acpi_register_spi_devices(struct spi_master *master) {} +static inline void acpi_register_spi_devices(struct spi_controller *ctlr) {}  #endif /* CONFIG_ACPI */ -static void spi_master_release(struct device *dev) +static void spi_controller_release(struct device *dev)  { -	struct spi_master *master; +	struct spi_controller *ctlr; -	master = container_of(dev, struct spi_master, dev); -	kfree(master); +	ctlr = container_of(dev, struct spi_controller, dev); +	kfree(ctlr);  }  static struct class spi_master_class = {  	.name		= "spi_master",  	.owner		= THIS_MODULE, -	.dev_release	= spi_master_release, +	.dev_release	= spi_controller_release,  	.dev_groups	= spi_master_groups,  }; +#ifdef CONFIG_SPI_SLAVE +/** + * spi_slave_abort - abort the ongoing transfer request on an SPI slave + *		     controller + * @spi: device used for the current transfer + */ +int spi_slave_abort(struct spi_device *spi) +{ +	struct spi_controller *ctlr = spi->controller; + +	if (spi_controller_is_slave(ctlr) && ctlr->slave_abort) +		return ctlr->slave_abort(ctlr); + +	return -ENOTSUPP; +} +EXPORT_SYMBOL_GPL(spi_slave_abort); + +static int match_true(struct device *dev, void *data) +{ +	return 1; +} + +static ssize_t spi_slave_show(struct device *dev, +			      struct device_attribute *attr, char *buf) +{ +	struct spi_controller *ctlr = container_of(dev, struct spi_controller, +						   dev); +	struct device *child; + +	child = device_find_child(&ctlr->dev, NULL, match_true); +	return sprintf(buf, "%s\n", +		       child ? to_spi_device(child)->modalias : NULL); +} + +static ssize_t spi_slave_store(struct device *dev, +			       struct device_attribute *attr, const char *buf, +			       size_t count) +{ +	struct spi_controller *ctlr = container_of(dev, struct spi_controller, +						   dev); +	struct spi_device *spi; +	struct device *child; +	char name[32]; +	int rc; + +	rc = sscanf(buf, "%31s", name); +	if (rc != 1 || !name[0]) +		return -EINVAL; + +	child = device_find_child(&ctlr->dev, NULL, match_true); +	if (child) { +		/* Remove registered slave */ +		device_unregister(child); +		put_device(child); +	} + +	if (strcmp(name, "(null)")) { +		/* Register new slave */ +		spi = spi_alloc_device(ctlr); +		if (!spi) +			return -ENOMEM; + +		strlcpy(spi->modalias, name, sizeof(spi->modalias)); + +		rc = spi_add_device(spi); +		if (rc) { +			spi_dev_put(spi); +			return rc; +		} +	} + +	return count; +} + +static DEVICE_ATTR(slave, 0644, spi_slave_show, spi_slave_store); + +static struct attribute *spi_slave_attrs[] = { +	&dev_attr_slave.attr, +	NULL, +}; + +static const struct attribute_group spi_slave_group = { +	.attrs = spi_slave_attrs, +}; + +static const struct attribute_group *spi_slave_groups[] = { +	&spi_controller_statistics_group, +	&spi_slave_group, +	NULL, +}; + +static struct class spi_slave_class = { +	.name		= "spi_slave", +	.owner		= THIS_MODULE, +	.dev_release	= spi_controller_release, +	.dev_groups	= spi_slave_groups, +}; +#else +extern struct class spi_slave_class;	/* dummy */ +#endif  /** - * spi_alloc_master - allocate SPI master controller + * __spi_alloc_controller - allocate an SPI master or slave controller   * @dev: the controller, possibly using the platform_bus   * @size: how much zeroed driver-private data to allocate; the pointer to this   *	memory is in the driver_data field of the returned device, - *	accessible with spi_master_get_devdata(). + *	accessible with spi_controller_get_devdata(). + * @slave: flag indicating whether to allocate an SPI master (false) or SPI + *	slave (true) controller   * Context: can sleep   * - * This call is used only by SPI master controller drivers, which are the + * This call is used only by SPI controller drivers, which are the   * only ones directly touching chip registers.  It's how they allocate - * an spi_master structure, prior to calling spi_register_master(). + * an spi_controller structure, prior to calling spi_register_controller().   *   * This must be called from context that can sleep.   * - * The caller is responsible for assigning the bus number and initializing - * the master's methods before calling spi_register_master(); and (after errors - * adding the device) calling spi_master_put() to prevent a memory leak. + * The caller is responsible for assigning the bus number and initializing the + * controller's methods before calling spi_register_controller(); and (after + * errors adding the device) calling spi_controller_put() to prevent a memory + * leak.   * - * Return: the SPI master structure on success, else NULL. + * Return: the SPI controller structure on success, else NULL.   */ -struct spi_master *spi_alloc_master(struct device *dev, unsigned size) +struct spi_controller *__spi_alloc_controller(struct device *dev, +					      unsigned int size, bool slave)  { -	struct spi_master	*master; +	struct spi_controller	*ctlr;  	if (!dev)  		return NULL; -	master = kzalloc(size + sizeof(*master), GFP_KERNEL); -	if (!master) +	ctlr = kzalloc(size + sizeof(*ctlr), GFP_KERNEL); +	if (!ctlr)  		return NULL; -	device_initialize(&master->dev); -	master->bus_num = -1; -	master->num_chipselect = 1; -	master->dev.class = &spi_master_class; -	master->dev.parent = dev; -	pm_suspend_ignore_children(&master->dev, true); -	spi_master_set_devdata(master, &master[1]); +	device_initialize(&ctlr->dev); +	ctlr->bus_num = -1; +	ctlr->num_chipselect = 1; +	ctlr->slave = slave; +	if (IS_ENABLED(CONFIG_SPI_SLAVE) && slave) +		ctlr->dev.class = &spi_slave_class; +	else +		ctlr->dev.class = &spi_master_class; +	ctlr->dev.parent = dev; +	pm_suspend_ignore_children(&ctlr->dev, true); +	spi_controller_set_devdata(ctlr, &ctlr[1]); -	return master; +	return ctlr;  } -EXPORT_SYMBOL_GPL(spi_alloc_master); +EXPORT_SYMBOL_GPL(__spi_alloc_controller);  #ifdef CONFIG_OF -static int of_spi_register_master(struct spi_master *master) +static int of_spi_register_master(struct spi_controller *ctlr)  {  	int nb, i, *cs; -	struct device_node *np = master->dev.of_node; +	struct device_node *np = ctlr->dev.of_node;  	if (!np)  		return 0;  	nb = of_gpio_named_count(np, "cs-gpios"); -	master->num_chipselect = max_t(int, nb, master->num_chipselect); +	ctlr->num_chipselect = max_t(int, nb, ctlr->num_chipselect);  	/* Return error only for an incorrectly formed cs-gpios property */  	if (nb == 0 || nb == -ENOENT) @@ -1890,15 +2036,14 @@ static int of_spi_register_master(struct spi_master *master)  	else if (nb < 0)  		return nb; -	cs = devm_kzalloc(&master->dev, -			  sizeof(int) * master->num_chipselect, +	cs = devm_kzalloc(&ctlr->dev, sizeof(int) * ctlr->num_chipselect,  			  GFP_KERNEL); -	master->cs_gpios = cs; +	ctlr->cs_gpios = cs; -	if (!master->cs_gpios) +	if (!ctlr->cs_gpios)  		return -ENOMEM; -	for (i = 0; i < master->num_chipselect; i++) +	for (i = 0; i < ctlr->num_chipselect; i++)  		cs[i] = -ENOENT;  	for (i = 0; i < nb; i++) @@ -1907,20 +2052,21 @@ static int of_spi_register_master(struct spi_master *master)  	return 0;  }  #else -static int of_spi_register_master(struct spi_master *master) +static int of_spi_register_master(struct spi_controller *ctlr)  {  	return 0;  }  #endif  /** - * spi_register_master - register SPI master controller - * @master: initialized master, originally from spi_alloc_master() + * spi_register_controller - register SPI master or slave controller + * @ctlr: initialized master, originally from spi_alloc_master() or + *	spi_alloc_slave()   * Context: can sleep   * - * SPI master controllers connect to their drivers using some non-SPI bus, + * SPI controllers connect to their drivers using some non-SPI bus,   * such as the platform bus.  The final stage of probe() in that code - * includes calling spi_register_master() to hook up to this SPI bus glue. + * includes calling spi_register_controller() to hook up to this SPI bus glue.   *   * SPI controllers use board specific (often SOC specific) bus numbers,   * and board-specific addressing for SPI devices combines those numbers @@ -1929,120 +2075,143 @@ static int of_spi_register_master(struct spi_master *master)   * chip is at which address.   *   * This must be called from context that can sleep.  It returns zero on - * success, else a negative error code (dropping the master's refcount). + * success, else a negative error code (dropping the controller's refcount).   * After a successful return, the caller is responsible for calling - * spi_unregister_master(). + * spi_unregister_controller().   *   * Return: zero on success, else a negative error code.   */ -int spi_register_master(struct spi_master *master) +int spi_register_controller(struct spi_controller *ctlr)  { -	static atomic_t		dyn_bus_id = ATOMIC_INIT((1<<15) - 1); -	struct device		*dev = master->dev.parent; +	struct device		*dev = ctlr->dev.parent;  	struct boardinfo	*bi;  	int			status = -ENODEV; -	int			dynamic = 0; +	int			id;  	if (!dev)  		return -ENODEV; -	status = of_spi_register_master(master); -	if (status) -		return status; +	if (!spi_controller_is_slave(ctlr)) { +		status = of_spi_register_master(ctlr); +		if (status) +			return status; +	}  	/* even if it's just one always-selected device, there must  	 * be at least one chipselect  	 */ -	if (master->num_chipselect == 0) +	if (ctlr->num_chipselect == 0)  		return -EINVAL; - -	if ((master->bus_num < 0) && master->dev.of_node) -		master->bus_num = of_alias_get_id(master->dev.of_node, "spi"); - -	/* convention:  dynamically assigned bus IDs count down from the max */ -	if (master->bus_num < 0) { -		/* FIXME switch to an IDR based scheme, something like -		 * I2C now uses, so we can't run out of "dynamic" IDs -		 */ -		master->bus_num = atomic_dec_return(&dyn_bus_id); -		dynamic = 1; +	/* allocate dynamic bus number using Linux idr */ +	if ((ctlr->bus_num < 0) && ctlr->dev.of_node) { +		id = of_alias_get_id(ctlr->dev.of_node, "spi"); +		if (id >= 0) { +			ctlr->bus_num = id; +			mutex_lock(&board_lock); +			id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num, +				       ctlr->bus_num + 1, GFP_KERNEL); +			mutex_unlock(&board_lock); +			if (WARN(id < 0, "couldn't get idr")) +				return id == -ENOSPC ? -EBUSY : id; +		}  	} - -	INIT_LIST_HEAD(&master->queue); -	spin_lock_init(&master->queue_lock); -	spin_lock_init(&master->bus_lock_spinlock); -	mutex_init(&master->bus_lock_mutex); -	mutex_init(&master->io_mutex); -	master->bus_lock_flag = 0; -	init_completion(&master->xfer_completion); -	if (!master->max_dma_len) -		master->max_dma_len = INT_MAX; +	if (ctlr->bus_num < 0) { +		mutex_lock(&board_lock); +		id = idr_alloc(&spi_master_idr, ctlr, SPI_DYN_FIRST_BUS_NUM, 0, +			       GFP_KERNEL); +		mutex_unlock(&board_lock); +		if (WARN(id < 0, "couldn't get idr")) +			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) +		ctlr->max_dma_len = INT_MAX;  	/* register the device, then userspace will see it.  	 * registration fails if the bus ID is in use.  	 */ -	dev_set_name(&master->dev, "spi%u", master->bus_num); -	status = device_add(&master->dev); -	if (status < 0) +	dev_set_name(&ctlr->dev, "spi%u", ctlr->bus_num); +	status = device_add(&ctlr->dev); +	if (status < 0) { +		/* free bus id */ +		mutex_lock(&board_lock); +		idr_remove(&spi_master_idr, ctlr->bus_num); +		mutex_unlock(&board_lock);  		goto done; -	dev_dbg(dev, "registered master %s%s\n", dev_name(&master->dev), -			dynamic ? " (dynamic)" : ""); +	} +	dev_dbg(dev, "registered %s %s\n", +			spi_controller_is_slave(ctlr) ? "slave" : "master", +			dev_name(&ctlr->dev));  	/* If we're using a queued driver, start the queue */ -	if (master->transfer) -		dev_info(dev, "master is unqueued, this is deprecated\n"); +	if (ctlr->transfer) +		dev_info(dev, "controller is unqueued, this is deprecated\n");  	else { -		status = spi_master_initialize_queue(master); +		status = spi_controller_initialize_queue(ctlr);  		if (status) { -			device_del(&master->dev); +			device_del(&ctlr->dev); +			/* free bus id */ +			mutex_lock(&board_lock); +			idr_remove(&spi_master_idr, ctlr->bus_num); +			mutex_unlock(&board_lock);  			goto done;  		}  	}  	/* add statistics */ -	spin_lock_init(&master->statistics.lock); +	spin_lock_init(&ctlr->statistics.lock);  	mutex_lock(&board_lock); -	list_add_tail(&master->list, &spi_master_list); +	list_add_tail(&ctlr->list, &spi_controller_list);  	list_for_each_entry(bi, &board_list, list) -		spi_match_master_to_boardinfo(master, &bi->board_info); +		spi_match_controller_to_boardinfo(ctlr, &bi->board_info);  	mutex_unlock(&board_lock);  	/* Register devices from the device tree and ACPI */ -	of_register_spi_devices(master); -	acpi_register_spi_devices(master); +	of_register_spi_devices(ctlr); +	acpi_register_spi_devices(ctlr);  done:  	return status;  } -EXPORT_SYMBOL_GPL(spi_register_master); +EXPORT_SYMBOL_GPL(spi_register_controller);  static void devm_spi_unregister(struct device *dev, void *res)  { -	spi_unregister_master(*(struct spi_master **)res); +	spi_unregister_controller(*(struct spi_controller **)res);  }  /** - * dev_spi_register_master - register managed SPI master controller - * @dev:    device managing SPI master - * @master: initialized master, originally from spi_alloc_master() + * devm_spi_register_controller - register managed SPI master or slave + *	controller + * @dev:    device managing SPI controller + * @ctlr: initialized controller, originally from spi_alloc_master() or + *	spi_alloc_slave()   * Context: can sleep   * - * Register a SPI device as with spi_register_master() which will + * Register a SPI device as with spi_register_controller() which will   * automatically be unregister   *   * Return: zero on success, else a negative error code.   */ -int devm_spi_register_master(struct device *dev, struct spi_master *master) +int devm_spi_register_controller(struct device *dev, +				 struct spi_controller *ctlr)  { -	struct spi_master **ptr; +	struct spi_controller **ptr;  	int ret;  	ptr = devres_alloc(devm_spi_unregister, sizeof(*ptr), GFP_KERNEL);  	if (!ptr)  		return -ENOMEM; -	ret = spi_register_master(master); +	ret = spi_register_controller(ctlr);  	if (!ret) { -		*ptr = master; +		*ptr = ctlr;  		devres_add(dev, ptr);  	} else {  		devres_free(ptr); @@ -2050,7 +2219,7 @@ int devm_spi_register_master(struct device *dev, struct spi_master *master)  	return ret;  } -EXPORT_SYMBOL_GPL(devm_spi_register_master); +EXPORT_SYMBOL_GPL(devm_spi_register_controller);  static int __unregister(struct device *dev, void *null)  { @@ -2059,71 +2228,85 @@ static int __unregister(struct device *dev, void *null)  }  /** - * spi_unregister_master - unregister SPI master controller - * @master: the master being unregistered + * spi_unregister_controller - unregister SPI master or slave controller + * @ctlr: the controller being unregistered   * Context: can sleep   * - * This call is used only by SPI master controller drivers, which are the + * This call is used only by SPI controller drivers, which are the   * only ones directly touching chip registers.   *   * This must be called from context that can sleep.   */ -void spi_unregister_master(struct spi_master *master) +void spi_unregister_controller(struct spi_controller *ctlr)  { +	struct spi_controller *found;  	int dummy; -	if (master->queued) { -		if (spi_destroy_queue(master)) -			dev_err(&master->dev, "queue remove failed\n"); +	/* First make sure that this controller was ever added */ +	mutex_lock(&board_lock); +	found = idr_find(&spi_master_idr, ctlr->bus_num); +	mutex_unlock(&board_lock); +	if (found != ctlr) { +		dev_dbg(&ctlr->dev, +			"attempting to delete unregistered controller [%s]\n", +			dev_name(&ctlr->dev)); +		return; +	} +	if (ctlr->queued) { +		if (spi_destroy_queue(ctlr)) +			dev_err(&ctlr->dev, "queue remove failed\n");  	} -  	mutex_lock(&board_lock); -	list_del(&master->list); +	list_del(&ctlr->list);  	mutex_unlock(&board_lock); -	dummy = device_for_each_child(&master->dev, NULL, __unregister); -	device_unregister(&master->dev); +	dummy = device_for_each_child(&ctlr->dev, NULL, __unregister); +	device_unregister(&ctlr->dev); +	/* free bus id */ +	mutex_lock(&board_lock); +	idr_remove(&spi_master_idr, ctlr->bus_num); +	mutex_unlock(&board_lock);  } -EXPORT_SYMBOL_GPL(spi_unregister_master); +EXPORT_SYMBOL_GPL(spi_unregister_controller); -int spi_master_suspend(struct spi_master *master) +int spi_controller_suspend(struct spi_controller *ctlr)  {  	int ret; -	/* Basically no-ops for non-queued masters */ -	if (!master->queued) +	/* Basically no-ops for non-queued controllers */ +	if (!ctlr->queued)  		return 0; -	ret = spi_stop_queue(master); +	ret = spi_stop_queue(ctlr);  	if (ret) -		dev_err(&master->dev, "queue stop failed\n"); +		dev_err(&ctlr->dev, "queue stop failed\n");  	return ret;  } -EXPORT_SYMBOL_GPL(spi_master_suspend); +EXPORT_SYMBOL_GPL(spi_controller_suspend); -int spi_master_resume(struct spi_master *master) +int spi_controller_resume(struct spi_controller *ctlr)  {  	int ret; -	if (!master->queued) +	if (!ctlr->queued)  		return 0; -	ret = spi_start_queue(master); +	ret = spi_start_queue(ctlr);  	if (ret) -		dev_err(&master->dev, "queue restart failed\n"); +		dev_err(&ctlr->dev, "queue restart failed\n");  	return ret;  } -EXPORT_SYMBOL_GPL(spi_master_resume); +EXPORT_SYMBOL_GPL(spi_controller_resume); -static int __spi_master_match(struct device *dev, const void *data) +static int __spi_controller_match(struct device *dev, const void *data)  { -	struct spi_master *m; +	struct spi_controller *ctlr;  	const u16 *bus_num = data; -	m = container_of(dev, struct spi_master, dev); -	return m->bus_num == *bus_num; +	ctlr = container_of(dev, struct spi_controller, dev); +	return ctlr->bus_num == *bus_num;  }  /** @@ -2133,22 +2316,22 @@ static int __spi_master_match(struct device *dev, const void *data)   *   * This call may be used with devices that are registered after   * arch init time.  It returns a refcounted pointer to the relevant - * spi_master (which the caller must release), or NULL if there is + * spi_controller (which the caller must release), or NULL if there is   * no such master registered.   *   * Return: the SPI master structure on success, else NULL.   */ -struct spi_master *spi_busnum_to_master(u16 bus_num) +struct spi_controller *spi_busnum_to_master(u16 bus_num)  {  	struct device		*dev; -	struct spi_master	*master = NULL; +	struct spi_controller	*ctlr = NULL;  	dev = class_find_device(&spi_master_class, NULL, &bus_num, -				__spi_master_match); +				__spi_controller_match);  	if (dev) -		master = container_of(dev, struct spi_master, dev); +		ctlr = container_of(dev, struct spi_controller, dev);  	/* reference got in class_find_device */ -	return master; +	return ctlr;  }  EXPORT_SYMBOL_GPL(spi_busnum_to_master); @@ -2168,7 +2351,7 @@ EXPORT_SYMBOL_GPL(spi_busnum_to_master);   * Return: the pointer to the allocated data   *   * This may get enhanced in the future to allocate from a memory pool - * of the @spi_device or @spi_master to avoid repeated allocations. + * of the @spi_device or @spi_controller to avoid repeated allocations.   */  void *spi_res_alloc(struct spi_device *spi,  		    spi_res_release_t release, @@ -2220,11 +2403,10 @@ EXPORT_SYMBOL_GPL(spi_res_add);  /**   * spi_res_release - release all spi resources for this message - * @master:  the @spi_master + * @ctlr:  the @spi_controller   * @message: the @spi_message   */ -void spi_res_release(struct spi_master *master, -		     struct spi_message *message) +void spi_res_release(struct spi_controller *ctlr, struct spi_message *message)  {  	struct spi_res *res; @@ -2233,7 +2415,7 @@ void spi_res_release(struct spi_master *master,  				      struct spi_res, entry);  		if (res->release) -			res->release(master, message, res->data); +			res->release(ctlr, message, res->data);  		list_del(&res->entry); @@ -2246,7 +2428,7 @@ EXPORT_SYMBOL_GPL(spi_res_release);  /* Core methods for spi_message alterations */ -static void __spi_replace_transfers_release(struct spi_master *master, +static void __spi_replace_transfers_release(struct spi_controller *ctlr,  					    struct spi_message *msg,  					    void *res)  { @@ -2255,7 +2437,7 @@ static void __spi_replace_transfers_release(struct spi_master *master,  	/* call extra callback if requested */  	if (rxfer->release) -		rxfer->release(master, msg, res); +		rxfer->release(ctlr, msg, res);  	/* insert replaced transfers back into the message */  	list_splice(&rxfer->replaced_transfers, rxfer->replaced_after); @@ -2375,7 +2557,7 @@ struct spi_replaced_transfers *spi_replace_transfers(  }  EXPORT_SYMBOL_GPL(spi_replace_transfers); -static int __spi_split_transfer_maxsize(struct spi_master *master, +static int __spi_split_transfer_maxsize(struct spi_controller *ctlr,  					struct spi_message *msg,  					struct spi_transfer **xferp,  					size_t maxsize, @@ -2437,7 +2619,7 @@ static int __spi_split_transfer_maxsize(struct spi_master *master,  	*xferp = &xfers[count - 1];  	/* increment statistics counters */ -	SPI_STATISTICS_INCREMENT_FIELD(&master->statistics, +	SPI_STATISTICS_INCREMENT_FIELD(&ctlr->statistics,  				       transfers_split_maxsize);  	SPI_STATISTICS_INCREMENT_FIELD(&msg->spi->statistics,  				       transfers_split_maxsize); @@ -2449,14 +2631,14 @@ static int __spi_split_transfer_maxsize(struct spi_master *master,   * spi_split_tranfers_maxsize - split spi transfers into multiple transfers   *                              when an individual transfer exceeds a   *                              certain size - * @master:    the @spi_master for this transfer + * @ctlr:    the @spi_controller for this transfer   * @msg:   the @spi_message to transform   * @maxsize:  the maximum when to apply this   * @gfp: GFP allocation flags   *   * Return: status of transformation   */ -int spi_split_transfers_maxsize(struct spi_master *master, +int spi_split_transfers_maxsize(struct spi_controller *ctlr,  				struct spi_message *msg,  				size_t maxsize,  				gfp_t gfp) @@ -2472,8 +2654,8 @@ int spi_split_transfers_maxsize(struct spi_master *master,  	 */  	list_for_each_entry(xfer, &msg->transfers, transfer_list) {  		if (xfer->len > maxsize) { -			ret = __spi_split_transfer_maxsize( -				master, msg, &xfer, maxsize, gfp); +			ret = __spi_split_transfer_maxsize(ctlr, msg, &xfer, +							   maxsize, gfp);  			if (ret)  				return ret;  		} @@ -2485,18 +2667,18 @@ EXPORT_SYMBOL_GPL(spi_split_transfers_maxsize);  /*-------------------------------------------------------------------------*/ -/* Core methods for SPI master protocol drivers.  Some of the +/* Core methods for SPI controller protocol drivers.  Some of the   * other core methods are currently defined as inline functions.   */ -static int __spi_validate_bits_per_word(struct spi_master *master, u8 bits_per_word) +static int __spi_validate_bits_per_word(struct spi_controller *ctlr, +					u8 bits_per_word)  { -	if (master->bits_per_word_mask) { +	if (ctlr->bits_per_word_mask) {  		/* Only 32 bits fit in the mask */  		if (bits_per_word > 32)  			return -EINVAL; -		if (!(master->bits_per_word_mask & -				SPI_BPW_MASK(bits_per_word))) +		if (!(ctlr->bits_per_word_mask & SPI_BPW_MASK(bits_per_word)))  			return -EINVAL;  	} @@ -2542,9 +2724,9 @@ int spi_setup(struct spi_device *spi)  		(SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD)))  		return -EINVAL;  	/* help drivers fail *cleanly* when they need options -	 * that aren't supported with their current master +	 * that aren't supported with their current controller  	 */ -	bad_bits = spi->mode & ~spi->master->mode_bits; +	bad_bits = spi->mode & ~spi->controller->mode_bits;  	ugly_bits = bad_bits &  		    (SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD);  	if (ugly_bits) { @@ -2563,15 +2745,16 @@ int spi_setup(struct spi_device *spi)  	if (!spi->bits_per_word)  		spi->bits_per_word = 8; -	status = __spi_validate_bits_per_word(spi->master, spi->bits_per_word); +	status = __spi_validate_bits_per_word(spi->controller, +					      spi->bits_per_word);  	if (status)  		return status;  	if (!spi->max_speed_hz) -		spi->max_speed_hz = spi->master->max_speed_hz; +		spi->max_speed_hz = spi->controller->max_speed_hz; -	if (spi->master->setup) -		status = spi->master->setup(spi); +	if (spi->controller->setup) +		status = spi->controller->setup(spi);  	spi_set_cs(spi, false); @@ -2590,7 +2773,7 @@ EXPORT_SYMBOL_GPL(spi_setup);  static int __spi_validate(struct spi_device *spi, struct spi_message *message)  { -	struct spi_master *master = spi->master; +	struct spi_controller *ctlr = spi->controller;  	struct spi_transfer *xfer;  	int w_size; @@ -2602,16 +2785,16 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)  	 * either MOSI or MISO is missing.  They can also be caused by  	 * software limitations.  	 */ -	if ((master->flags & SPI_MASTER_HALF_DUPLEX) -			|| (spi->mode & SPI_3WIRE)) { -		unsigned flags = master->flags; +	if ((ctlr->flags & SPI_CONTROLLER_HALF_DUPLEX) || +	    (spi->mode & SPI_3WIRE)) { +		unsigned flags = ctlr->flags;  		list_for_each_entry(xfer, &message->transfers, transfer_list) {  			if (xfer->rx_buf && xfer->tx_buf)  				return -EINVAL; -			if ((flags & SPI_MASTER_NO_TX) && xfer->tx_buf) +			if ((flags & SPI_CONTROLLER_NO_TX) && xfer->tx_buf)  				return -EINVAL; -			if ((flags & SPI_MASTER_NO_RX) && xfer->rx_buf) +			if ((flags & SPI_CONTROLLER_NO_RX) && xfer->rx_buf)  				return -EINVAL;  		}  	} @@ -2631,13 +2814,12 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)  		if (!xfer->speed_hz)  			xfer->speed_hz = spi->max_speed_hz;  		if (!xfer->speed_hz) -			xfer->speed_hz = master->max_speed_hz; +			xfer->speed_hz = ctlr->max_speed_hz; -		if (master->max_speed_hz && -		    xfer->speed_hz > master->max_speed_hz) -			xfer->speed_hz = master->max_speed_hz; +		if (ctlr->max_speed_hz && xfer->speed_hz > ctlr->max_speed_hz) +			xfer->speed_hz = ctlr->max_speed_hz; -		if (__spi_validate_bits_per_word(master, xfer->bits_per_word)) +		if (__spi_validate_bits_per_word(ctlr, xfer->bits_per_word))  			return -EINVAL;  		/* @@ -2655,8 +2837,8 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)  		if (xfer->len % w_size)  			return -EINVAL; -		if (xfer->speed_hz && master->min_speed_hz && -		    xfer->speed_hz < master->min_speed_hz) +		if (xfer->speed_hz && ctlr->min_speed_hz && +		    xfer->speed_hz < ctlr->min_speed_hz)  			return -EINVAL;  		if (xfer->tx_buf && !xfer->tx_nbits) @@ -2701,16 +2883,16 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)  static int __spi_async(struct spi_device *spi, struct spi_message *message)  { -	struct spi_master *master = spi->master; +	struct spi_controller *ctlr = spi->controller;  	message->spi = spi; -	SPI_STATISTICS_INCREMENT_FIELD(&master->statistics, spi_async); +	SPI_STATISTICS_INCREMENT_FIELD(&ctlr->statistics, spi_async);  	SPI_STATISTICS_INCREMENT_FIELD(&spi->statistics, spi_async);  	trace_spi_message_submit(message); -	return master->transfer(spi, message); +	return ctlr->transfer(spi, message);  }  /** @@ -2746,7 +2928,7 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)   */  int spi_async(struct spi_device *spi, struct spi_message *message)  { -	struct spi_master *master = spi->master; +	struct spi_controller *ctlr = spi->controller;  	int ret;  	unsigned long flags; @@ -2754,14 +2936,14 @@ int spi_async(struct spi_device *spi, struct spi_message *message)  	if (ret != 0)  		return ret; -	spin_lock_irqsave(&master->bus_lock_spinlock, flags); +	spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags); -	if (master->bus_lock_flag) +	if (ctlr->bus_lock_flag)  		ret = -EBUSY;  	else  		ret = __spi_async(spi, message); -	spin_unlock_irqrestore(&master->bus_lock_spinlock, flags); +	spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);  	return ret;  } @@ -2800,7 +2982,7 @@ EXPORT_SYMBOL_GPL(spi_async);   */  int spi_async_locked(struct spi_device *spi, struct spi_message *message)  { -	struct spi_master *master = spi->master; +	struct spi_controller *ctlr = spi->controller;  	int ret;  	unsigned long flags; @@ -2808,11 +2990,11 @@ int spi_async_locked(struct spi_device *spi, struct spi_message *message)  	if (ret != 0)  		return ret; -	spin_lock_irqsave(&master->bus_lock_spinlock, flags); +	spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags);  	ret = __spi_async(spi, message); -	spin_unlock_irqrestore(&master->bus_lock_spinlock, flags); +	spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);  	return ret; @@ -2824,7 +3006,7 @@ int spi_flash_read(struct spi_device *spi,  		   struct spi_flash_read_message *msg)  { -	struct spi_master *master = spi->master; +	struct spi_controller *master = spi->controller;  	struct device *rx_dev = NULL;  	int ret; @@ -2878,7 +3060,7 @@ EXPORT_SYMBOL_GPL(spi_flash_read);  /*-------------------------------------------------------------------------*/ -/* Utility methods for SPI master protocol drivers, layered on +/* Utility methods for SPI protocol drivers, layered on   * top of the core.  Some other utility methods are defined as   * inline functions.   */ @@ -2892,7 +3074,7 @@ static int __spi_sync(struct spi_device *spi, struct spi_message *message)  {  	DECLARE_COMPLETION_ONSTACK(done);  	int status; -	struct spi_master *master = spi->master; +	struct spi_controller *ctlr = spi->controller;  	unsigned long flags;  	status = __spi_validate(spi, message); @@ -2903,7 +3085,7 @@ static int __spi_sync(struct spi_device *spi, struct spi_message *message)  	message->context = &done;  	message->spi = spi; -	SPI_STATISTICS_INCREMENT_FIELD(&master->statistics, spi_sync); +	SPI_STATISTICS_INCREMENT_FIELD(&ctlr->statistics, spi_sync);  	SPI_STATISTICS_INCREMENT_FIELD(&spi->statistics, spi_sync);  	/* If we're not using the legacy transfer method then we will @@ -2911,14 +3093,14 @@ static int __spi_sync(struct spi_device *spi, struct spi_message *message)  	 * This code would be less tricky if we could remove the  	 * support for driver implemented message queues.  	 */ -	if (master->transfer == spi_queued_transfer) { -		spin_lock_irqsave(&master->bus_lock_spinlock, flags); +	if (ctlr->transfer == spi_queued_transfer) { +		spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags);  		trace_spi_message_submit(message);  		status = __spi_queued_transfer(spi, message, false); -		spin_unlock_irqrestore(&master->bus_lock_spinlock, flags); +		spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);  	} else {  		status = spi_async_locked(spi, message);  	} @@ -2927,12 +3109,12 @@ static int __spi_sync(struct spi_device *spi, struct spi_message *message)  		/* Push out the messages in the calling context if we  		 * can.  		 */ -		if (master->transfer == spi_queued_transfer) { -			SPI_STATISTICS_INCREMENT_FIELD(&master->statistics, +		if (ctlr->transfer == spi_queued_transfer) { +			SPI_STATISTICS_INCREMENT_FIELD(&ctlr->statistics,  						       spi_sync_immediate);  			SPI_STATISTICS_INCREMENT_FIELD(&spi->statistics,  						       spi_sync_immediate); -			__spi_pump_messages(master, false); +			__spi_pump_messages(ctlr, false);  		}  		wait_for_completion(&done); @@ -2967,9 +3149,9 @@ int spi_sync(struct spi_device *spi, struct spi_message *message)  {  	int ret; -	mutex_lock(&spi->master->bus_lock_mutex); +	mutex_lock(&spi->controller->bus_lock_mutex);  	ret = __spi_sync(spi, message); -	mutex_unlock(&spi->master->bus_lock_mutex); +	mutex_unlock(&spi->controller->bus_lock_mutex);  	return ret;  } @@ -2999,7 +3181,7 @@ EXPORT_SYMBOL_GPL(spi_sync_locked);  /**   * spi_bus_lock - obtain a lock for exclusive SPI bus usage - * @master: SPI bus master that should be locked for exclusive bus access + * @ctlr: SPI bus master that should be locked for exclusive bus access   * Context: can sleep   *   * This call may only be used from a context that may sleep.  The sleep @@ -3012,15 +3194,15 @@ EXPORT_SYMBOL_GPL(spi_sync_locked);   *   * Return: always zero.   */ -int spi_bus_lock(struct spi_master *master) +int spi_bus_lock(struct spi_controller *ctlr)  {  	unsigned long flags; -	mutex_lock(&master->bus_lock_mutex); +	mutex_lock(&ctlr->bus_lock_mutex); -	spin_lock_irqsave(&master->bus_lock_spinlock, flags); -	master->bus_lock_flag = 1; -	spin_unlock_irqrestore(&master->bus_lock_spinlock, flags); +	spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags); +	ctlr->bus_lock_flag = 1; +	spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);  	/* mutex remains locked until spi_bus_unlock is called */ @@ -3030,7 +3212,7 @@ EXPORT_SYMBOL_GPL(spi_bus_lock);  /**   * spi_bus_unlock - release the lock for exclusive SPI bus usage - * @master: SPI bus master that was locked for exclusive bus access + * @ctlr: SPI bus master that was locked for exclusive bus access   * Context: can sleep   *   * This call may only be used from a context that may sleep.  The sleep @@ -3041,11 +3223,11 @@ EXPORT_SYMBOL_GPL(spi_bus_lock);   *   * Return: always zero.   */ -int spi_bus_unlock(struct spi_master *master) +int spi_bus_unlock(struct spi_controller *ctlr)  { -	master->bus_lock_flag = 0; +	ctlr->bus_lock_flag = 0; -	mutex_unlock(&master->bus_lock_mutex); +	mutex_unlock(&ctlr->bus_lock_mutex);  	return 0;  } @@ -3147,49 +3329,52 @@ static struct spi_device *of_find_spi_device_by_node(struct device_node *node)  	return dev ? to_spi_device(dev) : NULL;  } -static int __spi_of_master_match(struct device *dev, const void *data) +static int __spi_of_controller_match(struct device *dev, const void *data)  {  	return dev->of_node == data;  } -/* the spi masters are not using spi_bus, so we find it with another way */ -static struct spi_master *of_find_spi_master_by_node(struct device_node *node) +/* the spi controllers are not using spi_bus, so we find it with another way */ +static struct spi_controller *of_find_spi_controller_by_node(struct device_node *node)  {  	struct device *dev;  	dev = class_find_device(&spi_master_class, NULL, node, -				__spi_of_master_match); +				__spi_of_controller_match); +	if (!dev && IS_ENABLED(CONFIG_SPI_SLAVE)) +		dev = class_find_device(&spi_slave_class, NULL, node, +					__spi_of_controller_match);  	if (!dev)  		return NULL;  	/* reference got in class_find_device */ -	return container_of(dev, struct spi_master, dev); +	return container_of(dev, struct spi_controller, dev);  }  static int of_spi_notify(struct notifier_block *nb, unsigned long action,  			 void *arg)  {  	struct of_reconfig_data *rd = arg; -	struct spi_master *master; +	struct spi_controller *ctlr;  	struct spi_device *spi;  	switch (of_reconfig_get_state_change(action, arg)) {  	case OF_RECONFIG_CHANGE_ADD: -		master = of_find_spi_master_by_node(rd->dn->parent); -		if (master == NULL) +		ctlr = of_find_spi_controller_by_node(rd->dn->parent); +		if (ctlr == NULL)  			return NOTIFY_OK;	/* not for us */  		if (of_node_test_and_set_flag(rd->dn, OF_POPULATED)) { -			put_device(&master->dev); +			put_device(&ctlr->dev);  			return NOTIFY_OK;  		} -		spi = of_register_spi_device(master, rd->dn); -		put_device(&master->dev); +		spi = of_register_spi_device(ctlr, rd->dn); +		put_device(&ctlr->dev);  		if (IS_ERR(spi)) { -			pr_err("%s: failed to create for '%s'\n", -					__func__, rd->dn->full_name); +			pr_err("%s: failed to create for '%pOF'\n", +					__func__, rd->dn);  			of_node_clear_flag(rd->dn, OF_POPULATED);  			return notifier_from_errno(PTR_ERR(spi));  		} @@ -3224,7 +3409,7 @@ extern struct notifier_block spi_of_notifier;  #endif /* IS_ENABLED(CONFIG_OF_DYNAMIC) */  #if IS_ENABLED(CONFIG_ACPI) -static int spi_acpi_master_match(struct device *dev, const void *data) +static int spi_acpi_controller_match(struct device *dev, const void *data)  {  	return ACPI_COMPANION(dev->parent) == data;  } @@ -3234,16 +3419,19 @@ static int spi_acpi_device_match(struct device *dev, void *data)  	return ACPI_COMPANION(dev) == data;  } -static struct spi_master *acpi_spi_find_master_by_adev(struct acpi_device *adev) +static struct spi_controller *acpi_spi_find_controller_by_adev(struct acpi_device *adev)  {  	struct device *dev;  	dev = class_find_device(&spi_master_class, NULL, adev, -				spi_acpi_master_match); +				spi_acpi_controller_match); +	if (!dev && IS_ENABLED(CONFIG_SPI_SLAVE)) +		dev = class_find_device(&spi_slave_class, NULL, adev, +					spi_acpi_controller_match);  	if (!dev)  		return NULL; -	return container_of(dev, struct spi_master, dev); +	return container_of(dev, struct spi_controller, dev);  }  static struct spi_device *acpi_spi_find_device_by_adev(struct acpi_device *adev) @@ -3259,17 +3447,17 @@ static int acpi_spi_notify(struct notifier_block *nb, unsigned long value,  			   void *arg)  {  	struct acpi_device *adev = arg; -	struct spi_master *master; +	struct spi_controller *ctlr;  	struct spi_device *spi;  	switch (value) {  	case ACPI_RECONFIG_DEVICE_ADD: -		master = acpi_spi_find_master_by_adev(adev->parent); -		if (!master) +		ctlr = acpi_spi_find_controller_by_adev(adev->parent); +		if (!ctlr)  			break; -		acpi_register_spi_device(master, adev); -		put_device(&master->dev); +		acpi_register_spi_device(ctlr, adev); +		put_device(&ctlr->dev);  		break;  	case ACPI_RECONFIG_DEVICE_REMOVE:  		if (!acpi_device_enumerated(adev)) @@ -3312,6 +3500,12 @@ static int __init spi_init(void)  	if (status < 0)  		goto err2; +	if (IS_ENABLED(CONFIG_SPI_SLAVE)) { +		status = class_register(&spi_slave_class); +		if (status < 0) +			goto err3; +	} +  	if (IS_ENABLED(CONFIG_OF_DYNAMIC))  		WARN_ON(of_reconfig_notifier_register(&spi_of_notifier));  	if (IS_ENABLED(CONFIG_ACPI)) @@ -3319,6 +3513,8 @@ static int __init spi_init(void)  	return 0; +err3: +	class_unregister(&spi_master_class);  err2:  	bus_unregister(&spi_bus_type);  err1: |