Re: basic-mmio-gpio: add DT support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Wed, Jan 14, 2015 at 8:20 PM, Álvaro Fernández Rojas
<noltari@xxxxxxxxx> wrote:
> El 14/01/2015 a las 6:32, Alexandre Courbot escribió:
>> On Wed, Dec 17, 2014 at 7:41 AM, Álvaro Fernández Rojas
>> <noltari@xxxxxxxxx> wrote:
>>> Add DT support while keeping legacy support.
>>>
>>> Signed-off-by: Álvaro Fernández Rojas <noltari@xxxxxxxxx>
>>> ---
>>> diff --git a/drivers/gpio/gpio-generic.c b/drivers/gpio/gpio-generic.c
>>
>> There is no documentation for these new bindings?
>
> Actually, I was waiting for this patch (by kamlakant.patel@xxxxxxxxxx) to be accepted before: "[PATCH v1 5/5] gpio: document basic mmio gpio library".
> Anyway, I will add documentation on the next version of this patch.
>
>>
>>> index 16f6115..9792783 100644
>>> --- a/drivers/gpio/gpio-generic.c
>>> +++ b/drivers/gpio/gpio-generic.c
>>> @@ -61,6 +61,9 @@ o        `                     ~~~~\___/~~~~    ` controller in FPGA is ,.`
>>>  #include <linux/platform_device.h>
>>>  #include <linux/mod_devicetable.h>
>>>  #include <linux/basic_mmio_gpio.h>
>>> +#include <linux/of.h>
>>> +#include <linux/of_device.h>
>>> +#include <linux/of_gpio.h>
>>>
>>>  static void bgpio_write8(void __iomem *reg, unsigned long data)
>>>  {
>>> @@ -488,8 +491,58 @@ static void __iomem *bgpio_map(struct platform_device *pdev,
>>>         return ret;
>>>  }
>>>
>>> +#ifdef CONFIG_OF
>>> +static const struct of_device_id bgpio_dt_ids[] = {
>>> +       { .compatible = "basic-mmio-gpio" },
>>> +};
>>> +MODULE_DEVICE_TABLE(of, bgpio_dt_ids);
>>> +
>>> +static int bgpio_probe_dt(struct platform_device *pdev)
>>> +{
>>> +       u32 tmp;
>>> +       struct bgpio_pdata *pdata;
>>> +       struct device_node *np;
>>> +
>>> +       np = pdev->dev.of_node;
>>> +       if (!np)
>>> +               return 0;
>>> +
>>> +       pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
>>> +       if (!pdata)
>>> +               return -ENOMEM;
>>> +
>>> +       pdata->label = dev_name(&pdev->dev);
>>> +       pdata->base = -1;
>>> +       if (of_find_property(np, "byte-be", NULL)) {
>>> +               pdata->flags |= BGPIOF_BIG_ENDIAN_BYTE_ORDER;
>>> +       }
>>> +       if (of_find_property(np, "bit-be", NULL)) {
>>> +               pdata->flags |= BGPIOF_BIG_ENDIAN;
>>> +       }
>>> +       if (of_find_property(np, "regset-nr", NULL)) {
>>> +               pdata->flags |= BGPIOF_UNREADABLE_REG_SET;
>>> +       }
>>> +       if (of_find_property(np, "regdir-nr", NULL)) {
>>> +               pdata->flags |= BGPIOF_UNREADABLE_REG_DIR;
>>> +       }
>>> +       if (!of_property_read_u32(np, "num-gpios", &tmp)) {
>>> +               pdata->ngpio = tmp;
>>> +       }
>>
>> I don't think this is acceptable. gpio-generic is designed to be used
>> as a framework for other drivers to build upon. These drivers should
>> have their own compatible strings, which should be enough to infer all
>> the properties you defined here.
>>
>
> gpio-generic is not only designed as a framework for other drivers, it can also be used directly by registering the driver through platform device (basic-mmio-gpio/basic-mmio-gpio-be).

This works for platform drivers which stay confined to the kernel, but
DT is a firmware definition where such generic bindings are much less
desirable.

> My intention is to make it DT compatible as a generic driver, which can be used for different hardware, by selecting different DT properties as configuration.
>
>> Device Tree identifies hardware precisely (vendor and model), and this
>> new binding is just not that. You *could* however have a very simple
>> driver that associates compatible strings to static tables containing
>> the values of the properties you wanted to see passed through the DT,
>> and have one single driver that covers many mmio-based GPIO devices.
>> But I'm afraid "basic-mmio-gpio" is *way* to vague to describe
>> hardware.
>>
>
> I don't think making a new driver mapping different compatible strings to static tables containing the values of the properties passed through DT is a sane way of doing it, since it will require multiple combinations to cover all the possibilites.
>
> My plan is to be able to do something like this (btw, I actually tested this patch on BCM63xx and works perfectly):
> gpio-controller@10000084 {
>         compatible = "basic-mmio-gpio", "brcm,brcm6368";

Here your compatible string should be

        compatible = "brcm,brcm6368", "basic-mmio-gpio";

I.e. from more precise to less precise. A dedicated BRCM6368 driver
should take precedence over your generic one.

>         reg = <0x10000084 0x4>, <0x1000008c 0x4>;
>         reg-names = "dirout", "dat";
>
>         num-gpios = <32>;
>         byte-be;
>
>         gpio-controller;
>         #gpio-cells = <2>;
> };
> And for other hardware you could do:
> gpio-controller@10000180 {
>         compatible = "basic-mmio-gpio", "foo,bar";
>         reg = <0x10000180 0x4>, <0x10000184 0x4>, <0x10000188 0x4>;
>         reg-names = "dirin", "dirout", "dat";
>
>         num-gpios = <20>;
>         bit-be;
>         byte-be;
>         regdir-nr;
>
>         gpio-controller;
>         #gpio-cells = <2>;
> };
> This way you wouldn't need to add a wrapper for each specific hardware using basic-mmio-gpio, and you would save time by using the generic driver.

I understand the intent but IIUC the history of DT speaks  against
such generic bindings. On the other hand I can see some instances of
them like "simple-bus" for instance. Added the DT maintainers and
mailing list to get more informed opinions on the matter.
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux