From 9814590eb3ad521b92b26c99e5ea9f6f5d2f6b24 Mon Sep 17 00:00:00 2001 From: Amneesh Singh Date: Thu, 13 Mar 2025 16:29:33 +0530 Subject: [PATCH] drivers: pinctrl: make ti_k3 multi-instance Some devices have multiple pinctrl regions; for instance, main pinctrl and mcu pinctrl. Currently there can only be a single pinctrl instance picked form a DT label. This patch makes the pinctrl driver initialise one instance for each node with correct compatible string. Signed-off-by: Amneesh Singh --- drivers/pinctrl/pinctrl_ti_k3.c | 30 ++++++++++++++---------------- soc/ti/k3/am6x/pinctrl_soc.h | 2 ++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/pinctrl/pinctrl_ti_k3.c b/drivers/pinctrl/pinctrl_ti_k3.c index e4e4f6289ab..2387c8b77fc 100644 --- a/drivers/pinctrl/pinctrl_ti_k3.c +++ b/drivers/pinctrl/pinctrl_ti_k3.c @@ -9,22 +9,18 @@ #include #include -#define PINCTRL_NODE DT_NODELABEL(pinctrl) - -static struct pinctrl_ti_k3_dev_data { +struct pinctrl_ti_k3_data { DEVICE_MMIO_RAM; -} pinctrl_ti_k3_dev; +}; -static struct pinctrl_ti_k3_cfg_data { +struct pinctrl_ti_k3_cfg { DEVICE_MMIO_ROM; -} pinctrl_ti_k3_cfg = { - DEVICE_MMIO_ROM_INIT(PINCTRL_NODE) }; int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg) { ARG_UNUSED(reg); - const struct device *dev = DEVICE_DT_GET(PINCTRL_NODE); + const struct device *dev = pins->dev; uintptr_t virt_reg_base = DEVICE_MMIO_GET(dev); for (uint8_t i = 0; i < pin_cnt; i++) { @@ -40,11 +36,13 @@ static int pinctrl_ti_k3_init(const struct device *dev) return 0; } -DEVICE_DT_DEFINE(PINCTRL_NODE, - pinctrl_ti_k3_init, - NULL, - &pinctrl_ti_k3_dev, - &pinctrl_ti_k3_cfg, - PRE_KERNEL_1, - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - NULL); +#define PINCTRL_TI_K3_INIT(n) \ + static struct pinctrl_ti_k3_data pinctrl_ti_k3_data_##n; \ + static struct pinctrl_ti_k3_cfg pinctrl_ti_k3_cfg_##n = { \ + DEVICE_MMIO_ROM_INIT(DT_DRV_INST(n)), \ + }; \ + DEVICE_DT_INST_DEFINE(n, &pinctrl_ti_k3_init, NULL, &pinctrl_ti_k3_data_##n, \ + &pinctrl_ti_k3_cfg_##n, PRE_KERNEL_1, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, NULL); + +DT_INST_FOREACH_STATUS_OKAY(PINCTRL_TI_K3_INIT) diff --git a/soc/ti/k3/am6x/pinctrl_soc.h b/soc/ti/k3/am6x/pinctrl_soc.h index 055215db7f2..56795419fca 100644 --- a/soc/ti/k3/am6x/pinctrl_soc.h +++ b/soc/ti/k3/am6x/pinctrl_soc.h @@ -15,6 +15,7 @@ extern "C" { #endif struct pinctrl_soc_pin { + const struct device *dev; uint32_t offset; uint32_t value; }; @@ -23,6 +24,7 @@ typedef struct pinctrl_soc_pin pinctrl_soc_pin_t; #define TI_K3_DT_PIN(node_id) \ { \ + .dev = DEVICE_DT_GET(DT_PARENT(node_id)), \ .offset = DT_PROP_BY_IDX(node_id, pinmux, 0), \ .value = DT_PROP_BY_IDX(node_id, pinmux, 1) \ },