diff options
author | Stephen Warren <swarren@nvidia.com> | 2012-03-02 15:05:48 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2012-03-05 05:25:11 -0500 |
commit | 1e2082b520721734c358f776d34a069867214c8e (patch) | |
tree | 4d11e15a4127ad69faf7555864480a6fafe5422c /drivers/pinctrl/pinmux.c | |
parent | 6e5e959dde0d92d177f035652aeaa77f9330c9c6 (diff) |
pinctrl: enhance mapping table to support pin config operations
The pinctrl mapping table can now contain entries to:
* Set the mux function of a pin group
* Apply a set of pin config options to a pin or a group
This allows pinctrl_select_state() to apply pin configs settings as well
as mux settings.
v3: Fix find_pinctrl() to iterate over the correct list.
s/_MUX_CONFIGS_/_CONFIGS_/ in mapping table macros.
Fix documentation to use correct mapping table macro.
v2: Added numerous extra PIN_MAP_*() special-case macros.
Fixed kerneldoc typo. Delete pinctrl_get_pin_id() and
replace it with pin_get_from_name(). Various minor fixes.
Updates due to rebase.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Dong Aisheng <dong.aisheng@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinmux.c')
-rw-r--r-- | drivers/pinctrl/pinmux.c | 69 |
1 files changed, 43 insertions, 26 deletions
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c index 56ca42e6a6ec..4852ebe5712e 100644 --- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c | |||
@@ -58,6 +58,17 @@ int pinmux_check_ops(struct pinctrl_dev *pctldev) | |||
58 | return 0; | 58 | return 0; |
59 | } | 59 | } |
60 | 60 | ||
61 | int pinmux_validate_map(struct pinctrl_map const *map, int i) | ||
62 | { | ||
63 | if (!map->data.mux.function) { | ||
64 | pr_err("failed to register map %s (%d): no function given\n", | ||
65 | map->name, i); | ||
66 | return -EINVAL; | ||
67 | } | ||
68 | |||
69 | return 0; | ||
70 | } | ||
71 | |||
61 | /** | 72 | /** |
62 | * pin_request() - request a single pin to be muxed in, typically for GPIO | 73 | * pin_request() - request a single pin to be muxed in, typically for GPIO |
63 | * @pin: the pin number in the global pin space | 74 | * @pin: the pin number in the global pin space |
@@ -284,21 +295,21 @@ int pinmux_map_to_setting(struct pinctrl_map const *map, | |||
284 | const unsigned *pins; | 295 | const unsigned *pins; |
285 | unsigned num_pins; | 296 | unsigned num_pins; |
286 | 297 | ||
287 | setting->func_selector = | 298 | setting->data.mux.func = |
288 | pinmux_func_name_to_selector(pctldev, map->function); | 299 | pinmux_func_name_to_selector(pctldev, map->data.mux.function); |
289 | if (setting->func_selector < 0) | 300 | if (setting->data.mux.func < 0) |
290 | return setting->func_selector; | 301 | return setting->data.mux.func; |
291 | 302 | ||
292 | ret = pmxops->get_function_groups(pctldev, setting->func_selector, | 303 | ret = pmxops->get_function_groups(pctldev, setting->data.mux.func, |
293 | &groups, &num_groups); | 304 | &groups, &num_groups); |
294 | if (ret < 0) | 305 | if (ret < 0) |
295 | return ret; | 306 | return ret; |
296 | if (!num_groups) | 307 | if (!num_groups) |
297 | return -EINVAL; | 308 | return -EINVAL; |
298 | 309 | ||
299 | if (map->group) { | 310 | if (map->data.mux.group) { |
300 | bool found = false; | 311 | bool found = false; |
301 | group = map->group; | 312 | group = map->data.mux.group; |
302 | for (i = 0; i < num_groups; i++) { | 313 | for (i = 0; i < num_groups; i++) { |
303 | if (!strcmp(group, groups[i])) { | 314 | if (!strcmp(group, groups[i])) { |
304 | found = true; | 315 | found = true; |
@@ -311,17 +322,16 @@ int pinmux_map_to_setting(struct pinctrl_map const *map, | |||
311 | group = groups[0]; | 322 | group = groups[0]; |
312 | } | 323 | } |
313 | 324 | ||
314 | setting->group_selector = | 325 | setting->data.mux.group = pinctrl_get_group_selector(pctldev, group); |
315 | pinctrl_get_group_selector(pctldev, group); | 326 | if (setting->data.mux.group < 0) |
316 | if (setting->group_selector < 0) | 327 | return setting->data.mux.group; |
317 | return setting->group_selector; | ||
318 | 328 | ||
319 | ret = pctlops->get_group_pins(pctldev, setting->group_selector, | 329 | ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, &pins, |
320 | &pins, &num_pins); | 330 | &num_pins); |
321 | if (ret) { | 331 | if (ret) { |
322 | dev_err(pctldev->dev, | 332 | dev_err(pctldev->dev, |
323 | "could not get pins for device %s group selector %d\n", | 333 | "could not get pins for device %s group selector %d\n", |
324 | pinctrl_dev_get_name(pctldev), setting->group_selector); | 334 | pinctrl_dev_get_name(pctldev), setting->data.mux.group); |
325 | return -ENODEV; | 335 | return -ENODEV; |
326 | } | 336 | } |
327 | 337 | ||
@@ -352,12 +362,12 @@ void pinmux_free_setting(struct pinctrl_setting const *setting) | |||
352 | int ret; | 362 | int ret; |
353 | int i; | 363 | int i; |
354 | 364 | ||
355 | ret = pctlops->get_group_pins(pctldev, setting->group_selector, | 365 | ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, |
356 | &pins, &num_pins); | 366 | &pins, &num_pins); |
357 | if (ret) { | 367 | if (ret) { |
358 | dev_err(pctldev->dev, | 368 | dev_err(pctldev->dev, |
359 | "could not get pins for device %s group selector %d\n", | 369 | "could not get pins for device %s group selector %d\n", |
360 | pinctrl_dev_get_name(pctldev), setting->group_selector); | 370 | pinctrl_dev_get_name(pctldev), setting->data.mux.group); |
361 | return; | 371 | return; |
362 | } | 372 | } |
363 | 373 | ||
@@ -370,8 +380,8 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting) | |||
370 | struct pinctrl_dev *pctldev = setting->pctldev; | 380 | struct pinctrl_dev *pctldev = setting->pctldev; |
371 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | 381 | const struct pinmux_ops *ops = pctldev->desc->pmxops; |
372 | 382 | ||
373 | return ops->enable(pctldev, setting->func_selector, | 383 | return ops->enable(pctldev, setting->data.mux.func, |
374 | setting->group_selector); | 384 | setting->data.mux.group); |
375 | } | 385 | } |
376 | 386 | ||
377 | void pinmux_disable_setting(struct pinctrl_setting const *setting) | 387 | void pinmux_disable_setting(struct pinctrl_setting const *setting) |
@@ -379,7 +389,7 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting) | |||
379 | struct pinctrl_dev *pctldev = setting->pctldev; | 389 | struct pinctrl_dev *pctldev = setting->pctldev; |
380 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | 390 | const struct pinmux_ops *ops = pctldev->desc->pmxops; |
381 | 391 | ||
382 | ops->disable(pctldev, setting->func_selector, setting->group_selector); | 392 | ops->disable(pctldev, setting->data.mux.func, setting->data.mux.group); |
383 | } | 393 | } |
384 | 394 | ||
385 | #ifdef CONFIG_DEBUG_FS | 395 | #ifdef CONFIG_DEBUG_FS |
@@ -456,18 +466,25 @@ static int pinmux_pins_show(struct seq_file *s, void *what) | |||
456 | return 0; | 466 | return 0; |
457 | } | 467 | } |
458 | 468 | ||
459 | void pinmux_dbg_show(struct seq_file *s, struct pinctrl_setting const *setting) | 469 | void pinmux_show_map(struct seq_file *s, struct pinctrl_map const *map) |
470 | { | ||
471 | seq_printf(s, "group %s\nfunction %s\n", | ||
472 | map->data.mux.group ? map->data.mux.group : "(default)", | ||
473 | map->data.mux.function); | ||
474 | } | ||
475 | |||
476 | void pinmux_show_setting(struct seq_file *s, | ||
477 | struct pinctrl_setting const *setting) | ||
460 | { | 478 | { |
461 | struct pinctrl_dev *pctldev = setting->pctldev; | 479 | struct pinctrl_dev *pctldev = setting->pctldev; |
462 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; | 480 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; |
463 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; | 481 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; |
464 | 482 | ||
465 | seq_printf(s, "controller: %s group: %s (%u) function: %s (%u)\n", | 483 | seq_printf(s, "group: %s (%u) function: %s (%u)\n", |
466 | pinctrl_dev_get_name(pctldev), | 484 | pctlops->get_group_name(pctldev, setting->data.mux.group), |
467 | pctlops->get_group_name(pctldev, setting->group_selector), | 485 | setting->data.mux.group, |
468 | setting->group_selector, | 486 | pmxops->get_function_name(pctldev, setting->data.mux.func), |
469 | pmxops->get_function_name(pctldev, setting->func_selector), | 487 | setting->data.mux.func); |
470 | setting->func_selector); | ||
471 | } | 488 | } |
472 | 489 | ||
473 | static int pinmux_functions_open(struct inode *inode, struct file *file) | 490 | static int pinmux_functions_open(struct inode *inode, struct file *file) |