Line data Source code
1 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 1 : #define SAM_PINCTRL_FLAGS_DEFAULT (0U)
81 0 : #define SAM_PINCTRL_FLAGS_POS (0U)
82 0 : #define SAM_PINCTRL_FLAGS_MASK (0x3F << SAM_PINCTRL_FLAGS_POS)
83 0 : #define SAM_PINCTRL_FLAG_MASK (1U)
84 0 : #define SAM_PINCTRL_PULLUP_POS (SAM_PINCTRL_FLAGS_POS)
85 0 : #define SAM_PINCTRL_PULLUP (1U << SAM_PINCTRL_PULLUP_POS)
86 0 : #define SAM_PINCTRL_PULLDOWN_POS (SAM_PINCTRL_PULLUP_POS + 1U)
87 0 : #define SAM_PINCTRL_PULLDOWN (1U << SAM_PINCTRL_PULLDOWN_POS)
88 0 : #define SAM_PINCTRL_OPENDRAIN_POS (SAM_PINCTRL_PULLDOWN_POS + 1U)
89 0 : #define SAM_PINCTRL_OPENDRAIN (1U << SAM_PINCTRL_OPENDRAIN_POS)
90 0 : #define SAM_PINCTRL_INPUTENABLE_POS (SAM_PINCTRL_OPENDRAIN_POS + 1U)
91 0 : #define SAM_PINCTRL_INPUTENABLE (1U << SAM_PINCTRL_INPUTENABLE_POS)
92 0 : #define SAM_PINCTRL_OUTPUTENABLE_POS (SAM_PINCTRL_INPUTENABLE_POS + 1U)
93 0 : #define SAM_PINCTRL_OUTPUTENABLE (1U << SAM_PINCTRL_OUTPUTENABLE_POS)
94 0 : #define SAM_PINCTRL_DRIVESTRENGTH_POS (SAM_PINCTRL_OUTPUTENABLE_POS + 1U)
95 0 : #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 1 : #define SAM_PINCTRL_FLAG_GET(pincfg, pos) \
106 : (((pincfg) >> pos) & SAM_PINCTRL_FLAG_MASK)
107 :
108 0 : #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_ */
|