xref: /linux-6.15/include/linux/pinctrl/machine.h (revision 7cc4e6b0)
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