Zephyr Project API 4.2.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
pinctrl.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 Nordic Semiconductor ASA
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
12#ifndef ZEPHYR_INCLUDE_DRIVERS_PINCTRL_H_
13#define ZEPHYR_INCLUDE_DRIVERS_PINCTRL_H_
14
24#include <errno.h>
25
26#include <zephyr/device.h>
27#include <zephyr/devicetree.h>
29#include <pinctrl_soc.h>
30#include <zephyr/sys/util.h>
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
43#define PINCTRL_STATE_DEFAULT 0U
45#define PINCTRL_STATE_SLEEP 1U
46
48#define PINCTRL_STATE_PRIV_START 2U
49
61
64#if defined(CONFIG_PINCTRL_STORE_REG) || defined(__DOXYGEN__)
70#endif /* defined(CONFIG_PINCTRL_STORE_REG) || defined(__DOXYGEN__) */
72 const struct pinctrl_state *states;
75};
76
78#define PINCTRL_REG_NONE 0U
79
82#if !defined(CONFIG_PINCTRL_KEEP_SLEEP_STATE)
84#define PINCTRL_SKIP_SLEEP 1
85#endif
86
93#define Z_PINCTRL_STATE_ID(state_idx, node_id) \
94 _CONCAT(PINCTRL_STATE_, \
95 DT_PINCTRL_IDX_TO_NAME_UPPER_TOKEN(node_id, state_idx))
96
103#define Z_PINCTRL_DEV_CONFIG_NAME(node_id) \
104 _CONCAT(__pinctrl_dev_config, DEVICE_DT_NAME_GET(node_id))
105
112#define Z_PINCTRL_STATES_NAME(node_id) \
113 _CONCAT(__pinctrl_states, DEVICE_DT_NAME_GET(node_id))
114
122#define Z_PINCTRL_STATE_PINS_NAME(state_idx, node_id) \
123 _CONCAT(__pinctrl_state_pins_ ## state_idx, DEVICE_DT_NAME_GET(node_id))
124
136#define Z_PINCTRL_SKIP_STATE(state_idx, node_id) \
137 _CONCAT(PINCTRL_SKIP_, \
138 DT_PINCTRL_IDX_TO_NAME_UPPER_TOKEN(node_id, state_idx))
139
146#define Z_PINCTRL_STATE_PINS_DEFINE(state_idx, node_id) \
147 COND_CODE_1(Z_PINCTRL_SKIP_STATE(state_idx, node_id), (), \
148 (static const pinctrl_soc_pin_t \
149 Z_PINCTRL_STATE_PINS_NAME(state_idx, node_id)[] = \
150 Z_PINCTRL_STATE_PINS_INIT(node_id, pinctrl_ ## state_idx)))
151
158#define Z_PINCTRL_STATE_INIT(state_idx, node_id) \
159 COND_CODE_1(Z_PINCTRL_SKIP_STATE(state_idx, node_id), (), \
160 ({ \
161 .pins = Z_PINCTRL_STATE_PINS_NAME(state_idx, node_id), \
162 .pin_cnt = ARRAY_SIZE(Z_PINCTRL_STATE_PINS_NAME(state_idx, \
163 node_id)), \
164 .id = Z_PINCTRL_STATE_ID(state_idx, node_id) \
165 }))
166
172#define Z_PINCTRL_STATES_DEFINE(node_id) \
173 static const struct pinctrl_state \
174 Z_PINCTRL_STATES_NAME(node_id)[] = { \
175 LISTIFY(DT_NUM_PINCTRL_STATES(node_id), \
176 Z_PINCTRL_STATE_INIT, (,), node_id) \
177 };
178
179#ifdef CONFIG_PINCTRL_STORE_REG
185#define Z_PINCTRL_DEV_CONFIG_INIT(node_id) \
186 { \
187 .reg = DT_REG_ADDR(node_id), \
188 .states = Z_PINCTRL_STATES_NAME(node_id), \
189 .state_cnt = ARRAY_SIZE(Z_PINCTRL_STATES_NAME(node_id)), \
190 }
191#else
192#define Z_PINCTRL_DEV_CONFIG_INIT(node_id) \
193 { \
194 .states = Z_PINCTRL_STATES_NAME(node_id), \
195 .state_cnt = ARRAY_SIZE(Z_PINCTRL_STATES_NAME(node_id)), \
196 }
197#endif
198
199#ifdef CONFIG_PINCTRL_NON_STATIC
200#define Z_PINCTRL_DEV_CONFIG_STATIC
201#else
202#define Z_PINCTRL_DEV_CONFIG_STATIC static
203#endif
204
205#ifdef CONFIG_PINCTRL_DYNAMIC
206#define Z_PINCTRL_DEV_CONFIG_CONST
207#else
208#define Z_PINCTRL_DEV_CONFIG_CONST const
209#endif
210
213#if defined(CONFIG_PINCTRL_NON_STATIC) || defined(__DOXYGEN__)
226#define PINCTRL_DT_DEV_CONFIG_DECLARE(node_id) \
227 extern Z_PINCTRL_DEV_CONFIG_CONST struct pinctrl_dev_config \
228 Z_PINCTRL_DEV_CONFIG_NAME(node_id)
229#endif /* defined(CONFIG_PINCTRL_NON_STATIC) || defined(__DOXYGEN__) */
230
242#define PINCTRL_DT_DEFINE(node_id) \
243 LISTIFY(DT_NUM_PINCTRL_STATES(node_id), \
244 Z_PINCTRL_STATE_PINS_DEFINE, (;), node_id); \
245 Z_PINCTRL_STATES_DEFINE(node_id) \
246 Z_PINCTRL_DEV_CONFIG_STATIC Z_PINCTRL_DEV_CONFIG_CONST \
247 struct pinctrl_dev_config Z_PINCTRL_DEV_CONFIG_NAME(node_id) = \
248 Z_PINCTRL_DEV_CONFIG_INIT(node_id)
249
257#define PINCTRL_DT_INST_DEFINE(inst) PINCTRL_DT_DEFINE(DT_DRV_INST(inst))
258
265#define PINCTRL_DT_DEV_CONFIG_GET(node_id) &Z_PINCTRL_DEV_CONFIG_NAME(node_id)
266
275#define PINCTRL_DT_INST_DEV_CONFIG_GET(inst) \
276 PINCTRL_DT_DEV_CONFIG_GET(DT_DRV_INST(inst))
277
289 const struct pinctrl_state **state);
290
308 uintptr_t reg);
309
320 const struct pinctrl_dev_config *config,
321 const struct pinctrl_state *state)
322{
323 uintptr_t reg;
324
325#ifdef CONFIG_PINCTRL_STORE_REG
326 reg = config->reg;
327#else
328 ARG_UNUSED(config);
329 reg = PINCTRL_REG_NONE;
330#endif
331
332 return pinctrl_configure_pins(state->pins, state->pin_cnt, reg);
333}
334
345static inline int pinctrl_apply_state(const struct pinctrl_dev_config *config,
346 uint8_t id)
347{
348 int ret;
349 const struct pinctrl_state *state;
350
351 ret = pinctrl_lookup_state(config, id, &state);
352 if (ret < 0) {
353 return ret;
354 }
355
356 return pinctrl_apply_state_direct(config, state);
357}
358
359#if defined(CONFIG_PINCTRL_DYNAMIC) || defined(__DOXYGEN__)
377#define PINCTRL_DT_STATE_PINS_DEFINE(node_id, prop) \
378 static const pinctrl_soc_pin_t prop ## _pins[] = \
379 Z_PINCTRL_STATE_PINS_INIT(node_id, prop); \
380
416#define PINCTRL_DT_STATE_INIT(prop, state) \
417 { \
418 .pins = prop ## _pins, \
419 .pin_cnt = ARRAY_SIZE(prop ## _pins), \
420 .id = state \
421 }
422
441 const struct pinctrl_state *states,
442 uint8_t state_cnt);
443
445#else
446static inline int pinctrl_update_states(
447 struct pinctrl_dev_config *config,
448 const struct pinctrl_state *states, uint8_t state_cnt)
449{
450 ARG_UNUSED(config);
451 ARG_UNUSED(states);
452 ARG_UNUSED(state_cnt);
453 return -ENOSYS;
454}
455#endif /* defined(CONFIG_PINCTRL_DYNAMIC) || defined(__DOXYGEN__) */
456
457#ifdef __cplusplus
458}
459#endif
460
465#endif /* ZEPHYR_INCLUDE_DRIVERS_PINCTRL_H_ */
Devicetree pin control helpers.
Devicetree main header.
System error numbers.
int pinctrl_update_states(struct pinctrl_dev_config *config, const struct pinctrl_state *states, uint8_t state_cnt)
Update states with a new set.
static int pinctrl_apply_state(const struct pinctrl_dev_config *config, uint8_t id)
Apply a state from the given device configuration.
Definition pinctrl.h:345
int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg)
Configure a set of pins.
static int pinctrl_apply_state_direct(const struct pinctrl_dev_config *config, const struct pinctrl_state *state)
Apply a state directly from the provided state configuration.
Definition pinctrl.h:319
int pinctrl_lookup_state(const struct pinctrl_dev_config *config, uint8_t id, const struct pinctrl_state **state)
Find the state configuration for the given state id.
#define PINCTRL_REG_NONE
Utility macro to indicate no register is used.
Definition pinctrl.h:78
#define ENOSYS
Function not implemented.
Definition errno.h:82
state
Definition parser_state.h:29
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105
Pin controller configuration for a given device.
Definition pinctrl.h:63
uint8_t state_cnt
Number of state configurations.
Definition pinctrl.h:74
const struct pinctrl_state * states
List of state configurations.
Definition pinctrl.h:72
uintptr_t reg
Device address (only available if.
Definition pinctrl.h:69
Type for R-Car pin.
Definition pinctrl_rcar_common.h:38
Pin control state configuration.
Definition pinctrl.h:53
const pinctrl_soc_pin_t * pins
Pin configurations.
Definition pinctrl.h:55
uint8_t pin_cnt
Number of pin configurations.
Definition pinctrl.h:57
uint8_t id
State identifier (see PINCTRL_STATES).
Definition pinctrl.h:59
Misc utilities.