1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (c) 2013 - 2018 Xilinx, Michal Simek 4 */ 5 6 #include <common.h> 7 #include <errno.h> 8 #include <malloc.h> 9 #include <linux/list.h> 10 #include <asm/io.h> 11 #include <asm/gpio.h> 12 #include <dm.h> 13 14 static LIST_HEAD(gpio_list); 15 16 enum gpio_direction { 17 GPIO_DIRECTION_OUT = 0, 18 GPIO_DIRECTION_IN = 1, 19 }; 20 21 /* Gpio simple map */ 22 struct gpio_regs { 23 u32 gpiodata; 24 u32 gpiodir; 25 }; 26 27 #if !defined(CONFIG_DM_GPIO) 28 29 #define GPIO_NAME_SIZE 10 30 31 struct gpio_names { 32 char name[GPIO_NAME_SIZE]; 33 }; 34 35 /* Initialized, rxbd_current, rx_first_buf must be 0 after init */ 36 struct xilinx_gpio_priv { 37 struct gpio_regs *regs; 38 u32 gpio_min; 39 u32 gpio_max; 40 u32 gpiodata_store; 41 char name[GPIO_NAME_SIZE]; 42 struct list_head list; 43 struct gpio_names *gpio_name; 44 }; 45 46 /* Store number of allocated gpio pins */ 47 static u32 xilinx_gpio_max; 48 49 /* Get associated gpio controller */ 50 static struct xilinx_gpio_priv *gpio_get_controller(unsigned gpio) 51 { 52 struct list_head *entry; 53 struct xilinx_gpio_priv *priv = NULL; 54 55 list_for_each(entry, &gpio_list) { 56 priv = list_entry(entry, struct xilinx_gpio_priv, list); 57 if (gpio >= priv->gpio_min && gpio <= priv->gpio_max) { 58 debug("%s: reg: %x, min-max: %d-%d\n", __func__, 59 (u32)priv->regs, priv->gpio_min, priv->gpio_max); 60 return priv; 61 } 62 } 63 puts("!!!Can't get gpio controller!!!\n"); 64 return NULL; 65 } 66 67 /* Get gpio pin name if used/setup */ 68 static char *get_name(unsigned gpio) 69 { 70 u32 gpio_priv; 71 struct xilinx_gpio_priv *priv; 72 73 debug("%s\n", __func__); 74 75 priv = gpio_get_controller(gpio); 76 if (priv) { 77 gpio_priv = gpio - priv->gpio_min; 78 79 return *priv->gpio_name[gpio_priv].name ? 80 priv->gpio_name[gpio_priv].name : "UNKNOWN"; 81 } 82 return "UNKNOWN"; 83 } 84 85 /* Get output value */ 86 static int gpio_get_output_value(unsigned gpio) 87 { 88 u32 val, gpio_priv; 89 struct xilinx_gpio_priv *priv = gpio_get_controller(gpio); 90 91 if (priv) { 92 gpio_priv = gpio - priv->gpio_min; 93 val = !!(priv->gpiodata_store & (1 << gpio_priv)); 94 debug("%s: reg: %x, gpio_no: %d, dir: %d\n", __func__, 95 (u32)priv->regs, gpio_priv, val); 96 97 return val; 98 } 99 return -1; 100 } 101 102 /* Get input value */ 103 static int gpio_get_input_value(unsigned gpio) 104 { 105 u32 val, gpio_priv; 106 struct gpio_regs *regs; 107 struct xilinx_gpio_priv *priv = gpio_get_controller(gpio); 108 109 if (priv) { 110 regs = priv->regs; 111 gpio_priv = gpio - priv->gpio_min; 112 val = readl(®s->gpiodata); 113 val = !!(val & (1 << gpio_priv)); 114 debug("%s: reg: %x, gpio_no: %d, dir: %d\n", __func__, 115 (u32)priv->regs, gpio_priv, val); 116 117 return val; 118 } 119 return -1; 120 } 121 122 /* Set gpio direction */ 123 static int gpio_set_direction(unsigned gpio, enum gpio_direction direction) 124 { 125 u32 val, gpio_priv; 126 struct gpio_regs *regs; 127 struct xilinx_gpio_priv *priv = gpio_get_controller(gpio); 128 129 if (priv) { 130 regs = priv->regs; 131 val = readl(®s->gpiodir); 132 133 gpio_priv = gpio - priv->gpio_min; 134 if (direction == GPIO_DIRECTION_OUT) 135 val &= ~(1 << gpio_priv); 136 else 137 val |= 1 << gpio_priv; 138 139 writel(val, ®s->gpiodir); 140 debug("%s: reg: %x, gpio_no: %d, dir: %d\n", __func__, 141 (u32)priv->regs, gpio_priv, val); 142 143 return 0; 144 } 145 146 return -1; 147 } 148 149 /* Get gpio direction */ 150 static int gpio_get_direction(unsigned gpio) 151 { 152 u32 val, gpio_priv; 153 struct gpio_regs *regs; 154 struct xilinx_gpio_priv *priv = gpio_get_controller(gpio); 155 156 if (priv) { 157 regs = priv->regs; 158 gpio_priv = gpio - priv->gpio_min; 159 val = readl(®s->gpiodir); 160 val = !!(val & (1 << gpio_priv)); 161 debug("%s: reg: %x, gpio_no: %d, dir: %d\n", __func__, 162 (u32)priv->regs, gpio_priv, val); 163 164 return val; 165 } 166 167 return -1; 168 } 169 170 /* 171 * Get input value 172 * for example gpio setup to output only can't get input value 173 * which is breaking gpio toggle command 174 */ 175 int gpio_get_value(unsigned gpio) 176 { 177 u32 val; 178 179 if (gpio_get_direction(gpio) == GPIO_DIRECTION_OUT) 180 val = gpio_get_output_value(gpio); 181 else 182 val = gpio_get_input_value(gpio); 183 184 return val; 185 } 186 187 /* Set output value */ 188 static int gpio_set_output_value(unsigned gpio, int value) 189 { 190 u32 val, gpio_priv; 191 struct gpio_regs *regs; 192 struct xilinx_gpio_priv *priv = gpio_get_controller(gpio); 193 194 if (priv) { 195 regs = priv->regs; 196 gpio_priv = gpio - priv->gpio_min; 197 val = priv->gpiodata_store; 198 if (value) 199 val |= 1 << gpio_priv; 200 else 201 val &= ~(1 << gpio_priv); 202 203 writel(val, ®s->gpiodata); 204 debug("%s: reg: %x, gpio_no: %d, output_val: %d\n", __func__, 205 (u32)priv->regs, gpio_priv, val); 206 priv->gpiodata_store = val; 207 208 return 0; 209 } 210 211 return -1; 212 } 213 214 int gpio_set_value(unsigned gpio, int value) 215 { 216 if (gpio_get_direction(gpio) == GPIO_DIRECTION_OUT) 217 return gpio_set_output_value(gpio, value); 218 219 return -1; 220 } 221 222 /* Set GPIO as input */ 223 int gpio_direction_input(unsigned gpio) 224 { 225 debug("%s\n", __func__); 226 return gpio_set_direction(gpio, GPIO_DIRECTION_IN); 227 } 228 229 /* Setup GPIO as output and set output value */ 230 int gpio_direction_output(unsigned gpio, int value) 231 { 232 int ret = gpio_set_direction(gpio, GPIO_DIRECTION_OUT); 233 234 debug("%s\n", __func__); 235 236 if (ret < 0) 237 return ret; 238 239 return gpio_set_output_value(gpio, value); 240 } 241 242 /* Show gpio status */ 243 void gpio_info(void) 244 { 245 unsigned gpio; 246 247 struct list_head *entry; 248 struct xilinx_gpio_priv *priv = NULL; 249 250 list_for_each(entry, &gpio_list) { 251 priv = list_entry(entry, struct xilinx_gpio_priv, list); 252 printf("\n%s: %s/%x (%d-%d)\n", __func__, priv->name, 253 (u32)priv->regs, priv->gpio_min, priv->gpio_max); 254 255 for (gpio = priv->gpio_min; gpio <= priv->gpio_max; gpio++) { 256 printf("GPIO_%d:\t%s is an ", gpio, get_name(gpio)); 257 if (gpio_get_direction(gpio) == GPIO_DIRECTION_OUT) 258 printf("OUTPUT value = %d\n", 259 gpio_get_output_value(gpio)); 260 else 261 printf("INPUT value = %d\n", 262 gpio_get_input_value(gpio)); 263 } 264 } 265 } 266 267 int gpio_request(unsigned gpio, const char *label) 268 { 269 u32 gpio_priv; 270 struct xilinx_gpio_priv *priv; 271 272 if (gpio >= xilinx_gpio_max) 273 return -EINVAL; 274 275 priv = gpio_get_controller(gpio); 276 if (priv) { 277 gpio_priv = gpio - priv->gpio_min; 278 279 if (label != NULL) { 280 strncpy(priv->gpio_name[gpio_priv].name, label, 281 GPIO_NAME_SIZE); 282 priv->gpio_name[gpio_priv].name[GPIO_NAME_SIZE - 1] = 283 '\0'; 284 } 285 return 0; 286 } 287 288 return -1; 289 } 290 291 int gpio_free(unsigned gpio) 292 { 293 u32 gpio_priv; 294 struct xilinx_gpio_priv *priv; 295 296 if (gpio >= xilinx_gpio_max) 297 return -EINVAL; 298 299 priv = gpio_get_controller(gpio); 300 if (priv) { 301 gpio_priv = gpio - priv->gpio_min; 302 priv->gpio_name[gpio_priv].name[0] = '\0'; 303 304 /* Do nothing here */ 305 return 0; 306 } 307 308 return -1; 309 } 310 311 int gpio_alloc(u32 baseaddr, const char *name, u32 gpio_no) 312 { 313 struct xilinx_gpio_priv *priv; 314 315 priv = calloc(1, sizeof(struct xilinx_gpio_priv)); 316 317 /* Setup gpio name */ 318 if (name != NULL) { 319 strncpy(priv->name, name, GPIO_NAME_SIZE); 320 priv->name[GPIO_NAME_SIZE - 1] = '\0'; 321 } 322 priv->regs = (struct gpio_regs *)baseaddr; 323 324 priv->gpio_min = xilinx_gpio_max; 325 xilinx_gpio_max = priv->gpio_min + gpio_no; 326 priv->gpio_max = xilinx_gpio_max - 1; 327 328 priv->gpio_name = calloc(gpio_no, sizeof(struct gpio_names)); 329 330 INIT_LIST_HEAD(&priv->list); 331 list_add_tail(&priv->list, &gpio_list); 332 333 printf("%s: Add %s (%d-%d)\n", __func__, name, 334 priv->gpio_min, priv->gpio_max); 335 336 /* Return the first gpio allocated for this device */ 337 return priv->gpio_min; 338 } 339 340 /* Dual channel gpio is one IP with two independent channels */ 341 int gpio_alloc_dual(u32 baseaddr, const char *name, u32 gpio_no0, u32 gpio_no1) 342 { 343 int ret; 344 345 ret = gpio_alloc(baseaddr, name, gpio_no0); 346 gpio_alloc(baseaddr + 8, strcat((char *)name, "_1"), gpio_no1); 347 348 /* Return the first gpio allocated for this device */ 349 return ret; 350 } 351 #else 352 #include <dt-bindings/gpio/gpio.h> 353 354 #define XILINX_GPIO_MAX_BANK 2 355 356 struct xilinx_gpio_platdata { 357 struct gpio_regs *regs; 358 int bank_max[XILINX_GPIO_MAX_BANK]; 359 int bank_input[XILINX_GPIO_MAX_BANK]; 360 int bank_output[XILINX_GPIO_MAX_BANK]; 361 }; 362 363 static int xilinx_gpio_get_bank_pin(unsigned offset, u32 *bank_num, 364 u32 *bank_pin_num, struct udevice *dev) 365 { 366 struct xilinx_gpio_platdata *platdata = dev_get_platdata(dev); 367 u32 bank, max_pins; 368 /* the first gpio is 0 not 1 */ 369 u32 pin_num = offset; 370 371 for (bank = 0; bank < XILINX_GPIO_MAX_BANK; bank++) { 372 max_pins = platdata->bank_max[bank]; 373 if (pin_num < max_pins) { 374 debug("%s: found at bank 0x%x pin 0x%x\n", __func__, 375 bank, pin_num); 376 *bank_num = bank; 377 *bank_pin_num = pin_num; 378 return 0; 379 } 380 pin_num -= max_pins; 381 } 382 383 return -EINVAL; 384 } 385 386 static int xilinx_gpio_set_value(struct udevice *dev, unsigned offset, 387 int value) 388 { 389 struct xilinx_gpio_platdata *platdata = dev_get_platdata(dev); 390 int val, ret; 391 u32 bank, pin; 392 393 ret = xilinx_gpio_get_bank_pin(offset, &bank, &pin, dev); 394 if (ret) 395 return ret; 396 397 debug("%s: regs: %lx, value: %x, gpio: %x, bank %x, pin %x\n", 398 __func__, (ulong)platdata->regs, value, offset, bank, pin); 399 400 if (value) { 401 val = readl(&platdata->regs->gpiodata + bank * 2); 402 val = val | (1 << pin); 403 writel(val, &platdata->regs->gpiodata + bank * 2); 404 } else { 405 val = readl(&platdata->regs->gpiodata + bank * 2); 406 val = val & ~(1 << pin); 407 writel(val, &platdata->regs->gpiodata + bank * 2); 408 } 409 410 return val; 411 }; 412 413 static int xilinx_gpio_get_value(struct udevice *dev, unsigned offset) 414 { 415 struct xilinx_gpio_platdata *platdata = dev_get_platdata(dev); 416 int val, ret; 417 u32 bank, pin; 418 419 ret = xilinx_gpio_get_bank_pin(offset, &bank, &pin, dev); 420 if (ret) 421 return ret; 422 423 debug("%s: regs: %lx, gpio: %x, bank %x, pin %x\n", __func__, 424 (ulong)platdata->regs, offset, bank, pin); 425 426 val = readl(&platdata->regs->gpiodata + bank * 2); 427 val = !!(val & (1 << pin)); 428 429 return val; 430 }; 431 432 static int xilinx_gpio_get_function(struct udevice *dev, unsigned offset) 433 { 434 struct xilinx_gpio_platdata *platdata = dev_get_platdata(dev); 435 int val, ret; 436 u32 bank, pin; 437 438 /* Check if all pins are inputs */ 439 if (platdata->bank_input[bank]) 440 return GPIOF_INPUT; 441 442 /* Check if all pins are outputs */ 443 if (platdata->bank_output[bank]) 444 return GPIOF_OUTPUT; 445 446 ret = xilinx_gpio_get_bank_pin(offset, &bank, &pin, dev); 447 if (ret) 448 return ret; 449 450 /* FIXME test on dual */ 451 val = readl(&platdata->regs->gpiodir + bank * 2); 452 val = !(val & (1 << pin)); 453 454 /* input is 1 in reg but GPIOF_INPUT is 0 */ 455 /* output is 0 in reg but GPIOF_OUTPUT is 1 */ 456 457 return val; 458 } 459 460 static int xilinx_gpio_direction_output(struct udevice *dev, unsigned offset, 461 int value) 462 { 463 struct xilinx_gpio_platdata *platdata = dev_get_platdata(dev); 464 int val, ret; 465 u32 bank, pin; 466 467 ret = xilinx_gpio_get_bank_pin(offset, &bank, &pin, dev); 468 if (ret) 469 return ret; 470 471 /* can't change it if all is input by default */ 472 if (platdata->bank_input[bank]) 473 return -EINVAL; 474 475 if (!platdata->bank_output[bank]) { 476 val = readl(&platdata->regs->gpiodir + bank * 2); 477 val = val & ~(1 << pin); 478 writel(val, &platdata->regs->gpiodir + bank * 2); 479 } 480 481 xilinx_gpio_set_value(dev, offset, value); 482 483 return 0; 484 } 485 486 static int xilinx_gpio_direction_input(struct udevice *dev, unsigned offset) 487 { 488 struct xilinx_gpio_platdata *platdata = dev_get_platdata(dev); 489 int val, ret; 490 u32 bank, pin; 491 492 ret = xilinx_gpio_get_bank_pin(offset, &bank, &pin, dev); 493 if (ret) 494 return ret; 495 496 /* Already input */ 497 if (platdata->bank_input[bank]) 498 return 0; 499 500 /* can't change it if all is output by default */ 501 if (platdata->bank_output[bank]) 502 return -EINVAL; 503 504 val = readl(&platdata->regs->gpiodir + bank * 2); 505 val = val | (1 << pin); 506 writel(val, &platdata->regs->gpiodir + bank * 2); 507 508 return 0; 509 } 510 511 static int xilinx_gpio_xlate(struct udevice *dev, struct gpio_desc *desc, 512 struct ofnode_phandle_args *args) 513 { 514 struct xilinx_gpio_platdata *platdata = dev_get_platdata(dev); 515 516 desc->offset = args->args[0]; 517 518 debug("%s: argc: %x, [0]: %x, [1]: %x, [2]: %x\n", __func__, 519 args->args_count, args->args[0], args->args[1], args->args[2]); 520 521 /* 522 * The second cell is channel offset: 523 * 0 is first channel, 8 is second channel 524 * 525 * U-Boot driver just combine channels together that's why simply 526 * add amount of pins in second channel if present. 527 */ 528 if (args->args[1]) { 529 if (!platdata->bank_max[1]) { 530 printf("%s: %s has no second channel\n", 531 __func__, dev->name); 532 return -EINVAL; 533 } 534 535 desc->offset += platdata->bank_max[0]; 536 } 537 538 /* The third cell is optional */ 539 if (args->args_count > 2) 540 desc->flags = (args->args[2] & 541 GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0); 542 543 debug("%s: offset %x, flags %lx\n", 544 __func__, desc->offset, desc->flags); 545 return 0; 546 } 547 548 static const struct dm_gpio_ops xilinx_gpio_ops = { 549 .direction_input = xilinx_gpio_direction_input, 550 .direction_output = xilinx_gpio_direction_output, 551 .get_value = xilinx_gpio_get_value, 552 .set_value = xilinx_gpio_set_value, 553 .get_function = xilinx_gpio_get_function, 554 .xlate = xilinx_gpio_xlate, 555 }; 556 557 static int xilinx_gpio_probe(struct udevice *dev) 558 { 559 struct xilinx_gpio_platdata *platdata = dev_get_platdata(dev); 560 struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); 561 562 uc_priv->bank_name = dev->name; 563 564 uc_priv->gpio_count = platdata->bank_max[0] + platdata->bank_max[1]; 565 566 return 0; 567 } 568 569 static int xilinx_gpio_ofdata_to_platdata(struct udevice *dev) 570 { 571 struct xilinx_gpio_platdata *platdata = dev_get_platdata(dev); 572 int is_dual; 573 574 platdata->regs = (struct gpio_regs *)dev_read_addr(dev); 575 576 platdata->bank_max[0] = dev_read_u32_default(dev, 577 "xlnx,gpio-width", 0); 578 platdata->bank_input[0] = dev_read_u32_default(dev, 579 "xlnx,all-inputs", 0); 580 platdata->bank_output[0] = dev_read_u32_default(dev, 581 "xlnx,all-outputs", 0); 582 583 is_dual = dev_read_u32_default(dev, "xlnx,is-dual", 0); 584 if (is_dual) { 585 platdata->bank_max[1] = dev_read_u32_default(dev, 586 "xlnx,gpio2-width", 0); 587 platdata->bank_input[1] = dev_read_u32_default(dev, 588 "xlnx,all-inputs-2", 0); 589 platdata->bank_output[1] = dev_read_u32_default(dev, 590 "xlnx,all-outputs-2", 0); 591 } 592 593 return 0; 594 } 595 596 static const struct udevice_id xilinx_gpio_ids[] = { 597 { .compatible = "xlnx,xps-gpio-1.00.a",}, 598 { } 599 }; 600 601 U_BOOT_DRIVER(xilinx_gpio) = { 602 .name = "xlnx_gpio", 603 .id = UCLASS_GPIO, 604 .ops = &xilinx_gpio_ops, 605 .of_match = xilinx_gpio_ids, 606 .ofdata_to_platdata = xilinx_gpio_ofdata_to_platdata, 607 .probe = xilinx_gpio_probe, 608 .platdata_auto_alloc_size = sizeof(struct xilinx_gpio_platdata), 609 }; 610 #endif 611