diff options
| author | Linus Walleij <linus.walleij@linaro.org> | 2012-02-09 13:47:48 -0500 |
|---|---|---|
| committer | Linus Walleij <linus.walleij@linaro.org> | 2012-02-10 15:33:06 -0500 |
| commit | befe5bdfbb698b3bc57c58d0bd7ca3391c9275ed (patch) | |
| tree | 71416f2adc515f010f54de2371e29626cd144a5b | |
| parent | e93bcee00c43e2bd4037291262111016f4c05793 (diff) | |
pinctrl: factor pin control handles over to the core
This moves the per-devices struct pinctrl handles and device map
over from the pinmux part of the subsystem to the core pinctrl part.
This makes the device handles core infrastructure with the goal of
using these handles also for pin configuration, so that device
drivers (or boards etc) will need one and only one handle to the
pin control core.
Acked-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
| -rw-r--r-- | drivers/pinctrl/core.c | 598 | ||||
| -rw-r--r-- | drivers/pinctrl/core.h | 30 | ||||
| -rw-r--r-- | drivers/pinctrl/pinmux.c | 711 | ||||
| -rw-r--r-- | drivers/pinctrl/pinmux.h | 67 | ||||
| -rw-r--r-- | include/linux/pinctrl/consumer.h | 8 |
5 files changed, 779 insertions, 635 deletions
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 75c6a6bb6c0a..ec32c545f07f 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Core driver for the pin control subsystem | 2 | * Core driver for the pin control subsystem |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2011 ST-Ericsson SA | 4 | * Copyright (C) 2011-2012 ST-Ericsson SA |
| 5 | * Written on behalf of Linaro for ST-Ericsson | 5 | * Written on behalf of Linaro for ST-Ericsson |
| 6 | * Based on bits of regulator core, gpio core and clk core | 6 | * Based on bits of regulator core, gpio core and clk core |
| 7 | * | 7 | * |
| @@ -30,10 +30,30 @@ | |||
| 30 | #include "pinmux.h" | 30 | #include "pinmux.h" |
| 31 | #include "pinconf.h" | 31 | #include "pinconf.h" |
| 32 | 32 | ||
| 33 | /** | ||
| 34 | * struct pinctrl_hog - a list item to stash control hogs | ||
| 35 | * @node: pin control hog list node | ||
| 36 | * @map: map entry responsible for this hogging | ||
| 37 | * @pmx: the pin control hogged by this item | ||
| 38 | */ | ||
| 39 | struct pinctrl_hog { | ||
| 40 | struct list_head node; | ||
| 41 | struct pinctrl_map const *map; | ||
| 42 | struct pinctrl *p; | ||
| 43 | }; | ||
| 44 | |||
| 33 | /* Global list of pin control devices */ | 45 | /* Global list of pin control devices */ |
| 34 | static DEFINE_MUTEX(pinctrldev_list_mutex); | 46 | static DEFINE_MUTEX(pinctrldev_list_mutex); |
| 35 | static LIST_HEAD(pinctrldev_list); | 47 | static LIST_HEAD(pinctrldev_list); |
| 36 | 48 | ||
| 49 | /* List of pin controller handles */ | ||
| 50 | static DEFINE_MUTEX(pinctrl_list_mutex); | ||
| 51 | static LIST_HEAD(pinctrl_list); | ||
| 52 | |||
| 53 | /* Global pinctrl maps */ | ||
| 54 | static struct pinctrl_map *pinctrl_maps; | ||
| 55 | static unsigned pinctrl_maps_num; | ||
| 56 | |||
| 37 | const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev) | 57 | const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev) |
| 38 | { | 58 | { |
| 39 | /* We're not allowed to register devices without name */ | 59 | /* We're not allowed to register devices without name */ |
| @@ -337,6 +357,476 @@ int pinctrl_get_group_selector(struct pinctrl_dev *pctldev, | |||
| 337 | return -EINVAL; | 357 | return -EINVAL; |
| 338 | } | 358 | } |
| 339 | 359 | ||
| 360 | /** | ||
| 361 | * pinctrl_request_gpio() - request a single pin to be used in as GPIO | ||
| 362 | * @gpio: the GPIO pin number from the GPIO subsystem number space | ||
| 363 | * | ||
| 364 | * This function should *ONLY* be used from gpiolib-based GPIO drivers, | ||
| 365 | * as part of their gpio_request() semantics, platforms and individual drivers | ||
| 366 | * shall *NOT* request GPIO pins to be muxed in. | ||
| 367 | */ | ||
| 368 | int pinctrl_request_gpio(unsigned gpio) | ||
| 369 | { | ||
| 370 | struct pinctrl_dev *pctldev; | ||
| 371 | struct pinctrl_gpio_range *range; | ||
| 372 | int ret; | ||
| 373 | int pin; | ||
| 374 | |||
| 375 | ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range); | ||
| 376 | if (ret) | ||
| 377 | return -EINVAL; | ||
| 378 | |||
| 379 | /* Convert to the pin controllers number space */ | ||
| 380 | pin = gpio - range->base + range->pin_base; | ||
| 381 | |||
| 382 | return pinmux_request_gpio(pctldev, range, pin, gpio); | ||
| 383 | } | ||
| 384 | EXPORT_SYMBOL_GPL(pinctrl_request_gpio); | ||
| 385 | |||
| 386 | /** | ||
| 387 | * pinctrl_free_gpio() - free control on a single pin, currently used as GPIO | ||
| 388 | * @gpio: the GPIO pin number from the GPIO subsystem number space | ||
| 389 | * | ||
| 390 | * This function should *ONLY* be used from gpiolib-based GPIO drivers, | ||
| 391 | * as part of their gpio_free() semantics, platforms and individual drivers | ||
| 392 | * shall *NOT* request GPIO pins to be muxed out. | ||
| 393 | */ | ||
| 394 | void pinctrl_free_gpio(unsigned gpio) | ||
| 395 | { | ||
| 396 | struct pinctrl_dev *pctldev; | ||
| 397 | struct pinctrl_gpio_range *range; | ||
| 398 | int ret; | ||
| 399 | int pin; | ||
| 400 | |||
| 401 | ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range); | ||
| 402 | if (ret) | ||
| 403 | return; | ||
| 404 | |||
| 405 | /* Convert to the pin controllers number space */ | ||
| 406 | pin = gpio - range->base + range->pin_base; | ||
| 407 | |||
| 408 | return pinmux_free_gpio(pctldev, pin, range); | ||
| 409 | } | ||
| 410 | EXPORT_SYMBOL_GPL(pinctrl_free_gpio); | ||
| 411 | |||
| 412 | static int pinctrl_gpio_direction(unsigned gpio, bool input) | ||
| 413 | { | ||
| 414 | struct pinctrl_dev *pctldev; | ||
| 415 | struct pinctrl_gpio_range *range; | ||
| 416 | int ret; | ||
| 417 | int pin; | ||
| 418 | |||
| 419 | ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range); | ||
| 420 | if (ret) | ||
| 421 | return ret; | ||
| 422 | |||
| 423 | /* Convert to the pin controllers number space */ | ||
| 424 | pin = gpio - range->base + range->pin_base; | ||
| 425 | |||
| 426 | return pinmux_gpio_direction(pctldev, range, pin, input); | ||
| 427 | } | ||
| 428 | |||
| 429 | /** | ||
| 430 | * pinctrl_gpio_direction_input() - request a GPIO pin to go into input mode | ||
| 431 | * @gpio: the GPIO pin number from the GPIO subsystem number space | ||
| 432 | * | ||
| 433 | * This function should *ONLY* be used from gpiolib-based GPIO drivers, | ||
| 434 | * as part of their gpio_direction_input() semantics, platforms and individual | ||
| 435 | * drivers shall *NOT* touch pin control GPIO calls. | ||
| 436 | */ | ||
| 437 | int pinctrl_gpio_direction_input(unsigned gpio) | ||
| 438 | { | ||
| 439 | return pinctrl_gpio_direction(gpio, true); | ||
| 440 | } | ||
| 441 | EXPORT_SYMBOL_GPL(pinctrl_gpio_direction_input); | ||
| 442 | |||
| 443 | /** | ||
| 444 | * pinctrl_gpio_direction_output() - request a GPIO pin to go into output mode | ||
| 445 | * @gpio: the GPIO pin number from the GPIO subsystem number space | ||
| 446 | * | ||
| 447 | * This function should *ONLY* be used from gpiolib-based GPIO drivers, | ||
| 448 | * as part of their gpio_direction_output() semantics, platforms and individual | ||
| 449 | * drivers shall *NOT* touch pin control GPIO calls. | ||
| 450 | */ | ||
| 451 | int pinctrl_gpio_direction_output(unsigned gpio) | ||
| 452 | { | ||
| 453 | return pinctrl_gpio_direction(gpio, false); | ||
| 454 | } | ||
| 455 | EXPORT_SYMBOL_GPL(pinctrl_gpio_direction_output); | ||
| 456 | |||
| 457 | /** | ||
| 458 | * pinctrl_get() - retrieves the pin controller handle for a certain device | ||
| 459 | * @dev: the device to get the pin controller handle for | ||
| 460 | * @name: an optional specific control mapping name or NULL, the name is only | ||
| 461 | * needed if you want to have more than one mapping per device, or if you | ||
| 462 | * need an anonymous pin control (not tied to any specific device) | ||
| 463 | */ | ||
| 464 | struct pinctrl *pinctrl_get(struct device *dev, const char *name) | ||
| 465 | { | ||
| 466 | struct pinctrl_map const *map = NULL; | ||
| 467 | struct pinctrl_dev *pctldev = NULL; | ||
| 468 | const char *devname = NULL; | ||
| 469 | struct pinctrl *p; | ||
| 470 | bool found_map; | ||
| 471 | unsigned num_maps = 0; | ||
| 472 | int ret = -ENODEV; | ||
| 473 | int i; | ||
| 474 | |||
| 475 | /* We must have dev or ID or both */ | ||
| 476 | if (!dev && !name) | ||
| 477 | return ERR_PTR(-EINVAL); | ||
| 478 | |||
| 479 | if (dev) | ||
| 480 | devname = dev_name(dev); | ||
| 481 | |||
| 482 | pr_debug("get pin control handle %s for device %s\n", name, | ||
| 483 | devname ? devname : "(none)"); | ||
| 484 | |||
| 485 | /* | ||
| 486 | * create the state cookie holder struct pinctrl for each | ||
| 487 | * mapping, this is what consumers will get when requesting | ||
| 488 | * a pin control handle with pinctrl_get() | ||
| 489 | */ | ||
| 490 | p = kzalloc(sizeof(struct pinctrl), GFP_KERNEL); | ||
| 491 | if (p == NULL) | ||
| 492 | return ERR_PTR(-ENOMEM); | ||
| 493 | mutex_init(&p->mutex); | ||
| 494 | pinmux_init_pinctrl_handle(p); | ||
| 495 | |||
| 496 | /* Iterate over the pin control maps to locate the right ones */ | ||
| 497 | for (i = 0; i < pinctrl_maps_num; i++) { | ||
| 498 | map = &pinctrl_maps[i]; | ||
| 499 | found_map = false; | ||
| 500 | |||
| 501 | /* | ||
| 502 | * First, try to find the | ||
