spi: stm32: disable device mode with st,stm32f4-spi compatible
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>
This commit is contained in:
parent
06c2afb862
commit
fee681646f
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue