1 /*
2  * Copyright 2022 NXP
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_SOC_ARM_NXP_LPC_11U6X_PINCTRL_SOC_H_
8 #define ZEPHYR_SOC_ARM_NXP_LPC_11U6X_PINCTRL_SOC_H_
9 
10 #include <zephyr/devicetree.h>
11 #include <zephyr/types.h>
12 #include <soc.h>
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 /** @cond INTERNAL_HIDDEN */
19 
20 typedef uint32_t pinctrl_soc_pin_t;
21 
22 #define Z_PINCTRL_IOCON_PINCFG(node_id)						\
23 	(IF_ENABLED(DT_PROP(node_id, bias_pull_down), (IOCON_PIO_MODE(0x1) |))	\
24 	IF_ENABLED(DT_PROP(node_id, bias_pull_up), (IOCON_PIO_MODE(0x2) |))	\
25 	IF_ENABLED(DT_PROP(node_id, drive_push_pull), (IOCON_PIO_MODE(0x3) |))	\
26 	IOCON_PIO_HYS(DT_PROP(node_id, input_schmitt_enable)) |			\
27 	IOCON_PIO_INVERT(DT_PROP(node_id, nxp_invert)) |			\
28 	IOCON_PIO_OD(DT_PROP(node_id, drive_open_drain)) |			\
29 	IOCON_PIO_SMODE(DT_ENUM_IDX(node_id, nxp_digital_filter)) |		\
30 	IOCON_PIO_CLKDIV(DT_ENUM_IDX(node_id, nxp_filter_clock_div)) |		\
31 	IOCON_PIO_ADMODE(!DT_PROP(node_id, nxp_analog_mode)) |			\
32 	IOCON_PIO_FILTER(DT_PROP(node_id, nxp_disable_analog_filter)) |		\
33 	IOCON_PIO_I2CMODE(!DT_PROP(node_id, nxp_i2c_mode)) |			\
34 	IOCON_PIO_I2CMODE((DT_ENUM_IDX_OR(node_id, nxp_i2c_filter, 0) << 1)))
35 
36 /* Mask for digital type pin configuration register */
37 #define Z_PINCTRL_IOCON_D_PIN_MASK (IOCON_PIO_FUNC_MASK |			\
38 	IOCON_PIO_MODE_MASK | IOCON_PIO_HYS_MASK | IOCON_PIO_INVERT_MASK |	\
39 	IOCON_PIO_OD_MASK | IOCON_PIO_SMODE_MASK | IOCON_PIO_CLKDIV_MASK)
40 
41 /* Mask for analog type pin configuration register */
42 #define Z_PINCTRL_IOCON_A_PIN_MASK						\
43 	(Z_PINCTRL_IOCON_D_PIN_MASK | IOCON_PIO_ADMODE_MASK |			\
44 	IOCON_PIO_FILTER_MASK)
45 
46 /* Mask for i2c type pin configuration register */
47 #define Z_PINCTRL_IOCON_I_PIN_MASK (IOCON_PIO_FUNC_MASK |			\
48 	IOCON_PIO_I2CMODE_MASK | IOCON_PIO_SMODE_MASK | IOCON_PIO_CLKDIV_MASK)
49 
50 #define Z_PINCTRL_STATE_PIN_INIT(group, pin_prop, idx)				\
51 	DT_PROP_BY_IDX(group, pin_prop, idx) | Z_PINCTRL_IOCON_PINCFG(group),
52 
53 /**
54  * @brief Utility macro to initialize state pins contained in a given property.
55  *
56  * @param node_id Node identifier.
57  * @param prop Property name describing state pins.
58  */
59 #define Z_PINCTRL_STATE_PINS_INIT(node_id, prop)			       \
60 	{DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop),		       \
61 				DT_FOREACH_PROP_ELEM, pinmux,		       \
62 				Z_PINCTRL_STATE_PIN_INIT)}
63 
64 #ifdef __cplusplus
65 }
66 #endif
67 
68 #endif /* ZEPHYR_SOC_ARM_NXP_LPC_11U6X_PINCTRL_SOC_H_ */
69