.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * Core driver for the pin control subsystem |
---|
3 | 4 | * |
---|
.. | .. |
---|
8 | 9 | * Author: Linus Walleij <linus.walleij@linaro.org> |
---|
9 | 10 | * |
---|
10 | 11 | * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved. |
---|
11 | | - * |
---|
12 | | - * License terms: GNU General Public License (GPL) version 2 |
---|
13 | 12 | */ |
---|
14 | 13 | #define pr_fmt(fmt) "pinctrl core: " fmt |
---|
15 | 14 | |
---|
.. | .. |
---|
28 | 27 | #include <linux/pinctrl/machine.h> |
---|
29 | 28 | |
---|
30 | 29 | #ifdef CONFIG_GPIOLIB |
---|
| 30 | +#include "../gpio/gpiolib.h" |
---|
31 | 31 | #include <asm-generic/gpio.h> |
---|
32 | 32 | #endif |
---|
33 | 33 | |
---|
.. | .. |
---|
99 | 99 | */ |
---|
100 | 100 | struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *devname) |
---|
101 | 101 | { |
---|
102 | | - struct pinctrl_dev *pctldev = NULL; |
---|
| 102 | + struct pinctrl_dev *pctldev; |
---|
103 | 103 | |
---|
104 | 104 | if (!devname) |
---|
105 | 105 | return NULL; |
---|
.. | .. |
---|
162 | 162 | /** |
---|
163 | 163 | * pin_get_name_from_id() - look up a pin name from a pin id |
---|
164 | 164 | * @pctldev: the pin control device to lookup the pin on |
---|
165 | | - * @name: the name of the pin to look up |
---|
| 165 | + * @pin: pin number/id to look up |
---|
166 | 166 | */ |
---|
167 | 167 | const char *pin_get_name(struct pinctrl_dev *pctldev, const unsigned pin) |
---|
168 | 168 | { |
---|
.. | .. |
---|
178 | 178 | return desc->name; |
---|
179 | 179 | } |
---|
180 | 180 | EXPORT_SYMBOL_GPL(pin_get_name); |
---|
181 | | - |
---|
182 | | -/** |
---|
183 | | - * pin_is_valid() - check if pin exists on controller |
---|
184 | | - * @pctldev: the pin control device to check the pin on |
---|
185 | | - * @pin: pin to check, use the local pin controller index number |
---|
186 | | - * |
---|
187 | | - * This tells us whether a certain pin exist on a certain pin controller or |
---|
188 | | - * not. Pin lists may be sparse, so some pins may not exist. |
---|
189 | | - */ |
---|
190 | | -bool pin_is_valid(struct pinctrl_dev *pctldev, int pin) |
---|
191 | | -{ |
---|
192 | | - struct pin_desc *pindesc; |
---|
193 | | - |
---|
194 | | - if (pin < 0) |
---|
195 | | - return false; |
---|
196 | | - |
---|
197 | | - mutex_lock(&pctldev->mutex); |
---|
198 | | - pindesc = pin_desc_get(pctldev, pin); |
---|
199 | | - mutex_unlock(&pctldev->mutex); |
---|
200 | | - |
---|
201 | | - return pindesc != NULL; |
---|
202 | | -} |
---|
203 | | -EXPORT_SYMBOL_GPL(pin_is_valid); |
---|
204 | 181 | |
---|
205 | 182 | /* Deletes a range of pin descriptors */ |
---|
206 | 183 | static void pinctrl_free_pindescs(struct pinctrl_dev *pctldev, |
---|
.. | .. |
---|
313 | 290 | static struct pinctrl_gpio_range * |
---|
314 | 291 | pinctrl_match_gpio_range(struct pinctrl_dev *pctldev, unsigned gpio) |
---|
315 | 292 | { |
---|
316 | | - struct pinctrl_gpio_range *range = NULL; |
---|
| 293 | + struct pinctrl_gpio_range *range; |
---|
317 | 294 | |
---|
318 | 295 | mutex_lock(&pctldev->mutex); |
---|
319 | 296 | /* Loop over the ranges */ |
---|
.. | .. |
---|
393 | 370 | struct pinctrl_dev **outdev, |
---|
394 | 371 | struct pinctrl_gpio_range **outrange) |
---|
395 | 372 | { |
---|
396 | | - struct pinctrl_dev *pctldev = NULL; |
---|
| 373 | + struct pinctrl_dev *pctldev; |
---|
397 | 374 | |
---|
398 | 375 | mutex_lock(&pinctrldev_list_mutex); |
---|
399 | 376 | |
---|
.. | .. |
---|
601 | 578 | /** |
---|
602 | 579 | * pinctrl_generic_get_group() - returns a pin group based on the number |
---|
603 | 580 | * @pctldev: pin controller device |
---|
604 | | - * @gselector: group number |
---|
| 581 | + * @selector: group number |
---|
605 | 582 | */ |
---|
606 | 583 | struct group_desc *pinctrl_generic_get_group(struct pinctrl_dev *pctldev, |
---|
607 | 584 | unsigned int selector) |
---|
.. | .. |
---|
760 | 737 | |
---|
761 | 738 | return -EINVAL; |
---|
762 | 739 | } |
---|
| 740 | + |
---|
| 741 | +bool pinctrl_gpio_can_use_line(unsigned gpio) |
---|
| 742 | +{ |
---|
| 743 | + struct pinctrl_dev *pctldev; |
---|
| 744 | + struct pinctrl_gpio_range *range; |
---|
| 745 | + bool result; |
---|
| 746 | + int pin; |
---|
| 747 | + |
---|
| 748 | + /* |
---|
| 749 | + * Try to obtain GPIO range, if it fails |
---|
| 750 | + * we're probably dealing with GPIO driver |
---|
| 751 | + * without a backing pin controller - bail out. |
---|
| 752 | + */ |
---|
| 753 | + if (pinctrl_get_device_gpio_range(gpio, &pctldev, &range)) |
---|
| 754 | + return true; |
---|
| 755 | + |
---|
| 756 | + mutex_lock(&pctldev->mutex); |
---|
| 757 | + |
---|
| 758 | + /* Convert to the pin controllers number space */ |
---|
| 759 | + pin = gpio_to_pin(range, gpio); |
---|
| 760 | + |
---|
| 761 | + result = pinmux_can_be_used_for_gpio(pctldev, pin); |
---|
| 762 | + |
---|
| 763 | + mutex_unlock(&pctldev->mutex); |
---|
| 764 | + |
---|
| 765 | + return result; |
---|
| 766 | +} |
---|
| 767 | +EXPORT_SYMBOL_GPL(pinctrl_gpio_can_use_line); |
---|
763 | 768 | |
---|
764 | 769 | /** |
---|
765 | 770 | * pinctrl_gpio_request() - request a single pin to be used as GPIO |
---|
.. | .. |
---|
1217 | 1222 | } |
---|
1218 | 1223 | EXPORT_SYMBOL_GPL(pinctrl_lookup_state); |
---|
1219 | 1224 | |
---|
| 1225 | +static void pinctrl_link_add(struct pinctrl_dev *pctldev, |
---|
| 1226 | + struct device *consumer) |
---|
| 1227 | +{ |
---|
| 1228 | + if (pctldev->desc->link_consumers) |
---|
| 1229 | + device_link_add(consumer, pctldev->dev, |
---|
| 1230 | + DL_FLAG_PM_RUNTIME | |
---|
| 1231 | + DL_FLAG_AUTOREMOVE_CONSUMER); |
---|
| 1232 | +} |
---|
| 1233 | + |
---|
1220 | 1234 | /** |
---|
1221 | 1235 | * pinctrl_commit_state() - select/activate/program a pinctrl state to HW |
---|
1222 | 1236 | * @p: the pinctrl handle for the device that requests configuration |
---|
.. | .. |
---|
1262 | 1276 | if (ret < 0) { |
---|
1263 | 1277 | goto unapply_new_state; |
---|
1264 | 1278 | } |
---|
| 1279 | + |
---|
| 1280 | + /* Do not link hogs (circular dependency) */ |
---|
| 1281 | + if (p != setting->pctldev->p) |
---|
| 1282 | + pinctrl_link_add(setting->pctldev, p->dev); |
---|
1265 | 1283 | } |
---|
1266 | 1284 | |
---|
1267 | 1285 | p->state = state; |
---|
.. | .. |
---|
1312 | 1330 | } |
---|
1313 | 1331 | |
---|
1314 | 1332 | /** |
---|
1315 | | - * struct devm_pinctrl_get() - Resource managed pinctrl_get() |
---|
| 1333 | + * devm_pinctrl_get() - Resource managed pinctrl_get() |
---|
1316 | 1334 | * @dev: the device to obtain the handle for |
---|
1317 | 1335 | * |
---|
1318 | 1336 | * If there is a need to explicitly destroy the returned struct pinctrl, |
---|
.. | .. |
---|
1360 | 1378 | } |
---|
1361 | 1379 | EXPORT_SYMBOL_GPL(devm_pinctrl_put); |
---|
1362 | 1380 | |
---|
1363 | | -int pinctrl_register_map(const struct pinctrl_map *maps, unsigned num_maps, |
---|
1364 | | - bool dup) |
---|
| 1381 | +/** |
---|
| 1382 | + * pinctrl_register_mappings() - register a set of pin controller mappings |
---|
| 1383 | + * @maps: the pincontrol mappings table to register. Note the pinctrl-core |
---|
| 1384 | + * keeps a reference to the passed in maps, so they should _not_ be |
---|
| 1385 | + * marked with __initdata. |
---|
| 1386 | + * @num_maps: the number of maps in the mapping table |
---|
| 1387 | + */ |
---|
| 1388 | +int pinctrl_register_mappings(const struct pinctrl_map *maps, |
---|
| 1389 | + unsigned num_maps) |
---|
1365 | 1390 | { |
---|
1366 | 1391 | int i, ret; |
---|
1367 | 1392 | struct pinctrl_maps *maps_node; |
---|
.. | .. |
---|
1414 | 1439 | if (!maps_node) |
---|
1415 | 1440 | return -ENOMEM; |
---|
1416 | 1441 | |
---|
| 1442 | + maps_node->maps = maps; |
---|
1417 | 1443 | maps_node->num_maps = num_maps; |
---|
1418 | | - if (dup) { |
---|
1419 | | - maps_node->maps = kmemdup(maps, sizeof(*maps) * num_maps, |
---|
1420 | | - GFP_KERNEL); |
---|
1421 | | - if (!maps_node->maps) { |
---|
1422 | | - kfree(maps_node); |
---|
1423 | | - return -ENOMEM; |
---|
1424 | | - } |
---|
1425 | | - } else { |
---|
1426 | | - maps_node->maps = maps; |
---|
1427 | | - } |
---|
1428 | 1444 | |
---|
1429 | 1445 | mutex_lock(&pinctrl_maps_mutex); |
---|
1430 | 1446 | list_add_tail(&maps_node->node, &pinctrl_maps); |
---|
.. | .. |
---|
1432 | 1448 | |
---|
1433 | 1449 | return 0; |
---|
1434 | 1450 | } |
---|
1435 | | - |
---|
1436 | | -/** |
---|
1437 | | - * pinctrl_register_mappings() - register a set of pin controller mappings |
---|
1438 | | - * @maps: the pincontrol mappings table to register. This should probably be |
---|
1439 | | - * marked with __initdata so it can be discarded after boot. This |
---|
1440 | | - * function will perform a shallow copy for the mapping entries. |
---|
1441 | | - * @num_maps: the number of maps in the mapping table |
---|
1442 | | - */ |
---|
1443 | | -int pinctrl_register_mappings(const struct pinctrl_map *maps, |
---|
1444 | | - unsigned num_maps) |
---|
1445 | | -{ |
---|
1446 | | - return pinctrl_register_map(maps, num_maps, true); |
---|
1447 | | -} |
---|
1448 | 1451 | EXPORT_SYMBOL_GPL(pinctrl_register_mappings); |
---|
1449 | 1452 | |
---|
1450 | | -void pinctrl_unregister_map(const struct pinctrl_map *map) |
---|
| 1453 | +/** |
---|
| 1454 | + * pinctrl_unregister_mappings() - unregister a set of pin controller mappings |
---|
| 1455 | + * @map: the pincontrol mappings table passed to pinctrl_register_mappings() |
---|
| 1456 | + * when registering the mappings. |
---|
| 1457 | + */ |
---|
| 1458 | +void pinctrl_unregister_mappings(const struct pinctrl_map *map) |
---|
1451 | 1459 | { |
---|
1452 | 1460 | struct pinctrl_maps *maps_node; |
---|
1453 | 1461 | |
---|
.. | .. |
---|
1462 | 1470 | } |
---|
1463 | 1471 | mutex_unlock(&pinctrl_maps_mutex); |
---|
1464 | 1472 | } |
---|
| 1473 | +EXPORT_SYMBOL_GPL(pinctrl_unregister_mappings); |
---|
1465 | 1474 | |
---|
1466 | 1475 | /** |
---|
1467 | 1476 | * pinctrl_force_sleep() - turn a given controller device into sleep state |
---|
.. | .. |
---|
1519 | 1528 | return ret; |
---|
1520 | 1529 | } |
---|
1521 | 1530 | |
---|
1522 | | -#ifdef CONFIG_PM |
---|
1523 | | - |
---|
1524 | | -/** |
---|
1525 | | - * pinctrl_pm_select_state() - select pinctrl state for PM |
---|
1526 | | - * @dev: device to select default state for |
---|
1527 | | - * @state: state to set |
---|
1528 | | - */ |
---|
1529 | | -static int pinctrl_pm_select_state(struct device *dev, |
---|
1530 | | - struct pinctrl_state *state) |
---|
| 1531 | +static int pinctrl_select_bound_state(struct device *dev, |
---|
| 1532 | + struct pinctrl_state *state) |
---|
1531 | 1533 | { |
---|
1532 | 1534 | struct dev_pin_info *pins = dev->pins; |
---|
1533 | 1535 | int ret; |
---|
.. | .. |
---|
1542 | 1544 | } |
---|
1543 | 1545 | |
---|
1544 | 1546 | /** |
---|
| 1547 | + * pinctrl_select_default_state() - select default pinctrl state |
---|
| 1548 | + * @dev: device to select default state for |
---|
| 1549 | + */ |
---|
| 1550 | +int pinctrl_select_default_state(struct device *dev) |
---|
| 1551 | +{ |
---|
| 1552 | + if (!dev->pins) |
---|
| 1553 | + return 0; |
---|
| 1554 | + |
---|
| 1555 | + return pinctrl_select_bound_state(dev, dev->pins->default_state); |
---|
| 1556 | +} |
---|
| 1557 | +EXPORT_SYMBOL_GPL(pinctrl_select_default_state); |
---|
| 1558 | + |
---|
| 1559 | +#ifdef CONFIG_PM |
---|
| 1560 | + |
---|
| 1561 | +/** |
---|
1545 | 1562 | * pinctrl_pm_select_default_state() - select default pinctrl state for PM |
---|
1546 | 1563 | * @dev: device to select default state for |
---|
1547 | 1564 | */ |
---|
1548 | 1565 | int pinctrl_pm_select_default_state(struct device *dev) |
---|
1549 | 1566 | { |
---|
1550 | | - if (!dev->pins) |
---|
1551 | | - return 0; |
---|
1552 | | - |
---|
1553 | | - return pinctrl_pm_select_state(dev, dev->pins->default_state); |
---|
| 1567 | + return pinctrl_select_default_state(dev); |
---|
1554 | 1568 | } |
---|
1555 | 1569 | EXPORT_SYMBOL_GPL(pinctrl_pm_select_default_state); |
---|
1556 | 1570 | |
---|
.. | .. |
---|
1563 | 1577 | if (!dev->pins) |
---|
1564 | 1578 | return 0; |
---|
1565 | 1579 | |
---|
1566 | | - return pinctrl_pm_select_state(dev, dev->pins->sleep_state); |
---|
| 1580 | + return pinctrl_select_bound_state(dev, dev->pins->sleep_state); |
---|
1567 | 1581 | } |
---|
1568 | 1582 | EXPORT_SYMBOL_GPL(pinctrl_pm_select_sleep_state); |
---|
1569 | 1583 | |
---|
.. | .. |
---|
1576 | 1590 | if (!dev->pins) |
---|
1577 | 1591 | return 0; |
---|
1578 | 1592 | |
---|
1579 | | - return pinctrl_pm_select_state(dev, dev->pins->idle_state); |
---|
| 1593 | + return pinctrl_select_bound_state(dev, dev->pins->idle_state); |
---|
1580 | 1594 | } |
---|
1581 | 1595 | EXPORT_SYMBOL_GPL(pinctrl_pm_select_idle_state); |
---|
1582 | 1596 | #endif |
---|
.. | .. |
---|
1588 | 1602 | struct pinctrl_dev *pctldev = s->private; |
---|
1589 | 1603 | const struct pinctrl_ops *ops = pctldev->desc->pctlops; |
---|
1590 | 1604 | unsigned i, pin; |
---|
| 1605 | +#ifdef CONFIG_GPIOLIB |
---|
| 1606 | + struct pinctrl_gpio_range *range; |
---|
| 1607 | + struct gpio_chip *chip; |
---|
| 1608 | + int gpio_num; |
---|
| 1609 | +#endif |
---|
1591 | 1610 | |
---|
1592 | 1611 | seq_printf(s, "registered pins: %d\n", pctldev->desc->npins); |
---|
1593 | 1612 | |
---|
.. | .. |
---|
1604 | 1623 | continue; |
---|
1605 | 1624 | |
---|
1606 | 1625 | seq_printf(s, "pin %d (%s) ", pin, desc->name); |
---|
| 1626 | + |
---|
| 1627 | +#ifdef CONFIG_GPIOLIB |
---|
| 1628 | + gpio_num = -1; |
---|
| 1629 | + list_for_each_entry(range, &pctldev->gpio_ranges, node) { |
---|
| 1630 | + if ((pin >= range->pin_base) && |
---|
| 1631 | + (pin < (range->pin_base + range->npins))) { |
---|
| 1632 | + gpio_num = range->base + (pin - range->pin_base); |
---|
| 1633 | + break; |
---|
| 1634 | + } |
---|
| 1635 | + } |
---|
| 1636 | + if (gpio_num >= 0) |
---|
| 1637 | + chip = gpio_to_chip(gpio_num); |
---|
| 1638 | + else |
---|
| 1639 | + chip = NULL; |
---|
| 1640 | + if (chip) |
---|
| 1641 | + seq_printf(s, "%u:%s ", gpio_num - chip->gpiodev->base, chip->label); |
---|
| 1642 | + else |
---|
| 1643 | + seq_puts(s, "0:? "); |
---|
| 1644 | +#endif |
---|
1607 | 1645 | |
---|
1608 | 1646 | /* Driver-specific info per pin */ |
---|
1609 | 1647 | if (ops->pin_dbg_show) |
---|
.. | .. |
---|
1667 | 1705 | static int pinctrl_gpioranges_show(struct seq_file *s, void *what) |
---|
1668 | 1706 | { |
---|
1669 | 1707 | struct pinctrl_dev *pctldev = s->private; |
---|
1670 | | - struct pinctrl_gpio_range *range = NULL; |
---|
| 1708 | + struct pinctrl_gpio_range *range; |
---|
1671 | 1709 | |
---|
1672 | 1710 | seq_puts(s, "GPIO ranges handled:\n"); |
---|
1673 | 1711 | |
---|
.. | .. |
---|
2083 | 2121 | return ERR_PTR(error); |
---|
2084 | 2122 | |
---|
2085 | 2123 | return pctldev; |
---|
2086 | | - |
---|
2087 | 2124 | } |
---|
2088 | 2125 | EXPORT_SYMBOL_GPL(pinctrl_register); |
---|
2089 | 2126 | |
---|
.. | .. |
---|
2215 | 2252 | * @dev: parent device for this pin controller |
---|
2216 | 2253 | * @pctldesc: descriptor for this pin controller |
---|
2217 | 2254 | * @driver_data: private pin controller data for this pin controller |
---|
| 2255 | + * @pctldev: pin controller device |
---|
2218 | 2256 | * |
---|
2219 | | - * Returns an error pointer if pincontrol register failed. Otherwise |
---|
2220 | | - * it returns valid pinctrl handle. |
---|
| 2257 | + * Returns zero on success or an error number on failure. |
---|
2221 | 2258 | * |
---|
2222 | 2259 | * The pinctrl device will be automatically released when the device is unbound. |
---|
2223 | 2260 | */ |
---|
.. | .. |
---|
2266 | 2303 | } |
---|
2267 | 2304 | |
---|
2268 | 2305 | /* init early since many drivers really need to initialized pinmux early */ |
---|
2269 | | -#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT |
---|
2270 | | -core_initcall_sync(pinctrl_init); |
---|
2271 | | -#else |
---|
2272 | 2306 | core_initcall(pinctrl_init); |
---|
2273 | | -#endif |
---|