Thread (25 messages) 25 messages, 4 authors, 2012-05-30

Re: [PATCH v4 6/6] pinctrl: add pinctrl gpio binding support

From: Stephen Warren <hidden>
Date: 2012-05-25 17:04:37
Also in: linux-arm-kernel, lkml

On 05/25/2012 07:36 AM, Dong Aisheng wrote:
From: Dong Aisheng <redacted>

This patch implements a standard common binding for pinctrl gpio ranges.
Each SoC can add gpio ranges through device tree by adding a gpio-maps property
under their pinctrl devices node with the format:
<&gpio $gpio-specifier $pin_offset $count>
while the gpio phandle and gpio-specifier are the standard approach
to represent a gpio in device tree.
Then we can cooperate it with the gpio xlate function to get the gpio number
from device tree to set up the gpio ranges map.

Then the pinctrl driver can call pinctrl_dt_add_gpio_ranges(pctldev, node)
to parse and register the gpio ranges from device tree.

Signed-off-by: Dong Aisheng <redacted>
---
Personally i'm not very satisfied with current solution due to a few reasons:
1) i can not user standard gpio api to get gpio number
2) i need to reinvent a new api of_parse_phandles_with_args_ext which i'm not
sure if it can be accepted by DT maintainer.
If i did not invent that API, i need to rewrite a lot of duplicated code
with slight differences with the exist functions like of_get_named_gpio_flags
and of_parse_phandle_with_args for the special pinctrl gpio maps format.

So i just sent it out first to see people's comment and if any better solution.

One alternative solution is that that the gpio-maps into two parts:
pinctrl-gpios = <&gpio_phandle gpio-specifier ..>
pinctrl-gpio-maps = <pin_id count ..>
Then we can reuse the standard gpio api altough it's not better than the
original one.
The problem I see with that is that it splits what is essentially a
single array with phandle+specifier+pin-id+count into two separate
arrays. Anyone reading/editing the DT needs to fully understand this,
and keep the entries in the two properties in the same order. Putting
everything into a single property makes this much more obvious to me. I
personally don't see any issue with the
of_parse_phandles_with_args_ext() function; it seems pretty clean to me.
quoted hunk ↗ jump to hunk
diff --git a/drivers/pinctrl/devicetree.c b/drivers/pinctrl/devicetree.c
+	if (!nranges) {
+		dev_err(pctldev->dev, "no gpio ranges found\n");
+		return -ENODEV;
+	}
In the case of a generic pinctrl IP block that can support an external
GPIO controller but happens not to be hooked up to one within a
particular SoC, that might not be an error. However, that situation is
pretty unlikely, so I think it's find to call dev_err() for now, and we
can change it later if we need.
+		ranges[i].base = ranges[i].gc->of_xlate(ranges[i].gc, &gpiospec, NULL);
I believe Grant wants to change the of_xlate prototype in order to be
able to return a different gc value, so this will probably need slight
rework work with that change, once they're both approved. Still, I think
this is fine for now.
+		if (ranges[i].base < 0) {
+			ret = -EINVAL;
+			goto out;
+		}
+		ranges[i].base += ranges[i].gc->base;
+		ranges[i].pin_base = gpiospec.args[gpiospec.args_count - 2];
+		ranges[i].npins = gpiospec.args[gpiospec.args_count - 1];
+
+		gpiochip_put(ranges[i].gc);
I wonder if this shouldn't happen until the pinctrl device is free'd,
and all the GPIO ranges are removed from it?

If we don't do that, I would argue that we shouldn't store ranges[i].gc,
since it might become invalid - I believe the only use of it is within
this function?
+		of_node_put(gpiospec.np);
+	}
Aside from the comments I've made, this series all seems reasonable.
There certainly are alternative ways of doing some of it, but I don't
see any other approach having any particular advantage over this one.
So, the series,

Acked-by: Stephen Warren <redacted>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help