Lines Matching defs:spi

14 #include <linux/spi/spi.h>
45 static struct spi_controller *get_controller_from_spi(struct gb_spilib *spi)
47 return gb_connection_get_data(spi->connection);
95 static void clean_xfer_state(struct gb_spilib *spi)
97 spi->first_xfer = NULL;
98 spi->last_xfer = NULL;
99 spi->rx_xfer_offset = 0;
100 spi->tx_xfer_offset = 0;
101 spi->last_xfer_size = 0;
102 spi->op_timeout = 0;
105 static bool is_last_xfer_done(struct gb_spilib *spi)
107 struct spi_transfer *last_xfer = spi->last_xfer;
109 if ((spi->tx_xfer_offset + spi->last_xfer_size == last_xfer->len) ||
110 (spi->rx_xfer_offset + spi->last_xfer_size == last_xfer->len))
116 static int setup_next_xfer(struct gb_spilib *spi, struct spi_message *msg)
118 struct spi_transfer *last_xfer = spi->last_xfer;
127 if (is_last_xfer_done(spi)) {
128 spi->tx_xfer_offset = 0;
129 spi->rx_xfer_offset = 0;
130 spi->op_timeout = 0;
136 spi->first_xfer = list_next_entry(last_xfer,
141 spi->first_xfer = last_xfer;
143 spi->tx_xfer_offset += spi->last_xfer_size;
146 spi->rx_xfer_offset += spi->last_xfer_size;
162 static struct gb_operation *gb_spi_operation_create(struct gb_spilib *spi,
166 struct spi_device *dev = msg->spi;
178 xfer = spi->first_xfer;
184 spi->last_xfer = xfer;
187 dev_err(spi->parent,
197 len = xfer->len - spi->tx_xfer_offset;
202 spi->last_xfer_size = tx_xfer_size;
206 len = xfer->len - spi->rx_xfer_offset;
209 spi->last_xfer_size = rx_xfer_size;
215 total_len += spi->last_xfer_size;
246 xfer = spi->first_xfer;
250 if (xfer == spi->last_xfer)
251 xfer_len = spi->last_xfer_size;
259 if (xfer_timeout > spi->op_timeout)
260 spi->op_timeout = xfer_timeout;
273 memcpy(tx_data, xfer->tx_buf + spi->tx_xfer_offset,
281 if (xfer == spi->last_xfer) {
282 if (!is_last_xfer_done(spi))
297 static void gb_spi_decode_response(struct gb_spilib *spi,
301 struct spi_transfer *xfer = spi->first_xfer;
308 if (xfer == spi->first_xfer)
309 xfer_len = xfer->len - spi->rx_xfer_offset;
310 else if (xfer == spi->last_xfer)
311 xfer_len = spi->last_xfer_size;
315 memcpy(xfer->rx_buf + spi->rx_xfer_offset, rx_data,
320 if (xfer == spi->last_xfer)
330 struct gb_spilib *spi = spi_controller_get_devdata(ctlr);
331 struct gb_connection *connection = spi->connection;
336 spi->first_xfer = list_first_entry_or_null(&msg->transfers,
339 if (!spi->first_xfer) {
348 operation = gb_spi_operation_create(spi, connection, msg);
356 spi->op_timeout);
360 gb_spi_decode_response(spi, msg, response);
362 dev_err(spi->parent,
368 setup_next_xfer(spi, msg);
373 clean_xfer_state(spi);
381 struct gb_spilib *spi = spi_controller_get_devdata(ctlr);
383 return spi->ops->prepare_transfer_hardware(spi->parent);
388 struct gb_spilib *spi = spi_controller_get_devdata(ctlr);
390 spi->ops->unprepare_transfer_hardware(spi->parent);
395 static int gb_spi_setup(struct spi_device *spi)
401 static void gb_spi_cleanup(struct spi_device *spi)
409 * Map Greybus spi mode bits/flags/bpw into Linux ones.
415 static int gb_spi_get_master_config(struct gb_spilib *spi)
421 ret = gb_operation_sync(spi->connection, GB_SPI_TYPE_MASTER_CONFIG,
427 spi->mode = gb_spi_mode_map(mode);
430 spi->flags = gb_spi_flags_map(flags);
432 spi->bits_per_word_mask = le32_to_cpu(response.bits_per_word_mask);
433 spi->num_chipselect = response.num_chipselect;
435 spi->min_speed_hz = le32_to_cpu(response.min_speed_hz);
436 spi->max_speed_hz = le32_to_cpu(response.max_speed_hz);
441 static int gb_spi_setup_device(struct gb_spilib *spi, u8 cs)
443 struct spi_controller *ctlr = get_controller_from_spi(spi);
453 ret = gb_operation_sync(spi->connection, GB_SPI_TYPE_DEVICE_CONFIG,
465 strscpy(spi_board.modalias, "spi-nor",
488 struct gb_spilib *spi;
494 ctlr = spi_alloc_master(dev, sizeof(*spi));
500 spi = spi_controller_get_devdata(ctlr);
501 spi->connection = connection;
503 spi->parent = dev;
504 spi->ops = ops;
507 ret = gb_spi_get_master_config(spi);
511 ctlr->bus_num = -1; /* Allow spi-core to allocate it dynamically */
512 ctlr->num_chipselect = spi->num_chipselect;
513 ctlr->mode_bits = spi->mode;
514 ctlr->flags = spi->flags;
515 ctlr->bits_per_word_mask = spi->bits_per_word_mask;
539 for (i = 0; i < spi->num_chipselect; i++) {
540 ret = gb_spi_setup_device(spi, i);
542 dev_err(dev, "failed to allocate spi device %d: %d\n",