1 /* 2 * Copyright (c) 2020 Linaro Ltd. 3 * Copyright (c) 2021 Nordic Semiconductor ASA 4 * Copyright (c) 2021 Microchip Technology Inc. 5 * 6 * SPDX-License-Identifier: Apache-2.0 7 */ 8 9 /** 10 * @file 11 * Microchip XEC SoC specific helpers for pinctrl driver 12 */ 13 14 #ifndef ZEPHYR_SOC_ARM_MICROCHIP_XEC_COMMON_PINCTRL_SOC_H_ 15 #define ZEPHYR_SOC_ARM_MICROCHIP_XEC_COMMON_PINCTRL_SOC_H_ 16 17 #include <zephyr/devicetree.h> 18 #include <zephyr/types.h> 19 20 #include <zephyr/dt-bindings/pinctrl/mchp-xec-pinctrl.h> 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 /** @cond INTERNAL_HIDDEN */ 27 28 /* Type for MCHP XEC pin. */ 29 typedef uint32_t pinctrl_soc_pin_t; 30 31 /* initialize pinmux member fields of pinctrl_pin_t */ 32 #define Z_PINCTRL_MCHP_XEC_PINMUX_INIT(node_id) (uint32_t)(DT_PROP(node_id, pinmux)) 33 34 #ifdef CONFIG_HAS_MEC5_HAL 35 #define Z_PINCTRL_STATE_PINCFG_INIT(node_id) \ 36 ((DT_PROP(node_id, bias_disable) << MCHP_XEC_NO_PUD_POS) | \ 37 (DT_PROP(node_id, bias_pull_down) << MCHP_XEC_PD_POS) | \ 38 (DT_PROP(node_id, bias_pull_up) << MCHP_XEC_PU_POS) | \ 39 (DT_PROP(node_id, drive_push_pull) << MCHP_XEC_PUSH_PULL_POS) | \ 40 (DT_PROP(node_id, drive_open_drain) << MCHP_XEC_OPEN_DRAIN_POS) | \ 41 (DT_PROP(node_id, output_disable) << MCHP_XEC_OUT_DIS_POS) | \ 42 (DT_PROP(node_id, output_enable) << MCHP_XEC_OUT_EN_POS) | \ 43 (DT_PROP(node_id, output_high) << MCHP_XEC_OUT_HI_POS) | \ 44 (DT_PROP(node_id, output_low) << MCHP_XEC_OUT_LO_POS) | \ 45 (DT_PROP(node_id, low_power_enable) << MCHP_XEC_PIN_LOW_POWER_POS) | \ 46 (DT_PROP(node_id, microchip_output_func_invert) << MCHP_XEC_FUNC_INV_POS) | \ 47 (DT_ENUM_IDX_OR(node_id, slew_rate, 0x3) << MCHP_XEC_SLEW_RATE_POS) | \ 48 (DT_ENUM_IDX_OR(node_id, drive_strength, 0x7) << MCHP_XEC_DRV_STR_POS)) 49 #else 50 #define Z_PINCTRL_STATE_PINCFG_INIT(node_id) \ 51 ((DT_PROP(node_id, bias_disable) << MCHP_XEC_NO_PUD_POS) | \ 52 (DT_PROP(node_id, bias_pull_down) << MCHP_XEC_PD_POS) | \ 53 (DT_PROP(node_id, bias_pull_up) << MCHP_XEC_PU_POS) | \ 54 (DT_PROP(node_id, drive_push_pull) << MCHP_XEC_PUSH_PULL_POS) | \ 55 (DT_PROP(node_id, drive_open_drain) << MCHP_XEC_OPEN_DRAIN_POS) | \ 56 (DT_PROP(node_id, output_disable) << MCHP_XEC_OUT_DIS_POS) | \ 57 (DT_PROP(node_id, output_enable) << MCHP_XEC_OUT_EN_POS) | \ 58 (DT_PROP(node_id, output_high) << MCHP_XEC_OUT_HI_POS) | \ 59 (DT_PROP(node_id, output_low) << MCHP_XEC_OUT_LO_POS) | \ 60 (DT_PROP(node_id, low_power_enable) << MCHP_XEC_PIN_LOW_POWER_POS) | \ 61 (DT_PROP(node_id, microchip_output_func_invert) << MCHP_XEC_FUNC_INV_POS) | \ 62 (DT_ENUM_IDX(node_id, slew_rate) << MCHP_XEC_SLEW_RATE_POS) | \ 63 (DT_ENUM_IDX(node_id, drive_strength) << MCHP_XEC_DRV_STR_POS)) 64 #endif 65 66 /* initialize pin structure members */ 67 #define Z_PINCTRL_STATE_PIN_INIT(node_id, state_prop, idx) \ 68 (Z_PINCTRL_MCHP_XEC_PINMUX_INIT(DT_PROP_BY_IDX(node_id, state_prop, idx)) | \ 69 Z_PINCTRL_STATE_PINCFG_INIT(DT_PROP_BY_IDX(node_id, state_prop, idx))), 70 71 /* Use DT FOREACH macro to initialize each used pin */ 72 #define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \ 73 {DT_FOREACH_PROP_ELEM(node_id, prop, Z_PINCTRL_STATE_PIN_INIT)} 74 75 /** @endcond */ 76 77 #ifdef __cplusplus 78 } 79 #endif 80 81 #endif /* ZEPHYR_SOC_ARM_MICROCHIP_XEC_COMMON_PINCTRL_SOC_H_ */ 82