diff options
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/core.h | 2 | ||||
-rw-r--r-- | drivers/pinctrl/pinmux.c | 71 |
2 files changed, 32 insertions, 41 deletions
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h index 7c305672919e..061c57d0e8f9 100644 --- a/drivers/pinctrl/core.h +++ b/drivers/pinctrl/core.h | |||
@@ -94,7 +94,7 @@ struct pin_desc { | |||
94 | spinlock_t lock; | 94 | spinlock_t lock; |
95 | /* These fields only added when supporting pinmux drivers */ | 95 | /* These fields only added when supporting pinmux drivers */ |
96 | #ifdef CONFIG_PINMUX | 96 | #ifdef CONFIG_PINMUX |
97 | const char *mux_function; | 97 | const char *owner; |
98 | #endif | 98 | #endif |
99 | }; | 99 | }; |
100 | 100 | ||
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c index ea31c4655667..288789750f96 100644 --- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c | |||
@@ -71,21 +71,20 @@ int pinmux_check_ops(struct pinctrl_dev *pctldev) | |||
71 | /** | 71 | /** |
72 | * pin_request() - request a single pin to be muxed in, typically for GPIO | 72 | * pin_request() - request a single pin to be muxed in, typically for GPIO |
73 | * @pin: the pin number in the global pin space | 73 | * @pin: the pin number in the global pin space |
74 | * @function: a functional name to give to this pin, passed to the driver | 74 | * @owner: a representation of the owner of this pin; typically the device |
75 | * so it knows what function to mux in, e.g. the string "gpioNN" | 75 | * name that controls its mux function, or the requested GPIO name |
76 | * means that you want to mux in the pin for use as GPIO number NN | ||
77 | * @gpio_range: the range matching the GPIO pin if this is a request for a | 76 | * @gpio_range: the range matching the GPIO pin if this is a request for a |
78 | * single GPIO pin | 77 | * single GPIO pin |
79 | */ | 78 | */ |
80 | static int pin_request(struct pinctrl_dev *pctldev, | 79 | static int pin_request(struct pinctrl_dev *pctldev, |
81 | int pin, const char *function, | 80 | int pin, const char *owner, |
82 | struct pinctrl_gpio_range *gpio_range) | 81 | struct pinctrl_gpio_range *gpio_range) |
83 | { | 82 | { |
84 | struct pin_desc *desc; | 83 | struct pin_desc *desc; |
85 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | 84 | const struct pinmux_ops *ops = pctldev->desc->pmxops; |
86 | int status = -EINVAL; | 85 | int status = -EINVAL; |
87 | 86 | ||
88 | dev_dbg(pctldev->dev, "request pin %d for %s\n", pin, function); | 87 | dev_dbg(pctldev->dev, "request pin %d for %s\n", pin, owner); |
89 | 88 | ||
90 | desc = pin_desc_get(pctldev, pin); | 89 | desc = pin_desc_get(pctldev, pin); |
91 | if (desc == NULL) { | 90 | if (desc == NULL) { |
@@ -94,19 +93,14 @@ static int pin_request(struct pinctrl_dev *pctldev, | |||
94 | goto out; | 93 | goto out; |
95 | } | 94 | } |
96 | 95 | ||
97 | if (!function) { | ||
98 | dev_err(pctldev->dev, "no function name given\n"); | ||
99 | return -EINVAL; | ||
100 | } | ||
101 | |||
102 | spin_lock(&desc->lock); | 96 | spin_lock(&desc->lock); |
103 | if (desc->mux_function) { | 97 | if (desc->owner && strcmp(desc->owner, owner)) { |
104 | spin_unlock(&desc->lock); | 98 | spin_unlock(&desc->lock); |
105 | dev_err(pctldev->dev, | 99 | dev_err(pctldev->dev, |
106 | "pin already requested\n"); | 100 | "pin already requested\n"); |
107 | goto out; | 101 | goto out; |
108 | } | 102 | } |
109 | desc->mux_function = function; | 103 | desc->owner = owner; |
110 | spin_unlock(&desc->lock); | 104 | spin_unlock(&desc->lock); |
111 | 105 | ||
112 | /* Let each pin increase references to this module */ | 106 | /* Let each pin increase references to this module */ |
@@ -136,13 +130,13 @@ static int pin_request(struct pinctrl_dev *pctldev, | |||
136 | out_free_pin: | 130 | out_free_pin: |
137 | if (status) { | 131 | if (status) { |
138 | spin_lock(&desc->lock); | 132 | spin_lock(&desc->lock); |
139 | desc->mux_function = NULL; | 133 | desc->owner = NULL; |
140 | spin_unlock(&desc->lock); | 134 | spin_unlock(&desc->lock); |
141 | } | 135 | } |
142 | out: | 136 | out: |
143 | if (status) | 137 | if (status) |
144 | dev_err(pctldev->dev, "pin-%d (%s) status %d\n", | 138 | dev_err(pctldev->dev, "pin-%d (%s) status %d\n", |
145 | pin, function ? : "?", status); | 139 | pin, owner, status); |
146 | 140 | ||
147 | return status; | 141 | return status; |
148 | } | 142 | } |
@@ -154,8 +148,8 @@ out: | |||
154 | * @gpio_range: the range matching the GPIO pin if this is a request for a | 148 | * @gpio_range: the range matching the GPIO pin if this is a request for a |
155 | * single GPIO pin | 149 | * single GPIO pin |
156 | * | 150 | * |
157 | * This function returns a pointer to the function name in use. This is used | 151 | * This function returns a pointer to the previous owner. This is used |
158 | * for callers that dynamically allocate a function name so it can be freed | 152 | * for callers that dynamically allocate an owner name so it can be freed |
159 | * once the pin is free. This is done for GPIO request functions. | 153 | * once the pin is free. This is done for GPIO request functions. |
160 | */ | 154 | */ |
161 | static const char *pin_free(struct pinctrl_dev *pctldev, int pin, | 155 | static const char *pin_free(struct pinctrl_dev *pctldev, int pin, |
@@ -163,7 +157,7 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin, | |||
163 | { | 157 | { |
164 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | 158 | const struct pinmux_ops *ops = pctldev->desc->pmxops; |
165 | struct pin_desc *desc; | 159 | struct pin_desc *desc; |
166 | const char *func; | 160 | const char *owner; |
167 | 161 | ||
168 | desc = pin_desc_get(pctldev, pin); | 162 | desc = pin_desc_get(pctldev, pin); |
169 | if (desc == NULL) { | 163 | if (desc == NULL) { |
@@ -182,12 +176,12 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin, | |||
182 | ops->free(pctldev, pin); | 176 | ops->free(pctldev, pin); |
183 | 177 | ||
184 | spin_lock(&desc->lock); | 178 | spin_lock(&desc->lock); |
185 | func = desc->mux_function; | 179 | owner = desc->owner; |
186 | desc->mux_function = NULL; | 180 | desc->owner = NULL; |
187 | spin_unlock(&desc->lock); | 181 | spin_unlock(&desc->lock); |
188 | module_put(pctldev->owner); | 182 | module_put(pctldev->owner); |
189 | 183 | ||
190 | return func; | 184 | return owner; |
191 | } | 185 | } |
192 | 186 | ||
193 | /** | 187 | /** |
@@ -201,19 +195,19 @@ int pinmux_request_gpio(struct pinctrl_dev *pctldev, | |||
201 | unsigned pin, unsigned gpio) | 195 | unsigned pin, unsigned gpio) |
202 | { | 196 | { |
203 | char gpiostr[16]; | 197 | char gpiostr[16]; |
204 | const char *function; | 198 | const char *owner; |
205 | int ret; | 199 | int ret; |
206 | 200 | ||
207 | /* Conjure some name stating what chip and pin this is taken by */ | 201 | /* Conjure some name stating what chip and pin this is taken by */ |
208 | snprintf(gpiostr, 15, "%s:%d", range->name, gpio); | 202 | snprintf(gpiostr, 15, "%s:%d", range->name, gpio); |
209 | 203 | ||
210 | function = kstrdup(gpiostr, GFP_KERNEL); | 204 | owner = kstrdup(gpiostr, GFP_KERNEL); |
211 | if (!function) | 205 | if (!owner) |
212 | return -EINVAL; | 206 | return -EINVAL; |
213 | 207 | ||
214 | ret = pin_request(pctldev, pin, function, range); | 208 | ret = pin_request(pctldev, pin, owner, range); |
215 | if (ret < 0) | 209 | if (ret < 0) |
216 | kfree(function); | 210 | kfree(owner); |
217 | 211 | ||
218 | return ret; | 212 | return ret; |
219 | } | 213 | } |
@@ -227,10 +221,10 @@ int pinmux_request_gpio(struct pinctrl_dev *pctldev, | |||
227 | void pinmux_free_gpio(struct pinctrl_dev *pctldev, unsigned pin, | 221 | void pinmux_free_gpio(struct pinctrl_dev *pctldev, unsigned pin, |
228 | struct pinctrl_gpio_range *range) | 222 | struct pinctrl_gpio_range *range) |
229 | { | 223 | { |
230 | const char *func; | 224 | const char *owner; |
231 | 225 | ||
232 | func = pin_free(pctldev, pin, range); | 226 | owner = pin_free(pctldev, pin, range); |
233 | kfree(func); | 227 | kfree(owner); |
234 | } | 228 | } |
235 | 229 | ||
236 | /** | 230 | /** |
@@ -260,17 +254,15 @@ int pinmux_gpio_direction(struct pinctrl_dev *pctldev, | |||
260 | /** | 254 | /** |
261 | * acquire_pins() - acquire all the pins for a certain function on a pinmux | 255 | * acquire_pins() - acquire all the pins for a certain function on a pinmux |
262 | * @pctldev: the device to take the pins on | 256 | * @pctldev: the device to take the pins on |
263 | * @func_selector: the function selector to acquire the pins for | 257 | * @owner: a representation of the owner of this pin; typically the device |
258 | * name that controls its mux function | ||
264 | * @group_selector: the group selector containing the pins to acquire | 259 | * @group_selector: the group selector containing the pins to acquire |
265 | */ | 260 | */ |
266 | static int acquire_pins(struct pinctrl_dev *pctldev, | 261 | static int acquire_pins(struct pinctrl_dev *pctldev, |
267 | unsigned func_selector, | 262 | const char *owner, |
268 | unsigned group_selector) | 263 | unsigned group_selector) |
269 | { | 264 | { |
270 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; | 265 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; |
271 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; | ||
272 | const char *func = pmxops->get_function_name(pctldev, | ||
273 | func_selector); | ||
274 | const unsigned *pins; | 266 | const unsigned *pins; |
275 | unsigned num_pins; | 267 | unsigned num_pins; |
276 | int ret; | 268 | int ret; |
@@ -286,11 +278,11 @@ static int acquire_pins(struct pinctrl_dev *pctldev, | |||
286 | 278 | ||
287 | /* Try to allocate all pins in this group, one by one */ | 279 | /* Try to allocate all pins in this group, one by one */ |
288 | for (i = 0; i < num_pins; i++) { | 280 | for (i = 0; i < num_pins; i++) { |
289 | ret = pin_request(pctldev, pins[i], func, NULL); | 281 | ret = pin_request(pctldev, pins[i], owner, NULL); |
290 | if (ret) { | 282 | if (ret) { |
291 | dev_err(pctldev->dev, | 283 | dev_err(pctldev->dev, |
292 | "could not get pin %d for function %s on device %s - conflicting mux mappings?\n", | 284 | "could not get request pin %d on device %s - conflicting mux mappings?\n", |
293 | pins[i], func ? : "(undefined)", | 285 | pins[i], |
294 | pinctrl_dev_get_name(pctldev)); | 286 | pinctrl_dev_get_name(pctldev)); |
295 | /* On error release all taken pins */ | 287 | /* On error release all taken pins */ |
296 | i--; /* this pin just failed */ | 288 | i--; /* this pin just failed */ |
@@ -503,7 +495,7 @@ static int pinmux_enable_muxmap(struct pinctrl_dev *pctldev, | |||
503 | if (!grp) | 495 | if (!grp) |
504 | return -ENOMEM; | 496 | return -ENOMEM; |
505 | grp->group_selector = group_selector; | 497 | grp->group_selector = group_selector; |
506 | ret = acquire_pins(pctldev, func_selector, group_selector); | 498 | ret = acquire_pins(pctldev, devname, group_selector); |
507 | if (ret) { | 499 | if (ret) { |
508 | kfree(grp); | 500 | kfree(grp); |
509 | return ret; | 501 | return ret; |
@@ -630,7 +622,7 @@ static int pinmux_pins_show(struct seq_file *s, void *what) | |||
630 | unsigned i, pin; | 622 | unsigned i, pin; |
631 | 623 | ||
632 | seq_puts(s, "Pinmux settings per pin\n"); | 624 | seq_puts(s, "Pinmux settings per pin\n"); |
633 | seq_puts(s, "Format: pin (name): pinmuxfunction\n"); | 625 | seq_puts(s, "Format: pin (name): owner\n"); |
634 | 626 | ||
635 | /* The pin number can be retrived from the pin controller descriptor */ | 627 | /* The pin number can be retrived from the pin controller descriptor */ |
636 | for (i = 0; i < pctldev->desc->npins; i++) { | 628 | for (i = 0; i < pctldev->desc->npins; i++) { |
@@ -645,8 +637,7 @@ static int pinmux_pins_show(struct seq_file *s, void *what) | |||
645 | 637 | ||
646 | seq_printf(s, "pin %d (%s): %s\n", pin, | 638 | seq_printf(s, "pin %d (%s): %s\n", pin, |
647 | desc->name ? desc->name : "unnamed", | 639 | desc->name ? desc->name : "unnamed", |
648 | desc->mux_function ? desc->mux_function | 640 | desc->owner ? desc->owner : "UNCLAIMED"); |
649 | : "UNCLAIMED"); | ||
650 | } | 641 | } |
651 | 642 | ||
652 | return 0; | 643 | return 0; |