Lines Matching +full:x +full:- +full:rc

1 // SPDX-License-Identifier: GPL-2.0-or-later
48 #define SPI_FSI_SEQUENCE_SEL_SLAVE(x) (0x10 | ((x) & 0xf)) argument
49 #define SPI_FSI_SEQUENCE_SHIFT_OUT(x) (0x30 | ((x) & 0xf)) argument
50 #define SPI_FSI_SEQUENCE_SHIFT_IN(x) (0x40 | ((x) & 0xf)) argument
52 #define SPI_FSI_SEQUENCE_BRANCH(x) (0xe0 | ((x) & 0xf)) argument
83 int rc; in fsi_spi_check_mux() local
87 rc = fsi_slave_read(fsi->slave, FSI_MBOX_ROOT_CTRL_8, &root_ctrl_8_be, in fsi_spi_check_mux()
89 if (rc) in fsi_spi_check_mux()
90 return rc; in fsi_spi_check_mux()
93 dev_dbg(dev, "Root control register 8: %08x\n", root_ctrl_8); in fsi_spi_check_mux()
98 return -ENOLINK; in fsi_spi_check_mux()
103 int rc; in fsi_spi_check_status() local
107 rc = fsi_device_read(ctx->fsi, FSI2SPI_STATUS, &sts_be, in fsi_spi_check_status()
109 if (rc) in fsi_spi_check_status()
110 return rc; in fsi_spi_check_status()
114 dev_err(ctx->dev, "Error with FSI2SPI interface: %08x.\n", sts); in fsi_spi_check_status()
115 return -EIO; in fsi_spi_check_status()
123 int rc; in fsi_spi_read_reg() local
126 u32 cmd = offset + ctx->base; in fsi_spi_read_reg()
131 return -EINVAL; in fsi_spi_read_reg()
134 rc = fsi_device_write(ctx->fsi, FSI2SPI_CMD, &cmd_be, sizeof(cmd_be)); in fsi_spi_read_reg()
135 if (rc) in fsi_spi_read_reg()
136 return rc; in fsi_spi_read_reg()
138 rc = fsi_spi_check_status(ctx); in fsi_spi_read_reg()
139 if (rc) in fsi_spi_read_reg()
140 return rc; in fsi_spi_read_reg()
142 rc = fsi_device_read(ctx->fsi, FSI2SPI_DATA0, &data_be, in fsi_spi_read_reg()
144 if (rc) in fsi_spi_read_reg()
145 return rc; in fsi_spi_read_reg()
149 rc = fsi_device_read(ctx->fsi, FSI2SPI_DATA1, &data_be, in fsi_spi_read_reg()
151 if (rc) in fsi_spi_read_reg()
152 return rc; in fsi_spi_read_reg()
155 dev_dbg(ctx->dev, "Read %02x[%016llx].\n", offset, *value); in fsi_spi_read_reg()
162 int rc; in fsi_spi_write_reg() local
165 u32 cmd = offset + ctx->base; in fsi_spi_write_reg()
168 return -EINVAL; in fsi_spi_write_reg()
170 dev_dbg(ctx->dev, "Write %02x[%016llx].\n", offset, value); in fsi_spi_write_reg()
173 rc = fsi_device_write(ctx->fsi, FSI2SPI_DATA0, &data_be, in fsi_spi_write_reg()
175 if (rc) in fsi_spi_write_reg()
176 return rc; in fsi_spi_write_reg()
179 rc = fsi_device_write(ctx->fsi, FSI2SPI_DATA1, &data_be, in fsi_spi_write_reg()
181 if (rc) in fsi_spi_write_reg()
182 return rc; in fsi_spi_write_reg()
185 rc = fsi_device_write(ctx->fsi, FSI2SPI_CMD, &cmd_be, sizeof(cmd_be)); in fsi_spi_write_reg()
186 if (rc) in fsi_spi_write_reg()
187 return rc; in fsi_spi_write_reg()
198 rx[i] = (u8)(in >> (8 * ((num_bytes - 1) - i))); in fsi_spi_data_in()
213 out_bytes[8 - (i + 1)] = tx[i]; in fsi_spi_data_out()
220 int rc; in fsi_spi_reset() local
222 dev_dbg(ctx->dev, "Resetting SPI controller.\n"); in fsi_spi_reset()
224 rc = fsi_spi_write_reg(ctx, SPI_FSI_CLOCK_CFG, in fsi_spi_reset()
226 if (rc) in fsi_spi_reset()
227 return rc; in fsi_spi_reset()
229 rc = fsi_spi_write_reg(ctx, SPI_FSI_CLOCK_CFG, in fsi_spi_reset()
231 if (rc) in fsi_spi_reset()
232 return rc; in fsi_spi_reset()
240 * Add the next byte of instruction to the 8-byte sequence register. in fsi_spi_sequence_add()
245 seq->data |= (u64)val << seq->bit; in fsi_spi_sequence_add()
246 seq->bit -= 8; in fsi_spi_sequence_add()
251 seq->bit = 56; in fsi_spi_sequence_init()
252 seq->data = 0ULL; in fsi_spi_sequence_init()
258 int rc = 0; in fsi_spi_transfer_data() local
261 if (transfer->tx_buf) { in fsi_spi_transfer_data()
265 const u8 *tx = transfer->tx_buf; in fsi_spi_transfer_data()
267 while (transfer->len > sent) { in fsi_spi_transfer_data()
269 (int)transfer->len - sent); in fsi_spi_transfer_data()
271 rc = fsi_spi_write_reg(ctx, SPI_FSI_DATA_TX, out); in fsi_spi_transfer_data()
272 if (rc) in fsi_spi_transfer_data()
273 return rc; in fsi_spi_transfer_data()
276 rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS, in fsi_spi_transfer_data()
278 if (rc) in fsi_spi_transfer_data()
279 return rc; in fsi_spi_transfer_data()
282 rc = fsi_spi_reset(ctx); in fsi_spi_transfer_data()
283 if (rc) in fsi_spi_transfer_data()
284 return rc; in fsi_spi_transfer_data()
286 return -EREMOTEIO; in fsi_spi_transfer_data()
292 } else if (transfer->rx_buf) { in fsi_spi_transfer_data()
295 u8 *rx = transfer->rx_buf; in fsi_spi_transfer_data()
297 while (transfer->len > recv) { in fsi_spi_transfer_data()
299 rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS, in fsi_spi_transfer_data()
301 if (rc) in fsi_spi_transfer_data()
302 return rc; in fsi_spi_transfer_data()
305 rc = fsi_spi_reset(ctx); in fsi_spi_transfer_data()
306 if (rc) in fsi_spi_transfer_data()
307 return rc; in fsi_spi_transfer_data()
309 return -EREMOTEIO; in fsi_spi_transfer_data()
313 rc = fsi_spi_read_reg(ctx, SPI_FSI_DATA_RX, &in); in fsi_spi_transfer_data()
314 if (rc) in fsi_spi_transfer_data()
315 return rc; in fsi_spi_transfer_data()
318 (int)transfer->len - recv); in fsi_spi_transfer_data()
327 int rc; in fsi_spi_transfer_init() local
340 return -ETIMEDOUT; in fsi_spi_transfer_init()
342 rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS, &status); in fsi_spi_transfer_init()
343 if (rc) in fsi_spi_transfer_init()
344 return rc; in fsi_spi_transfer_init()
352 return -EIO; in fsi_spi_transfer_init()
354 rc = fsi_spi_reset(ctx); in fsi_spi_transfer_init()
355 if (rc) in fsi_spi_transfer_init()
356 return rc; in fsi_spi_transfer_init()
363 rc = fsi_spi_write_reg(ctx, SPI_FSI_COUNTER_CFG, 0ULL); in fsi_spi_transfer_init()
364 if (rc) in fsi_spi_transfer_init()
365 return rc; in fsi_spi_transfer_init()
367 rc = fsi_spi_read_reg(ctx, SPI_FSI_CLOCK_CFG, &clock_cfg); in fsi_spi_transfer_init()
368 if (rc) in fsi_spi_transfer_init()
369 return rc; in fsi_spi_transfer_init()
376 rc = fsi_spi_write_reg(ctx, SPI_FSI_CLOCK_CFG, in fsi_spi_transfer_init()
379 return rc; in fsi_spi_transfer_init()
385 int rc; in fsi_spi_transfer_one_message() local
386 u8 seq_slave = SPI_FSI_SEQUENCE_SEL_SLAVE(mesg->spi->chip_select + 1); in fsi_spi_transfer_one_message()
391 rc = fsi_spi_check_mux(ctx->fsi, ctx->dev); in fsi_spi_transfer_one_message()
392 if (rc) in fsi_spi_transfer_one_message()
395 list_for_each_entry(transfer, &mesg->transfers, transfer_list) { in fsi_spi_transfer_one_message()
400 if (!transfer->tx_buf || transfer->len > SPI_FSI_MAX_TX_SIZE) { in fsi_spi_transfer_one_message()
401 rc = -EINVAL; in fsi_spi_transfer_one_message()
405 dev_dbg(ctx->dev, "Start tx of %d bytes.\n", transfer->len); in fsi_spi_transfer_one_message()
407 rc = fsi_spi_transfer_init(ctx); in fsi_spi_transfer_one_message()
408 if (rc < 0) in fsi_spi_transfer_one_message()
414 len = transfer->len; in fsi_spi_transfer_one_message()
418 len -= 8; in fsi_spi_transfer_one_message()
422 if (!list_is_last(&transfer->transfer_list, in fsi_spi_transfer_one_message()
423 &mesg->transfers)) { in fsi_spi_transfer_one_message()
427 if (next->rx_buf) { in fsi_spi_transfer_one_message()
430 if (next->len > SPI_FSI_MAX_RX_SIZE) { in fsi_spi_transfer_one_message()
431 rc = -EINVAL; in fsi_spi_transfer_one_message()
435 dev_dbg(ctx->dev, "Sequence rx of %d bytes.\n", in fsi_spi_transfer_one_message()
436 next->len); in fsi_spi_transfer_one_message()
438 shift = SPI_FSI_SEQUENCE_SHIFT_IN(next->len); in fsi_spi_transfer_one_message()
447 rc = fsi_spi_write_reg(ctx, SPI_FSI_SEQUENCE, seq.data); in fsi_spi_transfer_one_message()
448 if (rc) in fsi_spi_transfer_one_message()
451 rc = fsi_spi_transfer_data(ctx, transfer); in fsi_spi_transfer_one_message()
452 if (rc) in fsi_spi_transfer_one_message()
456 rc = fsi_spi_transfer_data(ctx, next); in fsi_spi_transfer_one_message()
457 if (rc) in fsi_spi_transfer_one_message()
465 mesg->status = rc; in fsi_spi_transfer_one_message()
468 return rc; in fsi_spi_transfer_one_message()
478 int rc; in fsi_spi_probe() local
483 rc = fsi_spi_check_mux(fsi, dev); in fsi_spi_probe()
484 if (rc) in fsi_spi_probe()
485 return -ENODEV; in fsi_spi_probe()
487 for_each_available_child_of_node(dev->of_node, np) { in fsi_spi_probe()
501 ctlr->dev.of_node = np; in fsi_spi_probe()
502 ctlr->num_chipselect = of_get_available_child_count(np) ?: 1; in fsi_spi_probe()
503 ctlr->flags = SPI_CONTROLLER_HALF_DUPLEX; in fsi_spi_probe()
504 ctlr->max_transfer_size = fsi_spi_max_transfer_size; in fsi_spi_probe()
505 ctlr->transfer_one_message = fsi_spi_transfer_one_message; in fsi_spi_probe()
508 ctx->dev = &ctlr->dev; in fsi_spi_probe()
509 ctx->fsi = fsi; in fsi_spi_probe()
510 ctx->base = base + SPI_FSI_BASE; in fsi_spi_probe()
512 rc = devm_spi_register_controller(dev, ctlr); in fsi_spi_probe()
513 if (rc) in fsi_spi_probe()
520 return -ENODEV; in fsi_spi_probe()
534 .name = "spi-fsi",