spi: bcm2835: Restore native CS probing when pinctrl-bcm2835 is absent
[ Upstream commit e19c1272c80a5ecce387c1b0c3b995f4edf9c525 ]
The lookup table forces the use of the "pinctrl-bcm2835" GPIO chip
provider and essentially assumes that there is going to be such a
provider, and if not, we will fail to set-up the SPI device.
While this is true on Raspberry Pi based systems (2835/36/37, 2711,
2712), this is not true on 7712/77122 Broadcom STB systems which use the
SPI driver, but not the GPIO driver.
There used to be an early check:
chip = gpiochip_find("pinctrl-bcm2835", chip_match_name);
if (!chip)
return 0;
which would accomplish that nicely, bring something similar back by
checking for the compatible strings matched by the pinctrl-bcm2835.c
driver, if there is no Device Tree node matching those compatible
strings, then we won't find any GPIO provider registered by the
"pinctrl-bcm2835" driver.
Fixes: 21f252cd29 ("spi: bcm2835: reduce the abuse of the GPIO API")
Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://patch.msgid.link/20250401233603.2938955-1-florian.fainelli@broadcom.com
Acked-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
174954911f
commit
40d187b247
@@ -1226,7 +1226,12 @@ static int bcm2835_spi_setup(struct spi_device *spi)
|
||||
struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr);
|
||||
struct bcm2835_spidev *target = spi_get_ctldata(spi);
|
||||
struct gpiod_lookup_table *lookup __free(kfree) = NULL;
|
||||
int ret;
|
||||
const char *pinctrl_compats[] = {
|
||||
"brcm,bcm2835-gpio",
|
||||
"brcm,bcm2711-gpio",
|
||||
"brcm,bcm7211-gpio",
|
||||
};
|
||||
int ret, i;
|
||||
u32 cs;
|
||||
|
||||
if (!target) {
|
||||
@@ -1291,6 +1296,14 @@ static int bcm2835_spi_setup(struct spi_device *spi)
|
||||
goto err_cleanup;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(pinctrl_compats); i++) {
|
||||
if (of_find_compatible_node(NULL, NULL, pinctrl_compats[i]))
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == ARRAY_SIZE(pinctrl_compats))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* TODO: The code below is a slightly better alternative to the utter
|
||||
* abuse of the GPIO API that I found here before. It creates a
|
||||
|
||||
Reference in New Issue
Block a user