2023-06-21 12:04:32

by Valentin Caron

[permalink] [raw]
Subject: [PATCH 1/2] spi: stm32: disable device mode with st,stm32f4-spi compatible

STM32 SPI driver is not capable to handle device mode with stm32f4/f7 soc.
Stop probing if this case happens.

Signed-off-by: Valentin Caron <[email protected]>
---
drivers/spi/spi-stm32.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c
index 6d10fa4ab783..f71712af43d4 100644
--- a/drivers/spi/spi-stm32.c
+++ b/drivers/spi/spi-stm32.c
@@ -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,15 @@ static int stm32_spi_probe(struct platform_device *pdev)
struct device_node *np = pdev->dev.of_node;
bool device_mode;
int ret;
+ const struct of_device_id *of_match =
+ of_match_device(pdev->dev.driver->of_match_table, &pdev->dev);
+ const struct stm32_spi_cfg *cfg = (const struct stm32_spi_cfg *)of_match->data;

device_mode = of_property_read_bool(np, "spi-slave");
+ if (!cfg->has_device_mode && device_mode) {
+ dev_err(&pdev->dev, "spi-slave not yet supported with %s\n", of_match->compatible);
+ return -EPERM;
+ }

if (device_mode)
ctrl = devm_spi_alloc_slave(&pdev->dev, sizeof(struct stm32_spi));
@@ -1817,9 +1828,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))
--
2.25.1



2023-06-21 13:05:46

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH 1/2] spi: stm32: disable device mode with st,stm32f4-spi compatible

On 21/06/2023 13:55, Valentin Caron wrote:
> STM32 SPI driver is not capable to handle device mode with stm32f4/f7 soc.
> Stop probing if this case happens.
>
> Signed-off-by: Valentin Caron <[email protected]>

...

>
> static const struct of_device_id stm32_spi_of_match[] = {
> @@ -1798,8 +1802,15 @@ static int stm32_spi_probe(struct platform_device *pdev)
> struct device_node *np = pdev->dev.of_node;
> bool device_mode;
> int ret;
> + const struct of_device_id *of_match =
> + of_match_device(pdev->dev.driver->of_match_table, &pdev->dev);
> + const struct stm32_spi_cfg *cfg = (const struct stm32_spi_cfg *)of_match->data;

It seems you open-coded of_device_get_match_data().

Best regards,
Krzysztof