aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-falcon.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pinctrl/pinctrl-falcon.c')
-rw-r--r--drivers/pinctrl/pinctrl-falcon.c63
1 files changed, 36 insertions, 27 deletions
diff --git a/drivers/pinctrl/pinctrl-falcon.c b/drivers/pinctrl/pinctrl-falcon.c
index 4e731f24df85..2e62689b5e9f 100644
--- a/drivers/pinctrl/pinctrl-falcon.c
+++ b/drivers/pinctrl/pinctrl-falcon.c
@@ -238,7 +238,8 @@ static int falcon_pinconf_group_get(struct pinctrl_dev *pctrldev,
238} 238}
239 239
240static int falcon_pinconf_group_set(struct pinctrl_dev *pctrldev, 240static int falcon_pinconf_group_set(struct pinctrl_dev *pctrldev,
241 unsigned group, unsigned long config) 241 unsigned group, unsigned long *configs,
242 unsigned num_configs)
242{ 243{
243 return -ENOTSUPP; 244 return -ENOTSUPP;
244} 245}
@@ -279,39 +280,47 @@ static int falcon_pinconf_get(struct pinctrl_dev *pctrldev,
279} 280}
280 281
281static int falcon_pinconf_set(struct pinctrl_dev *pctrldev, 282static int falcon_pinconf_set(struct pinctrl_dev *pctrldev,
282 unsigned pin, unsigned long config) 283 unsigned pin, unsigned long *configs,
284 unsigned num_configs)
283{ 285{
284 enum ltq_pinconf_param param = LTQ_PINCONF_UNPACK_PARAM(config); 286 enum ltq_pinconf_param param;
285 int arg = LTQ_PINCONF_UNPACK_ARG(config); 287 int arg;
286 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); 288 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev);
287 void __iomem *mem = info->membase[PORT(pin)]; 289 void __iomem *mem = info->membase[PORT(pin)];
288 u32 reg; 290 u32 reg;
291 int i;
289 292
290 switch (param) { 293 for (i = 0; i < num_configs; i++) {
291 case LTQ_PINCONF_PARAM_DRIVE_CURRENT: 294 param = LTQ_PINCONF_UNPACK_PARAM(configs[i]);
292 reg = LTQ_PADC_DCC; 295 arg = LTQ_PINCONF_UNPACK_ARG(configs[i]);
293 break; 296
294 297 switch (param) {
295 case LTQ_PINCONF_PARAM_SLEW_RATE: 298 case LTQ_PINCONF_PARAM_DRIVE_CURRENT:
296 reg = LTQ_PADC_SRC; 299 reg = LTQ_PADC_DCC;
297 break; 300 break;
298 301
299 case LTQ_PINCONF_PARAM_PULL: 302 case LTQ_PINCONF_PARAM_SLEW_RATE:
300 if (arg == 1) 303 reg = LTQ_PADC_SRC;
301 reg = LTQ_PADC_PDEN; 304 break;
302 else 305
303 reg = LTQ_PADC_PUEN; 306 case LTQ_PINCONF_PARAM_PULL:
304 break; 307 if (arg == 1)
308 reg = LTQ_PADC_PDEN;
309 else
310 reg = LTQ_PADC_PUEN;
311 break;
312
313 default:
314 pr_err("%s: Invalid config param %04x\n",
315 pinctrl_dev_get_name(pctrldev), param);
316 return -ENOTSUPP;
317 }
305 318
306 default: 319 pad_w32(mem, BIT(PORT_PIN(pin)), reg);
307 pr_err("%s: Invalid config param %04x\n", 320 if (!(pad_r32(mem, reg) & BIT(PORT_PIN(pin))))
308 pinctrl_dev_get_name(pctrldev), param); 321 return -ENOTSUPP;
309 return -ENOTSUPP; 322 } /* for each config */
310 }
311 323
312 pad_w32(mem, BIT(PORT_PIN(pin)), reg);
313 if (!(pad_r32(mem, reg) & BIT(PORT_PIN(pin))))
314 return -ENOTSUPP;
315 return 0; 324 return 0;
316} 325}
317 326