]> git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/gpio/gpio-uclass.c
gpio: mvebu_gpio: Add missing out value set to gpio_direction_output()
[people/ms/u-boot.git] / drivers / gpio / gpio-uclass.c
1 /*
2 * Copyright (c) 2013 Google, Inc
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7 #include <common.h>
8 #include <dm.h>
9 #include <errno.h>
10 #include <fdtdec.h>
11 #include <malloc.h>
12 #include <asm/gpio.h>
13 #include <linux/bug.h>
14 #include <linux/ctype.h>
15
16 DECLARE_GLOBAL_DATA_PTR;
17
18 /**
19 * gpio_to_device() - Convert global GPIO number to device, number
20 *
21 * Convert the GPIO number to an entry in the list of GPIOs
22 * or GPIO blocks registered with the GPIO controller. Returns
23 * entry on success, NULL on error.
24 *
25 * @gpio: The numeric representation of the GPIO
26 * @desc: Returns description (desc->flags will always be 0)
27 * @return 0 if found, -ENOENT if not found
28 */
29 static int gpio_to_device(unsigned int gpio, struct gpio_desc *desc)
30 {
31 struct gpio_dev_priv *uc_priv;
32 struct udevice *dev;
33 int ret;
34
35 for (ret = uclass_first_device(UCLASS_GPIO, &dev);
36 dev;
37 ret = uclass_next_device(&dev)) {
38 uc_priv = dev_get_uclass_priv(dev);
39 if (gpio >= uc_priv->gpio_base &&
40 gpio < uc_priv->gpio_base + uc_priv->gpio_count) {
41 desc->dev = dev;
42 desc->offset = gpio - uc_priv->gpio_base;
43 desc->flags = 0;
44 return 0;
45 }
46 }
47
48 /* No such GPIO */
49 return ret ? ret : -ENOENT;
50 }
51
52 int dm_gpio_lookup_name(const char *name, struct gpio_desc *desc)
53 {
54 struct gpio_dev_priv *uc_priv = NULL;
55 struct udevice *dev;
56 ulong offset;
57 int numeric;
58 int ret;
59
60 numeric = isdigit(*name) ? simple_strtoul(name, NULL, 10) : -1;
61 for (ret = uclass_first_device(UCLASS_GPIO, &dev);
62 dev;
63 ret = uclass_next_device(&dev)) {
64 int len;
65
66 uc_priv = dev_get_uclass_priv(dev);
67 if (numeric != -1) {
68 offset = numeric - uc_priv->gpio_base;
69 /* Allow GPIOs to be numbered from 0 */
70 if (offset >= 0 && offset < uc_priv->gpio_count)
71 break;
72 }
73
74 len = uc_priv->bank_name ? strlen(uc_priv->bank_name) : 0;
75
76 if (!strncasecmp(name, uc_priv->bank_name, len)) {
77 if (!strict_strtoul(name + len, 10, &offset))
78 break;
79 }
80 }
81
82 if (!dev)
83 return ret ? ret : -EINVAL;
84
85 desc->dev = dev;
86 desc->offset = offset;
87
88 return 0;
89 }
90
91 int gpio_lookup_name(const char *name, struct udevice **devp,
92 unsigned int *offsetp, unsigned int *gpiop)
93 {
94 struct gpio_desc desc;
95 int ret;
96
97 if (devp)
98 *devp = NULL;
99 ret = dm_gpio_lookup_name(name, &desc);
100 if (ret)
101 return ret;
102
103 if (devp)
104 *devp = desc.dev;
105 if (offsetp)
106 *offsetp = desc.offset;
107 if (gpiop) {
108 struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(desc.dev);
109
110 *gpiop = uc_priv->gpio_base + desc.offset;
111 }
112
113 return 0;
114 }
115
116 static int gpio_find_and_xlate(struct gpio_desc *desc,
117 struct fdtdec_phandle_args *args)
118 {
119 struct dm_gpio_ops *ops = gpio_get_ops(desc->dev);
120
121 /* Use the first argument as the offset by default */
122 if (args->args_count > 0)
123 desc->offset = args->args[0];
124 else
125 desc->offset = -1;
126 desc->flags = 0;
127
128 return ops->xlate ? ops->xlate(desc->dev, desc, args) : 0;
129 }
130
131 int dm_gpio_request(struct gpio_desc *desc, const char *label)
132 {
133 struct udevice *dev = desc->dev;
134 struct gpio_dev_priv *uc_priv;
135 char *str;
136 int ret;
137
138 uc_priv = dev_get_uclass_priv(dev);
139 if (uc_priv->name[desc->offset])
140 return -EBUSY;
141 str = strdup(label);
142 if (!str)
143 return -ENOMEM;
144 if (gpio_get_ops(dev)->request) {
145 ret = gpio_get_ops(dev)->request(dev, desc->offset, label);
146 if (ret) {
147 free(str);
148 return ret;
149 }
150 }
151 uc_priv->name[desc->offset] = str;
152
153 return 0;
154 }
155
156 static int dm_gpio_requestf(struct gpio_desc *desc, const char *fmt, ...)
157 {
158 #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_USE_TINY_PRINTF)
159 va_list args;
160 char buf[40];
161
162 va_start(args, fmt);
163 vscnprintf(buf, sizeof(buf), fmt, args);
164 va_end(args);
165 return dm_gpio_request(desc, buf);
166 #else
167 return dm_gpio_request(desc, fmt);
168 #endif
169 }
170
171 /**
172 * gpio_request() - [COMPAT] Request GPIO
173 * gpio: GPIO number
174 * label: Name for the requested GPIO
175 *
176 * The label is copied and allocated so the caller does not need to keep
177 * the pointer around.
178 *
179 * This function implements the API that's compatible with current
180 * GPIO API used in U-Boot. The request is forwarded to particular
181 * GPIO driver. Returns 0 on success, negative value on error.
182 */
183 int gpio_request(unsigned gpio, const char *label)
184 {
185 struct gpio_desc desc;
186 int ret;
187
188 ret = gpio_to_device(gpio, &desc);
189 if (ret)
190 return ret;
191
192 return dm_gpio_request(&desc, label);
193 }
194
195 /**
196 * gpio_requestf() - [COMPAT] Request GPIO
197 * @gpio: GPIO number
198 * @fmt: Format string for the requested GPIO
199 * @...: Arguments for the printf() format string
200 *
201 * This function implements the API that's compatible with current
202 * GPIO API used in U-Boot. The request is forwarded to particular
203 * GPIO driver. Returns 0 on success, negative value on error.
204 */
205 int gpio_requestf(unsigned gpio, const char *fmt, ...)
206 {
207 #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_USE_TINY_PRINTF)
208 va_list args;
209 char buf[40];
210
211 va_start(args, fmt);
212 vscnprintf(buf, sizeof(buf), fmt, args);
213 va_end(args);
214 return gpio_request(gpio, buf);
215 #else
216 return gpio_request(gpio, fmt);
217 #endif
218 }
219
220 int _dm_gpio_free(struct udevice *dev, uint offset)
221 {
222 struct gpio_dev_priv *uc_priv;
223 int ret;
224
225 uc_priv = dev_get_uclass_priv(dev);
226 if (!uc_priv->name[offset])
227 return -ENXIO;
228 if (gpio_get_ops(dev)->free) {
229 ret = gpio_get_ops(dev)->free(dev, offset);
230 if (ret)
231 return ret;
232 }
233
234 free(uc_priv->name[offset]);
235 uc_priv->name[offset] = NULL;
236
237 return 0;
238 }
239
240 /**
241 * gpio_free() - [COMPAT] Relinquish GPIO
242 * gpio: GPIO number
243 *
244 * This function implements the API that's compatible with current
245 * GPIO API used in U-Boot. The request is forwarded to particular
246 * GPIO driver. Returns 0 on success, negative value on error.
247 */
248 int gpio_free(unsigned gpio)
249 {
250 struct gpio_desc desc;
251 int ret;
252
253 ret = gpio_to_device(gpio, &desc);
254 if (ret)
255 return ret;
256
257 return _dm_gpio_free(desc.dev, desc.offset);
258 }
259
260 static int check_reserved(const struct gpio_desc *desc, const char *func)
261 {
262 struct gpio_dev_priv *uc_priv;
263
264 if (!dm_gpio_is_valid(desc))
265 return -ENOENT;
266
267 uc_priv = dev_get_uclass_priv(desc->dev);
268 if (!uc_priv->name[desc->offset]) {
269 printf("%s: %s: error: gpio %s%d not reserved\n",
270 desc->dev->name, func,
271 uc_priv->bank_name ? uc_priv->bank_name : "",
272 desc->offset);
273 return -EBUSY;
274 }
275
276 return 0;
277 }
278
279 /**
280 * gpio_direction_input() - [COMPAT] Set GPIO direction to input
281 * gpio: GPIO number
282 *
283 * This function implements the API that's compatible with current
284 * GPIO API used in U-Boot. The request is forwarded to particular
285 * GPIO driver. Returns 0 on success, negative value on error.
286 */
287 int gpio_direction_input(unsigned gpio)
288 {
289 struct gpio_desc desc;
290 int ret;
291
292 ret = gpio_to_device(gpio, &desc);
293 if (ret)
294 return ret;
295 ret = check_reserved(&desc, "dir_input");
296 if (ret)
297 return ret;
298
299 return gpio_get_ops(desc.dev)->direction_input(desc.dev, desc.offset);
300 }
301
302 /**
303 * gpio_direction_output() - [COMPAT] Set GPIO direction to output and set value
304 * gpio: GPIO number
305 * value: Logical value to be set on the GPIO pin
306 *
307 * This function implements the API that's compatible with current
308 * GPIO API used in U-Boot. The request is forwarded to particular
309 * GPIO driver. Returns 0 on success, negative value on error.
310 */
311 int gpio_direction_output(unsigned gpio, int value)
312 {
313 struct gpio_desc desc;
314 int ret;
315
316 ret = gpio_to_device(gpio, &desc);
317 if (ret)
318 return ret;
319 ret = check_reserved(&desc, "dir_output");
320 if (ret)
321 return ret;
322
323 return gpio_get_ops(desc.dev)->direction_output(desc.dev,
324 desc.offset, value);
325 }
326
327 int dm_gpio_get_value(const struct gpio_desc *desc)
328 {
329 int value;
330 int ret;
331
332 ret = check_reserved(desc, "get_value");
333 if (ret)
334 return ret;
335
336 value = gpio_get_ops(desc->dev)->get_value(desc->dev, desc->offset);
337
338 return desc->flags & GPIOD_ACTIVE_LOW ? !value : value;
339 }
340
341 int dm_gpio_set_value(const struct gpio_desc *desc, int value)
342 {
343 int ret;
344
345 ret = check_reserved(desc, "set_value");
346 if (ret)
347 return ret;
348
349 if (desc->flags & GPIOD_ACTIVE_LOW)
350 value = !value;
351 gpio_get_ops(desc->dev)->set_value(desc->dev, desc->offset, value);
352 return 0;
353 }
354
355 int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
356 {
357 struct udevice *dev = desc->dev;
358 struct dm_gpio_ops *ops = gpio_get_ops(dev);
359 int ret;
360
361 ret = check_reserved(desc, "set_dir");
362 if (ret)
363 return ret;
364
365 if (flags & GPIOD_IS_OUT) {
366 int value = flags & GPIOD_IS_OUT_ACTIVE ? 1 : 0;
367
368 if (flags & GPIOD_ACTIVE_LOW)
369 value = !value;
370 ret = ops->direction_output(dev, desc->offset, value);
371 } else if (flags & GPIOD_IS_IN) {
372 ret = ops->direction_input(dev, desc->offset);
373 }
374 if (ret)
375 return ret;
376 /*
377 * Update desc->flags here, so that GPIO_ACTIVE_LOW is honoured in
378 * futures
379 */
380 desc->flags = flags;
381
382 return 0;
383 }
384
385 int dm_gpio_set_dir(struct gpio_desc *desc)
386 {
387 return dm_gpio_set_dir_flags(desc, desc->flags);
388 }
389
390 /**
391 * gpio_get_value() - [COMPAT] Sample GPIO pin and return it's value
392 * gpio: GPIO number
393 *
394 * This function implements the API that's compatible with current
395 * GPIO API used in U-Boot. The request is forwarded to particular
396 * GPIO driver. Returns the value of the GPIO pin, or negative value
397 * on error.
398 */
399 int gpio_get_value(unsigned gpio)
400 {
401 int ret;
402
403 struct gpio_desc desc;
404
405 ret = gpio_to_device(gpio, &desc);
406 if (ret)
407 return ret;
408 return dm_gpio_get_value(&desc);
409 }
410
411 /**
412 * gpio_set_value() - [COMPAT] Configure logical value on GPIO pin
413 * gpio: GPIO number
414 * value: Logical value to be set on the GPIO pin.
415 *
416 * This function implements the API that's compatible with current
417 * GPIO API used in U-Boot. The request is forwarded to particular
418 * GPIO driver. Returns 0 on success, negative value on error.
419 */
420 int gpio_set_value(unsigned gpio, int value)
421 {
422 struct gpio_desc desc;
423 int ret;
424
425 ret = gpio_to_device(gpio, &desc);
426 if (ret)
427 return ret;
428 return dm_gpio_set_value(&desc, value);
429 }
430
431 const char *gpio_get_bank_info(struct udevice *dev, int *bit_count)
432 {
433 struct gpio_dev_priv *priv;
434
435 /* Must be called on an active device */
436 priv = dev_get_uclass_priv(dev);
437 assert(priv);
438
439 *bit_count = priv->gpio_count;
440 return priv->bank_name;
441 }
442
443 static const char * const gpio_function[GPIOF_COUNT] = {
444 "input",
445 "output",
446 "unused",
447 "unknown",
448 "func",
449 };
450
451 int get_function(struct udevice *dev, int offset, bool skip_unused,
452 const char **namep)
453 {
454 struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
455 struct dm_gpio_ops *ops = gpio_get_ops(dev);
456
457 BUILD_BUG_ON(GPIOF_COUNT != ARRAY_SIZE(gpio_function));
458 if (!device_active(dev))
459 return -ENODEV;
460 if (offset < 0 || offset >= uc_priv->gpio_count)
461 return -EINVAL;
462 if (namep)
463 *namep = uc_priv->name[offset];
464 if (skip_unused && !uc_priv->name[offset])
465 return GPIOF_UNUSED;
466 if (ops->get_function) {
467 int ret;
468
469 ret = ops->get_function(dev, offset);
470 if (ret < 0)
471 return ret;
472 if (ret >= ARRAY_SIZE(gpio_function))
473 return -ENODATA;
474 return ret;
475 }
476
477 return GPIOF_UNKNOWN;
478 }
479
480 int gpio_get_function(struct udevice *dev, int offset, const char **namep)
481 {
482 return get_function(dev, offset, true, namep);
483 }
484
485 int gpio_get_raw_function(struct udevice *dev, int offset, const char **namep)
486 {
487 return get_function(dev, offset, false, namep);
488 }
489
490 int gpio_get_status(struct udevice *dev, int offset, char *buf, int buffsize)
491 {
492 struct dm_gpio_ops *ops = gpio_get_ops(dev);
493 struct gpio_dev_priv *priv;
494 char *str = buf;
495 int func;
496 int ret;
497 int len;
498
499 BUILD_BUG_ON(GPIOF_COUNT != ARRAY_SIZE(gpio_function));
500
501 *buf = 0;
502 priv = dev_get_uclass_priv(dev);
503 ret = gpio_get_raw_function(dev, offset, NULL);
504 if (ret < 0)
505 return ret;
506 func = ret;
507 len = snprintf(str, buffsize, "%s%d: %s",
508 priv->bank_name ? priv->bank_name : "",
509 offset, gpio_function[func]);
510 if (func == GPIOF_INPUT || func == GPIOF_OUTPUT ||
511 func == GPIOF_UNUSED) {
512 const char *label;
513 bool used;
514
515 ret = ops->get_value(dev, offset);
516 if (ret < 0)
517 return ret;
518 used = gpio_get_function(dev, offset, &label) != GPIOF_UNUSED;
519 snprintf(str + len, buffsize - len, ": %d [%c]%s%s",
520 ret,
521 used ? 'x' : ' ',
522 used ? " " : "",
523 label ? label : "");
524 }
525
526 return 0;
527 }
528
529 int gpio_claim_vector(const int *gpio_num_array, const char *fmt)
530 {
531 int i, ret;
532 int gpio;
533
534 for (i = 0; i < 32; i++) {
535 gpio = gpio_num_array[i];
536 if (gpio == -1)
537 break;
538 ret = gpio_requestf(gpio, fmt, i);
539 if (ret)
540 goto err;
541 ret = gpio_direction_input(gpio);
542 if (ret) {
543 gpio_free(gpio);
544 goto err;
545 }
546 }
547
548 return 0;
549 err:
550 for (i--; i >= 0; i--)
551 gpio_free(gpio_num_array[i]);
552
553 return ret;
554 }
555
556 /*
557 * get a number comprised of multiple GPIO values. gpio_num_array points to
558 * the array of gpio pin numbers to scan, terminated by -1.
559 */
560 int gpio_get_values_as_int(const int *gpio_list)
561 {
562 int gpio;
563 unsigned bitmask = 1;
564 unsigned vector = 0;
565 int ret;
566
567 while (bitmask &&
568 ((gpio = *gpio_list++) != -1)) {
569 ret = gpio_get_value(gpio);
570 if (ret < 0)
571 return ret;
572 else if (ret)
573 vector |= bitmask;
574 bitmask <<= 1;
575 }
576
577 return vector;
578 }
579
580 int dm_gpio_get_values_as_int(const struct gpio_desc *desc_list, int count)
581 {
582 unsigned bitmask = 1;
583 unsigned vector = 0;
584 int ret, i;
585
586 for (i = 0; i < count; i++) {
587 ret = dm_gpio_get_value(&desc_list[i]);
588 if (ret < 0)
589 return ret;
590 else if (ret)
591 vector |= bitmask;
592 bitmask <<= 1;
593 }
594
595 return vector;
596 }
597
598 static int _gpio_request_by_name_nodev(const void *blob, int node,
599 const char *list_name, int index,
600 struct gpio_desc *desc, int flags,
601 bool add_index)
602 {
603 struct fdtdec_phandle_args args;
604 int ret;
605
606 desc->dev = NULL;
607 desc->offset = 0;
608 ret = fdtdec_parse_phandle_with_args(blob, node, list_name,
609 "#gpio-cells", 0, index, &args);
610 if (ret) {
611 debug("%s: fdtdec_parse_phandle_with_args failed\n", __func__);
612 goto err;
613 }
614
615 ret = uclass_get_device_by_of_offset(UCLASS_GPIO, args.node,
616 &desc->dev);
617 if (ret) {
618 debug("%s: uclass_get_device_by_of_offset failed\n", __func__);
619 goto err;
620 }
621 ret = gpio_find_and_xlate(desc, &args);
622 if (ret) {
623 debug("%s: gpio_find_and_xlate failed\n", __func__);
624 goto err;
625 }
626 ret = dm_gpio_requestf(desc, add_index ? "%s.%s%d" : "%s.%s",
627 fdt_get_name(blob, node, NULL),
628 list_name, index);
629 if (ret) {
630 debug("%s: dm_gpio_requestf failed\n", __func__);
631 goto err;
632 }
633 ret = dm_gpio_set_dir_flags(desc, flags | desc->flags);
634 if (ret) {
635 debug("%s: dm_gpio_set_dir failed\n", __func__);
636 goto err;
637 }
638
639 return 0;
640 err:
641 debug("%s: Node '%s', property '%s', failed to request GPIO index %d: %d\n",
642 __func__, fdt_get_name(blob, node, NULL), list_name, index, ret);
643 return ret;
644 }
645
646 int gpio_request_by_name_nodev(const void *blob, int node,
647 const char *list_name, int index,
648 struct gpio_desc *desc, int flags)
649 {
650 return _gpio_request_by_name_nodev(blob, node, list_name, index, desc,
651 flags, index > 0);
652 }
653
654 int gpio_request_by_name(struct udevice *dev, const char *list_name, int index,
655 struct gpio_desc *desc, int flags)
656 {
657 /*
658 * This isn't ideal since we don't use dev->name in the debug()
659 * calls in gpio_request_by_name(), but we can do this until
660 * gpio_request_by_name_nodev() can be dropped.
661 */
662 return gpio_request_by_name_nodev(gd->fdt_blob, dev->of_offset,
663 list_name, index, desc, flags);
664 }
665
666 int gpio_request_list_by_name_nodev(const void *blob, int node,
667 const char *list_name,
668 struct gpio_desc *desc, int max_count,
669 int flags)
670 {
671 int count;
672 int ret;
673
674 for (count = 0; count < max_count; count++) {
675 ret = _gpio_request_by_name_nodev(blob, node, list_name, count,
676 &desc[count], flags, true);
677 if (ret == -ENOENT)
678 break;
679 else if (ret)
680 goto err;
681 }
682
683 /* We ran out of GPIOs in the list */
684 return count;
685
686 err:
687 gpio_free_list_nodev(desc, count - 1);
688
689 return ret;
690 }
691
692 int gpio_request_list_by_name(struct udevice *dev, const char *list_name,
693 struct gpio_desc *desc, int max_count,
694 int flags)
695 {
696 /*
697 * This isn't ideal since we don't use dev->name in the debug()
698 * calls in gpio_request_by_name(), but we can do this until
699 * gpio_request_list_by_name_nodev() can be dropped.
700 */
701 return gpio_request_list_by_name_nodev(gd->fdt_blob, dev->of_offset,
702 list_name, desc, max_count,
703 flags);
704 }
705
706 int gpio_get_list_count(struct udevice *dev, const char *list_name)
707 {
708 int ret;
709
710 ret = fdtdec_parse_phandle_with_args(gd->fdt_blob, dev->of_offset,
711 list_name, "#gpio-cells", 0, -1,
712 NULL);
713 if (ret) {
714 debug("%s: Node '%s', property '%s', GPIO count failed: %d\n",
715 __func__, dev->name, list_name, ret);
716 }
717
718 return ret;
719 }
720
721 int dm_gpio_free(struct udevice *dev, struct gpio_desc *desc)
722 {
723 /* For now, we don't do any checking of dev */
724 return _dm_gpio_free(desc->dev, desc->offset);
725 }
726
727 int gpio_free_list(struct udevice *dev, struct gpio_desc *desc, int count)
728 {
729 int i;
730
731 /* For now, we don't do any checking of dev */
732 for (i = 0; i < count; i++)
733 dm_gpio_free(dev, &desc[i]);
734
735 return 0;
736 }
737
738 int gpio_free_list_nodev(struct gpio_desc *desc, int count)
739 {
740 return gpio_free_list(NULL, desc, count);
741 }
742
743 /* We need to renumber the GPIOs when any driver is probed/removed */
744 static int gpio_renumber(struct udevice *removed_dev)
745 {
746 struct gpio_dev_priv *uc_priv;
747 struct udevice *dev;
748 struct uclass *uc;
749 unsigned base;
750 int ret;
751
752 ret = uclass_get(UCLASS_GPIO, &uc);
753 if (ret)
754 return ret;
755
756 /* Ensure that we have a base for each bank */
757 base = 0;
758 uclass_foreach_dev(dev, uc) {
759 if (device_active(dev) && dev != removed_dev) {
760 uc_priv = dev_get_uclass_priv(dev);
761 uc_priv->gpio_base = base;
762 base += uc_priv->gpio_count;
763 }
764 }
765
766 return 0;
767 }
768
769 int gpio_get_number(const struct gpio_desc *desc)
770 {
771 struct udevice *dev = desc->dev;
772 struct gpio_dev_priv *uc_priv;
773
774 if (!dev)
775 return -1;
776 uc_priv = dev->uclass_priv;
777
778 return uc_priv->gpio_base + desc->offset;
779 }
780
781 static int gpio_post_probe(struct udevice *dev)
782 {
783 struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
784
785 uc_priv->name = calloc(uc_priv->gpio_count, sizeof(char *));
786 if (!uc_priv->name)
787 return -ENOMEM;
788
789 return gpio_renumber(NULL);
790 }
791
792 static int gpio_pre_remove(struct udevice *dev)
793 {
794 struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
795 int i;
796
797 for (i = 0; i < uc_priv->gpio_count; i++) {
798 if (uc_priv->name[i])
799 free(uc_priv->name[i]);
800 }
801 free(uc_priv->name);
802
803 return gpio_renumber(dev);
804 }
805
806 UCLASS_DRIVER(gpio) = {
807 .id = UCLASS_GPIO,
808 .name = "gpio",
809 .flags = DM_UC_FLAG_SEQ_ALIAS,
810 .post_probe = gpio_post_probe,
811 .pre_remove = gpio_pre_remove,
812 .per_device_auto_alloc_size = sizeof(struct gpio_dev_priv),
813 };