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 <a-singh7@ti.com>
This commit is contained in:
Amneesh Singh 2025-03-13 16:29:33 +05:30 committed by Daniel DeGrasse
commit 9814590eb3
2 changed files with 16 additions and 16 deletions

View file

@ -9,22 +9,18 @@
#include <zephyr/arch/cpu.h>
#include <zephyr/drivers/pinctrl.h>
#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)

View file

@ -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) \
},