12744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij/*
22744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij * Machine interface for the pinctrl subsystem.
32744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij *
42744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij * Copyright (C) 2011 ST-Ericsson SA
52744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij * Written on behalf of Linaro for ST-Ericsson
62744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij * Based on bits of regulator core, gpio core and clk core
72744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij *
82744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij * Author: Linus Walleij <linus.walleij@linaro.org>
92744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij *
102744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij * License terms: GNU General Public License (GPL) version 2
112744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij */
12e93bcee00c43e2bd4037291262111016f4c05793Linus Walleij#ifndef __LINUX_PINCTRL_MACHINE_H
13e93bcee00c43e2bd4037291262111016f4c05793Linus Walleij#define __LINUX_PINCTRL_MACHINE_H
142744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij
156f11f6f1a0a717eb8bd0dadd101c4522b945c501Stephen Warren#include <linux/bug.h>
166f11f6f1a0a717eb8bd0dadd101c4522b945c501Stephen Warren
179a01be1715b6a027765701ca09ba0401ff066fc5Linus Walleij#include "pinctrl-state.h"
1846919ae63d4820e76724beb655274ce143f0da0bStephen Warren
191e2082b520721734c358f776d34a069867214c8eStephen Warrenenum pinctrl_map_type {
201e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_TYPE_INVALID,
211e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_TYPE_DUMMY_STATE,
221e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_TYPE_MUX_GROUP,
231e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_TYPE_CONFIGS_PIN,
241e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_TYPE_CONFIGS_GROUP,
251e2082b520721734c358f776d34a069867214c8eStephen Warren};
261e2082b520721734c358f776d34a069867214c8eStephen Warren
271e2082b520721734c358f776d34a069867214c8eStephen Warren/**
281e2082b520721734c358f776d34a069867214c8eStephen Warren * struct pinctrl_map_mux - mapping table content for MAP_TYPE_MUX_GROUP
291e2082b520721734c358f776d34a069867214c8eStephen Warren * @group: the name of the group whose mux function is to be configured. This
301e2082b520721734c358f776d34a069867214c8eStephen Warren *	field may be left NULL, and the first applicable group for the function
311e2082b520721734c358f776d34a069867214c8eStephen Warren *	will be used.
321e2082b520721734c358f776d34a069867214c8eStephen Warren * @function: the mux function to select for the group
331e2082b520721734c358f776d34a069867214c8eStephen Warren */
341e2082b520721734c358f776d34a069867214c8eStephen Warrenstruct pinctrl_map_mux {
351e2082b520721734c358f776d34a069867214c8eStephen Warren	const char *group;
361e2082b520721734c358f776d34a069867214c8eStephen Warren	const char *function;
371e2082b520721734c358f776d34a069867214c8eStephen Warren};
381e2082b520721734c358f776d34a069867214c8eStephen Warren
391e2082b520721734c358f776d34a069867214c8eStephen Warren/**
401e2082b520721734c358f776d34a069867214c8eStephen Warren * struct pinctrl_map_configs - mapping table content for MAP_TYPE_CONFIGS_*
411e2082b520721734c358f776d34a069867214c8eStephen Warren * @group_or_pin: the name of the pin or group whose configuration parameters
421e2082b520721734c358f776d34a069867214c8eStephen Warren *	are to be configured.
431e2082b520721734c358f776d34a069867214c8eStephen Warren * @configs: a pointer to an array of config parameters/values to program into
441e2082b520721734c358f776d34a069867214c8eStephen Warren *	hardware. Each individual pin controller defines the format and meaning
451e2082b520721734c358f776d34a069867214c8eStephen Warren *	of config parameters.
461e2082b520721734c358f776d34a069867214c8eStephen Warren * @num_configs: the number of entries in array @configs
471e2082b520721734c358f776d34a069867214c8eStephen Warren */
481e2082b520721734c358f776d34a069867214c8eStephen Warrenstruct pinctrl_map_configs {
491e2082b520721734c358f776d34a069867214c8eStephen Warren	const char *group_or_pin;
501e2082b520721734c358f776d34a069867214c8eStephen Warren	unsigned long *configs;
511e2082b520721734c358f776d34a069867214c8eStephen Warren	unsigned num_configs;
521e2082b520721734c358f776d34a069867214c8eStephen Warren};
531e2082b520721734c358f776d34a069867214c8eStephen Warren
542744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij/**
55e93bcee00c43e2bd4037291262111016f4c05793Linus Walleij * struct pinctrl_map - boards/machines shall provide this map for devices
56806d314325812fb8ffe7059bd84a23d334350c21Stephen Warren * @dev_name: the name of the device using this specific mapping, the name
57806d314325812fb8ffe7059bd84a23d334350c21Stephen Warren *	must be the same as in your struct device*. If this name is set to the
58806d314325812fb8ffe7059bd84a23d334350c21Stephen Warren *	same name as the pin controllers own dev_name(), the map entry will be
59806d314325812fb8ffe7059bd84a23d334350c21Stephen Warren *	hogged by the driver itself upon registration
602744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij * @name: the name of this specific map entry for the particular machine.
616e5e959dde0d92d177f035652aeaa77f9330c9c6Stephen Warren *	This is the parameter passed to pinmux_lookup_state()
621e2082b520721734c358f776d34a069867214c8eStephen Warren * @type: the type of mapping table entry
632744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij * @ctrl_dev_name: the name of the device controlling this specific mapping,
641e2082b520721734c358f776d34a069867214c8eStephen Warren *	the name must be the same as in your struct device*. This field is not
651e2082b520721734c358f776d34a069867214c8eStephen Warren *	used for PIN_MAP_TYPE_DUMMY_STATE
661e2082b520721734c358f776d34a069867214c8eStephen Warren * @data: Data specific to the mapping type
672744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij */
68e93bcee00c43e2bd4037291262111016f4c05793Linus Walleijstruct pinctrl_map {
69806d314325812fb8ffe7059bd84a23d334350c21Stephen Warren	const char *dev_name;
702744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij	const char *name;
711e2082b520721734c358f776d34a069867214c8eStephen Warren	enum pinctrl_map_type type;
722744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij	const char *ctrl_dev_name;
731e2082b520721734c358f776d34a069867214c8eStephen Warren	union {
741e2082b520721734c358f776d34a069867214c8eStephen Warren		struct pinctrl_map_mux mux;
751e2082b520721734c358f776d34a069867214c8eStephen Warren		struct pinctrl_map_configs configs;
761e2082b520721734c358f776d34a069867214c8eStephen Warren	} data;
772744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij};
782744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij
791e2082b520721734c358f776d34a069867214c8eStephen Warren/* Convenience macros to create mapping table entries */
802744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij
811e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_DUMMY_STATE(dev, state) \
821e2082b520721734c358f776d34a069867214c8eStephen Warren	{								\
831e2082b520721734c358f776d34a069867214c8eStephen Warren		.dev_name = dev,					\
841e2082b520721734c358f776d34a069867214c8eStephen Warren		.name = state,						\
851e2082b520721734c358f776d34a069867214c8eStephen Warren		.type = PIN_MAP_TYPE_DUMMY_STATE,			\
861e2082b520721734c358f776d34a069867214c8eStephen Warren	}
871ddb6ff03c0cdec58c6cfdbada95acddcce4a7b7Stephen Warren
881e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_MUX_GROUP(dev, state, pinctrl, grp, func)		\
891e2082b520721734c358f776d34a069867214c8eStephen Warren	{								\
901e2082b520721734c358f776d34a069867214c8eStephen Warren		.dev_name = dev,					\
911e2082b520721734c358f776d34a069867214c8eStephen Warren		.name = state,						\
921e2082b520721734c358f776d34a069867214c8eStephen Warren		.type = PIN_MAP_TYPE_MUX_GROUP,				\
931e2082b520721734c358f776d34a069867214c8eStephen Warren		.ctrl_dev_name = pinctrl,				\
941e2082b520721734c358f776d34a069867214c8eStephen Warren		.data.mux = {						\
951e2082b520721734c358f776d34a069867214c8eStephen Warren			.group = grp,					\
961e2082b520721734c358f776d34a069867214c8eStephen Warren			.function = func,				\
971e2082b520721734c358f776d34a069867214c8eStephen Warren		},							\
981e2082b520721734c358f776d34a069867214c8eStephen Warren	}
991e2082b520721734c358f776d34a069867214c8eStephen Warren
1001e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_MUX_GROUP_DEFAULT(dev, pinctrl, grp, func)		\
1011e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_MUX_GROUP(dev, PINCTRL_STATE_DEFAULT, pinctrl, grp, func)
1021e2082b520721734c358f776d34a069867214c8eStephen Warren
1031e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_MUX_GROUP_HOG(dev, state, grp, func)			\
1041e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_MUX_GROUP(dev, state, dev, grp, func)
1051e2082b520721734c358f776d34a069867214c8eStephen Warren
1061e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_MUX_GROUP_HOG_DEFAULT(dev, grp, func)			\
1071e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_MUX_GROUP(dev, PINCTRL_STATE_DEFAULT, dev, grp, func)
1081e2082b520721734c358f776d34a069867214c8eStephen Warren
1091e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_CONFIGS_PIN(dev, state, pinctrl, pin, cfgs)		\
1101e2082b520721734c358f776d34a069867214c8eStephen Warren	{								\
1111e2082b520721734c358f776d34a069867214c8eStephen Warren		.dev_name = dev,					\
1121e2082b520721734c358f776d34a069867214c8eStephen Warren		.name = state,						\
1131e2082b520721734c358f776d34a069867214c8eStephen Warren		.type = PIN_MAP_TYPE_CONFIGS_PIN,			\
1141e2082b520721734c358f776d34a069867214c8eStephen Warren		.ctrl_dev_name = pinctrl,				\
1151e2082b520721734c358f776d34a069867214c8eStephen Warren		.data.configs = {					\
1161e2082b520721734c358f776d34a069867214c8eStephen Warren			.group_or_pin = pin,				\
1171e2082b520721734c358f776d34a069867214c8eStephen Warren			.configs = cfgs,				\
1181e2082b520721734c358f776d34a069867214c8eStephen Warren			.num_configs = ARRAY_SIZE(cfgs),		\
1191e2082b520721734c358f776d34a069867214c8eStephen Warren		},							\
1201e2082b520721734c358f776d34a069867214c8eStephen Warren	}
1211e2082b520721734c358f776d34a069867214c8eStephen Warren
1221e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_CONFIGS_PIN_DEFAULT(dev, pinctrl, pin, cfgs)		\
1231e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_CONFIGS_PIN(dev, PINCTRL_STATE_DEFAULT, pinctrl, pin, cfgs)
1241e2082b520721734c358f776d34a069867214c8eStephen Warren
1251e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_CONFIGS_PIN_HOG(dev, state, pin, cfgs)			\
1261e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_CONFIGS_PIN(dev, state, dev, pin, cfgs)
1271e2082b520721734c358f776d34a069867214c8eStephen Warren
1281e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_CONFIGS_PIN_HOG_DEFAULT(dev, pin, cfgs)			\
1291e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_CONFIGS_PIN(dev, PINCTRL_STATE_DEFAULT, dev, pin, cfgs)
1301e2082b520721734c358f776d34a069867214c8eStephen Warren
1311e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_CONFIGS_GROUP(dev, state, pinctrl, grp, cfgs)		\
1321e2082b520721734c358f776d34a069867214c8eStephen Warren	{								\
1331e2082b520721734c358f776d34a069867214c8eStephen Warren		.dev_name = dev,					\
1341e2082b520721734c358f776d34a069867214c8eStephen Warren		.name = state,						\
1351e2082b520721734c358f776d34a069867214c8eStephen Warren		.type = PIN_MAP_TYPE_CONFIGS_GROUP,			\
1361e2082b520721734c358f776d34a069867214c8eStephen Warren		.ctrl_dev_name = pinctrl,				\
1371e2082b520721734c358f776d34a069867214c8eStephen Warren		.data.configs = {					\
1381e2082b520721734c358f776d34a069867214c8eStephen Warren			.group_or_pin = grp,				\
1391e2082b520721734c358f776d34a069867214c8eStephen Warren			.configs = cfgs,				\
1401e2082b520721734c358f776d34a069867214c8eStephen Warren			.num_configs = ARRAY_SIZE(cfgs),		\
1411e2082b520721734c358f776d34a069867214c8eStephen Warren		},							\
1421e2082b520721734c358f776d34a069867214c8eStephen Warren	}
1431e2082b520721734c358f776d34a069867214c8eStephen Warren
1441e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_CONFIGS_GROUP_DEFAULT(dev, pinctrl, grp, cfgs)		\
1451e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_CONFIGS_GROUP(dev, PINCTRL_STATE_DEFAULT, pinctrl, grp, cfgs)
1461e2082b520721734c358f776d34a069867214c8eStephen Warren
1471e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_CONFIGS_GROUP_HOG(dev, state, grp, cfgs)		\
1481e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_CONFIGS_GROUP(dev, state, dev, grp, cfgs)
1491e2082b520721734c358f776d34a069867214c8eStephen Warren
1501e2082b520721734c358f776d34a069867214c8eStephen Warren#define PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(dev, grp, cfgs)		\
1511e2082b520721734c358f776d34a069867214c8eStephen Warren	PIN_MAP_CONFIGS_GROUP(dev, PINCTRL_STATE_DEFAULT, dev, grp, cfgs)
15223750196ef472e9249958d5165b0bb292518c710Linus Walleij
15389e004e78ff6317520d35bdb0d0174893ab49f17Dong Aisheng#ifdef CONFIG_PINCTRL
1542744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij
155e93bcee00c43e2bd4037291262111016f4c05793Linus Walleijextern int pinctrl_register_mappings(struct pinctrl_map const *map,
1562744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij				unsigned num_maps);
1572744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij
1582744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij#else
1592744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij
160e93bcee00c43e2bd4037291262111016f4c05793Linus Walleijstatic inline int pinctrl_register_mappings(struct pinctrl_map const *map,
1612744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij					   unsigned num_maps)
1622744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij{
1632744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij	return 0;
1642744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij}
1652744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij
1662744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij#endif /* !CONFIG_PINMUX */
1672744e8afb3b76343e7eb8197e8b3e085036010a5Linus Walleij#endif
168