1 /* 2 * Copyright (c) 2022, Gerson Fernando Budke <nandojve@gmail.com> 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 /** 8 * @file 9 * Atmel SAM SoC specific helpers for pinctrl driver 10 */ 11 12 #ifndef ZEPHYR_INCLUDE_DRIVERS_PINCTRL_PINCTRL_SOC_SAM_COMMON_H_ 13 #define ZEPHYR_INCLUDE_DRIVERS_PINCTRL_PINCTRL_SOC_SAM_COMMON_H_ 14 15 #include <zephyr/devicetree.h> 16 #include <zephyr/types.h> 17 #include <dt-bindings/pinctrl/atmel_sam_pinctrl.h> 18 19 #ifdef __cplusplus 20 extern "C" { 21 #endif 22 23 /** @cond INTERNAL_HIDDEN */ 24 25 /** @brief Type for SAM pin. 26 * 27 * Bits: 28 * - 0-15: SAM pinmux bit field (@ref SAM_PINMUX). 29 * - 16-21: Pin flags bit field (@ref SAM_PINFLAGS). 30 * - 22-31: Reserved. 31 */ 32 typedef uint32_t pinctrl_soc_pin_t; 33 34 /** 35 * @brief Utility macro to initialize each pin. 36 * 37 * @param node_id Node identifier. 38 * @param prop Property name. 39 * @param idx Property entry index. 40 */ 41 #if defined(CONFIG_SOC_FAMILY_ATMEL_SAM) 42 #define Z_PINCTRL_STATE_PIN_INIT(node_id, prop, idx) \ 43 ((DT_PROP_BY_IDX(node_id, prop, idx) << SAM_PINCTRL_PINMUX_POS) \ 44 | (DT_PROP(node_id, bias_pull_up) << SAM_PINCTRL_PULLUP_POS) \ 45 | (DT_PROP(node_id, bias_pull_down) << SAM_PINCTRL_PULLDOWN_POS) \ 46 | (DT_PROP(node_id, drive_open_drain) << SAM_PINCTRL_OPENDRAIN_POS) \ 47 ), 48 #else /* CONFIG_SOC_FAMILY_ATMEL_SAM0 */ 49 #define Z_PINCTRL_STATE_PIN_INIT(node_id, prop, idx) \ 50 ((DT_PROP_BY_IDX(node_id, prop, idx) << SAM_PINCTRL_PINMUX_POS) \ 51 | (DT_PROP(node_id, bias_pull_up) << SAM_PINCTRL_PULLUP_POS) \ 52 | (DT_PROP(node_id, bias_pull_down) << SAM_PINCTRL_PULLDOWN_POS) \ 53 | (DT_PROP(node_id, input_enable) << SAM_PINCTRL_INPUTENABLE_POS) \ 54 | (DT_PROP(node_id, output_enable) << SAM_PINCTRL_OUTPUTENABLE_POS) \ 55 | (DT_ENUM_IDX(node_id, drive_strength) << SAM_PINCTRL_DRIVESTRENGTH_POS)\ 56 ), 57 #endif 58 59 /** 60 * @brief Utility macro to initialize state pins contained in a given property. 61 * 62 * @param node_id Node identifier. 63 * @param prop Property name describing state pins. 64 */ 65 #define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \ 66 {DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop), \ 67 DT_FOREACH_PROP_ELEM, pinmux, \ 68 Z_PINCTRL_STATE_PIN_INIT)} 69 70 /** @endcond */ 71 72 73 /** 74 * @brief Pin flags/attributes 75 * @anchor SAM_PINFLAGS 76 * 77 * @{ 78 */ 79 80 #define SAM_PINCTRL_FLAGS_DEFAULT (0U) 81 #define SAM_PINCTRL_FLAGS_POS (0U) 82 #define SAM_PINCTRL_FLAGS_MASK (0x3F << SAM_PINCTRL_FLAGS_POS) 83 #define SAM_PINCTRL_FLAG_MASK (1U) 84 #define SAM_PINCTRL_PULLUP_POS (SAM_PINCTRL_FLAGS_POS) 85 #define SAM_PINCTRL_PULLUP (1U << SAM_PINCTRL_PULLUP_POS) 86 #define SAM_PINCTRL_PULLDOWN_POS (SAM_PINCTRL_PULLUP_POS + 1U) 87 #define SAM_PINCTRL_PULLDOWN (1U << SAM_PINCTRL_PULLDOWN_POS) 88 #define SAM_PINCTRL_OPENDRAIN_POS (SAM_PINCTRL_PULLDOWN_POS + 1U) 89 #define SAM_PINCTRL_OPENDRAIN (1U << SAM_PINCTRL_OPENDRAIN_POS) 90 #define SAM_PINCTRL_INPUTENABLE_POS (SAM_PINCTRL_OPENDRAIN_POS + 1U) 91 #define SAM_PINCTRL_INPUTENABLE (1U << SAM_PINCTRL_INPUTENABLE_POS) 92 #define SAM_PINCTRL_OUTPUTENABLE_POS (SAM_PINCTRL_INPUTENABLE_POS + 1U) 93 #define SAM_PINCTRL_OUTPUTENABLE (1U << SAM_PINCTRL_OUTPUTENABLE_POS) 94 #define SAM_PINCTRL_DRIVESTRENGTH_POS (SAM_PINCTRL_OUTPUTENABLE_POS + 1U) 95 #define SAM_PINCTRL_DRIVESTRENGTH (1U << SAM_PINCTRL_DRIVESTRENGTH_POS) 96 97 /** @} */ 98 99 /** 100 * Obtain Flag value from pinctrl_soc_pin_t configuration. 101 * 102 * @param pincfg pinctrl_soc_pin_t bit field value. 103 * @param pos attribute/flags bit position (@ref SAM_PINFLAGS). 104 */ 105 #define SAM_PINCTRL_FLAG_GET(pincfg, pos) \ 106 (((pincfg) >> pos) & SAM_PINCTRL_FLAG_MASK) 107 108 #define SAM_PINCTRL_FLAGS_GET(pincfg) \ 109 (((pincfg) >> SAM_PINCTRL_FLAGS_POS) & SAM_PINCTRL_FLAGS_MASK) 110 111 #ifdef __cplusplus 112 } 113 #endif 114 115 #endif /* ZEPHYR_INCLUDE_DRIVERS_PINCTRL_PINCTRL_SOC_SAM_COMMON_H_ */ 116