Message ID | 20240219-mainline-spi-precook-message-v2-3-4a762c6701b9@baylibre.com |
---|---|
State | Accepted |
Commit | c2bcfe7c6edf418d5adf731a7d60a8abd81e952f |
Headers | show |
Series | spi: add support for pre-cooking messages | expand |
On Mon, 19 Feb 2024 16:33:20 -0600 David Lechner <dlechner@baylibre.com> 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@baylibre.com> Trivial comment inline. Otherwise LGTM Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> 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; >
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 + * 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;
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@baylibre.com> --- v2 changes: none drivers/spi/spi-stm32.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)