@samitouri / QOSamiQemu / commits / a4256760c0

hw/arm: ax3000-soc: Enable Cadence GPIO controllers

Enable 8 Cadence GPIO controllers into Axiado AX3000 SoC Signed-off-by: Kuan-Jui Chiu <kchiu@axiado.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com> Message-id: 20260713073033.3883619-9-kchiu@axiado.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Kuan-Jui Chiu committed Aug 11, 2026 at 20:14 UTC a4256760c0e0a123569be2e99d8749f00b812c1d
3 files changed +52
hw/arm/Kconfig
+1
@@ -731,6 +731,7 @@ config AXIADO_SOC
731 select ARM_GIC
732 select CADENCE # UART
733 select AXIADO_CLK
734 + select CADENCE_GPIO
735 select AXIADO_SDHCI
736 select UNIMP
737
hw/arm/ax3000-soc.c
+30
@@ -36,6 +36,11 @@ static void ax3000_init(Object *obj)
36
37 object_initialize_child(obj, "clk", &s->ax3000_clk, TYPE_AX3000_CLK);
38 object_initialize_child(obj, "sdhci0", &s->sdhci0, TYPE_AXIADO_SDHCI);
39 +
40 + for (int i = 0; i < AX3000_NUM_GPIOS; i++) {
41 + g_autofree char *name = g_strdup_printf("gpio%d", i);
42 + object_initialize_child(obj, name, &s->gpio[i], TYPE_CADENCE_GPIO);
43 + }
44 }
45
46 static void ax3000_realize(DeviceState *dev, Error **errp)
@@ -187,6 +192,31 @@ static void ax3000_realize(DeviceState *dev, Error **errp)
192 &error_fatal);
193 qdev_realize_and_unref(card, s->sdhci0.sd_bus, &error_fatal);
194 }
195 +
196 + /* GPIOs */
197 + const struct {
198 + hwaddr addr;
199 + unsigned int irq;
200 + } gpio_table[] = {
201 + { AX3000_GPIO0_BASE, AX3000_GPIO0_IRQ },
202 + { AX3000_GPIO1_BASE, AX3000_GPIO1_IRQ },
203 + { AX3000_GPIO2_BASE, AX3000_GPIO2_IRQ },
204 + { AX3000_GPIO3_BASE, AX3000_GPIO3_IRQ },
205 + { AX3000_GPIO4_BASE, AX3000_GPIO4_IRQ },
206 + { AX3000_GPIO5_BASE, AX3000_GPIO5_IRQ },
207 + { AX3000_GPIO6_BASE, AX3000_GPIO6_IRQ },
208 + { AX3000_GPIO7_BASE, AX3000_GPIO7_IRQ }
209 + };
210 +
211 + for (int i = 0; i < AX3000_NUM_GPIOS; i++) {
212 + if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
213 + return;
214 + }
215 +
216 + sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
217 + sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0,
218 + qdev_get_gpio_in(gic_dev, gpio_table[i].irq));
219 + }
220 }
221
222 static void ax3000_class_init(ObjectClass *oc, const void *data)
include/hw/arm/ax3000-soc.h
+21
@@ -13,6 +13,7 @@
13 #include "hw/intc/arm_gicv3_common.h"
14 #include "hw/char/cadence_uart.h"
15 #include "hw/misc/axiado_clk.h"
16 +#include "hw/gpio/cadence_gpio.h"
17 #include "hw/sd/axiado_sdhci.h"
18 #include "hw/core/sysbus.h"
19 #include "qemu/units.h"
@@ -38,6 +39,15 @@ OBJECT_DECLARE_TYPE(Ax3000SoCState, Ax3000SoCClass, AX3000_SOC)
39 #define AX3000_SDHCI0_BASE 0x86000000
40 #define AX3000_EMMC_PHY_BASE 0x80801C00
41
42 +#define AX3000_GPIO0_BASE 0x80500000
43 +#define AX3000_GPIO1_BASE 0x80580000
44 +#define AX3000_GPIO2_BASE 0x80600000
45 +#define AX3000_GPIO3_BASE 0x80680000
46 +#define AX3000_GPIO4_BASE 0x80700000
47 +#define AX3000_GPIO5_BASE 0x80780000
48 +#define AX3000_GPIO6_BASE 0x80800000
49 +#define AX3000_GPIO7_BASE 0x80880000
50 +
51 #define AX3000_TIMER_CTRL 0x8A020000
52 #define AX3000_PLL_BASE 0x80000000
53
@@ -46,6 +56,7 @@ enum Ax3000Configuration {
56 AX3000_NUM_IRQS = 224,
57 AX3000_NUM_BANKS = 2,
58 AX3000_NUM_UARTS = 4,
59 + AX3000_NUM_GPIOS = 8,
60 };
61
62 typedef struct Ax3000SoCState {
@@ -56,6 +67,7 @@ typedef struct Ax3000SoCState {
67 MemoryRegion dram[AX3000_NUM_BANKS];
68 Ax3000ClkState ax3000_clk;
69 CadenceUARTState uart[AX3000_NUM_UARTS];
70 + CadenceGPIOState gpio[AX3000_NUM_GPIOS];
71 AxiadoSDHCIState sdhci0;
72 } Ax3000SoCState;
73
@@ -72,6 +84,15 @@ enum Ax3000Irqs {
84 AX3000_UART3_IRQ = 170,
85
86 AX3000_SDHCI0_IRQ = 123,
87 +
88 + AX3000_GPIO0_IRQ = 183,
89 + AX3000_GPIO1_IRQ = 184,
90 + AX3000_GPIO2_IRQ = 185,
91 + AX3000_GPIO3_IRQ = 186,
92 + AX3000_GPIO4_IRQ = 187,
93 + AX3000_GPIO5_IRQ = 188,
94 + AX3000_GPIO6_IRQ = 189,
95 + AX3000_GPIO7_IRQ = 190,
96 };
97
98 #endif /* AXIADO_AX3000_H */