diff options
| -rw-r--r-- | Documentation/pinctrl.txt | 8 | ||||
| -rw-r--r-- | drivers/pinctrl/core.c | 97 | ||||
| -rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx.c | 2 | ||||
| -rw-r--r-- | drivers/pinctrl/pinctrl-single.c | 2 | ||||
| -rw-r--r-- | drivers/pinctrl/sh-pfc/pinctrl.c | 11 | ||||
| -rw-r--r-- | drivers/pinctrl/ti/pinctrl-ti-iodelay.c | 2 | ||||
| -rw-r--r-- | include/linux/pinctrl/pinctrl.h | 3 |
7 files changed, 83 insertions, 42 deletions
diff --git a/Documentation/pinctrl.txt b/Documentation/pinctrl.txt index 54bd5faa8782..f2af35f6d6b2 100644 --- a/Documentation/pinctrl.txt +++ b/Documentation/pinctrl.txt | |||
| @@ -77,9 +77,15 @@ static struct pinctrl_desc foo_desc = { | |||
| 77 | 77 | ||
| 78 | int __init foo_probe(void) | 78 | int __init foo_probe(void) |
| 79 | { | 79 | { |
| 80 | int error; | ||
| 81 | |||
| 80 | struct pinctrl_dev *pctl; | 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 | To enable the pinctrl subsystem and the subgroups for PINMUX and PINCONF and | 91 | 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 d69046537b75..32822b0d9cd0 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
| @@ -2010,29 +2010,57 @@ out_err: | |||
| 2010 | return ERR_PTR(ret); | 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 | pctldev->p = create_pinctrl(pctldev->dev, pctldev); | 2015 | pctldev->p = create_pinctrl(pctldev->dev, pctldev); |
| 2016 | if (!IS_ERR(pctldev->p)) { | 2016 | if (PTR_ERR(pctldev->p) == -ENODEV) { |
| 2017 | kref_get(&pctldev->p->users); | 2017 | dev_dbg(pctldev->dev, "no hogs found\n"); |
| 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 | } | ||
| 2029 | 2018 | ||
| 2030 | pctldev->hog_sleep = | 2019 | return 0; |
| 2031 | pinctrl_lookup_state(pctldev->p, | 2020 | } |
| 2032 | PINCTRL_STATE_SLEEP); | 2021 | |
| 2033 | if (IS_ERR(pctldev->hog_sleep)) | 2022 | if (IS_ERR(pctldev->p)) { |
| 2034 | dev_dbg(pctldev->dev, | 2023 | dev_err(pctldev->dev, "error claiming hogs: %li\n", |
| 2035 | "failed to lookup the sleep state\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 | mutex_lock(&pinctrldev_list_mutex); | 2066 | mutex_lock(&pinctrldev_list_mutex); |
| @@ -2043,6 +2071,7 @@ static int pinctrl_create_and_start(struct pinctrl_dev *pctldev) | |||
| 2043 | 2071 | ||
| 2044 | return 0; | 2072 | return 0; |
| 2045 | } | 2073 | } |
| 2074 | EXPORT_SYMBOL_GPL(pinctrl_enable); | ||
| 2046 | 2075 | ||
| 2047 | /** | 2076 | /** |
| 2048 | * pinctrl_register() - register a pin controller device | 2077 | * pinctrl_register() - register a pin controller device |
| @@ -2065,25 +2094,30 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | |||
| 2065 | if (IS_ERR(pctldev)) | 2094 | if (IS_ERR(pctldev)) |
| 2066 | return pctldev; | 2095 | return pctldev; |
| 2067 | 2096 | ||
| 2068 | error = pinctrl_create_and_start(pctldev); | 2097 | error = pinctrl_enable(pctldev); |
| 2069 | if (error) { | 2098 | if (error) |
| 2070 | mutex_destroy(&pctldev->mutex); | ||
| 2071 | kfree(pctldev); | ||
| 2072 | |||
| 2073 | return ERR_PTR(error); | 2099 | return ERR_PTR(error); |
| 2074 | } | ||
| 2075 | 2100 | ||
| 2076 | return pctldev; | 2101 | return pctldev; |
| 2077 | 2102 | ||
| 2078 | } | 2103 | } |
| 2079 | EXPORT_SYMBOL_GPL(pinctrl_register); | 2104 | EXPORT_SYMBOL_GPL(pinctrl_register); |
| 2080 | 2105 | ||
| 2106 | /** | ||
| 2107 | * pinctrl_register_and_init() - register and init pin controller device | ||
| 2108 | * @pctldesc: descriptor for this pin controller | ||
| 2109 | * @dev: parent device for this pin controller | ||
| 2110 | * @driver_data: private pin controller data for this pin controller | ||
| 2111 | * @pctldev: pin controller device | ||
| 2112 | * | ||
| 2113 | * Note that pinctrl_enable() still needs to be manually called after | ||
| 2114 | * this once the driver is ready. | ||
| 2115 | */ | ||
| 2081 | int pinctrl_register_and_init(struct pinctrl_desc *pctldesc, | 2116 | int pinctrl_register_and_init(struct pinctrl_desc *pctldesc, |
| 2082 | struct device *dev, void *driver_data, | 2117 | struct device *dev, void *driver_data, |
| 2083 | struct pinctrl_dev **pctldev) | 2118 | struct pinctrl_dev **pctldev) |
| 2084 | { | 2119 | { |
| 2085 | struct pinctrl_dev *p; | 2120 | struct pinctrl_dev *p; |
| 2086 | int error; | ||
| 2087 | 2121 | ||
| 2088 | p = pinctrl_init_controller(pctldesc, dev, driver_data); | 2122 | p = pinctrl_init_controller(pctldesc, dev, driver_data); |
| 2089 | if (IS_ERR(p)) | 2123 | if (IS_ERR(p)) |
| @@ -2097,15 +2131,6 @@ int pinctrl_register_and_init(struct pinctrl_desc *pctldesc, | |||
| 2097 | */ | 2131 | */ |
| 2098 | *pctldev = p; | 2132 | *pctldev = p; |
| 2099 | 2133 | ||
| 2100 | error = pinctrl_create_and_start(p); | ||
| 2101 | if (error) { | ||
| 2102 | mutex_destroy(&p->mutex); | ||
| 2103 | kfree(p); | ||
| 2104 | *pctldev = NULL; | ||
| 2105 | |||
| 2106 | return error; | ||
| 2107 | } | ||
| 2108 | |||
| 2109 | return 0; | 2134 | return 0; |
| 2110 | } | 2135 | } |
| 2111 | EXPORT_SYMBOL_GPL(pinctrl_register_and_init); | 2136 | EXPORT_SYMBOL_GPL(pinctrl_register_and_init); |
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index a7ace9e1ad81..74bd90dfd7b1 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c | |||
| @@ -790,7 +790,7 @@ int imx_pinctrl_probe(struct platform_device *pdev, | |||
| 790 | 790 | ||
| 791 | dev_info(&pdev->dev, "initialized IMX pinctrl driver\n"); | 791 | dev_info(&pdev->dev, "initialized IMX pinctrl driver\n"); |
| 792 | 792 | ||
| 793 | return 0; | 793 | return pinctrl_enable(ipctl->pctl); |
| 794 | 794 | ||
| 795 | free: | 795 | free: |
| 796 | imx_free_resources(ipctl); | 796 | imx_free_resources(ipctl); |
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 8b2d45e85bae..9c267dcda094 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c | |||
| @@ -1781,7 +1781,7 @@ static int pcs_probe(struct platform_device *pdev) | |||
| 1781 | dev_info(pcs->dev, "%i pins at pa %p size %u\n", | 1781 | dev_info(pcs->dev, "%i pins at pa %p size %u\n", |
| 1782 | pcs->desc.npins, pcs->base, pcs->size); | 1782 | pcs->desc.npins, pcs->base, pcs->size); |
| 1783 | 1783 | ||
| 1784 | return 0; | 1784 | return pinctrl_enable(pcs->pctl); |
| 1785 | 1785 | ||
| 1786 | free: | 1786 | free: |
| 1787 | pcs_free_resources(pcs); | 1787 | pcs_free_resources(pcs); |
diff --git a/drivers/pinctrl/sh-pfc/pinctrl.c b/drivers/pinctrl/sh-pfc/pinctrl.c index 08150a321be6..a70157f0acf4 100644 --- a/drivers/pinctrl/sh-pfc/pinctrl.c +++ b/drivers/pinctrl/sh-pfc/pinctrl.c | |||
| @@ -816,6 +816,13 @@ 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 | return devm_pinctrl_register_and_init(pfc->dev, &pmx->pctl_desc, pmx, | 819 | ret = devm_pinctrl_register_and_init(pfc->dev, &pmx->pctl_desc, pmx, |
| 820 | &pmx->pctl); | 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 | } |
diff --git a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c index 717e3404900c..362c50918c13 100644 --- a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c +++ b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c | |||
| @@ -893,6 +893,8 @@ static int ti_iodelay_probe(struct platform_device *pdev) | |||
| 893 | 893 | ||
| 894 | platform_set_drvdata(pdev, iod); | 894 | platform_set_drvdata(pdev, iod); |
| 895 | 895 | ||
| 896 | return pinctrl_enable(iod->pctl); | ||
| 897 | |||
| 896 | exit_out: | 898 | exit_out: |
| 897 | of_node_put(np); | 899 | of_node_put(np); |
| 898 | return ret; | 900 | return ret; |
diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h index 8ce2d87a238b..5e45385c5bdc 100644 --- a/include/linux/pinctrl/pinctrl.h +++ b/include/linux/pinctrl/pinctrl.h | |||
| @@ -145,8 +145,9 @@ struct pinctrl_desc { | |||
| 145 | extern int pinctrl_register_and_init(struct pinctrl_desc *pctldesc, | 145 | extern int pinctrl_register_and_init(struct pinctrl_desc *pctldesc, |
| 146 | struct device *dev, void *driver_data, | 146 | struct device *dev, void *driver_data, |
| 147 | struct pinctrl_dev **pctldev); | 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 | extern struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | 151 | extern struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, |
| 151 | struct device *dev, void *driver_data); | 152 | struct device *dev, void *driver_data); |
| 152 | 153 | ||
