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