diff --git a/drivers/pinctrl/pinctrl_silabs_dbus.c b/drivers/pinctrl/pinctrl_silabs_dbus.c index 022ce27e18c..edca73d6db4 100644 --- a/drivers/pinctrl/pinctrl_silabs_dbus.c +++ b/drivers/pinctrl/pinctrl_silabs_dbus.c @@ -37,7 +37,9 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp (pins[i].base_offset * sizeof(mem_addr_t)); route_reg = enable_reg + (pins[i].route_offset * sizeof(mem_addr_t)); - sys_write32(pins[i].port | FIELD_PREP(PIN_MASK, pins[i].pin), route_reg); + if (pins[i].route_offset != SILABS_PINCTRL_UNUSED) { + sys_write32(pins[i].port | FIELD_PREP(PIN_MASK, pins[i].pin), route_reg); + } if (pins[i].en_bit != SILABS_PINCTRL_UNUSED) { if (pins[i].mode == gpioModeDisabled) { diff --git a/include/zephyr/dt-bindings/pinctrl/silabs-pinctrl-dbus.h b/include/zephyr/dt-bindings/pinctrl/silabs-pinctrl-dbus.h index e42879a91c3..c28d87432af 100644 --- a/include/zephyr/dt-bindings/pinctrl/silabs-pinctrl-dbus.h +++ b/include/zephyr/dt-bindings/pinctrl/silabs-pinctrl-dbus.h @@ -13,7 +13,8 @@ * * 31 : Whether the configuration represents an analog pin * If digital (bit 31 == 0): - * 30..29: Reserved + * 30 : Reserved + * 29 : Route register presence (fixed routes have no route register) * 28..24: Route register offset in words from peripheral config (offset of ROUTE * register in GPIO_ROUTE_TypeDef) * 23..19: Enable bit (offset into ROUTEEN register for given function) @@ -35,6 +36,7 @@ #define SILABS_PINCTRL_HAVE_EN_MASK 0x00040000UL #define SILABS_PINCTRL_EN_BIT_MASK 0x00F80000UL #define SILABS_PINCTRL_ROUTE_MASK 0x1F000000UL +#define SILABS_PINCTRL_HAVE_ROUTE_MASK 0x20000000UL #define SILABS_PINCTRL_ANALOG_MASK 0x80000000UL #define SILABS_PINCTRL_ABUS_BUS_MASK 0x0000C000UL @@ -50,7 +52,16 @@ FIELD_PREP(SILABS_PINCTRL_PERIPH_BASE_MASK, periph_base) | \ FIELD_PREP(SILABS_PINCTRL_HAVE_EN_MASK, en_present) | \ FIELD_PREP(SILABS_PINCTRL_EN_BIT_MASK, en_bit) | \ - FIELD_PREP(SILABS_PINCTRL_ROUTE_MASK, route)) + FIELD_PREP(SILABS_PINCTRL_ROUTE_MASK, route) | \ + FIELD_PREP(SILABS_PINCTRL_HAVE_ROUTE_MASK, 1)) + +#define SILABS_FIXED_ROUTE(port, pin, periph_base, en_bit) \ + (FIELD_PREP(SILABS_PINCTRL_GPIO_PORT_MASK, port) | \ + FIELD_PREP(SILABS_PINCTRL_GPIO_PIN_MASK, pin) | \ + FIELD_PREP(SILABS_PINCTRL_PERIPH_BASE_MASK, periph_base) | \ + FIELD_PREP(SILABS_PINCTRL_HAVE_EN_MASK, 1) | \ + FIELD_PREP(SILABS_PINCTRL_EN_BIT_MASK, en_bit) | \ + FIELD_PREP(SILABS_PINCTRL_HAVE_ROUTE_MASK, 0)) #define SILABS_ABUS(bus, parity, peripheral) \ (FIELD_PREP(SILABS_PINCTRL_ANALOG_MASK, 1) | \ diff --git a/include/zephyr/dt-bindings/pinctrl/silabs/xg21-pinctrl.h b/include/zephyr/dt-bindings/pinctrl/silabs/xg21-pinctrl.h index cc29205712d..6dbaafd2576 100644 --- a/include/zephyr/dt-bindings/pinctrl/silabs/xg21-pinctrl.h +++ b/include/zephyr/dt-bindings/pinctrl/silabs/xg21-pinctrl.h @@ -107,6 +107,14 @@ #define SILABS_DBUS_USART2_TX(port, pin) SILABS_DBUS(port, pin, 107, 1, 4, 6) #define SILABS_DBUS_USART2_CTS(port, pin) SILABS_DBUS(port, pin, 107, 0, 0, 2) +#define GPIO_SWCLKTCK_PA1 SILABS_FIXED_ROUTE(0x0, 0x1, 0, 0) +#define GPIO_SWDIOTMS_PA2 SILABS_FIXED_ROUTE(0x0, 0x2, 0, 1) +#define GPIO_TDO_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 0, 2) +#define GPIO_TDI_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 0, 3) +#define GPIO_SWV_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 0) +#define GPIO_TRACECLK_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 1, 1) +#define GPIO_TRACEDATA0_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 2) + #define ACMP0_ACMPOUT_PA0 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x0) #define ACMP0_ACMPOUT_PA1 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x1) #define ACMP0_ACMPOUT_PA2 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x2) diff --git a/include/zephyr/dt-bindings/pinctrl/silabs/xg22-pinctrl.h b/include/zephyr/dt-bindings/pinctrl/silabs/xg22-pinctrl.h index 900b1ea2e42..e4629b1c6b2 100644 --- a/include/zephyr/dt-bindings/pinctrl/silabs/xg22-pinctrl.h +++ b/include/zephyr/dt-bindings/pinctrl/silabs/xg22-pinctrl.h @@ -123,6 +123,14 @@ #define SILABS_DBUS_USART1_TX(port, pin) SILABS_DBUS(port, pin, 127, 1, 4, 6) #define SILABS_DBUS_USART1_CTS(port, pin) SILABS_DBUS(port, pin, 127, 0, 0, 2) +#define GPIO_SWCLKTCK_PA1 SILABS_FIXED_ROUTE(0x0, 0x1, 0, 0) +#define GPIO_SWDIOTMS_PA2 SILABS_FIXED_ROUTE(0x0, 0x2, 0, 1) +#define GPIO_TDO_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 0, 2) +#define GPIO_TDI_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 0, 3) +#define GPIO_SWV_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 0) +#define GPIO_TRACECLK_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 1, 1) +#define GPIO_TRACEDATA0_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 2) + #define CMU_CLKOUT0_PC0 SILABS_DBUS_CMU_CLKOUT0(0x2, 0x0) #define CMU_CLKOUT0_PC1 SILABS_DBUS_CMU_CLKOUT0(0x2, 0x1) #define CMU_CLKOUT0_PC2 SILABS_DBUS_CMU_CLKOUT0(0x2, 0x2) diff --git a/include/zephyr/dt-bindings/pinctrl/silabs/xg23-pinctrl.h b/include/zephyr/dt-bindings/pinctrl/silabs/xg23-pinctrl.h index b8ca05d3dd3..d1ec5a99b59 100644 --- a/include/zephyr/dt-bindings/pinctrl/silabs/xg23-pinctrl.h +++ b/include/zephyr/dt-bindings/pinctrl/silabs/xg23-pinctrl.h @@ -169,6 +169,17 @@ #define SILABS_DBUS_USART0_TX(port, pin) SILABS_DBUS(port, pin, 214, 1, 4, 6) #define SILABS_DBUS_USART0_CTS(port, pin) SILABS_DBUS(port, pin, 214, 0, 0, 2) +#define GPIO_SWCLKTCK_PA1 SILABS_FIXED_ROUTE(0x0, 0x1, 0, 0) +#define GPIO_SWDIOTMS_PA2 SILABS_FIXED_ROUTE(0x0, 0x2, 0, 1) +#define GPIO_TDO_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 0, 2) +#define GPIO_TDI_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 0, 3) +#define GPIO_SWV_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 0) +#define GPIO_TRACECLK_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 1, 1) +#define GPIO_TRACEDATA0_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 2) +#define GPIO_TRACEDATA1_PA5 SILABS_FIXED_ROUTE(0x0, 0x5, 1, 3) +#define GPIO_TRACEDATA2_PA6 SILABS_FIXED_ROUTE(0x0, 0x6, 1, 4) +#define GPIO_TRACEDATA3_PA7 SILABS_FIXED_ROUTE(0x0, 0x7, 1, 5) + #define ACMP0_ACMPOUT_PA0 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x0) #define ACMP0_ACMPOUT_PA1 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x1) #define ACMP0_ACMPOUT_PA2 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x2) diff --git a/include/zephyr/dt-bindings/pinctrl/silabs/xg24-pinctrl.h b/include/zephyr/dt-bindings/pinctrl/silabs/xg24-pinctrl.h index ff67fc06fc7..85eb32c8a91 100644 --- a/include/zephyr/dt-bindings/pinctrl/silabs/xg24-pinctrl.h +++ b/include/zephyr/dt-bindings/pinctrl/silabs/xg24-pinctrl.h @@ -152,6 +152,17 @@ #define SILABS_DBUS_USART0_TX(port, pin) SILABS_DBUS(port, pin, 184, 1, 4, 6) #define SILABS_DBUS_USART0_CTS(port, pin) SILABS_DBUS(port, pin, 184, 0, 0, 2) +#define GPIO_SWCLKTCK_PA1 SILABS_FIXED_ROUTE(0x0, 0x1, 0, 0) +#define GPIO_SWDIOTMS_PA2 SILABS_FIXED_ROUTE(0x0, 0x2, 0, 1) +#define GPIO_TDO_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 0, 2) +#define GPIO_TDI_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 0, 3) +#define GPIO_SWV_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 0) +#define GPIO_TRACECLK_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 1, 1) +#define GPIO_TRACEDATA0_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 2) +#define GPIO_TRACEDATA1_PA5 SILABS_FIXED_ROUTE(0x0, 0x5, 1, 3) +#define GPIO_TRACEDATA2_PA6 SILABS_FIXED_ROUTE(0x0, 0x6, 1, 4) +#define GPIO_TRACEDATA3_PA7 SILABS_FIXED_ROUTE(0x0, 0x7, 1, 5) + #define ACMP0_ACMPOUT_PA0 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x0) #define ACMP0_ACMPOUT_PA1 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x1) #define ACMP0_ACMPOUT_PA2 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x2) diff --git a/include/zephyr/dt-bindings/pinctrl/silabs/xg27-pinctrl.h b/include/zephyr/dt-bindings/pinctrl/silabs/xg27-pinctrl.h index 90932d52e74..098313cadcf 100644 --- a/include/zephyr/dt-bindings/pinctrl/silabs/xg27-pinctrl.h +++ b/include/zephyr/dt-bindings/pinctrl/silabs/xg27-pinctrl.h @@ -127,6 +127,17 @@ #define SILABS_DBUS_USART1_TX(port, pin) SILABS_DBUS(port, pin, 133, 1, 4, 6) #define SILABS_DBUS_USART1_CTS(port, pin) SILABS_DBUS(port, pin, 133, 0, 0, 2) +#define GPIO_SWCLKTCK_PA1 SILABS_FIXED_ROUTE(0x0, 0x1, 0, 0) +#define GPIO_SWDIOTMS_PA2 SILABS_FIXED_ROUTE(0x0, 0x2, 0, 1) +#define GPIO_TDO_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 0, 2) +#define GPIO_TDI_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 0, 3) +#define GPIO_SWV_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 0) +#define GPIO_TRACECLK_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 1, 1) +#define GPIO_TRACEDATA0_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 2) +#define GPIO_TRACEDATA1_PA5 SILABS_FIXED_ROUTE(0x0, 0x5, 1, 3) +#define GPIO_TRACEDATA2_PA6 SILABS_FIXED_ROUTE(0x0, 0x6, 1, 4) +#define GPIO_TRACEDATA3_PA7 SILABS_FIXED_ROUTE(0x0, 0x7, 1, 5) + #define ACMP0_ACMPOUT_PA0 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x0) #define ACMP0_ACMPOUT_PA1 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x1) #define ACMP0_ACMPOUT_PA2 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x2) diff --git a/include/zephyr/dt-bindings/pinctrl/silabs/xg29-pinctrl.h b/include/zephyr/dt-bindings/pinctrl/silabs/xg29-pinctrl.h index 2bb51bb9a90..d8a478a7b67 100644 --- a/include/zephyr/dt-bindings/pinctrl/silabs/xg29-pinctrl.h +++ b/include/zephyr/dt-bindings/pinctrl/silabs/xg29-pinctrl.h @@ -134,6 +134,17 @@ #define SILABS_DBUS_USART1_TX(port, pin) SILABS_DBUS(port, pin, 141, 1, 4, 6) #define SILABS_DBUS_USART1_CTS(port, pin) SILABS_DBUS(port, pin, 141, 0, 0, 2) +#define GPIO_SWCLKTCK_PA1 SILABS_FIXED_ROUTE(0x0, 0x1, 0, 0) +#define GPIO_SWDIOTMS_PA2 SILABS_FIXED_ROUTE(0x0, 0x2, 0, 1) +#define GPIO_TDO_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 0, 2) +#define GPIO_TDI_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 0, 3) +#define GPIO_SWV_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 0) +#define GPIO_TRACECLK_PA4 SILABS_FIXED_ROUTE(0x0, 0x4, 1, 1) +#define GPIO_TRACEDATA0_PA3 SILABS_FIXED_ROUTE(0x0, 0x3, 1, 2) +#define GPIO_TRACEDATA1_PA5 SILABS_FIXED_ROUTE(0x0, 0x5, 1, 3) +#define GPIO_TRACEDATA2_PA6 SILABS_FIXED_ROUTE(0x0, 0x6, 1, 4) +#define GPIO_TRACEDATA3_PA7 SILABS_FIXED_ROUTE(0x0, 0x7, 1, 5) + #define ACMP0_ACMPOUT_PA0 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x0) #define ACMP0_ACMPOUT_PA1 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x1) #define ACMP0_ACMPOUT_PA2 SILABS_DBUS_ACMP0_ACMPOUT(0x0, 0x2) diff --git a/soc/silabs/common/pinctrl_soc.h b/soc/silabs/common/pinctrl_soc.h index 9b4d27c9a54..079c056c636 100644 --- a/soc/silabs/common/pinctrl_soc.h +++ b/soc/silabs/common/pinctrl_soc.h @@ -74,7 +74,10 @@ typedef struct pinctrl_soc_pin { (FIELD_GET(SILABS_PINCTRL_HAVE_EN_MASK, DT_PROP_BY_IDX(node, prop, idx)) \ ? FIELD_GET(SILABS_PINCTRL_EN_BIT_MASK, DT_PROP_BY_IDX(node, prop, idx)) \ : SILABS_PINCTRL_UNUSED), \ - .route_offset = FIELD_GET(SILABS_PINCTRL_ROUTE_MASK, DT_PROP_BY_IDX(node, prop, idx)), \ + .route_offset = \ + (FIELD_GET(SILABS_PINCTRL_HAVE_ROUTE_MASK, DT_PROP_BY_IDX(node, prop, idx)) \ + ? FIELD_GET(SILABS_PINCTRL_ROUTE_MASK, DT_PROP_BY_IDX(node, prop, idx)) \ + : SILABS_PINCTRL_UNUSED), \ .mode = Z_PINCTRL_SILABS_MODE_INIT(node), \ .dout = Z_PINCTRL_SILABS_DOUT_INIT(node)},