linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thierry Reding <thierry.reding@gmail.com>
To: Laxman Dewangan <ldewangan@nvidia.com>
Cc: Linus Walleij <linus.walleij@linaro.org>,
	Stephen Warren <swarren@wwwdotorg.org>,
	Suresh Mangipudi <smangipudi@nvidia.com>,
	Alexandre Courbot <gnurou@gmail.com>,
	linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org,
	linux-tegra@vger.kernel.org
Subject: Re: [PATCH] gpio: Add Tegra186 support
Date: Thu, 24 Nov 2016 15:44:11 +0100	[thread overview]
Message-ID: <20161124144411.GA26657@ulmo.ba.sec> (raw)
In-Reply-To: <58368E84.6040104@nvidia.com>

[-- Attachment #1: Type: text/plain, Size: 3750 bytes --]

On Thu, Nov 24, 2016 at 12:23:56PM +0530, Laxman Dewangan wrote:
> 
> On Tuesday 22 November 2016 11:25 PM, Thierry Reding wrote:
> > +static inline struct tegra_gpio *to_tegra_gpio(struct gpio_chip *chip)
> > +{
> > +	return container_of(chip, struct tegra_gpio, gpio);
> > +}
> 
> You dont need this as gpiochip_get_data(chip); can provide the required
> driver specific data.

It's common practice to embed the struct gpio_chip within a driver-
specific structure, and it's equally common to use a container_of() to
get at the embedding structure.

> > +static const struct tegra_gpio_port *
> > +tegra186_gpio_get_port(struct tegra_gpio *gpio, unsigned int *pin)
> > +{
> > +	unsigned int start = 0, i;
> > +
> > +	for (i = 0; i < gpio->soc->num_ports; i++) {
> > +		const struct tegra_gpio_port *port = &gpio->soc->ports[i];
> > +
> > +		if (*pin >= start && *pin < start + port->pins) {
> > +			*pin -= start;
> > +			return port;
> > +		}
> > +
> > +		start += port->pins;
> > +	}
> > +
> Why not get the port from pins and then calculate with fixed offset.
> We will not need the loop if we know the port number.

Because we don't know what the port is until we've determined that the
pin is within the range of the port. This function determines what port
a given pin is in, then returns the relative index of the pin within
that port.

> > +static int tegra186_gpio_direction_output(struct gpio_chip *chip,
> > +					  unsigned int offset, int level)
> > +{
> > +	struct tegra_gpio *gpio = to_tegra_gpio(chip);
> > +	void __iomem *base;
> > +	u32 value;
> > +
> > +	/* configure output level first */
> > +	chip->set(chip, offset, level);
> We can directly call the apis instead of function pointer at this point.

That would mean reshuffling the functions or having an unneeded forward
declaration of tegra186_gpio_set().

> > +static struct lock_class_key tegra186_gpio_lock_class;
> We will have two instance of the driver (normal and AON) and so this will be
> shared between them.
> Do we really support multiple instance with same variable?

As the type and name indicate this is to track a specific class of lock.
It's fine to use a single variable with multiple instances. It is in
fact an error to try and make these per-instance.

> > +	gpio->gpio.label = "tegra186-gpio";
> Two instance will have same name. Better to say tegra186-gpio and
> tegra186-gpio-aon.

Good point. I suppose we could either add this to struct tegra_gpio_soc
or simply use the device tree node name.

> > +	gpio->gpio.parent = &pdev->dev;
> > +
> > +	gpio->gpio.get_direction = tegra186_gpio_get_direction;
> > +	gpio->gpio.direction_input = tegra186_gpio_direction_input;
> > +	gpio->gpio.direction_output = tegra186_gpio_direction_output;
> > +	gpio->gpio.get = tegra186_gpio_get,
> > +	gpio->gpio.set = tegra186_gpio_set;
> > +	gpio->gpio.to_irq = tegra186_gpio_to_irq;
> > +
> > +	gpio->gpio.base = -1;
> > +
> > +	for (i = 0; i < gpio->soc->num_ports; i++)
> > +		gpio->gpio.ngpio += gpio->soc->ports[i].pins;
> > +
> 
> Our DT binding does not say this. We assume that we have 8 gpios per port.
> so this will not work at all.

This has nothing to do with the device tree binding. What the device
tree binding defines is the indices to use to obtain a given GPIO within
a given port. What numbering the driver uses internally is completely up
to the driver implementation.

Oh, and the above works just fine.

> > +static const struct tegra_gpio_port tegra186_main_ports[] = {
> > +	[TEGRA_MAIN_GPIO_PORT_A]  = { 0x2000, 7 },
> Use C99 style initialization which is like
>    .offset =
>    .pins =

I suppose I could do that.

Thanks,
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

  reply	other threads:[~2016-11-24 14:45 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-02 10:48 [PATCH] gpio: tegra186: Add support for T186 GPIO Suresh Mangipudi
2016-11-07  7:53 ` Linus Walleij
2016-11-07 13:21   ` Thierry Reding
2016-11-08  1:42     ` Olof Johansson
2016-11-08 15:55       ` Thierry Reding
2016-11-08 16:49         ` Stephen Warren
2016-11-08 17:58           ` Thierry Reding
2016-11-08 19:07 ` Stephen Warren
2016-11-22 17:30   ` Thierry Reding
2016-11-22 17:55     ` [PATCH] gpio: Add Tegra186 support Thierry Reding
2016-11-23 13:30       ` Linus Walleij
2016-11-23 19:44         ` Thierry Reding
2016-11-24 15:40           ` Linus Walleij
2016-11-24  6:53       ` Laxman Dewangan
2016-11-24 14:44         ` Thierry Reding [this message]
2016-11-24 14:44           ` Laxman Dewangan
2016-11-24 15:08             ` Thierry Reding
2016-11-25 12:10               ` Laxman Dewangan
2016-11-23 13:25     ` [PATCH] gpio: tegra186: Add support for T186 GPIO Linus Walleij
2016-11-23 19:40       ` Thierry Reding
2016-11-24  6:36         ` Laxman Dewangan
2016-11-24 15:01           ` Thierry Reding
2016-11-24 15:08         ` Linus Walleij
2016-11-24 16:32           ` Thierry Reding
2016-11-24 23:24             ` Linus Walleij

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=20161124144411.GA26657@ulmo.ba.sec \
    --to=thierry.reding@gmail.com \
    --cc=gnurou@gmail.com \
    --cc=ldewangan@nvidia.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=smangipudi@nvidia.com \
    --cc=swarren@wwwdotorg.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).