1 /*
2  * Copyright (c) 2023 IoT.bzh
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  */
7 
8 #ifndef ZEPHYR_SOC_ARM_RENESAS_RCAR_COMMON_PINCTRL_SOC_H_
9 #define ZEPHYR_SOC_ARM_RENESAS_RCAR_COMMON_PINCTRL_SOC_H_
10 
11 #include <zephyr/devicetree.h>
12 #include <zephyr/dt-bindings/pinctrl/renesas/pinctrl-rcar-common.h>
13 #include <stdint.h>
14 #include <zephyr/sys/util_macro.h>
15 
16 struct rcar_pin_func {
17 	uint8_t bank:5;      /* bank number 0 - 18 */
18 	uint8_t shift:5;     /* bit shift 0 - 28 */
19 	uint8_t func:4;      /* choice from 0x0 to 0xF */
20 };
21 
22 /** Pull-up, pull-down, or bias disable is requested */
23 #define RCAR_PIN_FLAGS_PULL_SET BIT(0)
24 /** Performs on/off control of the pull resistors */
25 #define RCAR_PIN_FLAGS_PUEN     BIT(1)
26 /** Select pull-up resistor if set pull-down otherwise */
27 #define RCAR_PIN_FLAGS_PUD      BIT(2)
28 /** Alternate function for the pin is requested */
29 #define RCAR_PIN_FLAGS_FUNC_SET BIT(3)
30 /** Ignore IPSR settings for alternate function pin */
31 #define RCAR_PIN_FLAGS_FUNC_DUMMY BIT(4)
32 
33 #define RCAR_PIN_PULL_UP      (RCAR_PIN_FLAGS_PULL_SET | RCAR_PIN_FLAGS_PUEN | RCAR_PIN_FLAGS_PUD)
34 #define RCAR_PIN_PULL_DOWN    (RCAR_PIN_FLAGS_PULL_SET | RCAR_PIN_FLAGS_PUEN)
35 #define RCAR_PIN_PULL_DISABLE  RCAR_PIN_FLAGS_PULL_SET
36 
37 /** Type for R-Car pin. */
38 typedef struct pinctrl_soc_pin {
39 	uint16_t pin;
40 	struct rcar_pin_func func;
41 	uint8_t flags;
42 	uint8_t drive_strength;
43 	uint8_t voltage;
44 } pinctrl_soc_pin_t;
45 
46 #define RCAR_IPSR(node_id) DT_PROP_BY_IDX(node_id, pin, 1)
47 #define RCAR_HAS_IPSR(node_id) DT_PROP_HAS_IDX(node_id, pin, 1)
48 
49 /* Offsets are defined in dt-bindings pinctrl-rcar-common.h */
50 #define RCAR_PIN_FUNC(node_id)			       \
51 	{					       \
52 		((RCAR_IPSR(node_id) >> 10U) & 0x1FU), \
53 		((RCAR_IPSR(node_id) >> 4U) & 0x1FU),  \
54 		((RCAR_IPSR(node_id) & 0xFU))	       \
55 	}
56 
57 #define RCAR_PIN_IS_FUNC_DUMMY(node_id)					       \
58 	((((RCAR_IPSR(node_id) >> 10U) & 0x1FU) == 0x1F) &&		       \
59 	 (((RCAR_IPSR(node_id) >> 4U) & 0x1FU) == 0x1F) &&		       \
60 	 ((RCAR_IPSR(node_id) & 0xFU) == 0xF))
61 
62 #define RCAR_PIN_FLAGS(node_id)						       \
63 	DT_PROP(node_id, bias_pull_up)   * RCAR_PIN_PULL_UP |		       \
64 	DT_PROP(node_id, bias_pull_down) * RCAR_PIN_PULL_DOWN |		       \
65 	DT_PROP(node_id, bias_disable)   * RCAR_PIN_PULL_DISABLE |	       \
66 	RCAR_HAS_IPSR(node_id) * RCAR_PIN_FLAGS_FUNC_SET |		       \
67 	RCAR_PIN_IS_FUNC_DUMMY(node_id) * RCAR_PIN_FLAGS_FUNC_DUMMY
68 
69 #define RCAR_DT_PIN(node_id)						       \
70 	{								       \
71 		.pin = DT_PROP_BY_IDX(node_id, pin, 0),			       \
72 		.func = COND_CODE_1(RCAR_HAS_IPSR(node_id),		       \
73 				    (RCAR_PIN_FUNC(node_id)), {0}),	       \
74 		.flags = RCAR_PIN_FLAGS(node_id),			       \
75 		.drive_strength =					       \
76 			COND_CODE_1(DT_NODE_HAS_PROP(node_id, drive_strength), \
77 				    (DT_PROP(node_id, drive_strength)), (0)),  \
78 		.voltage = COND_CODE_1(DT_NODE_HAS_PROP(node_id,	       \
79 							power_source),	       \
80 				       (DT_PROP(node_id, power_source)),       \
81 				       (PIN_VOLTAGE_NONE)),		       \
82 	},
83 
84 /**
85  * @brief Utility macro to initialize each pin.
86  *
87  * @param node_id Node identifier.
88  * @param state_prop State property name.
89  * @param idx State property entry index.
90  */
91 #define Z_PINCTRL_STATE_PIN_INIT(node_id, state_prop, idx) \
92 	RCAR_DT_PIN(DT_PROP_BY_IDX(node_id, state_prop, idx))
93 
94 /**
95  * @brief Utility macro to initialize state pins contained in a given property.
96  *
97  * @param node_id Node identifier.
98  * @param prop Property name describing state pins.
99  */
100 #define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \
101 	{ DT_FOREACH_PROP_ELEM(node_id, prop, Z_PINCTRL_STATE_PIN_INIT) }
102 
103 struct pfc_drive_reg_field {
104 	uint16_t pin;
105 	uint8_t offset;
106 	uint8_t size;
107 };
108 
109 struct pfc_drive_reg {
110 	uint32_t reg;
111 	const struct pfc_drive_reg_field fields[8];
112 };
113 
114 struct pfc_bias_reg {
115 	uint32_t puen;		/** Pull-enable or pull-up control register */
116 	uint32_t pud;		/** Pull-up/down or pull-down control register */
117 	const uint16_t pins[32];
118 };
119 
120 /**
121  * @brief Utility macro to check if a pin is GPIO capable
122  *
123  * @param pin
124  * @return true if pin is GPIO capable false otherwise
125  */
126 #define RCAR_IS_GP_PIN(pin) (pin < PIN_NOGPSR_START)
127 
128 #endif /* ZEPHYR_SOC_ARM_RENESAS_RCAR_COMMON_PINCTRL_SOC_H_ */
129