Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'pinctrl-v4.11-4' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl

Pull pin control fix from Linus Walleij:
"This late fix for pin control is hopefully the last I send this cycle.

The problem was detected early in the v4.11 release cycle and there
has been some back and forth on how to solve it. Sadly the proper fix
arrives late, but at least not too late.

An issue was detected with pin control on the Freescale i.MX after the
refactorings for more general group and function handling.

We now have the proper fix for this"

* tag 'pinctrl-v4.11-4' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl:
pinctrl: core: Fix pinctrl_register_and_init() with pinctrl_enable()

+83 -42
+7 -1
Documentation/pinctrl.txt
··· 77 77 78 78 int __init foo_probe(void) 79 79 { 80 + int error; 81 + 80 82 struct pinctrl_dev *pctl; 81 83 82 - return pinctrl_register_and_init(&foo_desc, <PARENT>, NULL, &pctl); 84 + error = pinctrl_register_and_init(&foo_desc, <PARENT>, NULL, &pctl); 85 + if (error) 86 + return error; 87 + 88 + return pinctrl_enable(pctl); 83 89 } 84 90 85 91 To enable the pinctrl subsystem and the subgroups for PINMUX and PINCONF and
+61 -36
drivers/pinctrl/core.c
··· 2010 2010 return ERR_PTR(ret); 2011 2011 } 2012 2012 2013 - static int pinctrl_create_and_start(struct pinctrl_dev *pctldev) 2013 + static int pinctrl_claim_hogs(struct pinctrl_dev *pctldev) 2014 2014 { 2015 2015 pctldev->p = create_pinctrl(pctldev->dev, pctldev); 2016 - if (!IS_ERR(pctldev->p)) { 2017 - kref_get(&pctldev->p->users); 2018 - pctldev->hog_default = 2019 - pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); 2020 - if (IS_ERR(pctldev->hog_default)) { 2021 - dev_dbg(pctldev->dev, 2022 - "failed to lookup the default state\n"); 2023 - } else { 2024 - if (pinctrl_select_state(pctldev->p, 2025 - pctldev->hog_default)) 2026 - dev_err(pctldev->dev, 2027 - "failed to select default state\n"); 2028 - } 2016 + if (PTR_ERR(pctldev->p) == -ENODEV) { 2017 + dev_dbg(pctldev->dev, "no hogs found\n"); 2029 2018 2030 - pctldev->hog_sleep = 2031 - pinctrl_lookup_state(pctldev->p, 2032 - PINCTRL_STATE_SLEEP); 2033 - if (IS_ERR(pctldev->hog_sleep)) 2034 - dev_dbg(pctldev->dev, 2035 - "failed to lookup the sleep state\n"); 2019 + return 0; 2020 + } 2021 + 2022 + if (IS_ERR(pctldev->p)) { 2023 + dev_err(pctldev->dev, "error claiming hogs: %li\n", 2024 + PTR_ERR(pctldev->p)); 2025 + 2026 + return PTR_ERR(pctldev->p); 2027 + } 2028 + 2029 + kref_get(&pctldev->p->users); 2030 + pctldev->hog_default = 2031 + pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); 2032 + if (IS_ERR(pctldev->hog_default)) { 2033 + dev_dbg(pctldev->dev, 2034 + "failed to lookup the default state\n"); 2035 + } else { 2036 + if (pinctrl_select_state(pctldev->p, 2037 + pctldev->hog_default)) 2038 + dev_err(pctldev->dev, 2039 + "failed to select default state\n"); 2040 + } 2041 + 2042 + pctldev->hog_sleep = 2043 + pinctrl_lookup_state(pctldev->p, 2044 + PINCTRL_STATE_SLEEP); 2045 + if (IS_ERR(pctldev->hog_sleep)) 2046 + dev_dbg(pctldev->dev, 2047 + "failed to lookup the sleep state\n"); 2048 + 2049 + return 0; 2050 + } 2051 + 2052 + int pinctrl_enable(struct pinctrl_dev *pctldev) 2053 + { 2054 + int error; 2055 + 2056 + error = pinctrl_claim_hogs(pctldev); 2057 + if (error) { 2058 + dev_err(pctldev->dev, "could not claim hogs: %i\n", 2059 + error); 2060 + mutex_destroy(&pctldev->mutex); 2061 + kfree(pctldev); 2062 + 2063 + return error; 2036 2064 } 2037 2065 2038 2066 mutex_lock(&pinctrldev_list_mutex); ··· 2071 2043 2072 2044 return 0; 2073 2045 } 2046 + EXPORT_SYMBOL_GPL(pinctrl_enable); 2074 2047 2075 2048 /** 2076 2049 * pinctrl_register() - register a pin controller device ··· 2094 2065 if (IS_ERR(pctldev)) 2095 2066 return pctldev; 2096 2067 2097 - error = pinctrl_create_and_start(pctldev); 2098 - if (error) { 2099 - mutex_destroy(&pctldev->mutex); 2100 - kfree(pctldev); 2101 - 2068 + error = pinctrl_enable(pctldev); 2069 + if (error) 2102 2070 return ERR_PTR(error); 2103 - } 2104 2071 2105 2072 return pctldev; 2106 2073 2107 2074 } 2108 2075 EXPORT_SYMBOL_GPL(pinctrl_register); 2109 2076 2077 + /** 2078 + * pinctrl_register_and_init() - register and init pin controller device 2079 + * @pctldesc: descriptor for this pin controller 2080 + * @dev: parent device for this pin controller 2081 + * @driver_data: private pin controller data for this pin controller 2082 + * @pctldev: pin controller device 2083 + * 2084 + * Note that pinctrl_enable() still needs to be manually called after 2085 + * this once the driver is ready. 2086 + */ 2110 2087 int pinctrl_register_and_init(struct pinctrl_desc *pctldesc, 2111 2088 struct device *dev, void *driver_data, 2112 2089 struct pinctrl_dev **pctldev) 2113 2090 { 2114 2091 struct pinctrl_dev *p; 2115 - int error; 2116 2092 2117 2093 p = pinctrl_init_controller(pctldesc, dev, driver_data); 2118 2094 if (IS_ERR(p)) ··· 2130 2096 * pin controller driver before we do anything. 2131 2097 */ 2132 2098 *pctldev = p; 2133 - 2134 - error = pinctrl_create_and_start(p); 2135 - if (error) { 2136 - mutex_destroy(&p->mutex); 2137 - kfree(p); 2138 - *pctldev = NULL; 2139 - 2140 - return error; 2141 - } 2142 2099 2143 2100 return 0; 2144 2101 }
+1 -1
drivers/pinctrl/freescale/pinctrl-imx.c
··· 790 790 791 791 dev_info(&pdev->dev, "initialized IMX pinctrl driver\n"); 792 792 793 - return 0; 793 + return pinctrl_enable(ipctl->pctl); 794 794 795 795 free: 796 796 imx_free_resources(ipctl);
+1 -1
drivers/pinctrl/pinctrl-single.c
··· 1781 1781 dev_info(pcs->dev, "%i pins at pa %p size %u\n", 1782 1782 pcs->desc.npins, pcs->base, pcs->size); 1783 1783 1784 - return 0; 1784 + return pinctrl_enable(pcs->pctl); 1785 1785 1786 1786 free: 1787 1787 pcs_free_resources(pcs);
+9 -2
drivers/pinctrl/sh-pfc/pinctrl.c
··· 816 816 pmx->pctl_desc.pins = pmx->pins; 817 817 pmx->pctl_desc.npins = pfc->info->nr_pins; 818 818 819 - return devm_pinctrl_register_and_init(pfc->dev, &pmx->pctl_desc, pmx, 820 - &pmx->pctl); 819 + ret = devm_pinctrl_register_and_init(pfc->dev, &pmx->pctl_desc, pmx, 820 + &pmx->pctl); 821 + if (ret) { 822 + dev_err(pfc->dev, "could not register: %i\n", ret); 823 + 824 + return ret; 825 + } 826 + 827 + return pinctrl_enable(pmx->pctl); 821 828 }
+2
drivers/pinctrl/ti/pinctrl-ti-iodelay.c
··· 893 893 894 894 platform_set_drvdata(pdev, iod); 895 895 896 + return pinctrl_enable(iod->pctl); 897 + 896 898 exit_out: 897 899 of_node_put(np); 898 900 return ret;
+2 -1
include/linux/pinctrl/pinctrl.h
··· 145 145 extern int pinctrl_register_and_init(struct pinctrl_desc *pctldesc, 146 146 struct device *dev, void *driver_data, 147 147 struct pinctrl_dev **pctldev); 148 + extern int pinctrl_enable(struct pinctrl_dev *pctldev); 148 149 149 - /* Please use pinctrl_register_and_init() instead */ 150 + /* Please use pinctrl_register_and_init() and pinctrl_enable() instead */ 150 151 extern struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, 151 152 struct device *dev, void *driver_data); 152 153