1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Machine interface for the pinctrl subsystem.
4 *
5 * Copyright (C) 2011 ST-Ericsson SA
6 * Written on behalf of Linaro for ST-Ericsson
7 * Based on bits of regulator core, gpio core and clk core
8 *
9 * Author: Linus Walleij <linus.walleij@linaro.org>
10 */
11#ifndef __LINUX_PINCTRL_MACHINE_H
12#define __LINUX_PINCTRL_MACHINE_H
13
14#include <linux/array_size.h>
15
16#include <linux/pinctrl/pinctrl-state.h>
17
18enum pinctrl_map_type {
19	PIN_MAP_TYPE_INVALID,
20	PIN_MAP_TYPE_DUMMY_STATE,
21	PIN_MAP_TYPE_MUX_GROUP,
22	PIN_MAP_TYPE_CONFIGS_PIN,
23	PIN_MAP_TYPE_CONFIGS_GROUP,
24};
25
26/**
27 * struct pinctrl_map_mux - mapping table content for MAP_TYPE_MUX_GROUP
28 * @group: the name of the group whose mux function is to be configured. This
29 *	field may be left NULL, and the first applicable group for the function
30 *	will be used.
31 * @function: the mux function to select for the group
32 */
33struct pinctrl_map_mux {
34	const char *group;
35	const char *function;
36};
37
38/**
39 * struct pinctrl_map_configs - mapping table content for MAP_TYPE_CONFIGS_*
40 * @group_or_pin: the name of the pin or group whose configuration parameters
41 *	are to be configured.
42 * @configs: a pointer to an array of config parameters/values to program into
43 *	hardware. Each individual pin controller defines the format and meaning
44 *	of config parameters.
45 * @num_configs: the number of entries in array @configs
46 */
47struct pinctrl_map_configs {
48	const char *group_or_pin;
49	unsigned long *configs;
50	unsigned int num_configs;
51};
52
53/**
54 * struct pinctrl_map - boards/machines shall provide this map for devices
55 * @dev_name: the name of the device using this specific mapping, the name
56 *	must be the same as in your struct device*. If this name is set to the
57 *	same name as the pin controllers own dev_name(), the map entry will be
58 *	hogged by the driver itself upon registration
59 * @name: the name of this specific map entry for the particular machine.
60 *	This is the parameter passed to pinmux_lookup_state()
61 * @type: the type of mapping table entry
62 * @ctrl_dev_name: the name of the device controlling this specific mapping,
63 *	the name must be the same as in your struct device*. This field is not
64 *	used for PIN_MAP_TYPE_DUMMY_STATE
65 * @data: Data specific to the mapping type
66 */
67struct pinctrl_map {
68	const char *dev_name;
69	const char *name;
70	enum pinctrl_map_type type;
71	const char *ctrl_dev_name;
72	union {
73		struct pinctrl_map_mux mux;
74		struct pinctrl_map_configs configs;
75	} data;
76};
77
78/* Convenience macros to create mapping table entries */
79
80#define PIN_MAP_DUMMY_STATE(dev, state) \
81	{								\
82		.dev_name = dev,					\
83		.name = state,						\
84		.type = PIN_MAP_TYPE_DUMMY_STATE,			\
85	}
86
87#define PIN_MAP_MUX_GROUP(dev, state, pinctrl, grp, func)		\
88	{								\
89		.dev_name = dev,					\
90		.name = state,						\
91		.type = PIN_MAP_TYPE_MUX_GROUP,				\
92		.ctrl_dev_name = pinctrl,				\
93		.data.mux = {						\
94			.group = grp,					\
95			.function = func,				\
96		},							\
97	}
98
99#define PIN_MAP_MUX_GROUP_DEFAULT(dev, pinctrl, grp, func)		\
100	PIN_MAP_MUX_GROUP(dev, PINCTRL_STATE_DEFAULT, pinctrl, grp, func)
101
102#define PIN_MAP_MUX_GROUP_HOG(dev, state, grp, func)			\
103	PIN_MAP_MUX_GROUP(dev, state, dev, grp, func)
104
105#define PIN_MAP_MUX_GROUP_HOG_DEFAULT(dev, grp, func)			\
106	PIN_MAP_MUX_GROUP(dev, PINCTRL_STATE_DEFAULT, dev, grp, func)
107
108#define PIN_MAP_CONFIGS_PIN(dev, state, pinctrl, pin, cfgs)		\
109	{								\
110		.dev_name = dev,					\
111		.name = state,						\
112		.type = PIN_MAP_TYPE_CONFIGS_PIN,			\
113		.ctrl_dev_name = pinctrl,				\
114		.data.configs = {					\
115			.group_or_pin = pin,				\
116			.configs = cfgs,				\
117			.num_configs = ARRAY_SIZE(cfgs),		\
118		},							\
119	}
120
121#define PIN_MAP_CONFIGS_PIN_DEFAULT(dev, pinctrl, pin, cfgs)		\
122	PIN_MAP_CONFIGS_PIN(dev, PINCTRL_STATE_DEFAULT, pinctrl, pin, cfgs)
123
124#define PIN_MAP_CONFIGS_PIN_HOG(dev, state, pin, cfgs)			\
125	PIN_MAP_CONFIGS_PIN(dev, state, dev, pin, cfgs)
126
127#define PIN_MAP_CONFIGS_PIN_HOG_DEFAULT(dev, pin, cfgs)			\
128	PIN_MAP_CONFIGS_PIN(dev, PINCTRL_STATE_DEFAULT, dev, pin, cfgs)
129
130#define PIN_MAP_CONFIGS_GROUP(dev, state, pinctrl, grp, cfgs)		\
131	{								\
132		.dev_name = dev,					\
133		.name = state,						\
134		.type = PIN_MAP_TYPE_CONFIGS_GROUP,			\
135		.ctrl_dev_name = pinctrl,				\
136		.data.configs = {					\
137			.group_or_pin = grp,				\
138			.configs = cfgs,				\
139			.num_configs = ARRAY_SIZE(cfgs),		\
140		},							\
141	}
142
143#define PIN_MAP_CONFIGS_GROUP_DEFAULT(dev, pinctrl, grp, cfgs)		\
144	PIN_MAP_CONFIGS_GROUP(dev, PINCTRL_STATE_DEFAULT, pinctrl, grp, cfgs)
145
146#define PIN_MAP_CONFIGS_GROUP_HOG(dev, state, grp, cfgs)		\
147	PIN_MAP_CONFIGS_GROUP(dev, state, dev, grp, cfgs)
148
149#define PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(dev, grp, cfgs)		\
150	PIN_MAP_CONFIGS_GROUP(dev, PINCTRL_STATE_DEFAULT, dev, grp, cfgs)
151
152struct pinctrl_map;
153
154#ifdef CONFIG_PINCTRL
155
156extern int pinctrl_register_mappings(const struct pinctrl_map *map,
157				     unsigned int num_maps);
158extern void pinctrl_unregister_mappings(const struct pinctrl_map *map);
159extern void pinctrl_provide_dummies(void);
160#else
161
162static inline int pinctrl_register_mappings(const struct pinctrl_map *map,
163					    unsigned int num_maps)
164{
165	return 0;
166}
167
168static inline void pinctrl_unregister_mappings(const struct pinctrl_map *map)
169{
170}
171
172static inline void pinctrl_provide_dummies(void)
173{
174}
175#endif /* !CONFIG_PINCTRL */
176#endif
177