aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/pinctrl.txt18
-rw-r--r--drivers/base/Makefile1
-rw-r--r--drivers/base/dd.c7
-rw-r--r--drivers/base/pinctrl.c69
-rw-r--r--drivers/pinctrl/core.c30
-rw-r--r--drivers/pinctrl/core.h3
-rw-r--r--include/linux/device.h7
-rw-r--r--include/linux/pinctrl/devinfo.h45
8 files changed, 173 insertions, 7 deletions
diff --git a/Documentation/pinctrl.txt b/Documentation/pinctrl.txt
index da40efbef6ec..a2b57e0a1db0 100644
--- a/Documentation/pinctrl.txt
+++ b/Documentation/pinctrl.txt
@@ -972,6 +972,18 @@ pinmux core.
972Pin control requests from drivers 972Pin control requests from drivers
973================================= 973=================================
974 974
975When a device driver is about to probe the device core will automatically
976attempt to issue pinctrl_get_select_default() on these devices.
977This way driver writers do not need to add any of the boilerplate code
978of the type found below. However when doing fine-grained state selection
979and not using the "default" state, you may have to do some device driver
980handling of the pinctrl handles and states.
981
982So if you just want to put the pins for a certain device into the default
983state and be done with it, there is nothing you need to do besides
984providing the proper mapping table. The device core will take care of
985the rest.
986
975Generally it is discouraged to let individual drivers get and enable pin 987Generally it is discouraged to let individual drivers get and enable pin
976control. So if possible, handle the pin control in platform code or some other 988control. So if possible, handle the pin control in platform code or some other
977place where you have access to all the affected struct device * pointers. In 989place where you have access to all the affected struct device * pointers. In
@@ -1097,9 +1109,9 @@ situations that can be electrically unpleasant, you will certainly want to
1097mux in and bias pins in a certain way before the GPIO subsystems starts to 1109mux in and bias pins in a certain way before the GPIO subsystems starts to
1098deal with them. 1110deal with them.
1099 1111
1100The above can be hidden: using pinctrl hogs, the pin control driver may be 1112The above can be hidden: using the device core, the pinctrl core may be
1101setting up the config and muxing for the pins when it is probing, 1113setting up the config and muxing for the pins right before the device is
1102nevertheless orthogonal to the GPIO subsystem. 1114probing, nevertheless orthogonal to the GPIO subsystem.
1103 1115
1104But there are also situations where it makes sense for the GPIO subsystem 1116But there are also situations where it makes sense for the GPIO subsystem
1105to communicate directly with with the pinctrl subsystem, using the latter 1117to communicate directly with with the pinctrl subsystem, using the latter
diff --git a/drivers/base/Makefile b/drivers/base/Makefile
index 5aa2d703d19f..4e22ce3ed73d 100644
--- a/drivers/base/Makefile
+++ b/drivers/base/Makefile
@@ -21,6 +21,7 @@ endif
21obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor.o 21obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor.o
22obj-$(CONFIG_REGMAP) += regmap/ 22obj-$(CONFIG_REGMAP) += regmap/
23obj-$(CONFIG_SOC_BUS) += soc.o 23obj-$(CONFIG_SOC_BUS) += soc.o
24obj-$(CONFIG_PINCTRL) += pinctrl.o
24 25
25ccflags-$(CONFIG_DEBUG_DRIVER) := -DDEBUG 26ccflags-$(CONFIG_DEBUG_DRIVER) := -DDEBUG
26 27
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index e3bbed8a617c..656310156dde 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -24,6 +24,7 @@
24#include <linux/wait.h> 24#include <linux/wait.h>
25#include <linux/async.h> 25#include <linux/async.h>
26#include <linux/pm_runtime.h> 26#include <linux/pm_runtime.h>
27#include <linux/pinctrl/devinfo.h>
27 28
28#include "base.h" 29#include "base.h"
29#include "power/power.h" 30#include "power/power.h"
@@ -269,6 +270,12 @@ static int really_probe(struct device *dev, struct device_driver *drv)
269 WARN_ON(!list_empty(&dev->devres_head)); 270 WARN_ON(!list_empty(&dev->devres_head));
270 271
271 dev->driver = drv; 272 dev->driver = drv;
273
274 /* If using pinctrl, bind pins now before probing */
275 ret = pinctrl_bind_pins(dev);
276 if (ret)
277 goto probe_failed;
278
272 if (driver_sysfs_add(dev)) { 279 if (driver_sysfs_add(dev)) {
273 printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n", 280 printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n",
274 __func__, dev_name(dev)); 281 __func__, dev_name(dev));
diff --git a/drivers/base/pinctrl.c b/drivers/base/pinctrl.c
new file mode 100644
index 000000000000..67a274e86727
--- /dev/null
+++ b/drivers/base/pinctrl.c
@@ -0,0 +1,69 @@
1/*
2 * Driver core interface to the pinctrl subsystem.
3 *
4 * Copyright (C) 2012 ST-Ericsson SA
5 * Written on behalf of Linaro for ST-Ericsson
6 * Based on bits of regulator core, gpio core and clk core
7 *
8 * Author: Linus Walleij <linus.walleij@linaro.org>
9 *
10 * License terms: GNU General Public License (GPL) version 2
11 */
12
13#include <linux/device.h>
14#include <linux/pinctrl/devinfo.h>
15#include <linux/pinctrl/consumer.h>
16#include <linux/slab.h>
17
18/**
19 * pinctrl_bind_pins() - called by the device core before probe
20 * @dev: the device that is just about to probe
21 */
22int pinctrl_bind_pins(struct device *dev)
23{
24 int ret;
25
26 dev->pins = devm_kzalloc(dev, sizeof(*(dev->pins)), GFP_KERNEL);
27 if (!dev->pins)
28 return -ENOMEM;
29
30 dev->pins->p = devm_pinctrl_get(dev);
31 if (IS_ERR(dev->pins->p)) {
32 dev_dbg(dev, "no pinctrl handle\n");
33 ret = PTR_ERR(dev->pins->p);
34 goto cleanup_alloc;
35 }
36
37 dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,
38 PINCTRL_STATE_DEFAULT);
39 if (IS_ERR(dev->pins->default_state)) {
40 dev_dbg(dev, "no default pinctrl state\n");
41 ret = 0;
42 goto cleanup_get;
43 }
44
45 ret = pinctrl_select_state(dev->pins->p, dev->pins->default_state);
46 if (ret) {
47 dev_dbg(dev, "failed to activate default pinctrl state\n");
48 goto cleanup_get;
49 }
50
51 return 0;
52
53 /*
54 * If no pinctrl handle or default state was found for this device,
55 * let's explicitly free the pin container in the device, there is
56 * no point in keeping it around.
57 */
58cleanup_get:
59 devm_pinctrl_put(dev->pins->p);
60cleanup_alloc:
61 devm_kfree(dev, dev->pins);
62 dev->pins = NULL;
63
64 /* Only return deferrals */
65 if (ret != -EPROBE_DEFER)
66 ret = 0;
67
68 return ret;
69}
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index e6373f30aeeb..5a2fe9aae20f 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -14,6 +14,7 @@
14#define pr_fmt(fmt) "pinctrl core: " fmt 14#define pr_fmt(fmt) "pinctrl core: " fmt
15 15
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/kref.h>
17#include <linux/export.h> 18#include <linux/export.h>
18#include <linux/init.h> 19#include <linux/init.h>
19#include <linux/device.h> 20#include <linux/device.h>
@@ -727,6 +728,8 @@ static struct pinctrl *create_pinctrl(struct device *dev)
727 return ERR_PTR(ret); 728 return ERR_PTR(ret);
728 } 729 }
729 730
731 kref_init(&p->users);
732
730 /* Add the pinctrl handle to the global list */ 733 /* Add the pinctrl handle to the global list */
731 list_add_tail(&p->node, &pinctrl_list); 734 list_add_tail(&p->node, &pinctrl_list);
732 735
@@ -740,9 +743,17 @@ static struct pinctrl *pinctrl_get_locked(struct device *dev)
740 if (WARN_ON(!dev)) 743 if (WARN_ON(!dev))
741 return ERR_PTR(-EINVAL); 744 return ERR_PTR(-EINVAL);
742 745
746 /*
747 * See if somebody else (such as the device core) has already
748 * obtained a handle to the pinctrl for this device. In that case,
749 * return another pointer to it.
750 */
743 p = find_pinctrl(dev); 751 p = find_pinctrl(dev);
744 if (p != NULL) 752 if (p != NULL) {
745 return ERR_PTR(-EBUSY); 753 dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n");
754 kref_get(&p->users);
755 return p;
756 }
746 757
747 return create_pinctrl(dev); 758 return create_pinctrl(dev);
748} 759}
@@ -798,13 +809,24 @@ static void pinctrl_put_locked(struct pinctrl *p, bool inlist)
798} 809}
799 810
800/** 811/**
801 * pinctrl_put() - release a previously claimed pinctrl handle 812 * pinctrl_release() - release the pinctrl handle
813 * @kref: the kref in the pinctrl being released
814 */
815void pinctrl_release(struct kref *kref)
816{
817 struct pinctrl *p = container_of(kref, struct pinctrl, users);
818
819 pinctrl_put_locked(p, true);
820}
821
822/**
823 * pinctrl_put() - decrease use count on a previously claimed pinctrl handle
802 * @p: the pinctrl handle to release 824 * @p: the pinctrl handle to release
803 */ 825 */
804void pinctrl_put(struct pinctrl *p) 826void pinctrl_put(struct pinctrl *p)
805{ 827{
806 mutex_lock(&pinctrl_mutex); 828 mutex_lock(&pinctrl_mutex);
807 pinctrl_put_locked(p, true); 829 kref_put(&p->users, pinctrl_release);
808 mutex_unlock(&pinctrl_mutex); 830 mutex_unlock(&pinctrl_mutex);
809} 831}
810EXPORT_SYMBOL_GPL(pinctrl_put); 832EXPORT_SYMBOL_GPL(pinctrl_put);
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h
index 232a9f6db4aa..fdd350d639f6 100644
--- a/drivers/pinctrl/core.h
+++ b/drivers/pinctrl/core.h
@@ -9,6 +9,7 @@
9 * License terms: GNU General Public License (GPL) version 2 9 * License terms: GNU General Public License (GPL) version 2
10 */ 10 */
11 11
12#include <linux/kref.h>
12#include <linux/mutex.h> 13#include <linux/mutex.h>
13#include <linux/radix-tree.h> 14#include <linux/radix-tree.h>
14#include <linux/pinctrl/pinconf.h> 15#include <linux/pinctrl/pinconf.h>
@@ -58,6 +59,7 @@ struct pinctrl_dev {
58 * @state: the current state 59 * @state: the current state
59 * @dt_maps: the mapping table chunks dynamically parsed from device tree for 60 * @dt_maps: the mapping table chunks dynamically parsed from device tree for
60 * this device, if any 61 * this device, if any
62 * @users: reference count
61 */ 63 */
62struct pinctrl { 64struct pinctrl {
63 struct list_head node; 65 struct list_head node;
@@ -65,6 +67,7 @@ struct pinctrl {
65 struct list_head states; 67 struct list_head states;
66 struct pinctrl_state *state; 68 struct pinctrl_state *state;
67 struct list_head dt_maps; 69 struct list_head dt_maps;
70 struct kref users;
68}; 71};
69 72
70/** 73/**
diff --git a/include/linux/device.h b/include/linux/device.h
index 43dcda937ddf..001f6637aa47 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -21,6 +21,7 @@
21#include <linux/compiler.h> 21#include <linux/compiler.h>
22#include <linux/types.h> 22#include <linux/types.h>
23#include <linux/mutex.h> 23#include <linux/mutex.h>
24#include <linux/pinctrl/devinfo.h>
24#include <linux/pm.h> 25#include <linux/pm.h>
25#include <linux/atomic.h> 26#include <linux/atomic.h>
26#include <linux/ratelimit.h> 27#include <linux/ratelimit.h>
@@ -620,6 +621,8 @@ struct acpi_dev_node {
620 * @pm_domain: Provide callbacks that are executed during system suspend, 621 * @pm_domain: Provide callbacks that are executed during system suspend,
621 * hibernation, system resume and during runtime PM transitions 622 * hibernation, system resume and during runtime PM transitions
622 * along with subsystem-level and driver-level callbacks. 623 * along with subsystem-level and driver-level callbacks.
624 * @pins: For device pin management.
625 * See Documentation/pinctrl.txt for details.
623 * @numa_node: NUMA node this device is close to. 626 * @numa_node: NUMA node this device is close to.
624 * @dma_mask: Dma mask (if dma'ble device). 627 * @dma_mask: Dma mask (if dma'ble device).
625 * @coherent_dma_mask: Like dma_mask, but for alloc_coherent mapping as not all 628 * @coherent_dma_mask: Like dma_mask, but for alloc_coherent mapping as not all
@@ -672,6 +675,10 @@ struct device {
672 struct dev_pm_info power; 675 struct dev_pm_info power;
673 struct dev_pm_domain *pm_domain; 676 struct dev_pm_domain *pm_domain;
674 677
678#ifdef CONFIG_PINCTRL
679 struct dev_pin_info *pins;
680#endif
681
675#ifdef CONFIG_NUMA 682#ifdef CONFIG_NUMA
676 int numa_node; /* NUMA node this device is close to */ 683 int numa_node; /* NUMA node this device is close to */
677#endif 684#endif
diff --git a/include/linux/pinctrl/devinfo.h b/include/linux/pinctrl/devinfo.h
new file mode 100644
index 000000000000..6e5f8a985ea7
--- /dev/null
+++ b/include/linux/pinctrl/devinfo.h
@@ -0,0 +1,45 @@
1/*
2 * Per-device information from the pin control system.
3 * This is the stuff that get included into the device
4 * core.
5 *
6 * Copyright (C) 2012 ST-Ericsson SA
7 * Written on behalf of Linaro for ST-Ericsson
8 * This interface is used in the core to keep track of pins.
9 *
10 * Author: Linus Walleij <linus.walleij@linaro.org>
11 *
12 * License terms: GNU General Public License (GPL) version 2
13 */
14
15#ifndef PINCTRL_DEVINFO_H
16#define PINCTRL_DEVINFO_H
17
18#ifdef CONFIG_PINCTRL
19
20/* The device core acts as a consumer toward pinctrl */
21#include <linux/pinctrl/consumer.h>
22
23/**
24 * struct dev_pin_info - pin state container for devices
25 * @p: pinctrl handle for the containing device
26 * @default_state: the default state for the handle, if found
27 */
28struct dev_pin_info {
29 struct pinctrl *p;
30 struct pinctrl_state *default_state;
31};
32
33extern int pinctrl_bind_pins(struct device *dev);
34
35#else
36
37/* Stubs if we're not using pinctrl */
38
39static inline int pinctrl_bind_pins(struct device *dev)
40{
41 return 0;
42}
43
44#endif /* CONFIG_PINCTRL */
45#endif /* PINCTRL_DEVINFO_H */