aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-u300.c
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2011-11-16 15:58:10 -0500
committerLinus Walleij <linus.walleij@linaro.org>2012-03-12 17:49:03 -0400
commitdc0b1aa3e2fefa6372f38d7f6d5d33581567a1b5 (patch)
treecd0f71588255f4b456f4d2e6f1f5b2446a91a51c /drivers/pinctrl/pinctrl-u300.c
parenta050b3eee61666421df786c8d898ec22c129f4af (diff)
pinctrl: support pinconfig on the U300
This adds pin configuration support for the U300 driver pair, we can now read out the biasing and drive mode in debugfs and configure it using the new configuration API. ChangeLog v1->v2: - Migrate to pin config and generic pin config changes. ChangeLog v2->v3: - Adjust to generic pin config changes in v7 patch set. Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinctrl-u300.c')
-rw-r--r--drivers/pinctrl/pinctrl-u300.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinctrl-u300.c b/drivers/pinctrl/pinctrl-u300.c
index fc4a281caba5..26eb8ccd72d5 100644
--- a/drivers/pinctrl/pinctrl-u300.c
+++ b/drivers/pinctrl/pinctrl-u300.c
@@ -19,6 +19,9 @@
19#include <linux/err.h> 19#include <linux/err.h>
20#include <linux/pinctrl/pinctrl.h> 20#include <linux/pinctrl/pinctrl.h>
21#include <linux/pinctrl/pinmux.h> 21#include <linux/pinctrl/pinmux.h>
22#include <linux/pinctrl/pinconf.h>
23#include <linux/pinctrl/pinconf-generic.h>
24#include "pinctrl-coh901.h"
22 25
23/* 26/*
24 * Register definitions for the U300 Padmux control registers in the 27 * Register definitions for the U300 Padmux control registers in the
@@ -1044,12 +1047,69 @@ static struct pinctrl_gpio_range u300_gpio_ranges[] = {
1044 U300_GPIO_RANGE(25, 181, 1), 1047 U300_GPIO_RANGE(25, 181, 1),
1045}; 1048};
1046 1049
1050static struct pinctrl_gpio_range *u300_match_gpio_range(unsigned pin)
1051{
1052 int i;
1053
1054 for (i = 0; i < ARRAY_SIZE(u300_gpio_ranges); i++) {
1055 struct pinctrl_gpio_range *range;
1056
1057 range = &u300_gpio_ranges[i];
1058 if (pin >= range->pin_base &&
1059 pin <= (range->pin_base + range->npins - 1))
1060 return range;
1061 }
1062 return NULL;
1063}
1064
1065int u300_pin_config_get(struct pinctrl_dev *pctldev,
1066 unsigned pin,
1067 unsigned long *config)
1068{
1069 struct pinctrl_gpio_range *range = u300_match_gpio_range(pin);
1070
1071 /* We get config for those pins we CAN get it for and that's it */
1072 if (!range)
1073 return -ENOTSUPP;
1074
1075 return u300_gpio_config_get(range->gc,
1076 (pin - range->pin_base + range->base),
1077 config);
1078}
1079
1080int u300_pin_config_set(struct pinctrl_dev *pctldev,
1081 unsigned pin,
1082 unsigned long config)
1083{
1084 struct pinctrl_gpio_range *range = u300_match_gpio_range(pin);
1085 int ret;
1086
1087 if (!range)
1088 return -EINVAL;
1089
1090 /* Note: none of these configurations take any argument */
1091 ret = u300_gpio_config_set(range->gc,
1092 (pin - range->pin_base + range->base),
1093 pinconf_to_config_param(config));
1094 if (ret)
1095 return ret;
1096
1097 return 0;
1098}
1099
1100static struct pinconf_ops u300_pconf_ops = {
1101 .is_generic = true,
1102 .pin_config_get = u300_pin_config_get,
1103 .pin_config_set = u300_pin_config_set,
1104};
1105
1047static struct pinctrl_desc u300_pmx_desc = { 1106static struct pinctrl_desc u300_pmx_desc = {
1048 .name = DRIVER_NAME, 1107 .name = DRIVER_NAME,
1049 .pins = u300_pads, 1108 .pins = u300_pads,
1050 .npins = ARRAY_SIZE(u300_pads), 1109 .npins = ARRAY_SIZE(u300_pads),
1051 .pctlops = &u300_pctrl_ops, 1110 .pctlops = &u300_pctrl_ops,
1052 .pmxops = &u300_pmx_ops, 1111 .pmxops = &u300_pmx_ops,
1112 .confops = &u300_pconf_ops,
1053 .owner = THIS_MODULE, 1113 .owner = THIS_MODULE,
1054}; 1114};
1055 1115