[PATCH v5 18/18] staging: mt7621-gpio: avoid use banks in device tree
NeilBrown
neil at brown.name
Sat Jun 30 05:47:34 UTC 2018
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.
NeilBrown
> ---
> 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/attachments/20180630/92d091c9/attachment.asc>
More information about the devel
mailing list