From 7ecdb16fe63e5b356335ebdc236adfb48cef31e1 Mon Sep 17 00:00:00 2001 From: Stephen Warren Date: Fri, 2 Mar 2012 13:05:45 -0700 Subject: pinctrl: refactor struct pinctrl handling in core.c vs pinmux.c This change separates two aspects of struct pinctrl: a) The data representation of the parsed mapping table, into: 1) The top-level struct pinctrl object, a single entity returned by pinctrl_get(). 2) The parsed version of each mapping table entry, struct pinctrl_setting, of which there is one per mapping table entry. b) The code that handles this; the code for (1) above is in core.c, and the code to parse/execute each entry in (2) above is in pinmux.c, while the iteration over multiple settings is lifted to core.c. This will allow the following future changes: 1) pinctrl_get() API rework, so that struct pinctrl represents all states for the device, and the device can select between them without calling put()/get() again. 2) To support that, a struct pinctrl_state object will be inserted into the data model between the struct pinctrl and struct pinctrl_setting. 3) The mapping table will be extended to allow specification of pin config settings too. To support this, struct pinctrl_setting will be enhanced to store either mux settings or config settings, and functions will be added to pinconf.c to parse/execute pin configuration settings. Signed-off-by: Stephen Warren Acked-by: Linus Walleij Acked-by: Dong Aisheng Signed-off-by: Linus Walleij --- drivers/pinctrl/core.h | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'drivers/pinctrl/core.h') diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h index 8808f25a07d4..5f258b793400 100644 --- a/drivers/pinctrl/core.h +++ b/drivers/pinctrl/core.h @@ -49,22 +49,31 @@ struct pinctrl_dev { * struct pinctrl - per-device pin control state holder * @node: global list node * @dev: the device using this pin control handle + * @state: the state name passed to pinctrl_get() * @usecount: the number of active users of this pin controller setting, used * to keep track of nested use cases - * @pctldev: pin control device handling this pin control handle - * @groups: the group selectors for the pinmux device and - * selector combination handling this pinmux, this is a list that - * will be traversed on all pinmux operations such as - * get/put/enable/disable + * @settings: a list of settings for this device/state */ struct pinctrl { struct list_head node; struct device *dev; + const char *state; unsigned usecount; + struct list_head settings; +}; + +/** + * struct pinctrl_setting - an individual mux setting + * @node: list node for struct pinctrl's @settings field + * @pctldev: pin control device handling to be programmed + * @group_selector: the group selector to program + * @func_selector: the function selector to program + */ +struct pinctrl_setting { + struct list_head node; struct pinctrl_dev *pctldev; -#ifdef CONFIG_PINMUX - struct list_head groups; -#endif + unsigned group_selector; + unsigned func_selector; }; /** -- cgit v1.2.3