diff options
-rw-r--r-- | commands/spi.c | 16 | ||||
-rw-r--r-- | drivers/spi/spi.c | 71 | ||||
-rw-r--r-- | include/spi/spi.h | 30 |
3 files changed, 62 insertions, 55 deletions
diff --git a/commands/spi.c b/commands/spi.c index 7bf193b0bb..55a0e255af 100644 --- a/commands/spi.c +++ b/commands/spi.c @@ -62,21 +62,21 @@ static int do_spi(int argc, char *argv[]) return COMMAND_ERROR_USAGE; - spi.master = spi_get_master(bus); - if (!spi.master) { + spi.controller = spi_get_controller(bus); + if (!spi.controller) { printf("spi bus %d not found\n", bus); return -ENODEV; } - if (spi.chip_select >= spi.master->num_chipselect) { - printf("spi chip select (%d) >= master num chipselect (%d)\n", - spi.chip_select, spi.master->num_chipselect); + if (spi.chip_select >= spi.controller->num_chipselect) { + printf("spi chip select (%d) >= controller num chipselect (%d)\n", + spi.chip_select, spi.controller->num_chipselect); return -EINVAL; } - ret = spi.master->setup(&spi); + ret = spi.controller->setup(&spi); if (ret) { - printf("can not setup the master (%d)\n", ret); + printf("can not setup the controller (%d)\n", ret); return ret; } @@ -93,7 +93,7 @@ static int do_spi(int argc, char *argv[]) byte_per_word = max(spi.bits_per_word / 8, 1); if (verbose) { printf("device config\n"); - printf(" bus_num = %d\n", spi.master->bus_num); + printf(" bus_num = %d\n", spi.controller->bus_num); printf(" max_speed_hz = %d\n", spi.max_speed_hz); printf(" chip_select = %d\n", spi.chip_select); printf(" mode = 0x%x\n", spi.mode); diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 25bb988794..7756304f19 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -54,22 +54,22 @@ static LIST_HEAD(board_list); * * Returns the new device, or NULL. */ -struct spi_device *spi_new_device(struct spi_master *master, +struct spi_device *spi_new_device(struct spi_controller *ctrl, struct spi_board_info *chip) { struct spi_device *proxy; int status; /* Chipselects are numbered 0..max; validate. */ - if (chip->chip_select >= master->num_chipselect) { + if (chip->chip_select >= ctrl->num_chipselect) { debug("cs%d > max %d\n", chip->chip_select, - master->num_chipselect); + ctrl->num_chipselect); return NULL; } proxy = xzalloc(sizeof *proxy); - proxy->master = master; + proxy->master = ctrl; proxy->chip_select = chip->chip_select; proxy->max_speed_hz = chip->max_speed_hz; proxy->mode = chip->mode; @@ -81,10 +81,11 @@ struct spi_device *spi_new_device(struct spi_master *master, proxy->dev.id = DEVICE_ID_DYNAMIC; proxy->dev.type_data = proxy; proxy->dev.device_node = chip->device_node; - proxy->dev.parent = master->dev; + proxy->dev.parent = ctrl->dev; + proxy->master = proxy->controller = ctrl; /* drivers may modify this initial i/o setup */ - status = master->setup(proxy); + status = ctrl->setup(proxy); if (status < 0) { printf("can't setup %s, status %d\n", proxy->dev.name, status); @@ -100,12 +101,12 @@ fail: } EXPORT_SYMBOL(spi_new_device); -static void spi_of_register_slaves(struct spi_master *master) +static void spi_of_register_slaves(struct spi_controller *ctrl) { struct device_node *n; struct spi_board_info chip; struct property *reg; - struct device_node *node = master->dev->device_node; + struct device_node *node = ctrl->dev->device_node; if (!IS_ENABLED(CONFIG_OFDEVICE)) return; @@ -116,7 +117,7 @@ static void spi_of_register_slaves(struct spi_master *master) for_each_available_child_of_node(node, n) { memset(&chip, 0, sizeof(chip)); chip.name = xstrdup(n->name); - chip.bus_num = master->bus_num; + chip.bus_num = ctrl->bus_num; /* Mode (clock phase/polarity/etc.) */ if (of_property_read_bool(n, "spi-cpha")) chip.mode |= SPI_CPHA; @@ -171,7 +172,7 @@ spi_register_board_info(struct spi_board_info const *info, int n) return 0; } -static void scan_boardinfo(struct spi_master *master) +static void scan_boardinfo(struct spi_controller *ctrl) { struct boardinfo *bi; @@ -180,27 +181,27 @@ static void scan_boardinfo(struct spi_master *master) unsigned n; for (n = bi->n_board_info; n > 0; n--, chip++) { - debug("%s %d %d\n", __FUNCTION__, chip->bus_num, master->bus_num); - if (chip->bus_num != master->bus_num) + debug("%s %d %d\n", __FUNCTION__, chip->bus_num, ctrl->bus_num); + if (chip->bus_num != ctrl->bus_num) continue; /* NOTE: this relies on spi_new_device to * issue diagnostics when given bogus inputs */ - (void) spi_new_device(master, chip); + (void) spi_new_device(ctrl, chip); } } } -static LIST_HEAD(spi_master_list); +static LIST_HEAD(spi_controller_list); /** - * spi_register_master - register SPI master controller - * @master: initialized master, originally from spi_alloc_master() + * spi_register_ctrl - register SPI ctrl controller + * @ctrl: initialized ctrl, originally from spi_alloc_ctrl() * 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_ctrl() 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 @@ -209,47 +210,47 @@ static LIST_HEAD(spi_master_list); * 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 ctrl's refcount). * After a successful return, the caller is responsible for calling - * spi_unregister_master(). + * spi_unregister_ctrl(). */ -int spi_register_master(struct spi_master *master) +int spi_register_controller(struct spi_controller *ctrl) { static int dyn_bus_id = (1 << 15) - 1; int status = -ENODEV; - debug("%s: %s:%d\n", __func__, master->dev->name, master->dev->id); + debug("%s: %s:%d\n", __func__, ctrl->dev->name, ctrl->dev->id); /* even if it's just one always-selected device, there must * be at least one chipselect */ - if (master->num_chipselect == 0) + if (ctrl->num_chipselect == 0) return -EINVAL; - if ((master->bus_num < 0) && master->dev->device_node) - master->bus_num = of_alias_get_id(master->dev->device_node, "spi"); + if ((ctrl->bus_num < 0) && ctrl->dev->device_node) + ctrl->bus_num = of_alias_get_id(ctrl->dev->device_node, "spi"); /* convention: dynamically assigned bus IDs count down from the max */ - if (master->bus_num < 0) - master->bus_num = dyn_bus_id--; + if (ctrl->bus_num < 0) + ctrl->bus_num = dyn_bus_id--; - list_add_tail(&master->list, &spi_master_list); + list_add_tail(&ctrl->list, &spi_controller_list); - spi_of_register_slaves(master); + spi_of_register_slaves(ctrl); /* populate children from any spi device tables */ - scan_boardinfo(master); + scan_boardinfo(ctrl); status = 0; return status; } -EXPORT_SYMBOL(spi_register_master); +EXPORT_SYMBOL(spi_register_ctrl); -struct spi_master *spi_get_master(int bus) +struct spi_controller *spi_get_controller(int bus) { - struct spi_master* m; + struct spi_controller* m; - list_for_each_entry(m, &spi_master_list, list) { + list_for_each_entry(m, &spi_controller_list, list) { if (m->bus_num == bus) return m; } @@ -259,7 +260,7 @@ struct spi_master *spi_get_master(int bus) int spi_sync(struct spi_device *spi, struct spi_message *message) { - return spi->master->transfer(spi, message); + return spi->controller->transfer(spi, message); } /** diff --git a/include/spi/spi.h b/include/spi/spi.h index 620e5e57b4..8c6927da41 100644 --- a/include/spi/spi.h +++ b/include/spi/spi.h @@ -20,13 +20,14 @@ struct spi_board_info { }; /** - * struct spi_device - Master side proxy for an SPI slave device + * struct spi_device - Controller side proxy for an SPI slave device * @dev: Driver model representation of the device. - * @master: SPI controller used with the device. + * @controller: SPI controller used with the device. + * @master: Copy of controller, for backwards compatibility * @max_speed_hz: Maximum clock rate to be used with this chip * (on this board); may be changed by the device's driver. * The spi_transfer.speed_hz can override this for each transfer. - * @chip_select: Chipselect, distinguishing chips handled by @master. + * @chip_select: Chipselect, distinguishing chips handled by @controller. * @mode: The spi mode defines how data is clocked out and in. * This may be changed by the device's driver. * The "active low" default for chipselect mode can be overridden @@ -59,7 +60,8 @@ struct spi_board_info { */ struct spi_device { struct device_d dev; - struct spi_master *master; + struct spi_controller *controller; + struct spi_controller *master; /* compatibility layer */ u32 max_speed_hz; u8 chip_select; u8 mode; @@ -93,7 +95,7 @@ struct spi_device { struct spi_message; /** - * struct spi_master - interface to SPI master controller + * struct spi_controller - interface to SPI master or slave controller * @dev: device interface to this driver * @bus_num: board-specific (and often SOC-specific) identifier for a * given SPI controller. @@ -108,8 +110,9 @@ struct spi_message; * the device whose settings are being modified. * @transfer: adds a message to the controller's transfer queue. * @cleanup: frees controller-specific state + * @list: link with the global spi_controller list * - * Each SPI master controller can communicate with one or more @spi_device + * Each SPI controller can communicate with one or more @spi_device * children. These make a small bus, sharing MOSI, MISO and SCK signals * but not chip select signals. Each device may be configured to use a * different clock rate, since those shared signals are ignored unless @@ -120,7 +123,7 @@ struct spi_message; * an SPI slave device. For each such message it queues, it calls the * message's completion function when the transaction completes. */ -struct spi_master { +struct spi_controller { struct device_d *dev; /* other than negative (== assign one dynamically), bus_num is fully @@ -147,7 +150,7 @@ struct spi_master { * any other request management * + To a given spi_device, message queueing is pure fifo * - * + The master's main job is to process its message queue, + * + The controller's main job is to process its message queue, * selecting a chip then transferring data * + If there are multiple spi_device children, the i/o queue * arbitration algorithm is unspecified (round robin, fifo, @@ -161,12 +164,15 @@ struct spi_master { int (*transfer)(struct spi_device *spi, struct spi_message *mesg); - /* called on release() to free memory provided by spi_master */ + /* called on release() to free memory provided by spi_controller */ void (*cleanup)(struct spi_device *spi); struct list_head list; }; +#define spi_master spi_controller +#define spi_register_master(_ctrl) spi_register_controller(_ctrl) + /*---------------------------------------------------------------------------*/ /* @@ -341,9 +347,9 @@ spi_transfer_del(struct spi_transfer *t) int spi_sync(struct spi_device *spi, struct spi_message *message); -struct spi_device *spi_new_device(struct spi_master *master, +struct spi_device *spi_new_device(struct spi_controller *ctrl, struct spi_board_info *chip); -int spi_register_master(struct spi_master *master); +int spi_register_controller(struct spi_controller *ctrl); #ifdef CONFIG_SPI int spi_register_board_info(struct spi_board_info const *info, int num); @@ -431,7 +437,7 @@ static inline ssize_t spi_w8r8(struct spi_device *spi, u8 cmd) extern struct bus_type spi_bus; -struct spi_master *spi_get_master(int bus); +struct spi_controller *spi_get_controller(int bus); static inline int spi_driver_register(struct driver_d *drv) { |