Re: basic-mmio-gpio: add DT support

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

 



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).
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";
	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.

Regards,
Álvaro.
--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux