From c7ddbb452a57683ad9a38df8a8f1fe879ed17010 Mon Sep 17 00:00:00 2001 From: Ayush Singh Date: Sat, 19 Jul 2025 21:13:03 +0530 Subject: [PATCH] UPSTREAM: dts: arm64: ti: ti_am62x_a53: Use GPIO Proxy commit 9f4a0153b89e0738a9b117592e3312b36840d571 upstream. After trying out a few different approaches, I think having separate nodes for each bank in devicetree and having a GPIO proxy node for the controller is the best solution right now. To be more specific, GPIO proxy solution still allows for bank level GPIO toggling. The linux kernel GPIO davinci driver is currently limited to single pin operations. This might not be a problem in Linux, but I feel like embedded systems would prefer having support for bank level operations. This also does not pose a problem for the future implementation of interrupts due to that fact that the interrupt router is separate device and will require a separate driver. In fact, the GPIO interrupt router is shared between main_gpio0 and main_gpio1. This patch also reverts the previous bank offset related work on GPIO davinci driver. The patch has been tested on PocketBeagle 2. Signed-off-by: Ayush Singh --- .../pocketbeagle_2_am62_a53-common.dtsi | 18 ++- drivers/gpio/gpio_davinci.c | 27 ++-- dts/arm/ti/am62x_m4.dtsi | 4 +- dts/arm/ti/j722s_main.dtsi | 8 +- dts/arm/ti/j722s_mcu.dtsi | 4 +- dts/vendor/ti/am64x_main.dtsi | 8 +- dts/vendor/ti/am64x_mcu.dtsi | 4 +- dts/vendor/ti/k3-am62-main.dtsi | 122 +++++++++++++++++- 8 files changed, 155 insertions(+), 40 deletions(-) diff --git a/boards/beagle/pocketbeagle_2/pocketbeagle_2_am62_a53-common.dtsi b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am62_a53-common.dtsi index 2a7b490a9e2d..532d56d43545 100644 --- a/boards/beagle/pocketbeagle_2/pocketbeagle_2_am62_a53-common.dtsi +++ b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am62_a53-common.dtsi @@ -93,12 +93,28 @@ status = "okay"; }; -&main_gpio0 { +&main_gpio0_0 { pinctrl-0 = <&led_pins_default>; pinctrl-names = "default"; status = "okay"; }; +&main_gpio0_1 { + status = "okay"; +}; + +&main_gpio0_2 { + status = "okay"; +}; + +&main_gpio1_0 { + status = "okay"; +}; + +&main_gpio1_1 { + status = "okay"; +}; + &main_rti0 { status = "okay"; }; diff --git a/drivers/gpio/gpio_davinci.c b/drivers/gpio/gpio_davinci.c index 42ae7ad7f353..65bf182bde08 100644 --- a/drivers/gpio/gpio_davinci.c +++ b/drivers/gpio/gpio_davinci.c @@ -27,6 +27,7 @@ LOG_MODULE_REGISTER(gpio_davinci, CONFIG_GPIO_LOG_LEVEL); #define DEV_CFG(dev) \ ((const struct gpio_davinci_config *)((dev)->config)) #define DEV_DATA(dev) ((struct gpio_davinci_data *)(dev)->data) +#define DEV_REGS(dev) ((struct gpio_davinci_regs *)DEVICE_MMIO_NAMED_GET(dev, port_base)) #define GPIO_DAVINCI_DIR_RESET_VAL (0xFFFFFFFF) @@ -61,22 +62,10 @@ struct gpio_davinci_config { const struct pinctrl_dev_config *pcfg; }; -const unsigned int offset_array[5] = {0x10, 0x38, 0x60, 0x88, 0xb0}; -#define MAX_REGS_BANK ARRAY_SIZE(offset_array) - -#define BANK0 0 - -static struct gpio_davinci_regs *gpio_davinci_get_regs(const struct device *dev, uint8_t bank) -{ - __ASSERT(bank < MAX_REGS_BANK, "Invalid bank"); - return (struct gpio_davinci_regs *)((uint8_t *)DEVICE_MMIO_NAMED_GET(dev, port_base) + - offset_array[bank]); -} - static int gpio_davinci_configure(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags) { - volatile struct gpio_davinci_regs *regs = gpio_davinci_get_regs(dev, BANK0); + volatile struct gpio_davinci_regs *regs = DEV_REGS(dev); if ((flags & GPIO_SINGLE_ENDED) != 0) { return -ENOTSUP; @@ -103,7 +92,7 @@ static int gpio_davinci_configure(const struct device *dev, gpio_pin_t pin, static int gpio_davinci_port_get_raw(const struct device *dev, gpio_port_value_t *value) { - volatile struct gpio_davinci_regs *regs = gpio_davinci_get_regs(dev, BANK0); + volatile struct gpio_davinci_regs *regs = DEV_REGS(dev); *value = regs->in_data; @@ -113,7 +102,7 @@ static int gpio_davinci_port_get_raw(const struct device *dev, static int gpio_davinci_port_set_masked_raw(const struct device *dev, gpio_port_pins_t mask, gpio_port_value_t value) { - volatile struct gpio_davinci_regs *regs = gpio_davinci_get_regs(dev, BANK0); + volatile struct gpio_davinci_regs *regs = DEV_REGS(dev); regs->out_data = (regs->out_data & (~mask)) | (mask & value); @@ -123,7 +112,7 @@ static int gpio_davinci_port_set_masked_raw(const struct device *dev, static int gpio_davinci_port_set_bits_raw(const struct device *dev, gpio_port_pins_t mask) { - volatile struct gpio_davinci_regs *regs = gpio_davinci_get_regs(dev, BANK0); + volatile struct gpio_davinci_regs *regs = DEV_REGS(dev); regs->set_data = mask; @@ -133,7 +122,7 @@ static int gpio_davinci_port_set_bits_raw(const struct device *dev, static int gpio_davinci_port_clear_bits_raw(const struct device *dev, gpio_port_pins_t mask) { - volatile struct gpio_davinci_regs *regs = gpio_davinci_get_regs(dev, BANK0); + volatile struct gpio_davinci_regs *regs = DEV_REGS(dev); regs->clr_data = mask; @@ -143,7 +132,7 @@ static int gpio_davinci_port_clear_bits_raw(const struct device *dev, static int gpio_davinci_port_toggle_bits(const struct device *dev, gpio_port_pins_t mask) { - volatile struct gpio_davinci_regs *regs = gpio_davinci_get_regs(dev, BANK0); + volatile struct gpio_davinci_regs *regs = DEV_REGS(dev); regs->out_data ^= mask; @@ -179,7 +168,7 @@ static int gpio_davinci_init(const struct device *dev) #define GPIO_DAVINCI_INIT_FUNC(n) \ static void gpio_davinci_bank_##n##_config(const struct device *dev) \ { \ - volatile struct gpio_davinci_regs *regs = gpio_davinci_get_regs(dev, BANK0); \ + volatile struct gpio_davinci_regs *regs = DEV_REGS(dev); \ regs->dir = GPIO_DAVINCI_DIR_RESET_VAL; \ } diff --git a/dts/arm/ti/am62x_m4.dtsi b/dts/arm/ti/am62x_m4.dtsi index 37b578e83f1b..ca486a472e1c 100644 --- a/dts/arm/ti/am62x_m4.dtsi +++ b/dts/arm/ti/am62x_m4.dtsi @@ -101,9 +101,9 @@ status = "disabled"; }; - gpio0: gpio@4201000 { + gpio0: gpio@4201010 { compatible = "ti,davinci-gpio"; - reg = <0x4201000 0x100>; + reg = <0x4201010 0x28>; gpio-controller; #gpio-cells = <2>; ngpios = <24>; diff --git a/dts/arm/ti/j722s_main.dtsi b/dts/arm/ti/j722s_main.dtsi index 473e327c0fb7..724afcf1230b 100644 --- a/dts/arm/ti/j722s_main.dtsi +++ b/dts/arm/ti/j722s_main.dtsi @@ -19,18 +19,18 @@ status = "okay"; }; - gpio0: gpio@600000 { + gpio0: gpio@600010 { compatible = "ti,davinci-gpio"; - reg = <0x00600000 0x100>; + reg = <0x00600010 0x28>; gpio-controller; #gpio-cells = <2>; ngpios = <92>; status = "disabled"; }; - gpio1: gpio@601000 { + gpio1: gpio@601010 { compatible = "ti,davinci-gpio"; - reg = <0x00601000 0x100>; + reg = <0x00601010 0x28>; gpio-controller; #gpio-cells = <2>; ngpios = <52>; diff --git a/dts/arm/ti/j722s_mcu.dtsi b/dts/arm/ti/j722s_mcu.dtsi index ec32c29ef747..987ee4e7b3cd 100644 --- a/dts/arm/ti/j722s_mcu.dtsi +++ b/dts/arm/ti/j722s_mcu.dtsi @@ -13,9 +13,9 @@ #address-cells = <1>; #size-cells = <1>; - mcu_gpio0: gpio@4201000 { + mcu_gpio0: gpio@4201010 { compatible = "ti,davinci-gpio"; - reg = <0x4201000 0x100>; + reg = <0x4201010 0x28>; gpio-controller; #gpio-cells = <2>; ngpios = <24>; diff --git a/dts/vendor/ti/am64x_main.dtsi b/dts/vendor/ti/am64x_main.dtsi index 5e9b5b297502..7eee796322dc 100644 --- a/dts/vendor/ti/am64x_main.dtsi +++ b/dts/vendor/ti/am64x_main.dtsi @@ -221,17 +221,17 @@ status = "disabled"; }; - main_gpio0: gpio@600000 { + main_gpio0: gpio@600010 { compatible = "ti,davinci-gpio"; - reg = <0x600000 0x100>; + reg = <0x600010 0x28>; gpio-controller; #gpio-cells = <2>; status = "disabled"; }; - main_gpio1: gpio@601000 { + main_gpio1: gpio@601010 { compatible = "ti,davinci-gpio"; - reg = <0x601000 0x100>; + reg = <0x601010 0x28>; gpio-controller; #gpio-cells = <2>; status = "disabled"; diff --git a/dts/vendor/ti/am64x_mcu.dtsi b/dts/vendor/ti/am64x_mcu.dtsi index 2cff07ed6ad6..72f927f00d67 100644 --- a/dts/vendor/ti/am64x_mcu.dtsi +++ b/dts/vendor/ti/am64x_mcu.dtsi @@ -62,9 +62,9 @@ status = "disabled"; }; - mcu_gpio0: gpio@4201000 { + mcu_gpio0: gpio@4201010 { compatible = "ti,davinci-gpio"; - reg = <0x4201000 0x100>; + reg = <0x4201010 0x28>; gpio-controller; #gpio-cells = <2>; ngpios = <23>; diff --git a/dts/vendor/ti/k3-am62-main.dtsi b/dts/vendor/ti/k3-am62-main.dtsi index e2e86b578fc9..a40e047dce7b 100644 --- a/dts/vendor/ti/k3-am62-main.dtsi +++ b/dts/vendor/ti/k3-am62-main.dtsi @@ -106,26 +106,136 @@ status = "disabled"; }; - main_gpio0: gpio@600000 { + main_gpio0: main-gpio0 { + #gpio-cells = <2>; + gpio-map = <0 0 &main_gpio0_0 0 0>, <1 0 &main_gpio0_0 1 0>, + <2 0 &main_gpio0_0 2 0>, <3 0 &main_gpio0_0 3 0>, + <4 0 &main_gpio0_0 4 0>, <5 0 &main_gpio0_0 5 0>, + <6 0 &main_gpio0_0 6 0>, <7 0 &main_gpio0_0 7 0>, + <8 0 &main_gpio0_0 8 0>, <9 0 &main_gpio0_0 9 0>, + <10 0 &main_gpio0_0 10 0>, <11 0 &main_gpio0_0 11 0>, + <12 0 &main_gpio0_0 12 0>, <13 0 &main_gpio0_0 13 0>, + <14 0 &main_gpio0_0 14 0>, <15 0 &main_gpio0_0 15 0>, + <16 0 &main_gpio0_0 16 0>, <17 0 &main_gpio0_0 17 0>, + <18 0 &main_gpio0_0 18 0>, <19 0 &main_gpio0_0 19 0>, + <20 0 &main_gpio0_0 20 0>, <21 0 &main_gpio0_0 21 0>, + <22 0 &main_gpio0_0 22 0>, <23 0 &main_gpio0_0 23 0>, + <24 0 &main_gpio0_0 24 0>, <25 0 &main_gpio0_0 25 0>, + <26 0 &main_gpio0_0 26 0>, <27 0 &main_gpio0_0 27 0>, + <28 0 &main_gpio0_0 28 0>, <29 0 &main_gpio0_0 29 0>, + <30 0 &main_gpio0_0 30 0>, <31 0 &main_gpio0_0 31 0>, + <32 0 &main_gpio0_1 0 0>, <33 0 &main_gpio0_1 1 0>, + <34 0 &main_gpio0_1 2 0>, <35 0 &main_gpio0_1 3 0>, + <36 0 &main_gpio0_1 4 0>, <37 0 &main_gpio0_1 5 0>, + <38 0 &main_gpio0_1 6 0>, <39 0 &main_gpio0_1 7 0>, + <40 0 &main_gpio0_1 8 0>, <41 0 &main_gpio0_1 9 0>, + <42 0 &main_gpio0_1 10 0>, <43 0 &main_gpio0_1 11 0>, + <44 0 &main_gpio0_1 12 0>, <45 0 &main_gpio0_1 13 0>, + <46 0 &main_gpio0_1 14 0>, <47 0 &main_gpio0_1 15 0>, + <48 0 &main_gpio0_1 16 0>, <49 0 &main_gpio0_1 17 0>, + <50 0 &main_gpio0_1 18 0>, <51 0 &main_gpio0_1 19 0>, + <52 0 &main_gpio0_1 20 0>, <53 0 &main_gpio0_1 21 0>, + <54 0 &main_gpio0_1 22 0>, <55 0 &main_gpio0_1 23 0>, + <56 0 &main_gpio0_1 24 0>, <57 0 &main_gpio0_1 25 0>, + <58 0 &main_gpio0_1 26 0>, <59 0 &main_gpio0_1 27 0>, + <60 0 &main_gpio0_1 28 0>, <61 0 &main_gpio0_1 29 0>, + <62 0 &main_gpio0_1 30 0>, <63 0 &main_gpio0_1 31 0>, + <64 0 &main_gpio0_2 0 0>, <65 0 &main_gpio0_2 1 0>, + <66 0 &main_gpio0_2 2 0>, <67 0 &main_gpio0_2 3 0>, + <68 0 &main_gpio0_2 4 0>, <69 0 &main_gpio0_2 5 0>, + <70 0 &main_gpio0_2 6 0>, <71 0 &main_gpio0_2 7 0>, + <72 0 &main_gpio0_2 8 0>, <73 0 &main_gpio0_2 9 0>, + <74 0 &main_gpio0_2 10 0>, <75 0 &main_gpio0_2 11 0>, + <76 0 &main_gpio0_2 12 0>, <77 0 &main_gpio0_2 13 0>, + <78 0 &main_gpio0_2 14 0>, <79 0 &main_gpio0_2 15 0>, + <80 0 &main_gpio0_2 16 0>, <81 0 &main_gpio0_2 17 0>, + <82 0 &main_gpio0_2 18 0>, <83 0 &main_gpio0_2 17 0>, + <84 0 &main_gpio0_2 20 0>, <85 0 &main_gpio0_2 21 0>, + <86 0 &main_gpio0_2 22 0>, <87 0 &main_gpio0_2 23 0>, + <88 0 &main_gpio0_2 24 0>, <89 0 &main_gpio0_2 25 0>, + <90 0 &main_gpio0_2 26 0>, <91 0 &main_gpio0_2 27 0>; + gpio-map-mask = <0xffff 0x0>; + gpio-map-pass-thru = <0x0 0x1>; + }; + + main_gpio0_0: gpio@600010 { compatible = "ti,davinci-gpio"; - reg = <0x00600000 0x100>; + reg = <0x00600010 0x28>; gpio-controller; #gpio-cells = <2>; - /* FIXME: Enable all 92 GPIOs */ ngpios = <32>; status = "disabled"; }; - main_gpio1: gpio@601000 { + main_gpio0_1: gpio@600038 { compatible = "ti,davinci-gpio"; - reg = <0x00601000 0x100>; + reg = <0x00600038 0x28>; gpio-controller; #gpio-cells = <2>; - /* FIXME: Enable all 52 GPIOs */ ngpios = <32>; status = "disabled"; }; + main_gpio0_2: gpio@600060 { + compatible = "ti,davinci-gpio"; + reg = <0x00600060 0x28>; + gpio-controller; + #gpio-cells = <2>; + ngpios = <28>; + status = "disabled"; + }; + + main_gpio1: main-gpio1 { + #gpio-cells = <2>; + gpio-map = <0 0 &main_gpio1_0 0 0>, <1 0 &main_gpio1_0 1 0>, + <2 0 &main_gpio1_0 2 0>, <3 0 &main_gpio1_0 3 0>, + <4 0 &main_gpio1_0 4 0>, <5 0 &main_gpio1_0 5 0>, + <6 0 &main_gpio1_0 6 0>, <7 0 &main_gpio1_0 7 0>, + <8 0 &main_gpio1_0 8 0>, <9 0 &main_gpio1_0 9 0>, + <10 0 &main_gpio1_0 10 0>, <11 0 &main_gpio1_0 11 0>, + <12 0 &main_gpio1_0 12 0>, <13 0 &main_gpio1_0 13 0>, + <14 0 &main_gpio1_0 14 0>, <15 0 &main_gpio1_0 15 0>, + <16 0 &main_gpio1_0 16 0>, <17 0 &main_gpio1_0 17 0>, + <18 0 &main_gpio1_0 18 0>, <19 0 &main_gpio1_0 19 0>, + <20 0 &main_gpio1_0 20 0>, <21 0 &main_gpio1_0 21 0>, + <22 0 &main_gpio1_0 22 0>, <23 0 &main_gpio1_0 23 0>, + <24 0 &main_gpio1_0 24 0>, <25 0 &main_gpio1_0 25 0>, + <26 0 &main_gpio1_0 26 0>, <27 0 &main_gpio1_0 27 0>, + <28 0 &main_gpio1_0 28 0>, <29 0 &main_gpio1_0 29 0>, + <30 0 &main_gpio1_0 30 0>, <31 0 &main_gpio1_0 31 0>, + <32 0 &main_gpio1_1 0 0>, <33 0 &main_gpio1_1 1 0>, + <34 0 &main_gpio1_1 2 0>, <35 0 &main_gpio1_1 3 0>, + <36 0 &main_gpio1_1 4 0>, <37 0 &main_gpio1_1 5 0>, + <38 0 &main_gpio1_1 6 0>, <39 0 &main_gpio1_1 7 0>, + <40 0 &main_gpio1_1 8 0>, <41 0 &main_gpio1_1 9 0>, + <42 0 &main_gpio1_1 10 0>, <43 0 &main_gpio1_1 11 0>, + <44 0 &main_gpio1_1 12 0>, <45 0 &main_gpio1_1 13 0>, + <46 0 &main_gpio1_1 14 0>, <47 0 &main_gpio1_1 15 0>, + <48 0 &main_gpio1_1 16 0>, <49 0 &main_gpio1_1 17 0>, + <50 0 &main_gpio1_1 18 0>, <51 0 &main_gpio1_1 19 0>, + <52 0 &main_gpio1_1 20 0>; + gpio-map-mask = <0xffff 0x0>; + gpio-map-pass-thru = <0x0 0x1>; + }; + + main_gpio1_0: gpio@601010 { + compatible = "ti,davinci-gpio"; + reg = <0x00601010 0x28>; + gpio-controller; + #gpio-cells = <2>; + ngpios = <32>; + status = "disabled"; + }; + + main_gpio1_1: gpio@601038 { + compatible = "ti,davinci-gpio"; + reg = <0x00601038 0x28>; + gpio-controller; + #gpio-cells = <2>; + ngpios = <20>; + status = "disabled"; + }; + main_rti0: watchdog@e000000 { compatible = "ti,j7-rti-wdt"; reg = <0x0e000000 0x100>;