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