summaryrefslogtreecommitdiff
path: root/drivers/pinctrl/pinmux.c
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2012-03-02 05:48:31 +0400
committerLinus Walleij <linus.walleij@linaro.org>2012-03-02 19:12:03 +0400
commitd4e3198736d9d64e4ba4d2b46ab75cbcf5d0a4e0 (patch)
treee5e06f5c3ec83949e10f5407a1020ff5e07a7934 /drivers/pinctrl/pinmux.c
parent3eedb4372354a70ce63c9f4ec294d2eba0d79d17 (diff)
downloadlinux-d4e3198736d9d64e4ba4d2b46ab75cbcf5d0a4e0.tar.xz
pinctrl: enhance pinctrl_get() to handle multiple functions
At present, pinctrl_get() assumes that all matching mapping table entries have the same "function" value, albeit potentially applied to different pins/groups. This change removes this restriction; pinctrl_get() can now handle a set of mapping tables where different functions are applied to the various pins/groups. Signed-off-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinmux.c')
-rw-r--r--drivers/pinctrl/pinmux.c37
1 files changed, 14 insertions, 23 deletions
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
index 2a405618b448..f409f161ea1d 100644
--- a/drivers/pinctrl/pinmux.c
+++ b/drivers/pinctrl/pinmux.c
@@ -33,10 +33,13 @@
/**
* struct pinmux_group - group list item for pinmux groups
* @node: pinmux group list node
+ * @func_selector: the function selector for the pinmux device handling
+ * this pinmux
* @group_selector: the group selector for this group
*/
struct pinmux_group {
struct list_head node;
+ unsigned func_selector;
unsigned group_selector;
};
@@ -476,24 +479,11 @@ static int pinmux_enable_muxmap(struct pinctrl_dev *pctldev,
if (ret < 0)
return ret;
- /*
- * If the function selector is already set, it needs to be identical,
- * we support several groups with one function but not several
- * functions with one or several groups in the same pinmux.
- */
- if (p->func_selector != UINT_MAX &&
- p->func_selector != func_selector) {
- dev_err(pctldev->dev,
- "dual function defines in the map for device %s\n",
- devname);
- return -EINVAL;
- }
- p->func_selector = func_selector;
-
/* Now add this group selector, we may have many of them */
grp = kmalloc(sizeof(*grp), GFP_KERNEL);
if (!grp)
return -ENOMEM;
+ grp->func_selector = func_selector;
grp->group_selector = group_selector;
ret = acquire_pins(pctldev, devname, group_selector);
if (ret) {
@@ -554,7 +544,7 @@ int pinmux_enable(struct pinctrl *p)
int ret;
list_for_each_entry(grp, &p->groups, node) {
- ret = ops->enable(pctldev, p->func_selector,
+ ret = ops->enable(pctldev, grp->func_selector,
grp->group_selector);
if (ret)
/*
@@ -576,7 +566,7 @@ void pinmux_disable(struct pinctrl *p)
struct pinmux_group *grp;
list_for_each_entry(grp, &p->groups, node) {
- ops->disable(pctldev, p->func_selector,
+ ops->disable(pctldev, grp->func_selector,
grp->group_selector);
}
}
@@ -654,21 +644,22 @@ void pinmux_dbg_show(struct seq_file *s, struct pinctrl *p)
const struct pinmux_ops *pmxops;
const struct pinctrl_ops *pctlops;
struct pinmux_group *grp;
+ const char *sep = "";
pmxops = pctldev->desc->pmxops;
pctlops = pctldev->desc->pctlops;
- seq_printf(s, " function: %s (%u),",
- pmxops->get_function_name(pctldev,
- p->func_selector),
- p->func_selector);
-
seq_printf(s, " groups: [");
list_for_each_entry(grp, &p->groups, node) {
- seq_printf(s, " %s (%u)",
+ seq_printf(s, "%s%s (%u)=%s (%u)",
+ sep,
pctlops->get_group_name(pctldev,
grp->group_selector),
- grp->group_selector);
+ grp->group_selector,
+ pmxops->get_function_name(pctldev,
+ grp->func_selector),
+ grp->func_selector);
+ sep = ", ";
}
seq_printf(s, " ]");
}