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
                !!(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 */
        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;