On Mon, 19 Feb 2024 16:33:20 -0600 David Lechner <dlechner@xxxxxxxxxxxx> wrote: > Since splitting transfers was moved to spi_optimize_message() in the > core SPI code, we now need to use the optimize_message callback in the > STM32 SPI driver to ensure that the operation is only performed once > when spi_optimize_message() is used by peripheral drivers explicitly. > > Signed-off-by: David Lechner <dlechner@xxxxxxxxxxxx> Trivial comment inline. Otherwise LGTM Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> There are changes to when this happens wrt to locking but I think those are all positive as the bus lock is held for less time and there is nothing in here that needs that lock held. > --- > > v2 changes: none > > drivers/spi/spi-stm32.c | 28 ++++++++++++++++------------ > 1 file changed, 16 insertions(+), 12 deletions(-) > > diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c > index c32e57bb38bd..e4e7ddb7524a 100644 > --- a/drivers/spi/spi-stm32.c > +++ b/drivers/spi/spi-stm32.c > @@ -1118,6 +1118,21 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) > return IRQ_HANDLED; > } > > +static int stm32_spi_optimize_message(struct spi_message *msg) > +{ > + struct spi_controller *ctrl = msg->spi->controller; > + struct stm32_spi *spi = spi_controller_get_devdata(ctrl); > + > + /* On STM32H7, messages should not exceed a maximum size set If you spin a v3, this isn't in keeping with local comment style. /* * On... > + * later via the set_number_of_data function. In order to > + * ensure that, split large messages into several messages > + */ > + if (spi->cfg->set_number_of_data) > + return spi_split_transfers_maxwords(ctrl, msg, spi->t_size_max); > + > + return 0; > +} > + > /** > * stm32_spi_prepare_msg - set up the controller to transfer a single message > * @ctrl: controller interface > @@ -1163,18 +1178,6 @@ static int stm32_spi_prepare_msg(struct spi_controller *ctrl, > !!(spi_dev->mode & SPI_LSB_FIRST), > !!(spi_dev->mode & SPI_CS_HIGH)); > > - /* On STM32H7, messages should not exceed a maximum size setted > - * afterward via the set_number_of_data function. In order to > - * ensure that, split large messages into several messages > - */ > - if (spi->cfg->set_number_of_data) { > - int ret; > - > - ret = spi_split_transfers_maxwords(ctrl, msg, spi->t_size_max); > - if (ret) > - return ret; > - } > - > spin_lock_irqsave(&spi->lock, flags); > > /* CPOL, CPHA and LSB FIRST bits have common register */ > @@ -2180,6 +2183,7 @@ static int stm32_spi_probe(struct platform_device *pdev) > ctrl->max_speed_hz = spi->clk_rate / spi->cfg->baud_rate_div_min; > ctrl->min_speed_hz = spi->clk_rate / spi->cfg->baud_rate_div_max; > ctrl->use_gpio_descriptors = true; > + ctrl->optimize_message = stm32_spi_optimize_message; > ctrl->prepare_message = stm32_spi_prepare_msg; > ctrl->transfer_one = stm32_spi_transfer_one; > ctrl->unprepare_message = stm32_spi_unprepare_msg; >