diff options
| author | Tony Lindgren <tony@atomide.com> | 2017-01-11 17:13:34 -0500 |
|---|---|---|
| committer | Linus Walleij <linus.walleij@linaro.org> | 2017-01-13 10:25:17 -0500 |
| commit | 950b0d91dc108f54bccca5a2f75bb46f2df63d29 (patch) | |
| tree | 305daab89f93b16951c6a53efc9bb002eacdefc9 | |
| parent | 56d9e4a76039afd504919cc5ec329fb0ce35812f (diff) | |
pinctrl: core: Fix regression caused by delayed work for hogs
Commit df61b366af26 ("pinctrl: core: Use delayed work for hogs") caused a
regression at least with sh-pfc that is also a GPIO controller as
noted by Geert Uytterhoeven <geert@linux-m68k.org>.
As the original pinctrl_register() has issues calling pin controller
driver functions early before the controller has finished registering,
we can't just revert commit df61b366af26. That would break the drivers
using GENERIC_PINCTRL_GROUPS or GENERIC_PINMUX_FUNCTIONS.
So let's fix the issue with the following steps as a single patch:
1. Revert the late_init parts of commit df61b366af26.
The late_init clearly won't work and we have to just give up
on fixing pinctrl_register() for GENERIC_PINCTRL_GROUPS and
GENERIC_PINMUX_FUNCTIONS.
2. Split pinctrl_register() into two parts
By splitting pinctrl_register() into pinctrl_init_controller()
and pinctrl_create_and_start() we have better control over when
it's safe to call pinctrl_create().
3. Introduce a new pinctrl_register_and_init() function
As suggested by Linus Walleij <linus.walleij@linaro.org>, we
can just introduce a new function for the controllers that need
pinctrl_create() called later.
4. Convert the four known problem cases to use new function
Let's convert pinctrl-imx, pinctrl-single, sh-pfc and ti-iodelay
to use the new function to fix the issues. The rest of the drivers
can be converted later. Let's also update Documentation/pinctrl.txt
accordingly because of the known issues with pinctrl_register().
Fixes: df61b366af26 ("pinctrl: core: Use delayed work for hogs")
Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Gary Bisson <gary.bisson@boundarydevices.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
| -rw-r--r-- | Documentation/pinctrl.txt | 4 | ||||
| -rw-r--r-- | drivers/pinctrl/core.c | 201 | ||||
| -rw-r--r-- | drivers/pinctrl/core.h | 2 | ||||
| -rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx.c | 8 | ||||
| -rw-r--r-- | drivers/pinctrl/pinctrl-single.c | 5 | ||||
| -rw-r--r-- | drivers/pinctrl/sh-pfc/pinctrl.c | 4 | ||||
| -rw-r--r-- | drivers/pinctrl/ti/pinctrl-ti-iodelay.c | 5 | ||||
| -rw-r--r-- | include/linux/pinctrl/pinctrl.h | 15 |
8 files changed, 165 insertions, 79 deletions
diff --git a/Documentation/pinctrl.txt b/Documentation/pinctrl.txt index 0d3b9ce0a0b9..54bd5faa8782 100644 --- a/Documentation/pinctrl.txt +++ b/Documentation/pinctrl.txt | |||
| @@ -79,9 +79,7 @@ int __init foo_probe(void) | |||
| 79 | { | 79 | { |
| 80 | struct pinctrl_dev *pctl; | 80 | struct pinctrl_dev *pctl; |
| 81 | 81 | ||
| 82 | pctl = pinctrl_register(&foo_desc, <PARENT>, NULL); | 82 | return pinctrl_register_and_init(&foo_desc, <PARENT>, NULL, &pctl); |
| 83 | if (!pctl) | ||
| 84 | pr_err("could not register foo pin driver\n"); | ||
| 85 | } | 83 | } |
| 86 | 84 | ||
| 87 | To enable the pinctrl subsystem and the subgroups for PINMUX and PINCONF and | 85 | To enable the pinctrl subsystem and the subgroups for PINMUX and PINCONF and |
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 65c0ae0969dc..bc73a63163ee 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
| @@ -1905,59 +1905,14 @@ static int pinctrl_check_ops(struct pinctrl_dev *pctldev) | |||
| 1905 | } | 1905 | } |
| 1906 | 1906 | ||
| 1907 | /** | 1907 | /** |
| 1908 | * pinctrl_late_init() - finish pin controller device registration | 1908 | * pinctrl_init_controller() - init a pin controller device |
| 1909 | * @work: work struct | ||
| 1910 | */ | ||
| 1911 | static void pinctrl_late_init(struct work_struct *work) | ||
| 1912 | { | ||
| 1913 | struct pinctrl_dev *pctldev; | ||
| 1914 | |||
| 1915 | pctldev = container_of(work, struct pinctrl_dev, late_init.work); | ||
| 1916 | |||
| 1917 | /* | ||
| 1918 | * If the pin controller does NOT have hogs, this will report an | ||
| 1919 | * error and we skip over this entire branch. This is why we can | ||
| 1920 | * call this function directly when we do not have hogs on the | ||
| 1921 | * device. | ||
| 1922 | */ | ||
| 1923 | pctldev->p = create_pinctrl(pctldev->dev, pctldev); | ||
| 1924 | if (!IS_ERR(pctldev->p)) { | ||
| 1925 | kref_get(&pctldev->p->users); | ||
| 1926 | pctldev->hog_default = | ||
| 1927 | pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); | ||
| 1928 | if (IS_ERR(pctldev->hog_default)) { | ||
| 1929 | dev_dbg(pctldev->dev, | ||
| 1930 | "failed to lookup the default state\n"); | ||
| 1931 | } else { | ||
| 1932 | if (pinctrl_select_state(pctldev->p, | ||
| 1933 | pctldev->hog_default)) | ||
| 1934 | dev_err(pctldev->dev, | ||
| 1935 | "failed to select default state\n"); | ||
| 1936 | } | ||
| 1937 | |||
| 1938 | pctldev->hog_sleep = | ||
| 1939 | pinctrl_lookup_state(pctldev->p, | ||
| 1940 | PINCTRL_STATE_SLEEP); | ||
| 1941 | if (IS_ERR(pctldev->hog_sleep)) | ||
| 1942 | dev_dbg(pctldev->dev, | ||
| 1943 | "failed to lookup the sleep state\n"); | ||
| 1944 | } | ||
| 1945 | |||
| 1946 | mutex_lock(&pinctrldev_list_mutex); | ||
| 1947 | list_add_tail(&pctldev->node, &pinctrldev_list); | ||
| 1948 | mutex_unlock(&pinctrldev_list_mutex); | ||
| 1949 | |||
| 1950 | pinctrl_init_device_debugfs(pctldev); | ||
| 1951 | } | ||
| 1952 | |||
| 1953 | /** | ||
| 1954 | * pinctrl_register() - register a pin controller device | ||
| 1955 | * @pctldesc: descriptor for this pin controller | 1909 | * @pctldesc: descriptor for this pin controller |
| 1956 | * @dev: parent device for this pin controller | 1910 | * @dev: parent device for this pin controller |
| 1957 | * @driver_data: private pin controller data for this pin controller | 1911 | * @driver_data: private pin controller data for this pin controller |
| 1958 | */ | 1912 | */ |
| 1959 | struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | 1913 | struct pinctrl_dev *pinctrl_init_controller(struct pinctrl_desc *pctldesc, |
| 1960 | struct device *dev, void *driver_data) | 1914 | struct device *dev, |
| 1915 | void *driver_data) | ||
| 1961 | { | 1916 | { |
| 1962 | struct pinctrl_dev *pctldev; | 1917 | struct pinctrl_dev *pctldev; |
| 1963 | int ret; | 1918 | int ret; |
| @@ -1983,7 +1938,6 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | |||
| 1983 | INIT_RADIX_TREE(&pctldev->pin_function_tree, GFP_KERNEL); | 1938 | INIT_RADIX_TREE(&pctldev->pin_function_tree, GFP_KERNEL); |
| 1984 | #endif | 1939 | #endif |
| 1985 | INIT_LIST_HEAD(&pctldev->gpio_ranges); | 1940 | INIT_LIST_HEAD(&pctldev->gpio_ranges); |
| 1986 | INIT_DELAYED_WORK(&pctldev->late_init, pinctrl_late_init); | ||
| 1987 | pctldev->dev = dev; | 1941 | pctldev->dev = dev; |
| 1988 | mutex_init(&pctldev->mutex); | 1942 | mutex_init(&pctldev->mutex); |
| 1989 | 1943 | ||
| @@ -2018,17 +1972,6 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | |||
| 2018 | goto out_err; | 1972 | goto out_err; |
| 2019 | } | 1973 | } |
| 2020 | 1974 | ||
| 2021 | /* | ||
| 2022 | * If the device has hogs we want the probe() function of the driver | ||
| 2023 | * to complete before we go in and hog them and add the pin controller | ||
| 2024 | * to the list of controllers. If it has no hogs, we can just complete | ||
| 2025 | * the registration immediately. | ||
| 2026 | */ | ||
| 2027 | if (pinctrl_dt_has_hogs(pctldev)) | ||
| 2028 | schedule_delayed_work(&pctldev->late_init, 0); | ||
| 2029 | else | ||
| 2030 | pinctrl_late_init(&pctldev->late_init.work); | ||
| 2031 | |||
| 2032 | return pctldev; | 1975 | return pctldev; |
| 2033 | 1976 | ||
| 2034 | out_err: | 1977 | out_err: |
| @@ -2036,8 +1979,107 @@ out_err: | |||
| 2036 | kfree(pctldev); | 1979 | kfree(pctldev); |
| 2037 | return ERR_PTR(ret); | 1980 | return ERR_PTR(ret); |
| 2038 | } | 1981 | } |
| 1982 | |||
| 1983 | static int pinctrl_create_and_start(struct pinctrl_dev *pctldev) | ||
| 1984 | { | ||
| 1985 | pctldev->p = create_pinctrl(pctldev->dev, pctldev); | ||
| 1986 | if (!IS_ERR(pctldev->p)) { | ||
| 1987 | kref_get(&pctldev->p->users); | ||
| 1988 | pctldev->hog_default = | ||
| 1989 | pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); | ||
| 1990 | if (IS_ERR(pctldev->hog_default)) { | ||
| 1991 | dev_dbg(pctldev->dev, | ||
| 1992 | "failed to lookup the default state\n"); | ||
| 1993 | } else { | ||
| 1994 | if (pinctrl_select_state(pctldev->p, | ||
| 1995 | pctldev->hog_default)) | ||
| 1996 | dev_err(pctldev->dev, | ||
| 1997 | "failed to select default state\n"); | ||
| 1998 | } | ||
| 1999 | |||
| 2000 | pctldev->hog_sleep = | ||
| 2001 | pinctrl_lookup_state(pctldev->p, | ||
| 2002 | PINCTRL_STATE_SLEEP); | ||
| 2003 | if (IS_ERR(pctldev->hog_sleep)) | ||
| 2004 | dev_dbg(pctldev->dev, | ||
| 2005 | "failed to lookup the sleep state\n"); | ||
| 2006 | } | ||
| 2007 | |||
| 2008 | mutex_lock(&pinctrldev_list_mutex); | ||
| 2009 | list_add_tail(&pctldev->node, &pinctrldev_list); | ||
| 2010 | mutex_unlock(&pinctrldev_list_mutex); | ||
| 2011 | |||
| 2012 | pinctrl_init_device_debugfs(pctldev); | ||
| 2013 | |||
| 2014 | return 0; | ||
| 2015 | } | ||
| 2016 | |||
| 2017 | /** | ||
| 2018 | * pinctrl_register() - register a pin controller device | ||
| 2019 | * @pctldesc: descriptor for this pin controller | ||
| 2020 | * @dev: parent device for this pin controller | ||
| 2021 | * @driver_data: private pin controller data for this pin controller | ||
| 2022 | * | ||
| 2023 | * Note that pinctrl_register() is known to have problems as the pin | ||
| 2024 | * controller driver functions are called before the driver has a | ||
| 2025 | * struct pinctrl_dev handle. To avoid issues later on, please use the | ||
| 2026 | * new pinctrl_register_and_init() below instead. | ||
| 2027 | */ | ||
| 2028 | struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | ||
| 2029 | struct device *dev, void *driver_data) | ||
| 2030 | { | ||
| 2031 | struct pinctrl_dev *pctldev; | ||
| 2032 | int error; | ||
| 2033 | |||
| 2034 | pctldev = pinctrl_init_controller(pctldesc, dev, driver_data); | ||
| 2035 | if (IS_ERR(pctldev)) | ||
| 2036 | return pctldev; | ||
| 2037 | |||
| 2038 | error = pinctrl_create_and_start(pctldev); | ||
| 2039 | if (error) { | ||
| 2040 | mutex_destroy(&pctldev->mutex); | ||
| 2041 | kfree(pctldev); | ||
| 2042 | |||
| 2043 | return ERR_PTR(error); | ||
| 2044 | } | ||
| 2045 | |||
| 2046 | return pctldev; | ||
| 2047 | |||
| 2048 | } | ||
| 2039 | EXPORT_SYMBOL_GPL(pinctrl_register); | 2049 | EXPORT_SYMBOL_GPL(pinctrl_register); |
| 2040 | 2050 | ||
| 2051 | int pinctrl_register_and_init(struct pinctrl_desc *pctldesc, | ||
| 2052 | struct device *dev, void *driver_data, | ||
| 2053 | struct pinctrl_dev **pctldev) | ||
| 2054 | { | ||
| 2055 | struct pinctrl_dev *p; | ||
| 2056 | int error; | ||
| 2057 | |||
| 2058 | p = pinctrl_init_controller(pctldesc, dev, driver_data); | ||
| 2059 | if (IS_ERR(p)) | ||
| 2060 | return PTR_ERR(p); | ||
| 2061 | |||
| 2062 | /* | ||
| 2063 | * We have pinctrl_start() call functions in the pin controller | ||
| 2064 | * driver with create_pinctrl() for at least dt_node_to_map(). So | ||
| 2065 | * let's make sure pctldev is properly initialized for the | ||
| 2066 | * pin controller driver before we do anything. | ||
| 2067 | */ | ||
| 2068 | *pctldev = p; | ||
| 2069 | |||
| 2070 | error = pinctrl_create_and_start(p); | ||
| 2071 | if (error) { | ||
| 2072 | mutex_destroy(&p->mutex); | ||
| 2073 | kfree(p); | ||
| 2074 | *pctldev = NULL; | ||
| 2075 | |||
| 2076 | return error; | ||
| 2077 | } | ||
| 2078 | |||
| 2079 | return 0; | ||
| 2080 | } | ||
| 2081 | EXPORT_SYMBOL_GPL(pinctrl_register_and_init); | ||
| 2082 | |||
| 2041 | /** | 2083 | /** |
| 2042 | * pinctrl_unregister() - unregister pinmux | 2084 | * pinctrl_unregister() - unregister pinmux |
| 2043 | * @pctldev: pin controller to unregister | 2085 | * @pctldev: pin controller to unregister |
| @@ -2052,7 +2094,6 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev) | |||
| 2052 | if (pctldev == NULL) | 2094 | if (pctldev == NULL) |
| 2053 | return; | 2095 | return; |
| 2054 | 2096 | ||
| 2055 | cancel_delayed_work_sync(&pctldev->late_init); | ||
| 2056 | mutex_lock(&pctldev->mutex); | 2097 | mutex_lock(&pctldev->mutex); |
| 2057 | pinctrl_remove_device_debugfs(pctldev); | 2098 | pinctrl_remove_device_debugfs(pctldev); |
| 2058 | mutex_unlock(&pctldev->mutex); | 2099 | mutex_unlock(&pctldev->mutex); |
| @@ -2134,6 +2175,42 @@ struct pinctrl_dev *devm_pinctrl_register(struct device *dev, | |||
| 2134 | EXPORT_SYMBOL_GPL(devm_pinctrl_register); | 2175 | EXPORT_SYMBOL_GPL(devm_pinctrl_register); |
| 2135 | 2176 | ||
| 2136 | /** | 2177 | /** |
| 2178 | * devm_pinctrl_register_and_init() - Resource managed pinctrl register and init | ||
| 2179 | * @dev: parent device for this pin controller | ||
| 2180 | * @pctldesc: descriptor for this pin controller | ||
| 2181 | * @driver_data: private pin controller data for this pin controller | ||
| 2182 | * | ||
| 2183 | * Returns an error pointer if pincontrol register failed. Otherwise | ||
| 2184 | * it returns valid pinctrl handle. | ||
| 2185 | * | ||
| 2186 | * The pinctrl device will be automatically released when the device is unbound. | ||
| 2187 | */ | ||
| 2188 | int devm_pinctrl_register_and_init(struct device *dev, | ||
| 2189 | struct pinctrl_desc *pctldesc, | ||
| 2190 | void *driver_data, | ||
| 2191 | struct pinctrl_dev **pctldev) | ||
| 2192 | { | ||
| 2193 | struct pinctrl_dev **ptr; | ||
| 2194 | int error; | ||
| 2195 | |||
| 2196 | ptr = devres_alloc(devm_pinctrl_dev_release, sizeof(*ptr), GFP_KERNEL); | ||
| 2197 | if (!ptr) | ||
| 2198 | return -ENOMEM; | ||
| 2199 | |||
| 2200 | error = pinctrl_register_and_init(pctldesc, dev, driver_data, pctldev); | ||
| 2201 | if (error) { | ||
| 2202 | devres_free(ptr); | ||
| 2203 | return error; | ||
| 2204 | } | ||
| 2205 | |||
| 2206 | *ptr = *pctldev; | ||
| 2207 | devres_add(dev, ptr); | ||
| 2208 | |||
| 2209 | return 0; | ||
| 2210 | } | ||
| 2211 | EXPORT_SYMBOL_GPL(devm_pinctrl_register_and_init); | ||
| 2212 | |||
| 2213 | /** | ||
| 2137 | * devm_pinctrl_unregister() - Resource managed version of pinctrl_unregister(). | 2214 | * devm_pinctrl_unregister() - Resource managed version of pinctrl_unregister(). |
| 2138 | * @dev: device for which which resource was allocated | 2215 | * @dev: device for which which resource was allocated |
| 2139 | * @pctldev: the pinctrl device to unregister. | 2216 | * @pctldev: the pinctrl device to unregister. |
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h index ad812a2d7248..1c35de59a658 100644 --- a/drivers/pinctrl/core.h +++ b/drivers/pinctrl/core.h | |||
| @@ -37,7 +37,6 @@ struct pinctrl_gpio_range; | |||
| 37 | * @p: result of pinctrl_get() for this device | 37 | * @p: result of pinctrl_get() for this device |
| 38 | * @hog_default: default state for pins hogged by this device | 38 | * @hog_default: default state for pins hogged by this device |
| 39 | * @hog_sleep: sleep state for pins hogged by this device | 39 | * @hog_sleep: sleep state for pins hogged by this device |
| 40 | * @late_init: delayed work for pin controller to finish registration | ||
| 41 | * @mutex: mutex taken on each pin controller specific action | 40 | * @mutex: mutex taken on each pin controller specific action |
| 42 | * @device_root: debugfs root for this device | 41 | * @device_root: debugfs root for this device |
| 43 | */ | 42 | */ |
| @@ -60,7 +59,6 @@ struct pinctrl_dev { | |||
| 60 | struct pinctrl *p; | 59 | struct pinctrl *p; |
| 61 | struct pinctrl_state *hog_default; | 60 | struct pinctrl_state *hog_default; |
| 62 | struct pinctrl_state *hog_sleep; | 61 | struct pinctrl_state *hog_sleep; |
| 63 | struct delayed_work late_init; | ||
| 64 | struct mutex mutex; | 62 | struct mutex mutex; |
| 65 | #ifdef CONFIG_DEBUG_FS | 63 | #ifdef CONFIG_DEBUG_FS |
| 66 | struct dentry *device_root; | 64 | struct dentry *device_root; |
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index bccd9416d44f..a7ace9e1ad81 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c | |||
| @@ -774,11 +774,11 @@ int imx_pinctrl_probe(struct platform_device *pdev, | |||
| 774 | ipctl->info = info; | 774 | ipctl->info = info; |
| 775 | ipctl->dev = info->dev; | 775 | ipctl->dev = info->dev; |
| 776 | platform_set_drvdata(pdev, ipctl); | 776 | platform_set_drvdata(pdev, ipctl); |
| 777 | ipctl->pctl = devm_pinctrl_register(&pdev->dev, | 777 | ret = devm_pinctrl_register_and_init(&pdev->dev, |
| 778 | imx_pinctrl_desc, ipctl); | 778 | imx_pinctrl_desc, ipctl, |
| 779 | if (IS_ERR(ipctl->pctl)) { | 779 | &ipctl->pctl); |
| 780 | if (ret) { | ||
| 780 | dev_err(&pdev->dev, "could not register IMX pinctrl driver\n"); | 781 | dev_err(&pdev->dev, "could not register IMX pinctrl driver\n"); |
| 781 | ret = PTR_ERR(ipctl->pctl); | ||
| 782 | goto free; | 782 | goto free; |
| 783 | } | 783 | } |
| 784 | 784 | ||
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 8408263de466..d23e0e0aeb22 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c | |||
| @@ -1747,10 +1747,9 @@ static int pcs_probe(struct platform_device *pdev) | |||
| 1747 | if (ret < 0) | 1747 | if (ret < 0) |
| 1748 | goto free; | 1748 | goto free; |
| 1749 | 1749 | ||
| 1750 | pcs->pctl = pinctrl_register(&pcs->desc, pcs->dev, pcs); | 1750 | ret = pinctrl_register_and_init(&pcs->desc, pcs->dev, pcs, &pcs->pctl); |
| 1751 | if (IS_ERR(pcs->pctl)) { | 1751 | if (ret) { |
| 1752 | dev_err(pcs->dev, "could not register single pinctrl driver\n"); | 1752 | dev_err(pcs->dev, "could not register single pinctrl driver\n"); |
| 1753 | ret = PTR_ERR(pcs->pctl); | ||
| 1754 | goto free; | 1753 | goto free; |
| 1755 | } | 1754 | } |
| 1756 | 1755 | ||
diff --git a/drivers/pinctrl/sh-pfc/pinctrl.c b/drivers/pinctrl/sh-pfc/pinctrl.c index fcacfa73ef6e..08150a321be6 100644 --- a/drivers/pinctrl/sh-pfc/pinctrl.c +++ b/drivers/pinctrl/sh-pfc/pinctrl.c | |||
| @@ -816,6 +816,6 @@ int sh_pfc_register_pinctrl(struct sh_pfc *pfc) | |||
| 816 | pmx->pctl_desc.pins = pmx->pins; | 816 | pmx->pctl_desc.pins = pmx->pins; |
| 817 | pmx->pctl_desc.npins = pfc->info->nr_pins; | 817 | pmx->pctl_desc.npins = pfc->info->nr_pins; |
| 818 | 818 | ||
| 819 | pmx->pctl = devm_pinctrl_register(pfc->dev, &pmx->pctl_desc, pmx); | 819 | return devm_pinctrl_register_and_init(pfc->dev, &pmx->pctl_desc, pmx, |
| 820 | return PTR_ERR_OR_ZERO(pmx->pctl); | 820 | &pmx->pctl); |
| 821 | } | 821 | } |
diff --git a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c index 3b86d3db7358..7f472f123515 100644 --- a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c +++ b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c | |||
| @@ -891,10 +891,9 @@ static int ti_iodelay_probe(struct platform_device *pdev) | |||
| 891 | iod->desc.name = dev_name(dev); | 891 | iod->desc.name = dev_name(dev); |
| 892 | iod->desc.owner = THIS_MODULE; | 892 | iod->desc.owner = THIS_MODULE; |
| 893 | 893 | ||
| 894 | iod->pctl = pinctrl_register(&iod->desc, dev, iod); | 894 | ret = pinctrl_register_and_init(&iod->desc, dev, iod, &iod->pctl); |
| 895 | if (!iod->pctl) { | 895 | if (ret) { |
| 896 | dev_err(dev, "Failed to register pinctrl\n"); | 896 | dev_err(dev, "Failed to register pinctrl\n"); |
| 897 | ret = -ENODEV; | ||
| 898 | goto exit_out; | 897 | goto exit_out; |
| 899 | } | 898 | } |
| 900 | 899 | ||
diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h index a42e57da270d..8ce2d87a238b 100644 --- a/include/linux/pinctrl/pinctrl.h +++ b/include/linux/pinctrl/pinctrl.h | |||
| @@ -141,12 +141,27 @@ struct pinctrl_desc { | |||
| 141 | }; | 141 | }; |
| 142 | 142 | ||
| 143 | /* External interface to pin controller */ | 143 | /* External interface to pin controller */ |
| 144 | |||
| 145 | extern int pinctrl_register_and_init(struct pinctrl_desc *pctldesc, | ||
| 146 | struct device *dev, void *driver_data, | ||
| 147 | struct pinctrl_dev **pctldev); | ||
| 148 | |||
| 149 | /* Please use pinctrl_register_and_init() instead */ | ||
| 144 | extern struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | 150 | extern struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, |
| 145 | struct device *dev, void *driver_data); | 151 | struct device *dev, void *driver_data); |
| 152 | |||
| 146 | extern void pinctrl_unregister(struct pinctrl_dev *pctldev); | 153 | extern void pinctrl_unregister(struct pinctrl_dev *pctldev); |
| 154 | |||
| 155 | extern int devm_pinctrl_register_and_init(struct device *dev, | ||
| 156 | struct pinctrl_desc *pctldesc, | ||
| 157 | void *driver_data, | ||
| 158 | struct pinctrl_dev **pctldev); | ||
| 159 | |||
| 160 | /* Please use devm_pinctrl_register_and_init() instead */ | ||
| 147 | extern struct pinctrl_dev *devm_pinctrl_register(struct device *dev, | 161 | extern struct pinctrl_dev *devm_pinctrl_register(struct device *dev, |
| 148 | struct pinctrl_desc *pctldesc, | 162 | struct pinctrl_desc *pctldesc, |
| 149 | void *driver_data); | 163 | void *driver_data); |
| 164 | |||
| 150 | extern void devm_pinctrl_unregister(struct device *dev, | 165 | extern void devm_pinctrl_unregister(struct device *dev, |
| 151 | struct pinctrl_dev *pctldev); | 166 | struct pinctrl_dev *pctldev); |
| 152 | 167 | ||
