Tool/software:
Hello Support-Team,
how could we get the right values for gpio numbers in kernel if we want to use gpio3_9 and gpio3_10 as reset and irq.
We have in DTS <105> and <106>
&spi0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&spi0_pins>; ti,pindir-d0-out-d1-in = <1>; ksz8895: ksz8895@0 { compatible = "micrel,ksz8895"; spi-max-frequency = <12000000>; spi-cpha; spi-cpol; phy-mode = "mii"; reg = <0>; /* Chip select 0 */ ksz8895,gpio_reset = <106>; /* GPIO_TO_PIN(3,10) */ ksz8895,gpio_irq = <105>; /* GPIO_TO_PIN(3,9) */ ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; label = "lan1"; }; port@1 { reg = <1>; label = "lan2"; }; port@2 { reg = <2>; label = "lan3"; }; port@3 { reg = <3>; label = "lan4"; }; port@4 { reg = <4>; label = "cpu"; ethernet = <&mac>; phy-mode = "mii"; fixed-link { speed = <100>; full-duplex; }; }; }; }; };
But is mapped to gpio0.
Like you can see here:
root@beagletest:~# cat /proc/interrupts
CPU0
16: 4398 INTC 68 Level clockevent
17: 0 INTC 96 Level 44e07000.gpio
23: 0 INTC 98 Level 4804c000.gpio
24: 0 INTC 4 Level 48080000.elm
25: 309 INTC 30 Level 4819c000.i2c
26: 0 INTC 32 Level 481ac000.gpio
27: 0 INTC 62 Level 481ae000.gpio
28: 0 INTC 111 Level 48310000.rng
29: 0 INTC 41 Level 4a100000.ethernet
30: 19 INTC 42 Level 4a100000.ethernet
31: 25 INTC 43 Level 4a100000.ethernet
32: 538 INTC 12 Level 49000000.dma_ccint
33: 0 INTC 14 Level 49000000.dma_ccerrint
34: 0 INTC 3 Level arm-pmu
35: 503 INTC 72 Level 44e09000.serial
36: 516 INTC 70 Level 44e0b000.i2c
37: 0 INTC 65 Level 48030000.spi
38: 0 44e07000.gpio 9 Edge ksz8895
39: 1970 INTC 64 Level mmc0
40: 0 44e07000.gpio 17 Edge 48060000.mmc cd
Err: 0
gpio0_target: target-module@7000 { /* 0x44e07000, ap 14 20.0 */ compatible = "ti,sysc-omap2", "ti,sysc"; reg = <0x7000 0x4>, <0x7010 0x4>, <0x7114 0x4>; reg-names = "rev", "sysc", "syss"; ti,sysc-mask = <(SYSC_OMAP2_ENAWAKEUP | SYSC_OMAP2_SOFTRESET | SYSC_OMAP2_AUTOIDLE)>; ti,sysc-sidle = <SYSC_IDLE_FORCE>, <SYSC_IDLE_NO>, <SYSC_IDLE_SMART>, <SYSC_IDLE_SMART_WKUP>; ti,syss-mask = <1>; /* Domains (P, C): wkup_pwrdm, l4_wkup_clkdm */ clocks = <&l4_wkup_clkctrl AM3_L4_WKUP_GPIO1_CLKCTRL 0>, <&l4_wkup_clkctrl AM3_L4_WKUP_GPIO1_CLKCTRL 18>; clock-names = "fck", "dbclk"; #address-cells = <1>; #size-cells = <1>; ranges = <0x0 0x7000 0x1000>; gpio0: gpio@0 { compatible = "ti,omap4-gpio"; gpio-ranges = <&am33xx_pinmux 0 82 8>, <&am33xx_pinmux 8 52 4>, <&am33xx_pinmux 12 94 4>, <&am33xx_pinmux 16 71 2>, <&am33xx_pinmux 18 135 1>, <&am33xx_pinmux 19 108 2>, <&am33xx_pinmux 21 73 1>, <&am33xx_pinmux 22 8 2>, <&am33xx_pinmux 26 10 2>, <&am33xx_pinmux 28 74 1>, <&am33xx_pinmux 29 81 1>, <&am33xx_pinmux 30 28 2>; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; reg = <0x0 0x1000>; interrupts = <96>; }; };
Comparing kernel 5 and 6 we have discrepancy in cat /sys/kernel/debug/gpio.
Correct: GPIO3 is used with 481ae000 gpiochip0: GPIOs 0-31, parent: platform/44e07000.gpio, gpio-0-31: gpiochip1: GPIOs 32-63, parent: platform/4804c000.gpio, gpio-32-63: gpiochip2: GPIOs 64-95, parent: platform/481ac000.gpio, gpio-64-95: gpiochip3: GPIOs 96-127, parent: platform/481ae000.gpio, gpio-96-127: gpio-105 ( |ksz8895 irq ) in hi IRQ gpio-106 ( |ksz8895 reset ) out lo |
Wrong: GPIO0 is used with root@beagletest:~# cat /sys/kernel/debug/gpio gpiochip0: GPIOs 0-31, parent: platform/4804c000.gpio, gpio-0-31: gpiochip1: GPIOs 32-63, parent: platform/481ac000.gpio, gpio-32-63: gpiochip2: GPIOs 64-95, parent: platform/481ae000.gpio, gpio-64-95: gpiochip3: GPIOs 96-127, parent: platform/44e07000.gpio, gpio-96-127: gpio-105 ( |ksz8895 irq ) in lo IRQ gpio-106 ( |ksz8895 reset ) out lo gpio-113 ( |cd ) in lo IRQ ACTIVE LOW |
How to solve this? How to have the same order according to addresses like in kernel 5?