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 | ||