[PATCH v5 18/18] staging: mt7621-gpio: avoid use banks in device tree

Sergio Paracuellos sergio.paracuellos at gmail.com
Sat Jun 30 06:06:05 UTC 2018


On Sat, Jun 30, 2018 at 7:47 AM, NeilBrown <neil at brown.name> wrote:
> On Mon, Jun 18 2018, Sergio Paracuellos wrote:
>
>> Banks shouldn't be defined in DT if number of resources
>> per bank is not variable. We actually know that this SoC
>> has three banks so take that into account in order to don't
>> overspecify the device tree. Device tree will only have one
>> node making it simple. Update device tree, binding doc and
>> code accordly.
>>
>> Signed-off-by: Sergio Paracuellos <sergio.paracuellos at gmail.com>
>
> I'm sorry that I've been silent one these for a while - busy any all
> that.
>
> This last patch doesn't work.  My test case works with all but this one
> applied, but this breaks it.  I haven't had a chance to look into why
> yet.  Sorry.

Thanks for pointing this out. All of them were applied so I though
there were no problem at all with any of them.
We should revert the last one or wait to your feedback about what is
breaking it and send a new patch fixing the problem.

Thanks in advance.

> NeilBrown

Best regards,
    Sergio Paracuellos

>
>> ---
>>  drivers/staging/mt7621-dts/gbpc1.dts               | 10 ++--
>>  drivers/staging/mt7621-dts/mt7621.dtsi             | 31 ++----------
>>  drivers/staging/mt7621-gpio/gpio-mt7621.c          | 21 ++++----
>>  .../staging/mt7621-gpio/mediatek,mt7621-gpio.txt   | 59 +++++-----------------
>>  4 files changed, 31 insertions(+), 90 deletions(-)
>>
>> diff --git a/drivers/staging/mt7621-dts/gbpc1.dts b/drivers/staging/mt7621-dts/gbpc1.dts
>> index 6b13d85..352945d 100644
>> --- a/drivers/staging/mt7621-dts/gbpc1.dts
>> +++ b/drivers/staging/mt7621-dts/gbpc1.dts
>> @@ -32,7 +32,7 @@
>>
>>               reset {
>>                       label = "reset";
>> -                     gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>;
>> +                     gpios = <&gpio 18 GPIO_ACTIVE_HIGH>;
>>                       linux,code = <KEY_RESTART>;
>>               };
>>       };
>> @@ -42,22 +42,22 @@
>>
>>               system {
>>                       label = "gb-pc1:green:system";
>> -                     gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
>> +                     gpios = <&gpio 6 GPIO_ACTIVE_LOW>;
>>               };
>>
>>               status {
>>                       label = "gb-pc1:green:status";
>> -                     gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
>> +                     gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
>>               };
>>
>>               lan1 {
>>                       label = "gb-pc1:green:lan1";
>> -                     gpios = <&gpio0 24 GPIO_ACTIVE_LOW>;
>> +                     gpios = <&gpio 24 GPIO_ACTIVE_LOW>;
>>               };
>>
>>               lan2 {
>>                       label = "gb-pc1:green:lan2";
>> -                     gpios = <&gpio0 25 GPIO_ACTIVE_LOW>;
>> +                     gpios = <&gpio 25 GPIO_ACTIVE_LOW>;
>>               };
>>       };
>>  };
>> diff --git a/drivers/staging/mt7621-dts/mt7621.dtsi b/drivers/staging/mt7621-dts/mt7621.dtsi
>> index acb6b8c..02746af 100644
>> --- a/drivers/staging/mt7621-dts/mt7621.dtsi
>> +++ b/drivers/staging/mt7621-dts/mt7621.dtsi
>> @@ -61,37 +61,14 @@
>>               };
>>
>>               gpio: gpio at 600 {
>> -                     #address-cells = <1>;
>> -                     #size-cells = <0>;
>> -
>> +                     #gpio-cells = <2>;
>> +                     #interrupt-cells = <2>;
>>                       compatible = "mediatek,mt7621-gpio";
>> +                     gpio-controller;
>> +                     interrupt-controller;
>>                       reg = <0x600 0x100>;
>> -
>>                       interrupt-parent = <&gic>;
>>                       interrupts = <GIC_SHARED 12 IRQ_TYPE_LEVEL_HIGH>;
>> -                     interrupt-controller;
>> -                     #interrupt-cells = <2>;
>> -
>> -                     gpio0: bank at 0 {
>> -                             reg = <0>;
>> -                             compatible = "mediatek,mt7621-gpio-bank";
>> -                             gpio-controller;
>> -                             #gpio-cells = <2>;
>> -                     };
>> -
>> -                     gpio1: bank at 1 {
>> -                             reg = <1>;
>> -                             compatible = "mediatek,mt7621-gpio-bank";
>> -                             gpio-controller;
>> -                             #gpio-cells = <2>;
>> -                     };
>> -
>> -                     gpio2: bank at 2 {
>> -                             reg = <2>;
>> -                             compatible = "mediatek,mt7621-gpio-bank";
>> -                             gpio-controller;
>> -                             #gpio-cells = <2>;
>> -                     };
>>               };
>>
>>               i2c: i2c at 900 {
>> diff --git a/drivers/staging/mt7621-gpio/gpio-mt7621.c b/drivers/staging/mt7621-gpio/gpio-mt7621.c
>> index 9a4a12f..281e621 100644
>> --- a/drivers/staging/mt7621-gpio/gpio-mt7621.c
>> +++ b/drivers/staging/mt7621-gpio/gpio-mt7621.c
>> @@ -206,23 +206,20 @@ static inline const char * const mediatek_gpio_bank_name(int bank)
>>  }
>>
>>  static int
>> -mediatek_gpio_bank_probe(struct platform_device *pdev, struct device_node *bank)
>> +mediatek_gpio_bank_probe(struct platform_device *pdev,
>> +                      struct device_node *node, int bank)
>>  {
>>       struct mtk_data *gpio = dev_get_drvdata(&pdev->dev);
>> -     const __be32 *id = of_get_property(bank, "reg", NULL);
>>       struct mtk_gc *rg;
>>       void __iomem *dat, *set, *ctrl, *diro;
>>       int ret;
>>
>> -     if (!id || be32_to_cpu(*id) >= MTK_BANK_CNT)
>> -             return -EINVAL;
>> -
>> -     rg = &gpio->gc_map[be32_to_cpu(*id)];
>> +     rg = &gpio->gc_map[bank];
>>       memset(rg, 0, sizeof(*rg));
>>
>>       spin_lock_init(&rg->lock);
>> -     rg->chip.of_node = bank;
>> -     rg->bank = be32_to_cpu(*id);
>> +     rg->chip.of_node = node;
>> +     rg->bank = bank;
>>       rg->chip.label = mediatek_gpio_bank_name(rg->bank);
>>
>>       dat = gpio->gpio_membase + GPIO_REG_DATA + (rg->bank * GPIO_BANK_WIDE);
>> @@ -283,9 +280,10 @@ mediatek_gpio_bank_probe(struct platform_device *pdev, struct device_node *bank)
>>  static int
>>  mediatek_gpio_probe(struct platform_device *pdev)
>>  {
>> -     struct device_node *bank, *np = pdev->dev.of_node;
>> +     struct device_node *np = pdev->dev.of_node;
>>       struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>       struct mtk_data *gpio_data;
>> +     int i;
>>
>>       gpio_data = devm_kzalloc(&pdev->dev, sizeof(*gpio_data), GFP_KERNEL);
>>       if (!gpio_data)
>> @@ -299,9 +297,8 @@ mediatek_gpio_probe(struct platform_device *pdev)
>>       gpio_data->dev = &pdev->dev;
>>       platform_set_drvdata(pdev, gpio_data);
>>
>> -     for_each_child_of_node(np, bank)
>> -             if (of_device_is_compatible(bank, "mediatek,mt7621-gpio-bank"))
>> -                     mediatek_gpio_bank_probe(pdev, bank);
>> +     for (i = 0; i < MTK_BANK_CNT; i++)
>> +             mediatek_gpio_bank_probe(pdev, np, i);
>>
>>       return 0;
>>  }
>> diff --git a/drivers/staging/mt7621-gpio/mediatek,mt7621-gpio.txt b/drivers/staging/mt7621-gpio/mediatek,mt7621-gpio.txt
>> index 30d8a02..ba45558 100644
>> --- a/drivers/staging/mt7621-gpio/mediatek,mt7621-gpio.txt
>> +++ b/drivers/staging/mt7621-gpio/mediatek,mt7621-gpio.txt
>> @@ -1,68 +1,35 @@
>> -Mediatek SoC GPIO controller bindings
>> +Mediatek MT7621 SoC GPIO controller bindings
>>
>>  The IP core used inside these SoCs has 3 banks of 32 GPIOs each.
>>  The registers of all the banks are interwoven inside one single IO range.
>> -We load one GPIO controller instance per bank. To make this possible
>> -we support 2 types of nodes. The parent node defines the memory I/O range and
>> -has 3 children each describing a single bank. Also the GPIO controller can receive
>> +We load one GPIO controller instance per bank. Also the GPIO controller can receive
>>  interrupts on any of the GPIOs, either edge or level. It then interrupts the CPU
>>  using GIC INT12.
>>
>>  Required properties for the top level node:
>> +- #gpio-cells : Should be two. The first cell is the GPIO pin number and the
>> +   second cell specifies GPIO flags, as defined in <dt-bindings/gpio/gpio.h>.
>> +   Only the GPIO_ACTIVE_HIGH and GPIO_ACTIVE_LOW flags are supported.
>> +- #interrupt-cells : Specifies the number of cells needed to encode an
>> +   interrupt. Should be 2. The first cell defines the interrupt number,
>> +   the second encodes the triger flags encoded as described in
>> +   Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
>>  - compatible:
>>    - "mediatek,mt7621-gpio" for Mediatek controllers
>>  - reg : Physical base address and length of the controller's registers
>>  - interrupt-parent : phandle of the parent interrupt controller.
>>  - interrupts : Interrupt specifier for the controllers interrupt.
>>  - interrupt-controller : Mark the device node as an interrupt controller.
>> -- #interrupt-cells : Should be 2. The first cell defines the interrupt number.
>> -   The second cell bits[3:0] is used to specify trigger type as follows:
>> -     - 1 = low-to-high edge triggered.
>> -     - 2 = high-to-low edge triggered.
>> -     - 4 = active high level-sensitive.
>> -     - 8 = active low level-sensitive.
>> -
>> -
>> -Required properties for the GPIO bank node:
>> -- compatible:
>> -  - "mediatek,mt7621-gpio-bank" for Mediatek banks
>> -- #gpio-cells : Should be two. The first cell is the GPIO pin number and the
>> -   second cell specifies GPIO flags, as defined in <dt-bindings/gpio/gpio.h>.
>> -   Only the GPIO_ACTIVE_HIGH and GPIO_ACTIVE_LOW flags are supported.
>>  - gpio-controller : Marks the device node as a GPIO controller.
>> -- reg : The id of the bank that the node describes.
>>
>>  Example:
>>       gpio at 600 {
>> -             #address-cells = <1>;
>> -             #size-cells = <0>;
>> -
>> +             #gpio-cells = <2>;
>> +             #interrupt-cells = <2>;
>>               compatible = "mediatek,mt7621-gpio";
>> +             gpio-controller;
>> +             interrupt-controller;
>>               reg = <0x600 0x100>;
>> -
>>               interrupt-parent = <&gic>;
>>               interrupts = <GIC_SHARED 12 IRQ_TYPE_LEVEL_HIGH>;
>> -             interrupt-controller;
>> -             #interrupt-cells = <2>;
>> -
>> -             gpio0: bank at 0 {
>> -                     reg = <0>;
>> -                     compatible = "mediatek,mt7621-gpio-bank";
>> -                     gpio-controller;
>> -                     #gpio-cells = <2>;
>> -             };
>> -
>> -             gpio1: bank at 1 {
>> -                     reg = <1>;
>> -                     compatible = "mediatek,mt7621-gpio-bank";
>> -                     gpio-controller;
>> -                     #gpio-cells = <2>;
>> -             };
>> -
>> -             gpio2: bank at 2 {
>> -                     reg = <2>;
>> -                     compatible = "mediatek,mt7621-gpio-bank";
>> -                     gpio-controller;
>> -                     #gpio-cells = <2>;
>> -             };
>>       };
>> --
>> 2.7.4


More information about the devel mailing list