Message ID | 20191128083718.39177-2-linus.walleij@linaro.org |
---|---|
State | New |
Headers | show |
Series | [1/3,v3] spi: fsl: Fix GPIO descriptor support | expand |
Le 28/11/2019 à 09:37, Linus Walleij a écrit : > We have a special quirk to handle the Freescale > nonstandard SPI chipselect GPIOs in the gpiolib-of.c > file, but it currently only handles the case where > the GPIOs are actually requested (gpiod_*get()). > > We also need to handle that the SPI core attempts > to count the GPIOs before use, and that needs a > similar quirk in the OF part of the library. > > Cc: Christophe Leroy <christophe.leroy@c-s.fr> > Reported-by: Christophe Leroy <christophe.leroy@c-s.fr> > Fixes: 0f0581b24bd0 ("spi: fsl: Convert to use CS GPIO descriptors") > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Tested-by: Christophe Leroy <christophe.leroy@c-s.fr> > --- > ChangeLog v2->v3: > - Fixed the bug (I hope) as I was counting the number > of gpios by checking for "gpios-gpios" and "gpios-gpio" > rather than "gpios" (ehm...) > ChangeLog v1->v2: > - Hardcode the quirk to look for "gpios" as this is all > we support and else the call would just recurse back > and fail again. > - Provide a proper NULL check so we don't upset strcmp(). > > Mark: I change my mind, better to keep the patches > together, once Christophe has it working with my > patch stack let's just merge all of it. > --- > drivers/gpio/gpiolib-of.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c > index 80ea49f570f4..43ffec3a6fbb 100644 > --- a/drivers/gpio/gpiolib-of.c > +++ b/drivers/gpio/gpiolib-of.c > @@ -23,6 +23,29 @@ > #include "gpiolib.h" > #include "gpiolib-of.h" > > +/** > + * of_gpio_spi_cs_get_count() - special GPIO counting for SPI > + * Some elder GPIO controllers need special quirks. Currently we handle > + * the Freescale GPIO controller with bindings that doesn't use the > + * established "cs-gpios" for chip selects but instead rely on > + * "gpios" for the chip select lines. If we detect this, we redirect > + * the counting of "cs-gpios" to count "gpios" transparent to the > + * driver. > + */ > +int of_gpio_spi_cs_get_count(struct device *dev, const char *con_id) > +{ > + struct device_node *np = dev->of_node; > + > + if (!IS_ENABLED(CONFIG_SPI_MASTER)) > + return 0; > + if (!con_id || strcmp(con_id, "cs")) > + return 0; > + if (!of_device_is_compatible(np, "fsl,spi") && > + !of_device_is_compatible(np, "aeroflexgaisler,spictrl")) > + return 0; > + return of_gpio_named_count(np, "gpios"); > +} > + > /* > * This is used by external users of of_gpio_count() from <linux/of_gpio.h> > * > @@ -35,6 +58,10 @@ int of_gpio_get_count(struct device *dev, const char *con_id) > char propname[32]; > unsigned int i; > > + ret = of_gpio_spi_cs_get_count(dev, con_id); > + if (ret > 0) > + return ret; > + > for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) { > if (con_id) > snprintf(propname, sizeof(propname), "%s-%s", >
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index 80ea49f570f4..43ffec3a6fbb 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c @@ -23,6 +23,29 @@ #include "gpiolib.h" #include "gpiolib-of.h" +/** + * of_gpio_spi_cs_get_count() - special GPIO counting for SPI + * Some elder GPIO controllers need special quirks. Currently we handle + * the Freescale GPIO controller with bindings that doesn't use the + * established "cs-gpios" for chip selects but instead rely on + * "gpios" for the chip select lines. If we detect this, we redirect + * the counting of "cs-gpios" to count "gpios" transparent to the + * driver. + */ +int of_gpio_spi_cs_get_count(struct device *dev, const char *con_id) +{ + struct device_node *np = dev->of_node; + + if (!IS_ENABLED(CONFIG_SPI_MASTER)) + return 0; + if (!con_id || strcmp(con_id, "cs")) + return 0; + if (!of_device_is_compatible(np, "fsl,spi") && + !of_device_is_compatible(np, "aeroflexgaisler,spictrl")) + return 0; + return of_gpio_named_count(np, "gpios"); +} + /* * This is used by external users of of_gpio_count() from <linux/of_gpio.h> * @@ -35,6 +58,10 @@ int of_gpio_get_count(struct device *dev, const char *con_id) char propname[32]; unsigned int i; + ret = of_gpio_spi_cs_get_count(dev, con_id); + if (ret > 0) + return ret; + for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) { if (con_id) snprintf(propname, sizeof(propname), "%s-%s",
We have a special quirk to handle the Freescale nonstandard SPI chipselect GPIOs in the gpiolib-of.c file, but it currently only handles the case where the GPIOs are actually requested (gpiod_*get()). We also need to handle that the SPI core attempts to count the GPIOs before use, and that needs a similar quirk in the OF part of the library. Cc: Christophe Leroy <christophe.leroy@c-s.fr> Reported-by: Christophe Leroy <christophe.leroy@c-s.fr> Fixes: 0f0581b24bd0 ("spi: fsl: Convert to use CS GPIO descriptors") Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- ChangeLog v2->v3: - Fixed the bug (I hope) as I was counting the number of gpios by checking for "gpios-gpios" and "gpios-gpio" rather than "gpios" (ehm...) ChangeLog v1->v2: - Hardcode the quirk to look for "gpios" as this is all we support and else the call would just recurse back and fail again. - Provide a proper NULL check so we don't upset strcmp(). Mark: I change my mind, better to keep the patches together, once Christophe has it working with my patch stack let's just merge all of it. --- drivers/gpio/gpiolib-of.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) -- 2.23.0