lkml.org 
[lkml]   [2020]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 008/165] gpio: Handle counting of Freescale chipselects
    Date
    From: Linus Walleij <linus.walleij@linaro.org>

    [ Upstream commit 71b8f600b034c7f5780f6fb311dabfe331c64feb ]

    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>
    Link: https://lore.kernel.org/r/20191128083718.39177-2-linus.walleij@linaro.org
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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",
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-11 11:21    [W:2.476 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site