diff --git a/drivers/pinctrl/CMakeLists.txt b/drivers/pinctrl/CMakeLists.txt index 5a37d70c2cc..cc5d1c18a53 100644 --- a/drivers/pinctrl/CMakeLists.txt +++ b/drivers/pinctrl/CMakeLists.txt @@ -8,6 +8,7 @@ zephyr_library_sources_ifdef(CONFIG_PINCTRL_TELINK_B91 pinctrl_b91.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_AMBIQ pinctrl_ambiq.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_ARM_MPS2 pinctrl_arm_mps2.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_ARM_MPS3 pinctrl_arm_mps3.c) +zephyr_library_sources_ifdef(CONFIG_PINCTRL_ARM_V2M_BEETLE pinctrl_arm_v2m_beetle.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_GD32_AF pinctrl_gd32_af.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_GD32_AFIO pinctrl_gd32_afio.c) zephyr_library_sources_ifdef(CONFIG_PINCTRL_ITE_IT8XXX2 pinctrl_ite_it8xxx2.c) diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index 3f993bd4ee7..95dcd8d67d4 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig @@ -38,6 +38,7 @@ source "drivers/pinctrl/Kconfig.b91" source "drivers/pinctrl/Kconfig.ambiq" source "drivers/pinctrl/Kconfig.arm_mps2" source "drivers/pinctrl/Kconfig.arm_mps3" +source "drivers/pinctrl/Kconfig.arm_v2m_beetle" source "drivers/pinctrl/Kconfig.gd32" source "drivers/pinctrl/Kconfig.it8xxx2" source "drivers/pinctrl/Kconfig.npcx" diff --git a/drivers/pinctrl/Kconfig.arm_v2m_beetle b/drivers/pinctrl/Kconfig.arm_v2m_beetle new file mode 100644 index 00000000000..218ea123011 --- /dev/null +++ b/drivers/pinctrl/Kconfig.arm_v2m_beetle @@ -0,0 +1,9 @@ +# Copyright 2025 Arm Limited and/or its affiliates +# SPDX-License-Identifier: Apache-2.0 + +config PINCTRL_ARM_V2M_BEETLE + bool "Arm V2M Beetle pin controller driver" + default y + depends on DT_HAS_ARM_V2M_BEETLE_PINCTRL_ENABLED + help + Arm MPS2 V2M Beetle driver diff --git a/drivers/pinctrl/pinctrl_arm_v2m_beetle.c b/drivers/pinctrl/pinctrl_arm_v2m_beetle.c new file mode 100644 index 00000000000..47fba5a6a2b --- /dev/null +++ b/drivers/pinctrl/pinctrl_arm_v2m_beetle.c @@ -0,0 +1,44 @@ +/* + * Copyright 2025 Arm Limited and/or its affiliates + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "zephyr/device.h" +#include "zephyr/drivers/gpio.h" +#include +#include +#include + +#define EXPANSION_SHIELD_POWER_ENABLE_MASK BIT(15) + +static const struct device *const gpio_ports[] = {DEVICE_DT_GET_OR_NULL(DT_NODELABEL(gpio0)), + DEVICE_DT_GET_OR_NULL(DT_NODELABEL(gpio1))}; + +static int pinctrl_configure_pin(const pinctrl_soc_pin_t *pin) +{ + uint32_t flags = pin->input_enable ? GPIO_INPUT : GPIO_OUTPUT; + + /* Each gpio has 16 pins, so divide by 16 to get specific gpio*/ + const struct device *gpio_dev = gpio_ports[pin->pin_num >> 4]; + + return cmsdk_ahb_gpio_config(gpio_dev, pin->pin_num % 16, flags); +} + +int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg) +{ + ARG_UNUSED(reg); + for (uint8_t i = 0U; i < pin_cnt; i++) { + if (pinctrl_configure_pin(pins++) == -ENOTSUP) { + return -ENOTSUP; + } + } + + const struct gpio_cmsdk_ahb_cfg *const cfg = gpio_ports[1]->config; + /* Set the ARD_PWR_EN GPIO1[15] as an output */ + cfg->port->outenableset |= EXPANSION_SHIELD_POWER_ENABLE_MASK; + /* Set on 3v3 (for ARDUINO HDR compliance) */ + cfg->port->data |= EXPANSION_SHIELD_POWER_ENABLE_MASK; + + return 0; +} diff --git a/dts/bindings/pinctrl/arm,v2m_beetle-pinctrl.yaml b/dts/bindings/pinctrl/arm,v2m_beetle-pinctrl.yaml new file mode 100644 index 00000000000..0581c6f9693 --- /dev/null +++ b/dts/bindings/pinctrl/arm,v2m_beetle-pinctrl.yaml @@ -0,0 +1,40 @@ +# Copyright 2025 Arm Limited and/or its affiliates +# SPDX-License-Identifier: Apache-2.0 + +description: | + The node has the 'pinctrl' node label set in your SoC's devicetree, + so you can modify it like this: + + &pinctrl { + /* your modifications go here */ + }; + + All device pin configurations should be placed in child nodes of the + 'pinctrl' node, as shown in this example: + + /* You can put this in places like a board-pinctrl.dtsi file in + * your board directory, or a devicetree overlay in your application. + */ + +compatible: "arm,v2m_beetle-pinctrl" + +include: base.yaml + +child-binding: + description: | + Definitions for a pinctrl state. + child-binding: + + include: + - name: pincfg-node.yaml + property-allowlist: + - input-enable + + properties: + pinmux: + required: true + type: array + description: | + An array of pins sharing the same group properties. Each + element of the array is an integer constructed from the + pin number and the alternative function of the pin. diff --git a/include/zephyr/dt-bindings/pinctrl/arm-v2m_beetle-pinctrl.h b/include/zephyr/dt-bindings/pinctrl/arm-v2m_beetle-pinctrl.h new file mode 100644 index 00000000000..0dcf30b9f20 --- /dev/null +++ b/include/zephyr/dt-bindings/pinctrl/arm-v2m_beetle-pinctrl.h @@ -0,0 +1,49 @@ +/* + * Copyright 2025 Arm Limited and/or its affiliates + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#define V2M_BEETLE_ALT_FUNC_POS 0 +#define V2M_BEETLE_ALT_FUNC_MASK 0x7 + +#define V2M_BEETLE_EXP_NUM_POS 3 +#define V2M_BEETLE_EXP_NUM_MASK 0x1F8 + +#define V2M_BEETLE_PINCTRL_FUNC_UART 0 +#define V2M_BEETLE_PINCTRL_FUNC_GPIO 1 +#define V2M_BEETLE_PINCTRL_FUNC_I2C 2 +#define V2M_BEETLE_PINCTRL_FUNC_SPI 3 +#define V2M_BEETLE_PINCTRL_FUNC_QSPI 4 + +#define V2M_BEETLE_PINMUX(alt_func, exp_num) (exp_num << V2M_BEETLE_EXP_NUM_POS | \ + alt_func << V2M_BEETLE_ALT_FUNC_POS) + + + +/* GPIO 0 */ +#define UART0_RXD_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_UART, 0) +#define UART0_TXD_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_UART, 1) +#define SPI0_SS_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_SPI, 10) +#define SPI0_MOSI_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_SPI, 11) +#define SPI0_MISO_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_SPI, 12) +#define SPI0_SCK_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_SPI, 13) +#define SBCON0_SDA_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_I2C, 14) +#define SBCON0_SCL_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_I2C, 15) + +/* GPIO 1 */ +#define UART1_RXD_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_UART, 16) +#define UART1_TXD_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_UART, 17) +#define SPI1_SS_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_SPI, 18) +#define SPI1_MOSI_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_SPI, 19) +#define SPI1_MISO_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_SPI, 20) +#define SPI1_SCK_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_SPI, 21) +#define SBCON1_SDA_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_I2C, 22) +#define SBCON1_SCL_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_I2C, 23) +#define QSPI_CS2_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_QSPI, 24) +#define QSPI_CS1_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_QSPI, 25) +#define QSPI_IOF0_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_QSPI, 26) +#define QSPI_IOF1_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_QSPI, 27) +#define QSPI_IOF2_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_QSPI, 28) +#define QSPI_IOF3_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_QSPI, 29) +#define QSPI_SCK_EXP V2M_BEETLE_PINMUX(V2M_BEETLE_PINCTRL_FUNC_QSPI, 30) diff --git a/soc/arm/beetle/pinctrl_soc.h b/soc/arm/beetle/pinctrl_soc.h new file mode 100644 index 00000000000..b515a8a0255 --- /dev/null +++ b/soc/arm/beetle/pinctrl_soc.h @@ -0,0 +1,51 @@ +/* + * Copyright 2025 Arm Limited and/or its affiliates + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +/** + * @brief Type to hold a pin's pinctrl configuration. + */ +struct beetle_pinctrl_soc_pin { + /** Pin number 0..52 */ + uint32_t pin_num : 6; + /** Alternative function (UART, SPI, etc.) */ + uint32_t alt_func : 3; + /** Enable the pin as an input */ + uint32_t input_enable : 1; +}; + +typedef struct beetle_pinctrl_soc_pin pinctrl_soc_pin_t; + +/** + * @brief Utility macro to initialize each pin. + * + * @param node_id Node identifier. + * @param prop Property name. + * @param idx Property entry index. + */ +#define Z_PINCTRL_STATE_PIN_INIT(node_id, prop, idx) \ + { \ + BEETLE_GET_PIN_NUM(DT_PROP_BY_IDX(node_id, prop, idx)), \ + BEETLE_GET_PIN_ALT_FUNC(DT_PROP_BY_IDX(node_id, prop, idx)), \ + DT_PROP(node_id, input_enable), \ + }, + +/** + * @brief Utility macro to initialize state pins contained in a given property. + * + * @param node_id Node identifier. + * @param prop Property name describing state pins. + */ +#define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \ + {DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop), \ + DT_FOREACH_PROP_ELEM, pinmux, \ + Z_PINCTRL_STATE_PIN_INIT)} + +#define BEETLE_GET_PIN_NUM(pinctrl) \ + (((pinctrl) >> V2M_BEETLE_EXP_NUM_POS) & V2M_BEETLE_EXP_NUM_MASK) +#define BEETLE_GET_PIN_ALT_FUNC(pinctrl) \ + (((pinctrl) >> V2M_BEETLE_ALT_FUNC_POS) & V2M_BEETLE_ALT_FUNC_MASK)