All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vladimir Zapolskiy <vz@mleia.com>
To: Masahiro Yamada <yamada.masahiro@socionext.com>,
	linux-gpio@vger.kernel.org
Cc: Linus Walleij <linus.walleij@linaro.org>,
	Alexandre Courbot <gnurou@gmail.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH] gpio: of: fix GPIO drivers with multiple gpio_chip for a single node
Date: Tue, 25 Oct 2016 01:07:13 +0300	[thread overview]
Message-ID: <cf3a1a54-659b-9629-e119-c9bcdd1ed636@mleia.com> (raw)
In-Reply-To: <1477295033-6008-1-git-send-email-yamada.masahiro@socionext.com>

Hi Masahiro,

On 24.10.2016 10:43, Masahiro Yamada wrote:
> Sylvain Lemieux reports the LPC32xx GPIO driver is broken since
> commit 762c2e46c059 ("gpio: of: remove of_gpiochip_and_xlate() and
> struct gg_data").  Probably, gpio-etraxfs.c and gpio-davinci.c are
> broken as well.
> 
> Those drivers register multiple gpio_chip that are associated to a
> single OF node, and their own .of_xlate() checks if the passed
> gpio_chip is valid.
> 
> Now, the problem is of_find_gpiochip_by_node() returns the first
> gpio_chip found to match the given node.  So, .of_xlate() fails,
> except for the first GPIO bank.
> 
> Reverting the commit could be a solution, but I do not want to go
> back to the mess of struct gg_data.  Another solution here is to
> take the match by a node pointer and the success of .of_xlate().
> It is a bit clumsy to call .of_xlate twice; for gpio_chip matching
> and for really getting the gpio_desc index.  Perhaps, the long-term
> goal might be to convert drivers to single chip registration, but
> this commit will solve the problem until then.
> 
> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
> Reported-by: <slemieux.tyco@gmail.com>

Fixes: 762c2e46c059 ("gpio: of: remove of_gpiochip_and_xlate() and struct gg_data")

> ---
> 
>  drivers/gpio/gpiolib-of.c | 14 +++++++++-----
>  1 file changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
> index ecad3f0..f996596 100644
> --- a/drivers/gpio/gpiolib-of.c
> +++ b/drivers/gpio/gpiolib-of.c
> @@ -26,14 +26,18 @@
>  
>  #include "gpiolib.h"
>  
> -static int of_gpiochip_match_node(struct gpio_chip *chip, void *data)
> +static int of_gpiochip_match_node_and_xlate(struct gpio_chip *chip, void *data)
>  {
> -	return chip->gpiodev->dev.of_node == data;
> +	struct of_phandle_args *gpiospec = data;
> +
> +	return chip->gpiodev->dev.of_node == gpiospec->np &&
> +					!chip->of_xlate(chip, gpiospec, NULL);

That's an awful but hopefully safe hack to support 3-4 broken GPIO
drivers, however it should work with a correction given by Sylvain.

Here I would recommend to expand the statement, so it will be easier
to simplify it in future:

  if (chip->gpiodev->dev.of_node != gpiospec->np)
          return 0;

  if (chip->of_xlate(chip, gpiospec, NULL) < 0)
          return 0;

  return 1;

As far as I can say it should work correctly with of_gpio_simple_xlate(),
brcmstb_gpio_of_xlate(), lpc32xx_of_xlate(), davinci_gpio_of_xlate(),
pxa_gpio_of_xlate() and etraxfs_gpio_of_xlate() flavours.

>  }
>  
> -static struct gpio_chip *of_find_gpiochip_by_node(struct device_node *np)
> +static struct gpio_chip *of_find_gpiochip_by_xlate(
> +					struct of_phandle_args *gpiospec)
>  {
> -	return gpiochip_find(np, of_gpiochip_match_node);
> +	return gpiochip_find(gpiospec, of_gpiochip_match_node_and_xlate);
>  }
>  
>  static struct gpio_desc *of_xlate_and_get_gpiod_flags(struct gpio_chip *chip,
> @@ -79,7 +83,7 @@ struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
>  		return ERR_PTR(ret);
>  	}
>  
> -	chip = of_find_gpiochip_by_node(gpiospec.np);
> +	chip = of_find_gpiochip_by_xlate(&gpiospec);
>  	if (!chip) {
>  		desc = ERR_PTR(-EPROBE_DEFER);
>  		goto out;
> 

--
With best wishes,
Vladimir

      parent reply	other threads:[~2016-10-24 22:07 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-24  7:43 [RFC PATCH] gpio: of: fix GPIO drivers with multiple gpio_chip for a single node Masahiro Yamada
2016-10-24 16:58 ` Sylvain Lemieux
2016-10-25  1:46   ` Masahiro Yamada
2016-10-24 21:31 ` [RFC] " David Lechner
2016-10-24 22:07 ` Vladimir Zapolskiy [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cf3a1a54-659b-9629-e119-c9bcdd1ed636@mleia.com \
    --to=vz@mleia.com \
    --cc=gnurou@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=yamada.masahiro@socionext.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.