On 7/27/24 8:15 AM, Jonathan Cameron wrote: > On Mon, 22 Jul 2024 16:57:09 -0500 > David Lechner <dlechner@xxxxxxxxxxxx> wrote: > >> +/** >> + * spi_offload_prepare - prepare offload hardware for a transfer >> + * @spi: The spi device to use for the transfers. >> + * @id: Function ID if SPI device uses more than one offload or NULL. >> + * @msg: The SPI message to use for the offload operation. >> + * >> + * Requests an offload instance with the specified ID and programs it with the >> + * provided message. >> + * >> + * The message must not be pre-optimized (do not call spi_optimize_message() on >> + * the message). >> + * >> + * Calls must be balanced with spi_offload_unprepare(). >> + * >> + * Return: 0 on success, else a negative error code. >> + */ >> +int spi_offload_prepare(struct spi_device *spi, const char *id, >> + struct spi_message *msg) >> +{ >> + struct spi_controller *ctlr = spi->controller; >> + int ret; >> + >> + if (!ctlr->offload_ops) >> + return -EOPNOTSUPP; >> + >> + msg->offload = true; > I'd set this later perhaps as... If we move it, then we would have to create a new function to call instead of spi_optimize_message() so that the controller driver can know that this is an offload message and not a regular message since they will need to be handled differently during the optimization phase. >> + >> + ret = spi_optimize_message(spi, msg); >> + if (ret) > > It otherwise needs clearing here so it doesn't have side > effects if an error occurs. > >> + return ret; >> + >> + mutex_lock(&ctlr->io_mutex); >> + ret = ctlr->offload_ops->prepare(spi, id, msg); >> + mutex_unlock(&ctlr->io_mutex); >> + >> + if (ret) { >> + spi_unoptimize_message(msg); >> + msg->offload = false; >> + return ret; >> + } >> + >> + return 0; >> +} >> +EXPORT_SYMBOL_GPL(spi_offload_prepare); >