1af873fceSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
22744e8afSLinus Walleij /*
32744e8afSLinus Walleij * Machine interface for the pinctrl subsystem.
42744e8afSLinus Walleij *
52744e8afSLinus Walleij * Copyright (C) 2011 ST-Ericsson SA
62744e8afSLinus Walleij * Written on behalf of Linaro for ST-Ericsson
72744e8afSLinus Walleij * Based on bits of regulator core, gpio core and clk core
82744e8afSLinus Walleij *
92744e8afSLinus Walleij * Author: Linus Walleij <[email protected]>
102744e8afSLinus Walleij */
11e93bcee0SLinus Walleij #ifndef __LINUX_PINCTRL_MACHINE_H
12e93bcee0SLinus Walleij #define __LINUX_PINCTRL_MACHINE_H
132744e8afSLinus Walleij
1482cc14c9SAndy Shevchenko #include <linux/array_size.h>
1522f099d0SStephen Warren
16a1ce3928SDavid Howells #include <linux/pinctrl/pinctrl-state.h>
1746919ae6SStephen Warren
181e2082b5SStephen Warren enum pinctrl_map_type {
191e2082b5SStephen Warren PIN_MAP_TYPE_INVALID,
201e2082b5SStephen Warren PIN_MAP_TYPE_DUMMY_STATE,
211e2082b5SStephen Warren PIN_MAP_TYPE_MUX_GROUP,
221e2082b5SStephen Warren PIN_MAP_TYPE_CONFIGS_PIN,
231e2082b5SStephen Warren PIN_MAP_TYPE_CONFIGS_GROUP,
241e2082b5SStephen Warren };
251e2082b5SStephen Warren
261e2082b5SStephen Warren /**
271e2082b5SStephen Warren * struct pinctrl_map_mux - mapping table content for MAP_TYPE_MUX_GROUP
281e2082b5SStephen Warren * @group: the name of the group whose mux function is to be configured. This
291e2082b5SStephen Warren * field may be left NULL, and the first applicable group for the function
301e2082b5SStephen Warren * will be used.
311e2082b5SStephen Warren * @function: the mux function to select for the group
321e2082b5SStephen Warren */
331e2082b5SStephen Warren struct pinctrl_map_mux {
341e2082b5SStephen Warren const char *group;
351e2082b5SStephen Warren const char *function;
361e2082b5SStephen Warren };
371e2082b5SStephen Warren
381e2082b5SStephen Warren /**
391e2082b5SStephen Warren * struct pinctrl_map_configs - mapping table content for MAP_TYPE_CONFIGS_*
401e2082b5SStephen Warren * @group_or_pin: the name of the pin or group whose configuration parameters
411e2082b5SStephen Warren * are to be configured.
421e2082b5SStephen Warren * @configs: a pointer to an array of config parameters/values to program into
431e2082b5SStephen Warren * hardware. Each individual pin controller defines the format and meaning
441e2082b5SStephen Warren * of config parameters.
451e2082b5SStephen Warren * @num_configs: the number of entries in array @configs
461e2082b5SStephen Warren */
471e2082b5SStephen Warren struct pinctrl_map_configs {
481e2082b5SStephen Warren const char *group_or_pin;
491e2082b5SStephen Warren unsigned long *configs;
50*7cc4e6b0SAndy Shevchenko unsigned int num_configs;
511e2082b5SStephen Warren };
521e2082b5SStephen Warren
532744e8afSLinus Walleij /**
54e93bcee0SLinus Walleij * struct pinctrl_map - boards/machines shall provide this map for devices
55806d3143SStephen Warren * @dev_name: the name of the device using this specific mapping, the name
56806d3143SStephen Warren * must be the same as in your struct device*. If this name is set to the
57806d3143SStephen Warren * same name as the pin controllers own dev_name(), the map entry will be
58806d3143SStephen Warren * hogged by the driver itself upon registration
592744e8afSLinus Walleij * @name: the name of this specific map entry for the particular machine.
606e5e959dSStephen Warren * This is the parameter passed to pinmux_lookup_state()
611e2082b5SStephen Warren * @type: the type of mapping table entry
622744e8afSLinus Walleij * @ctrl_dev_name: the name of the device controlling this specific mapping,
631e2082b5SStephen Warren * the name must be the same as in your struct device*. This field is not
641e2082b5SStephen Warren * used for PIN_MAP_TYPE_DUMMY_STATE
651e2082b5SStephen Warren * @data: Data specific to the mapping type
662744e8afSLinus Walleij */
67e93bcee0SLinus Walleij struct pinctrl_map {
68806d3143SStephen Warren const char *dev_name;
692744e8afSLinus Walleij const char *name;
701e2082b5SStephen Warren enum pinctrl_map_type type;
712744e8afSLinus Walleij const char *ctrl_dev_name;
721e2082b5SStephen Warren union {
731e2082b5SStephen Warren struct pinctrl_map_mux mux;
741e2082b5SStephen Warren struct pinctrl_map_configs configs;
751e2082b5SStephen Warren } data;
762744e8afSLinus Walleij };
772744e8afSLinus Walleij
781e2082b5SStephen Warren /* Convenience macros to create mapping table entries */
792744e8afSLinus Walleij
801e2082b5SStephen Warren #define PIN_MAP_DUMMY_STATE(dev, state) \
811e2082b5SStephen Warren { \
821e2082b5SStephen Warren .dev_name = dev, \
831e2082b5SStephen Warren .name = state, \
841e2082b5SStephen Warren .type = PIN_MAP_TYPE_DUMMY_STATE, \
851e2082b5SStephen Warren }
861ddb6ff0SStephen Warren
871e2082b5SStephen Warren #define PIN_MAP_MUX_GROUP(dev, state, pinctrl, grp, func) \
881e2082b5SStephen Warren { \
891e2082b5SStephen Warren .dev_name = dev, \
901e2082b5SStephen Warren .name = state, \
911e2082b5SStephen Warren .type = PIN_MAP_TYPE_MUX_GROUP, \
921e2082b5SStephen Warren .ctrl_dev_name = pinctrl, \
931e2082b5SStephen Warren .data.mux = { \
941e2082b5SStephen Warren .group = grp, \
951e2082b5SStephen Warren .function = func, \
961e2082b5SStephen Warren }, \
971e2082b5SStephen Warren }
981e2082b5SStephen Warren
991e2082b5SStephen Warren #define PIN_MAP_MUX_GROUP_DEFAULT(dev, pinctrl, grp, func) \
1001e2082b5SStephen Warren PIN_MAP_MUX_GROUP(dev, PINCTRL_STATE_DEFAULT, pinctrl, grp, func)
1011e2082b5SStephen Warren
1021e2082b5SStephen Warren #define PIN_MAP_MUX_GROUP_HOG(dev, state, grp, func) \
1031e2082b5SStephen Warren PIN_MAP_MUX_GROUP(dev, state, dev, grp, func)
1041e2082b5SStephen Warren
1051e2082b5SStephen Warren #define PIN_MAP_MUX_GROUP_HOG_DEFAULT(dev, grp, func) \
1061e2082b5SStephen Warren PIN_MAP_MUX_GROUP(dev, PINCTRL_STATE_DEFAULT, dev, grp, func)
1071e2082b5SStephen Warren
1081e2082b5SStephen Warren #define PIN_MAP_CONFIGS_PIN(dev, state, pinctrl, pin, cfgs) \
1091e2082b5SStephen Warren { \
1101e2082b5SStephen Warren .dev_name = dev, \
1111e2082b5SStephen Warren .name = state, \
1121e2082b5SStephen Warren .type = PIN_MAP_TYPE_CONFIGS_PIN, \
1131e2082b5SStephen Warren .ctrl_dev_name = pinctrl, \
1141e2082b5SStephen Warren .data.configs = { \
1151e2082b5SStephen Warren .group_or_pin = pin, \
1161e2082b5SStephen Warren .configs = cfgs, \
1171e2082b5SStephen Warren .num_configs = ARRAY_SIZE(cfgs), \
1181e2082b5SStephen Warren }, \
1191e2082b5SStephen Warren }
1201e2082b5SStephen Warren
1211e2082b5SStephen Warren #define PIN_MAP_CONFIGS_PIN_DEFAULT(dev, pinctrl, pin, cfgs) \
1221e2082b5SStephen Warren PIN_MAP_CONFIGS_PIN(dev, PINCTRL_STATE_DEFAULT, pinctrl, pin, cfgs)
1231e2082b5SStephen Warren
1241e2082b5SStephen Warren #define PIN_MAP_CONFIGS_PIN_HOG(dev, state, pin, cfgs) \
1251e2082b5SStephen Warren PIN_MAP_CONFIGS_PIN(dev, state, dev, pin, cfgs)
1261e2082b5SStephen Warren
1271e2082b5SStephen Warren #define PIN_MAP_CONFIGS_PIN_HOG_DEFAULT(dev, pin, cfgs) \
1281e2082b5SStephen Warren PIN_MAP_CONFIGS_PIN(dev, PINCTRL_STATE_DEFAULT, dev, pin, cfgs)
1291e2082b5SStephen Warren
1301e2082b5SStephen Warren #define PIN_MAP_CONFIGS_GROUP(dev, state, pinctrl, grp, cfgs) \
1311e2082b5SStephen Warren { \
1321e2082b5SStephen Warren .dev_name = dev, \
1331e2082b5SStephen Warren .name = state, \
1341e2082b5SStephen Warren .type = PIN_MAP_TYPE_CONFIGS_GROUP, \
1351e2082b5SStephen Warren .ctrl_dev_name = pinctrl, \
1361e2082b5SStephen Warren .data.configs = { \
1371e2082b5SStephen Warren .group_or_pin = grp, \
1381e2082b5SStephen Warren .configs = cfgs, \
1391e2082b5SStephen Warren .num_configs = ARRAY_SIZE(cfgs), \
1401e2082b5SStephen Warren }, \
1411e2082b5SStephen Warren }
1421e2082b5SStephen Warren
1431e2082b5SStephen Warren #define PIN_MAP_CONFIGS_GROUP_DEFAULT(dev, pinctrl, grp, cfgs) \
1441e2082b5SStephen Warren PIN_MAP_CONFIGS_GROUP(dev, PINCTRL_STATE_DEFAULT, pinctrl, grp, cfgs)
1451e2082b5SStephen Warren
1461e2082b5SStephen Warren #define PIN_MAP_CONFIGS_GROUP_HOG(dev, state, grp, cfgs) \
1471e2082b5SStephen Warren PIN_MAP_CONFIGS_GROUP(dev, state, dev, grp, cfgs)
1481e2082b5SStephen Warren
1491e2082b5SStephen Warren #define PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(dev, grp, cfgs) \
1501e2082b5SStephen Warren PIN_MAP_CONFIGS_GROUP(dev, PINCTRL_STATE_DEFAULT, dev, grp, cfgs)
15123750196SLinus Walleij
152e5530adcSAndy Shevchenko struct pinctrl_map;
153e5530adcSAndy Shevchenko
1546974f1f4SDong Aisheng #ifdef CONFIG_PINCTRL
1552744e8afSLinus Walleij
1563f713b7cSMasahiro Yamada extern int pinctrl_register_mappings(const struct pinctrl_map *map,
157*7cc4e6b0SAndy Shevchenko unsigned int num_maps);
158c72bed23SHans de Goede extern void pinctrl_unregister_mappings(const struct pinctrl_map *map);
1595b3aa5f7SDong Aisheng extern void pinctrl_provide_dummies(void);
1602744e8afSLinus Walleij #else
1612744e8afSLinus Walleij
pinctrl_register_mappings(const struct pinctrl_map * map,unsigned int num_maps)1623f713b7cSMasahiro Yamada static inline int pinctrl_register_mappings(const struct pinctrl_map *map,
163*7cc4e6b0SAndy Shevchenko unsigned int num_maps)
1642744e8afSLinus Walleij {
1652744e8afSLinus Walleij return 0;
1662744e8afSLinus Walleij }
1672744e8afSLinus Walleij
pinctrl_unregister_mappings(const struct pinctrl_map * map)168c72bed23SHans de Goede static inline void pinctrl_unregister_mappings(const struct pinctrl_map *map)
169c72bed23SHans de Goede {
170c72bed23SHans de Goede }
171c72bed23SHans de Goede
pinctrl_provide_dummies(void)1725b3aa5f7SDong Aisheng static inline void pinctrl_provide_dummies(void)
1735b3aa5f7SDong Aisheng {
1745b3aa5f7SDong Aisheng }
175dd512701SLinus Walleij #endif /* !CONFIG_PINCTRL */
1762744e8afSLinus Walleij #endif
177