1 /*
2  * Copyright (c) 2024 Texas Instruments Incorporated
3  * Copyright (c) 2024 BayLibre, SAS
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #ifndef TI_SIMPLELINK_CC23X0_SOC_PINCTRL_H_
9 #define TI_SIMPLELINK_CC23X0_SOC_PINCTRL_H_
10 
11 #include <zephyr/types.h>
12 
13 /* IO enabling/disabling */
14 #define IOC_INPUT_ENABLE  BIT(29)
15 #define IOC_INPUT_DISABLE 0U
16 #define IOC_HYST_ENABLE   BIT(30)
17 #define IOC_HYST_DISABLE  0U
18 
19 /* IO modes */
20 #define IOC_IOMODE_NORMAL            0U
21 #define IOC_IOMODE_INV               BIT(24)
22 #define IOC_IOMODE_OPEN_DRAIN_NORMAL BIT(25)
23 #define IOC_IOMODE_OPEN_DRAIN_INV    GENMASK(25, 24)
24 #define IOC_IOMODE_OPEN_SRC_NORMAL   BIT(26)
25 #define IOC_IOMODE_OPEN_SRC_INV      (BIT(26) | BIT(24))
26 
27 /* IO pull */
28 #define IOC_NO_IOPULL   0U
29 #define IOC_IOPULL_UP   BIT(14)
30 #define IOC_IOPULL_DOWN BIT(13)
31 
32 typedef struct pinctrl_soc_pin {
33 	uint32_t pin;
34 	uint32_t iofunc;
35 	uint32_t iomode;
36 } pinctrl_soc_pin_t;
37 
38 /* Convert DT flags to SoC flags */
39 #define CC23X0_PIN_FLAGS(node_id)                                                                  \
40 	(DT_PROP(node_id, bias_pull_up) * IOC_IOPULL_UP |                                          \
41 	 DT_PROP(node_id, bias_pull_down) * IOC_IOPULL_DOWN |                                      \
42 	 DT_PROP(node_id, bias_disable) * IOC_NO_IOPULL |                                          \
43 	 DT_PROP(node_id, drive_open_drain) * IOC_IOMODE_OPEN_DRAIN_NORMAL |                       \
44 	 DT_PROP(node_id, drive_open_source) * IOC_IOMODE_OPEN_SRC_NORMAL |                        \
45 	 DT_PROP(node_id, input_enable) * IOC_INPUT_ENABLE |                                       \
46 	 DT_PROP(node_id, input_schmitt_enable) * IOC_HYST_ENABLE)
47 
48 #define CC23X0_DT_PIN(node_id)                                                                     \
49 	{.pin = DT_PROP_BY_IDX(node_id, pinmux, 0),                                                \
50 	 .iofunc = DT_PROP_BY_IDX(node_id, pinmux, 1),                                             \
51 	 .iomode = CC23X0_PIN_FLAGS(node_id)},
52 
53 #define Z_PINCTRL_STATE_PIN_INIT(node_id, prop, idx)                                               \
54 	CC23X0_DT_PIN(DT_PROP_BY_IDX(node_id, prop, idx))
55 
56 #define Z_PINCTRL_STATE_PINS_INIT(node_id, prop)                                                   \
57 	{DT_FOREACH_PROP_ELEM(node_id, prop, Z_PINCTRL_STATE_PIN_INIT)}
58 
59 #endif /* TI_SIMPLELINK_CC23X0_SOC_PINCTRL_H_ */
60