Re: [PATCH v3 01/14] Documentation: dt/bindings: Document pinctrl-ingenic

From
Linus Walleij <hidden>
Date
2017-02-23 09:59:20
Also in
linux-devicetree, linux-gpio, linux-mips, linux-mmc, linux-pwm, lkml
Reply to
Paul Cercueil, 2017-02-21
On Tue, Feb 21, 2017 at 12:20 PM, Paul Cercueil [off-list ref] wrote:
Le 2017-02-20 14:56, Linus Walleij a écrit :
quoted
On Thu, Feb 9, 2017 at 6:28 PM, Paul Cercueil [off-list ref]
wrote:
quoted
I was thinking that instead of having one pinctrl-ingenic instance
covering
0x600 of register space, and 6 instances of gpio-ingenic having 0x100
each,
I could just have 6 instances of pinctrl-ingenic, each one with an
instance
of gpio-ingenic declared as a sub-node, each handling just 0x100 of
memory
space.

My head is spinning,  but I think I get it. What is wrong with the
solution
I proposed with one pin control instance covering the whole 0x600 and with
6
subnodes of GPIO?

The GPIO nodes do not even have to have an address range associated with
them you know, that can be distributed out with regmap code accessing
the parent regmap.

OK, but then each GPIO chip 'X' still need to know its offset in the
register
area, which is (pinctrl_base + X * 0x100).
What's the best way to pass that info to the driver? (I assume it's not with
a custom DT binding...).
I do not really understand what driver you are referring to.

If the pin controller node is overarching and spawning children for
the gpiochips, you use the design pattern from MFD to pass data
from parents to children, e.g.:

#include <linux/regmap.h>

pinctrl driver:
     struct regmap_config mapconf = {
                .reg_bits = 32,
                .val_bits = 32,
                .reg_stride = 4,
     };
    struct regmap *map;

    map = regmap_init_mmio(dev, base, &mapconf);
    if (IS_ERR(map))
          ....
    dev_set_drvdata(dev, map);
    of_populate_children(dev,)..
    (can also use platform_device_add_data() or "simple-bus" etc)

gpio subdrivers:
     struct regmap *map;

     map = dev_get_drvdata(dev->parent);

There are examples of drivers passing more complex things to
their children than a regmap, just put some struct in a <linux/*/*.h>
file and pass it with drvdata as per above.

PS i2c_set_drvdata(), platform_set_drvdata() are just aliases
for dev_set_drvdata().

Yours,
Linus Walleij
Thread (142 messages) 142 messages, 11 authors, last reply 2017-07-31
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help