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