[U-Boot] [PATCH 2/2] sunxi: gpio: Add support for the gpio banks which are part of the R-io cluster

Simon Glass sjg at chromium.org
Tue Aug 18 14:45:30 CEST 2015


Hi Hans,

On 18 August 2015 at 03:29, Hans de Goede <hdegoede at redhat.com> wrote:
> Hi,
>
>
> On 18-08-15 00:14, Simon Glass wrote:
>>
>> Hi Hans,
>>
>> On 6 August 2015 at 12:13, Hans de Goede <hdegoede at redhat.com> wrote:
>>>
>>> sun6i and later have a couple of io-blocks which are shared between the
>>> main CPU core and the "R" cpu which is small embedded cpu which can be
>>> active while the main system is suspended.
>>>
>>> These gpio banks sit at a different mmio address then the normal banks,
>>> and have a separate devicetree node and compatible, this adds support for
>>> these banks to the sunxi-gpio code when built with device-model support.
>>>
>>> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
>>> ---
>>>   drivers/gpio/sunxi_gpio.c | 22 ++++++++++++++++++----
>>>   1 file changed, 18 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/gpio/sunxi_gpio.c b/drivers/gpio/sunxi_gpio.c
>>> index afa165a..57b78e5 100644
>>> --- a/drivers/gpio/sunxi_gpio.c
>>> +++ b/drivers/gpio/sunxi_gpio.c
>>> @@ -266,16 +266,28 @@ static int gpio_sunxi_bind(struct udevice *parent)
>>>   {
>>>          struct sunxi_gpio_platdata *plat = parent->platdata;
>>>          struct sunxi_gpio_reg *ctlr;
>>> -       int bank;
>>> -       int ret;
>>> +       int bank, no_banks, ret, start;
>>>
>>>          /* If this is a child device, there is nothing to do here */
>>>          if (plat)
>>>                  return 0;
>>>
>>> +       if (fdt_node_check_compatible(gd->fdt_blob, parent->of_offset,
>>> +                               "allwinner,sun6i-a31-r-pinctrl") == 0) {
>>
>>
>> If I understand what you are doing here, the correct way is to use a
>> .data field in sunxi_gpio_ids[]  below.
>
>
> Yes that would work too, but that indirection makes it harder to follow
> what the code is doing without giving us much benefit IMHO.
>
>> In any case you should not be
>> checking the compatible string of a parent.
>
>
> AFAICT this is the right way to check a compatible string in a bind
> function,
> the parent variable name here is confusing as this actually points to the
> udevice passed into the bind function, not its parent. I guess it is named
> parent rather then device to distinguish it from the per bank gpio udevices
> the bind function is instantiating.

Sounds fine.

>
> So I'm not really checking the parents compatible but its own, it just looks
> that way because of the bind function parameter name being parent.

See for example, drivers/i2c/tegra_i2c.c:

static const struct udevice_id tegra_i2c_ids[] = {
{ .compatible = "nvidia,tegra114-i2c", .data = TYPE_114 },
{ .compatible = "nvidia,tegra20-i2c", .data = TYPE_STD },
{ .compatible = "nvidia,tegra20-i2c-dvc", .data = TYPE_DVC },
{ }
};

...

i2c_bus->type = dev_get_driver_data(dev);

which gets the 'data' value. So it's pretty easy to use and is the
standard way to make a driver support multiple hardware types.

>
> Regards,
>
> Hans
>
>
>
>>
>>> +               start = 'L' - 'A';
>>> +               no_banks = 2; /* L & M */
>>> +       } else if (fdt_node_check_compatible(gd->fdt_blob,
>>> parent->of_offset,
>>> +                               "allwinner,sun8i-a23-r-pinctrl") == 0) {
>>> +               start = 'L' - 'A';
>>> +               no_banks = 1; /* L only */
>>> +       } else {
>>> +               start = 0;
>>> +               no_banks = SUNXI_GPIO_BANKS;
>>> +       }
>>> +
>>>          ctlr = (struct sunxi_gpio_reg *)fdtdec_get_addr(gd->fdt_blob,
>>>                                                     parent->of_offset,
>>> "reg");
>>> -       for (bank = 0; bank < SUNXI_GPIO_BANKS; bank++) {
>>> +       for (bank = 0; bank < no_banks; bank++) {
>>>                  struct sunxi_gpio_platdata *plat;
>>>                  struct udevice *dev;
>>>
>>> @@ -283,7 +295,7 @@ static int gpio_sunxi_bind(struct udevice *parent)
>>>                  if (!plat)
>>>                          return -ENOMEM;
>>>                  plat->regs = &ctlr->gpio_bank[bank];
>>> -               plat->bank_name = gpio_bank_name(bank);
>>> +               plat->bank_name = gpio_bank_name(start + bank);
>>>                  plat->gpio_count = SUNXI_GPIOS_PER_BANK;
>>>
>>>                  ret = device_bind(parent, parent->driver,
>>> @@ -306,6 +318,8 @@ static const struct udevice_id sunxi_gpio_ids[] = {
>>>          { .compatible = "allwinner,sun8i-a23-pinctrl" },
>>>          { .compatible = "allwinner,sun8i-a33-pinctrl" },
>>>          { .compatible = "allwinner,sun9i-a80-pinctrl" },
>>> +       { .compatible = "allwinner,sun6i-a31-r-pinctrl" },
>>> +       { .compatible = "allwinner,sun8i-a23-r-pinctrl" },
>>>          { }
>>>   };
>>>
>>> --
>>> 2.4.3
>>>
>>> _______________________________________________
>>> U-Boot mailing list
>>> U-Boot at lists.denx.de
>>> http://lists.denx.de/mailman/listinfo/u-boot

Regards,
Simon


More information about the U-Boot mailing list