diff --git a/drivers/pinmux/pinmux_stm32.h b/drivers/pinmux/pinmux_stm32.h index 77e854a91eb..6606b83cb85 100644 --- a/drivers/pinmux/pinmux_stm32.h +++ b/drivers/pinmux/pinmux_stm32.h @@ -37,26 +37,21 @@ struct soc_gpio_pinctrl { * value */ #define STM32_DT_PINMUX_PORT(__pin) \ - (((__pin) >> 12) & 0xf) + (((__pin) >> STM32_PORT_SHIFT) & STM32_PORT_MASK) /** * @brief helper to extract IO pin number from STM32_PINMUX() encoded * value */ #define STM32_DT_PINMUX_LINE(__pin) \ - (((__pin) >> 8) & 0xf) + (((__pin) >> STM32_LINE_SHIFT) & STM32_LINE_MASK) /** * @brief helper to extract IO pin func from STM32_PINMUX() encoded * value */ -#if DT_HAS_COMPAT_STATUS_OKAY(st_stm32f1_pinctrl) #define STM32_DT_PINMUX_FUNC(__pin) \ - (((__pin) >> 6) & 0x3) -#else -#define STM32_DT_PINMUX_FUNC(__pin) \ - ((__pin) & 0xff) -#endif + (((__pin) >> STM32_MODE_SHIFT) & STM32_MODE_MASK) #if DT_HAS_COMPAT_STATUS_OKAY(st_stm32f1_pinctrl) /** @@ -64,7 +59,7 @@ struct soc_gpio_pinctrl { * value */ #define STM32_DT_PINMUX_REMAP(__pin) \ - ((__pin) & 0x1fU) + (((__pin) >> STM32_REMAP_SHIFT) & STM32_REMAP_MASK) #endif /** diff --git a/include/dt-bindings/pinctrl/stm32-pinctrl.h b/include/dt-bindings/pinctrl/stm32-pinctrl.h index 5f868c21fb0..39629cf9031 100644 --- a/include/dt-bindings/pinctrl/stm32-pinctrl.h +++ b/include/dt-bindings/pinctrl/stm32-pinctrl.h @@ -35,11 +35,34 @@ /** * @brief Macro to generate pinmux int using port, pin number and mode arguments - * This is taken from Linux equivalent st,stm32f429-pinctrl binding + * This is inspired from Linux equivalent st,stm32f429-pinctrl binding */ -#define PIN_NO(port, line) (((port) - 'A') * 0x10 + (line)) -#define STM32_PINMUX(port, line, mode) (((PIN_NO(port, line)) << 8) | (STM32_ ## mode)) +/** + * @brief Pin configuration configuration bit field. + * + * Fields: + * + * - mode [ 0 : 4 ] + * - line [ 5 : 8 ] + * - port [ 9 : 12 ] + * + * @param port Port ('A'..'K') + * @param line Pin (0..15) + * @param mode Mode (ANALOG, GPIO_IN, ALTERNATE). + */ + +#define STM32_MODE_SHIFT 0U +#define STM32_MODE_MASK 0x1FU +#define STM32_LINE_SHIFT 5U +#define STM32_LINE_MASK 0xFU +#define STM32_PORT_SHIFT 9U +#define STM32_PORT_MASK 0xFU + +#define STM32_PINMUX(port, line, mode) \ + (((((port) - 'A') & STM32_PORT_MASK) << STM32_PORT_SHIFT) | \ + (((line) & STM32_LINE_MASK) << STM32_LINE_SHIFT) | \ + (((STM32_ ## mode) & STM32_MODE_MASK) << STM32_MODE_SHIFT)) /** * @brief PIN configuration bitfield diff --git a/include/dt-bindings/pinctrl/stm32f1-pinctrl.h b/include/dt-bindings/pinctrl/stm32f1-pinctrl.h index 3de61cc5e45..d68d9b85df6 100644 --- a/include/dt-bindings/pinctrl/stm32f1-pinctrl.h +++ b/include/dt-bindings/pinctrl/stm32f1-pinctrl.h @@ -16,9 +16,36 @@ * This is adapted from Linux equivalent st,stm32f429-pinctrl binding */ -#define PIN_NO(port, line) (((port) - 'A') * 0x10 + (line)) -#define STM32F1_PINMUX(port, line, mode, remap) \ - (((PIN_NO(port, line)) << 8) | (mode << 6) | (remap)) +/** + * @brief Pin configuration configuration bit field. + * + * Fields: + * + * - mode [ 0 : 1 ] + * - line [ 2 : 5 ] + * - port [ 6 : 9 ] + * - remap [ 10 : 12 ] + * + * @param port Port ('A'..'K') + * @param line Pin (0..15) + * @param mode Pin mode (ANALOG, GPIO_IN, ALTERNATE). + * @param remap Pin remapping configuration (NO_REMAP, REMAP_1, ...) + */ + +#define STM32_MODE_SHIFT 0U +#define STM32_MODE_MASK 0x3U +#define STM32_LINE_SHIFT 2U +#define STM32_LINE_MASK 0xFU +#define STM32_PORT_SHIFT 6U +#define STM32_PORT_MASK 0xFU +#define STM32_REMAP_SHIFT 10U +#define STM32_REMAP_MASK 0x1FU + +#define STM32F1_PINMUX(port, line, mode, remap) \ + (((((port) - 'A') & STM32_PORT_MASK) << STM32_PORT_SHIFT) | \ + (((line) & STM32_LINE_MASK) << STM32_LINE_SHIFT) | \ + (((mode) & STM32_MODE_MASK) << STM32_MODE_SHIFT) | \ + (((remap) & STM32_REMAP_MASK) << STM32_REMAP_SHIFT)) /** * @brief Pin modes