hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/pinctrl/core.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Core driver for the pin control subsystem
34 *
....@@ -8,8 +9,6 @@
89 * Author: Linus Walleij <linus.walleij@linaro.org>
910 *
1011 * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
11
- *
12
- * License terms: GNU General Public License (GPL) version 2
1312 */
1413 #define pr_fmt(fmt) "pinctrl core: " fmt
1514
....@@ -28,6 +27,7 @@
2827 #include <linux/pinctrl/machine.h>
2928
3029 #ifdef CONFIG_GPIOLIB
30
+#include "../gpio/gpiolib.h"
3131 #include <asm-generic/gpio.h>
3232 #endif
3333
....@@ -99,7 +99,7 @@
9999 */
100100 struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *devname)
101101 {
102
- struct pinctrl_dev *pctldev = NULL;
102
+ struct pinctrl_dev *pctldev;
103103
104104 if (!devname)
105105 return NULL;
....@@ -162,7 +162,7 @@
162162 /**
163163 * pin_get_name_from_id() - look up a pin name from a pin id
164164 * @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
166166 */
167167 const char *pin_get_name(struct pinctrl_dev *pctldev, const unsigned pin)
168168 {
....@@ -178,29 +178,6 @@
178178 return desc->name;
179179 }
180180 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);
204181
205182 /* Deletes a range of pin descriptors */
206183 static void pinctrl_free_pindescs(struct pinctrl_dev *pctldev,
....@@ -313,7 +290,7 @@
313290 static struct pinctrl_gpio_range *
314291 pinctrl_match_gpio_range(struct pinctrl_dev *pctldev, unsigned gpio)
315292 {
316
- struct pinctrl_gpio_range *range = NULL;
293
+ struct pinctrl_gpio_range *range;
317294
318295 mutex_lock(&pctldev->mutex);
319296 /* Loop over the ranges */
....@@ -393,7 +370,7 @@
393370 struct pinctrl_dev **outdev,
394371 struct pinctrl_gpio_range **outrange)
395372 {
396
- struct pinctrl_dev *pctldev = NULL;
373
+ struct pinctrl_dev *pctldev;
397374
398375 mutex_lock(&pinctrldev_list_mutex);
399376
....@@ -601,7 +578,7 @@
601578 /**
602579 * pinctrl_generic_get_group() - returns a pin group based on the number
603580 * @pctldev: pin controller device
604
- * @gselector: group number
581
+ * @selector: group number
605582 */
606583 struct group_desc *pinctrl_generic_get_group(struct pinctrl_dev *pctldev,
607584 unsigned int selector)
....@@ -760,6 +737,34 @@
760737
761738 return -EINVAL;
762739 }
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);
763768
764769 /**
765770 * pinctrl_gpio_request() - request a single pin to be used as GPIO
....@@ -1217,6 +1222,15 @@
12171222 }
12181223 EXPORT_SYMBOL_GPL(pinctrl_lookup_state);
12191224
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
+
12201234 /**
12211235 * pinctrl_commit_state() - select/activate/program a pinctrl state to HW
12221236 * @p: the pinctrl handle for the device that requests configuration
....@@ -1262,6 +1276,10 @@
12621276 if (ret < 0) {
12631277 goto unapply_new_state;
12641278 }
1279
+
1280
+ /* Do not link hogs (circular dependency) */
1281
+ if (p != setting->pctldev->p)
1282
+ pinctrl_link_add(setting->pctldev, p->dev);
12651283 }
12661284
12671285 p->state = state;
....@@ -1312,7 +1330,7 @@
13121330 }
13131331
13141332 /**
1315
- * struct devm_pinctrl_get() - Resource managed pinctrl_get()
1333
+ * devm_pinctrl_get() - Resource managed pinctrl_get()
13161334 * @dev: the device to obtain the handle for
13171335 *
13181336 * If there is a need to explicitly destroy the returned struct pinctrl,
....@@ -1360,8 +1378,15 @@
13601378 }
13611379 EXPORT_SYMBOL_GPL(devm_pinctrl_put);
13621380
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)
13651390 {
13661391 int i, ret;
13671392 struct pinctrl_maps *maps_node;
....@@ -1414,17 +1439,8 @@
14141439 if (!maps_node)
14151440 return -ENOMEM;
14161441
1442
+ maps_node->maps = maps;
14171443 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
- }
14281444
14291445 mutex_lock(&pinctrl_maps_mutex);
14301446 list_add_tail(&maps_node->node, &pinctrl_maps);
....@@ -1432,22 +1448,14 @@
14321448
14331449 return 0;
14341450 }
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
-}
14481451 EXPORT_SYMBOL_GPL(pinctrl_register_mappings);
14491452
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)
14511459 {
14521460 struct pinctrl_maps *maps_node;
14531461
....@@ -1462,6 +1470,7 @@
14621470 }
14631471 mutex_unlock(&pinctrl_maps_mutex);
14641472 }
1473
+EXPORT_SYMBOL_GPL(pinctrl_unregister_mappings);
14651474
14661475 /**
14671476 * pinctrl_force_sleep() - turn a given controller device into sleep state
....@@ -1519,15 +1528,8 @@
15191528 return ret;
15201529 }
15211530
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)
15311533 {
15321534 struct dev_pin_info *pins = dev->pins;
15331535 int ret;
....@@ -1542,15 +1544,27 @@
15421544 }
15431545
15441546 /**
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
+/**
15451562 * pinctrl_pm_select_default_state() - select default pinctrl state for PM
15461563 * @dev: device to select default state for
15471564 */
15481565 int pinctrl_pm_select_default_state(struct device *dev)
15491566 {
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);
15541568 }
15551569 EXPORT_SYMBOL_GPL(pinctrl_pm_select_default_state);
15561570
....@@ -1563,7 +1577,7 @@
15631577 if (!dev->pins)
15641578 return 0;
15651579
1566
- return pinctrl_pm_select_state(dev, dev->pins->sleep_state);
1580
+ return pinctrl_select_bound_state(dev, dev->pins->sleep_state);
15671581 }
15681582 EXPORT_SYMBOL_GPL(pinctrl_pm_select_sleep_state);
15691583
....@@ -1576,7 +1590,7 @@
15761590 if (!dev->pins)
15771591 return 0;
15781592
1579
- return pinctrl_pm_select_state(dev, dev->pins->idle_state);
1593
+ return pinctrl_select_bound_state(dev, dev->pins->idle_state);
15801594 }
15811595 EXPORT_SYMBOL_GPL(pinctrl_pm_select_idle_state);
15821596 #endif
....@@ -1588,6 +1602,11 @@
15881602 struct pinctrl_dev *pctldev = s->private;
15891603 const struct pinctrl_ops *ops = pctldev->desc->pctlops;
15901604 unsigned i, pin;
1605
+#ifdef CONFIG_GPIOLIB
1606
+ struct pinctrl_gpio_range *range;
1607
+ struct gpio_chip *chip;
1608
+ int gpio_num;
1609
+#endif
15911610
15921611 seq_printf(s, "registered pins: %d\n", pctldev->desc->npins);
15931612
....@@ -1604,6 +1623,25 @@
16041623 continue;
16051624
16061625 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
16071645
16081646 /* Driver-specific info per pin */
16091647 if (ops->pin_dbg_show)
....@@ -1667,7 +1705,7 @@
16671705 static int pinctrl_gpioranges_show(struct seq_file *s, void *what)
16681706 {
16691707 struct pinctrl_dev *pctldev = s->private;
1670
- struct pinctrl_gpio_range *range = NULL;
1708
+ struct pinctrl_gpio_range *range;
16711709
16721710 seq_puts(s, "GPIO ranges handled:\n");
16731711
....@@ -2083,7 +2121,6 @@
20832121 return ERR_PTR(error);
20842122
20852123 return pctldev;
2086
-
20872124 }
20882125 EXPORT_SYMBOL_GPL(pinctrl_register);
20892126
....@@ -2215,9 +2252,9 @@
22152252 * @dev: parent device for this pin controller
22162253 * @pctldesc: descriptor for this pin controller
22172254 * @driver_data: private pin controller data for this pin controller
2255
+ * @pctldev: pin controller device
22182256 *
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.
22212258 *
22222259 * The pinctrl device will be automatically released when the device is unbound.
22232260 */
....@@ -2266,8 +2303,4 @@
22662303 }
22672304
22682305 /* 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
22722306 core_initcall(pinctrl_init);
2273
-#endif