blob: e987dc9fd2afb78fce6b833e0b358d37dbd61288 [file] [log] [blame]
Thomas Gleixneraf873fc2019-05-28 09:57:21 -07001/* SPDX-License-Identifier: GPL-2.0-only */
Linus Walleij2744e8a2011-05-02 20:50:54 +02002/*
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>
Linus Walleij2744e8a2011-05-02 20:50:54 +020010 */
Linus Walleije93bcee2012-02-09 07:23:28 +010011#ifndef __LINUX_PINCTRL_MACHINE_H
12#define __LINUX_PINCTRL_MACHINE_H
Linus Walleij2744e8a2011-05-02 20:50:54 +020013
Stephen Warren22f099d2012-03-16 14:54:23 -060014#include <linux/bug.h>
15
David Howellsa1ce3922012-10-02 18:01:25 +010016#include <linux/pinctrl/pinctrl-state.h>
Stephen Warren46919ae2012-03-01 18:48:32 -070017
Stephen Warren1e2082b2012-03-02 13:05:48 -070018enum 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 num_configs;
51};
52
Linus Walleij2744e8a2011-05-02 20:50:54 +020053/**
Linus Walleije93bcee2012-02-09 07:23:28 +010054 * struct pinctrl_map - boards/machines shall provide this map for devices
Stephen Warren806d3142012-02-23 17:04:39 -070055 * @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
Linus Walleij2744e8a2011-05-02 20:50:54 +020059 * @name: the name of this specific map entry for the particular machine.
Stephen Warren6e5e9592012-03-02 13:05:47 -070060 * This is the parameter passed to pinmux_lookup_state()
Stephen Warren1e2082b2012-03-02 13:05:48 -070061 * @type: the type of mapping table entry
Linus Walleij2744e8a2011-05-02 20:50:54 +020062 * @ctrl_dev_name: the name of the device controlling this specific mapping,
Stephen Warren1e2082b2012-03-02 13:05:48 -070063 * 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
Linus Walleij2744e8a2011-05-02 20:50:54 +020066 */
Linus Walleije93bcee2012-02-09 07:23:28 +010067struct pinctrl_map {
Stephen Warren806d3142012-02-23 17:04:39 -070068 const char *dev_name;
Linus Walleij2744e8a2011-05-02 20:50:54 +020069 const char *name;
Stephen Warren1e2082b2012-03-02 13:05:48 -070070 enum pinctrl_map_type type;
Linus Walleij2744e8a2011-05-02 20:50:54 +020071 const char *ctrl_dev_name;
Stephen Warren1e2082b2012-03-02 13:05:48 -070072 union {
73 struct pinctrl_map_mux mux;
74 struct pinctrl_map_configs configs;
75 } data;
Linus Walleij2744e8a2011-05-02 20:50:54 +020076};
77
Stephen Warren1e2082b2012-03-02 13:05:48 -070078/* Convenience macros to create mapping table entries */
Linus Walleij2744e8a2011-05-02 20:50:54 +020079
Stephen Warren1e2082b2012-03-02 13:05:48 -070080#define PIN_MAP_DUMMY_STATE(dev, state) \
81 { \
82 .dev_name = dev, \
83 .name = state, \
84 .type = PIN_MAP_TYPE_DUMMY_STATE, \
85 }
Stephen Warren1ddb6ff2011-12-09 16:59:03 -070086
Stephen Warren1e2082b2012-03-02 13:05:48 -070087#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)
Linus Walleij23750192011-12-14 09:30:08 +0100151
Dong Aisheng6974f1f2012-04-05 17:07:23 +0800152#ifdef CONFIG_PINCTRL
Linus Walleij2744e8a2011-05-02 20:50:54 +0200153
Masahiro Yamada3f713b72017-08-04 11:22:31 +0900154extern int pinctrl_register_mappings(const struct pinctrl_map *map,
Linus Walleij2744e8a2011-05-02 20:50:54 +0200155 unsigned num_maps);
Hans de Goedec72bed22019-12-16 21:51:18 +0100156extern void pinctrl_unregister_mappings(const struct pinctrl_map *map);
Dong Aisheng5b3aa5f2012-04-26 16:15:50 +0800157extern void pinctrl_provide_dummies(void);
Linus Walleij2744e8a2011-05-02 20:50:54 +0200158#else
159
Masahiro Yamada3f713b72017-08-04 11:22:31 +0900160static inline int pinctrl_register_mappings(const struct pinctrl_map *map,
Linus Walleij2744e8a2011-05-02 20:50:54 +0200161 unsigned num_maps)
162{
163 return 0;
164}
165
Hans de Goedec72bed22019-12-16 21:51:18 +0100166static inline void pinctrl_unregister_mappings(const struct pinctrl_map *map)
167{
168}
169
Dong Aisheng5b3aa5f2012-04-26 16:15:50 +0800170static inline void pinctrl_provide_dummies(void)
171{
172}
Linus Walleijdd512702012-04-24 15:20:02 +0200173#endif /* !CONFIG_PINCTRL */
Linus Walleij2744e8a2011-05-02 20:50:54 +0200174#endif