aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinconf.c
diff options
context:
space:
mode:
authorSherman Yin <syin@broadcom.com>2013-08-27 14:32:12 -0400
committerLinus Walleij <linus.walleij@linaro.org>2013-08-28 07:34:41 -0400
commit03b054e9696c3cbd3d5905ec96da15acd0a2fe8d (patch)
tree7123b780c194d350b3e5134c267e17262effb385 /drivers/pinctrl/pinconf.c
parentf5ba9c52bf1e236c4698c240955e5f119db62a28 (diff)
pinctrl: Pass all configs to driver on pin_config_set()
When setting pin configuration in the pinctrl framework, pin_config_set() or pin_config_group_set() is called in a loop to set one configuration at a time for the specified pin or group. This patch 1) removes the loop and 2) changes the API to pass the whole pin config array to the driver. It is now up to the driver to loop through the configs. This allows the driver to potentially combine configs and reduce the number of writes to pin config registers. All c files changed have been build-tested to verify the change compiles and that the corresponding .o is successfully generated. Signed-off-by: Sherman Yin <syin@broadcom.com> Reviewed-by: Christian Daudt <csd@broadcom.com> Reviewed-by: Matt Porter <matt.porter@linaro.org> Tested-by: Stephen Warren <swarren@nvidia.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinconf.c')
-rw-r--r--drivers/pinctrl/pinconf.c42
1 files changed, 19 insertions, 23 deletions
diff --git a/drivers/pinctrl/pinconf.c b/drivers/pinctrl/pinconf.c
index 8da2d6db228c..a138965c01cb 100644
--- a/drivers/pinctrl/pinconf.c
+++ b/drivers/pinctrl/pinconf.c
@@ -158,7 +158,7 @@ int pinconf_apply_setting(struct pinctrl_setting const *setting)
158{ 158{
159 struct pinctrl_dev *pctldev = setting->pctldev; 159 struct pinctrl_dev *pctldev = setting->pctldev;
160 const struct pinconf_ops *ops = pctldev->desc->confops; 160 const struct pinconf_ops *ops = pctldev->desc->confops;
161 int i, ret; 161 int ret;
162 162
163 if (!ops) { 163 if (!ops) {
164 dev_err(pctldev->dev, "missing confops\n"); 164 dev_err(pctldev->dev, "missing confops\n");
@@ -171,17 +171,15 @@ int pinconf_apply_setting(struct pinctrl_setting const *setting)
171 dev_err(pctldev->dev, "missing pin_config_set op\n"); 171 dev_err(pctldev->dev, "missing pin_config_set op\n");
172 return -EINVAL; 172 return -EINVAL;
173 } 173 }
174 for (i = 0; i < setting->data.configs.num_configs; i++) { 174 ret = ops->pin_config_set(pctldev,
175 ret = ops->pin_config_set(pctldev, 175 setting->data.configs.group_or_pin,
176 setting->data.configs.group_or_pin, 176 setting->data.configs.configs,
177 setting->data.configs.configs[i]); 177 setting->data.configs.num_configs);
178 if (ret < 0) { 178 if (ret < 0) {
179 dev_err(pctldev->dev, 179 dev_err(pctldev->dev,
180 "pin_config_set op failed for pin %d config %08lx\n", 180 "pin_config_set op failed for pin %d\n",
181 setting->data.configs.group_or_pin, 181 setting->data.configs.group_or_pin);
182 setting->data.configs.configs[i]); 182 return ret;
183 return ret;
184 }
185 } 183 }
186 break; 184 break;
187 case PIN_MAP_TYPE_CONFIGS_GROUP: 185 case PIN_MAP_TYPE_CONFIGS_GROUP:
@@ -190,17 +188,15 @@ int pinconf_apply_setting(struct pinctrl_setting const *setting)
190 "missing pin_config_group_set op\n"); 188 "missing pin_config_group_set op\n");
191 return -EINVAL; 189 return -EINVAL;
192 } 190 }
193 for (i = 0; i < setting->data.configs.num_configs; i++) { 191 ret = ops->pin_config_group_set(pctldev,
194 ret = ops->pin_config_group_set(pctldev, 192 setting->data.configs.group_or_pin,
195 setting->data.configs.group_or_pin, 193 setting->data.configs.configs,
196 setting->data.configs.configs[i]); 194 setting->data.configs.num_configs);
197 if (ret < 0) { 195 if (ret < 0) {
198 dev_err(pctldev->dev, 196 dev_err(pctldev->dev,
199 "pin_config_group_set op failed for group %d config %08lx\n", 197 "pin_config_group_set op failed for group %d\n",
200 setting->data.configs.group_or_pin, 198 setting->data.configs.group_or_pin);
201 setting->data.configs.configs[i]); 199 return ret;
202 return ret;
203 }
204 } 200 }
205 break; 201 break;
206 default: 202 default: