spi: stm32: disable device mode with st,stm32f4-spi compatible
authorValentin Caron <valentin.caron@foss.st.com>
Thu, 6 Jul 2023 08:13:42 +0000 (10:13 +0200)
committerMark Brown <broonie@kernel.org>
Sun, 9 Jul 2023 21:51:33 +0000 (22:51 +0100)
STM32 SPI driver is not capable to handle device mode with stm32f4 soc.
Stop probing if this case happens.

Signed-off-by: Valentin Caron <valentin.caron@foss.st.com>
Link: https://lore.kernel.org/r/20230706081342.468090-1-valentin.caron@foss.st.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-stm32.c

index 6d10fa4..536d89e 100644 (file)
@@ -238,6 +238,7 @@ struct stm32_spi;
  * @baud_rate_div_min: minimum baud rate divisor
  * @baud_rate_div_max: maximum baud rate divisor
  * @has_fifo: boolean to know if fifo is used for driver
+ * @has_device_mode: is this compatible capable to switch on device mode
  * @flags: compatible specific SPI controller flags used at registration time
  */
 struct stm32_spi_cfg {
@@ -259,6 +260,7 @@ struct stm32_spi_cfg {
        unsigned int baud_rate_div_min;
        unsigned int baud_rate_div_max;
        bool has_fifo;
+       bool has_device_mode;
        u16 flags;
 };
 
@@ -1750,6 +1752,7 @@ static const struct stm32_spi_cfg stm32f4_spi_cfg = {
        .baud_rate_div_min = STM32F4_SPI_BR_DIV_MIN,
        .baud_rate_div_max = STM32F4_SPI_BR_DIV_MAX,
        .has_fifo = false,
+       .has_device_mode = false,
        .flags = SPI_MASTER_MUST_TX,
 };
 
@@ -1774,6 +1777,7 @@ static const struct stm32_spi_cfg stm32h7_spi_cfg = {
        .baud_rate_div_min = STM32H7_SPI_MBR_DIV_MIN,
        .baud_rate_div_max = STM32H7_SPI_MBR_DIV_MAX,
        .has_fifo = true,
+       .has_device_mode = true,
 };
 
 static const struct of_device_id stm32_spi_of_match[] = {
@@ -1798,8 +1802,13 @@ static int stm32_spi_probe(struct platform_device *pdev)
        struct device_node *np = pdev->dev.of_node;
        bool device_mode;
        int ret;
+       const struct stm32_spi_cfg *cfg = of_device_get_match_data(&pdev->dev);
 
        device_mode = of_property_read_bool(np, "spi-slave");
+       if (!cfg->has_device_mode && device_mode) {
+               dev_err(&pdev->dev, "spi-slave not supported\n");
+               return -EPERM;
+       }
 
        if (device_mode)
                ctrl = devm_spi_alloc_slave(&pdev->dev, sizeof(struct stm32_spi));
@@ -1817,9 +1826,7 @@ static int stm32_spi_probe(struct platform_device *pdev)
        spi->device_mode = device_mode;
        spin_lock_init(&spi->lock);
 
-       spi->cfg = (const struct stm32_spi_cfg *)
-               of_match_device(pdev->dev.driver->of_match_table,
-                               &pdev->dev)->data;
+       spi->cfg = cfg;
 
        spi->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(spi->base))