sunxi_gpio.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * (C) Copyright 2012 Henrik Nordstrom <henrik@henriknordstrom.net>
  3. *
  4. * Based on earlier arch/arm/cpu/armv7/sunxi/gpio.c:
  5. *
  6. * (C) Copyright 2007-2011
  7. * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
  8. * Tom Cubie <tangliang@allwinnertech.com>
  9. *
  10. * SPDX-License-Identifier: GPL-2.0+
  11. */
  12. #include <common.h>
  13. #include <asm/io.h>
  14. #include <asm/gpio.h>
  15. static int sunxi_gpio_output(u32 pin, u32 val)
  16. {
  17. u32 dat;
  18. u32 bank = GPIO_BANK(pin);
  19. u32 num = GPIO_NUM(pin);
  20. struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
  21. dat = readl(&pio->dat);
  22. if (val)
  23. dat |= 0x1 << num;
  24. else
  25. dat &= ~(0x1 << num);
  26. writel(dat, &pio->dat);
  27. return 0;
  28. }
  29. static int sunxi_gpio_input(u32 pin)
  30. {
  31. u32 dat;
  32. u32 bank = GPIO_BANK(pin);
  33. u32 num = GPIO_NUM(pin);
  34. struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
  35. dat = readl(&pio->dat);
  36. dat >>= num;
  37. return dat & 0x1;
  38. }
  39. int gpio_request(unsigned gpio, const char *label)
  40. {
  41. return 0;
  42. }
  43. int gpio_free(unsigned gpio)
  44. {
  45. return 0;
  46. }
  47. int gpio_direction_input(unsigned gpio)
  48. {
  49. sunxi_gpio_set_cfgpin(gpio, SUNXI_GPIO_INPUT);
  50. return sunxi_gpio_input(gpio);
  51. }
  52. int gpio_direction_output(unsigned gpio, int value)
  53. {
  54. sunxi_gpio_set_cfgpin(gpio, SUNXI_GPIO_OUTPUT);
  55. return sunxi_gpio_output(gpio, value);
  56. }
  57. int gpio_get_value(unsigned gpio)
  58. {
  59. return sunxi_gpio_input(gpio);
  60. }
  61. int gpio_set_value(unsigned gpio, int value)
  62. {
  63. return sunxi_gpio_output(gpio, value);
  64. }
  65. int sunxi_name_to_gpio(const char *name)
  66. {
  67. int group = 0;
  68. int groupsize = 9 * 32;
  69. long pin;
  70. char *eptr;
  71. if (*name == 'P' || *name == 'p')
  72. name++;
  73. if (*name >= 'A') {
  74. group = *name - (*name > 'a' ? 'a' : 'A');
  75. groupsize = 32;
  76. name++;
  77. }
  78. pin = simple_strtol(name, &eptr, 10);
  79. if (!*name || *eptr)
  80. return -1;
  81. if (pin < 0 || pin > groupsize || group >= 9)
  82. return -1;
  83. return group * 32 + pin;
  84. }