Zephyr Project API  3.2.0
A Scalable Open Source RTOS
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
11#ifndef ZEPHYR_INCLUDE_DRIVERS_PINCTRL_H_
12#define ZEPHYR_INCLUDE_DRIVERS_PINCTRL_H_
13
21#include <zephyr/device.h>
22#include <zephyr/devicetree.h>
24#include <pinctrl_soc.h>
25#include <zephyr/sys/util.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
38#define PINCTRL_STATE_DEFAULT 0U
40#define PINCTRL_STATE_SLEEP 1U
41
43#define PINCTRL_STATE_PRIV_START 2U
44
50 const pinctrl_soc_pin_t *pins;
55};
56
59#if defined(CONFIG_PINCTRL_STORE_REG) || defined(__DOXYGEN__)
65#endif /* defined(CONFIG_PINCTRL_STORE_REG) || defined(__DOXYGEN__) */
67 const struct pinctrl_state *states;
70};
71
73#define PINCTRL_REG_NONE 0U
74
77#ifndef CONFIG_PM_DEVICE
79#define PINCTRL_SKIP_SLEEP 1
80#endif
81
88#define Z_PINCTRL_STATE_ID(state_idx, node_id) \
89 _CONCAT(PINCTRL_STATE_, \
90 DT_PINCTRL_IDX_TO_NAME_UPPER_TOKEN(node_id, state_idx))
91
98#define Z_PINCTRL_DEV_CONFIG_NAME(node_id) \
99 _CONCAT(__pinctrl_dev_config, DEVICE_DT_NAME_GET(node_id))
100
107#define Z_PINCTRL_STATES_NAME(node_id) \
108 _CONCAT(__pinctrl_states, DEVICE_DT_NAME_GET(node_id))
109
117#define Z_PINCTRL_STATE_PINS_NAME(state_idx, node_id) \
118 _CONCAT(__pinctrl_state_pins_ ## state_idx, DEVICE_DT_NAME_GET(node_id))
119
131#define Z_PINCTRL_SKIP_STATE(state_idx, node_id) \
132 _CONCAT(PINCTRL_SKIP_, \
133 DT_PINCTRL_IDX_TO_NAME_UPPER_TOKEN(node_id, state_idx))
134
141#define Z_PINCTRL_STATE_PINS_DEFINE(state_idx, node_id) \
142 COND_CODE_1(Z_PINCTRL_SKIP_STATE(state_idx, node_id), (), \
143 (static const pinctrl_soc_pin_t \
144 Z_PINCTRL_STATE_PINS_NAME(state_idx, node_id)[] = \
145 Z_PINCTRL_STATE_PINS_INIT(node_id, pinctrl_ ## state_idx)))
146
153#define Z_PINCTRL_STATE_INIT(state_idx, node_id) \
154 COND_CODE_1(Z_PINCTRL_SKIP_STATE(state_idx, node_id), (), \
155 ({ \
156 .id = Z_PINCTRL_STATE_ID(state_idx, node_id), \
157 .pins = Z_PINCTRL_STATE_PINS_NAME(state_idx, node_id), \
158 .pin_cnt = ARRAY_SIZE(Z_PINCTRL_STATE_PINS_NAME(state_idx, \
159 node_id)) \
160 }))
161
167#define Z_PINCTRL_STATES_DEFINE(node_id) \
168 static const struct pinctrl_state \
169 Z_PINCTRL_STATES_NAME(node_id)[] = { \
170 LISTIFY(DT_NUM_PINCTRL_STATES(node_id), \
171 Z_PINCTRL_STATE_INIT, (,), node_id) \
172 };
173
174#ifdef CONFIG_PINCTRL_STORE_REG
180#define Z_PINCTRL_DEV_CONFIG_INIT(node_id) \
181 { \
182 .reg = DT_REG_ADDR(node_id), \
183 .states = Z_PINCTRL_STATES_NAME(node_id), \
184 .state_cnt = ARRAY_SIZE(Z_PINCTRL_STATES_NAME(node_id)), \
185 }
186#else
187#define Z_PINCTRL_DEV_CONFIG_INIT(node_id) \
188 { \
189 .states = Z_PINCTRL_STATES_NAME(node_id), \
190 .state_cnt = ARRAY_SIZE(Z_PINCTRL_STATES_NAME(node_id)), \
191 }
192#endif
193
194#ifdef CONFIG_PINCTRL_NON_STATIC
195#define Z_PINCTRL_DEV_CONFIG_STATIC
196#else
197#define Z_PINCTRL_DEV_CONFIG_STATIC static
198#endif
199
200#ifdef CONFIG_PINCTRL_DYNAMIC
201#define Z_PINCTRL_DEV_CONFIG_CONST
202#else
203#define Z_PINCTRL_DEV_CONFIG_CONST const
204#endif
205
208#if defined(CONFIG_PINCTRL_NON_STATIC) || defined(__DOXYGEN__)
221#define PINCTRL_DT_DEV_CONFIG_DECLARE(node_id) \
222 extern Z_PINCTRL_DEV_CONFIG_CONST struct pinctrl_dev_config \
223 Z_PINCTRL_DEV_CONFIG_NAME(node_id)
224#endif /* defined(CONFIG_PINCTRL_NON_STATIC) || defined(__DOXYGEN__) */
225
237#define PINCTRL_DT_DEFINE(node_id) \
238 LISTIFY(DT_NUM_PINCTRL_STATES(node_id), \
239 Z_PINCTRL_STATE_PINS_DEFINE, (;), node_id); \
240 Z_PINCTRL_STATES_DEFINE(node_id) \
241 Z_PINCTRL_DEV_CONFIG_STATIC Z_PINCTRL_DEV_CONFIG_CONST \
242 struct pinctrl_dev_config Z_PINCTRL_DEV_CONFIG_NAME(node_id) = \
243 Z_PINCTRL_DEV_CONFIG_INIT(node_id)
244
252#define PINCTRL_DT_INST_DEFINE(inst) PINCTRL_DT_DEFINE(DT_DRV_INST(inst))
253
260#define PINCTRL_DT_DEV_CONFIG_GET(node_id) &Z_PINCTRL_DEV_CONFIG_NAME(node_id)
261
270#define PINCTRL_DT_INST_DEV_CONFIG_GET(inst) \
271 PINCTRL_DT_DEV_CONFIG_GET(DT_DRV_INST(inst))
272
284 const struct pinctrl_state **state);
285
302int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt,
303 uintptr_t reg);
304
315 const struct pinctrl_dev_config *config,
316 const struct pinctrl_state *state)
317{
318 uintptr_t reg;
319
320#ifdef CONFIG_PINCTRL_STORE_REG
321 reg = config->reg;
322#else
323 ARG_UNUSED(config);
324 reg = PINCTRL_REG_NONE;
325#endif
326
327 return pinctrl_configure_pins(state->pins, state->pin_cnt, reg);
328}
329
340static inline int pinctrl_apply_state(const struct pinctrl_dev_config *config,
341 uint8_t id)
342{
343 int ret;
344 const struct pinctrl_state *state;
345
346 ret = pinctrl_lookup_state(config, id, &state);
347 if (ret < 0) {
348 return ret;
349 }
350
351 return pinctrl_apply_state_direct(config, state);
352}
353
354#if defined(CONFIG_PINCTRL_DYNAMIC) || defined(__DOXYGEN__)
372#define PINCTRL_DT_STATE_PINS_DEFINE(node_id, prop) \
373 static const pinctrl_soc_pin_t prop ## _pins[] = \
374 Z_PINCTRL_STATE_PINS_INIT(node_id, prop); \
375
411#define PINCTRL_DT_STATE_INIT(prop, state) \
412 { \
413 .id = state, \
414 .pins = prop ## _pins, \
415 .pin_cnt = ARRAY_SIZE(prop ## _pins) \
416 }
417
436 const struct pinctrl_state *states,
437 uint8_t state_cnt);
438
440#else
441static inline int pinctrl_update_states(
442 struct pinctrl_dev_config *config,
443 const struct pinctrl_state *states, uint8_t state_cnt)
444{
445 ARG_UNUSED(config);
446 ARG_UNUSED(states);
447 ARG_UNUSED(state_cnt);
448 return -ENOSYS;
449}
450#endif /* defined(CONFIG_PINCTRL_DYNAMIC) || defined(__DOXYGEN__) */
451
452#ifdef __cplusplus
453}
454#endif
455
460#endif /* ZEPHYR_INCLUDE_DRIVERS_PINCTRL_H_ */
Devicetree pin control helpers.
Devicetree main header.
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:340
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:314
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
Definition: pinctrl.h:73
#define ENOSYS
Definition: errno.h:83
state
Definition: http_parser_state.h:29
static ZTEST_BMEM volatile int ret
Definition: k_float_disable.c:28
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINTPTR_TYPE__ uintptr_t
Definition: stdint.h:105
Definition: pinctrl.h:58
uint8_t state_cnt
Definition: pinctrl.h:69
const struct pinctrl_state * states
Definition: pinctrl.h:67
uintptr_t reg
Definition: pinctrl.h:64
Definition: pinctrl.h:48
const pinctrl_soc_pin_t * pins
Definition: pinctrl.h:50
uint8_t pin_cnt
Definition: pinctrl.h:52
uint8_t id
Definition: pinctrl.h:54
Misc utilities.