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