mpc83xx_gpio.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Freescale MPC83xx GPIO handling.
  4. */
  5. #include <common.h>
  6. #include <malloc.h>
  7. #include <mpc83xx.h>
  8. #include <asm/gpio.h>
  9. #include <asm/io.h>
  10. #ifndef CONFIG_MPC83XX_GPIO_0_INIT_DIRECTION
  11. #define CONFIG_MPC83XX_GPIO_0_INIT_DIRECTION 0
  12. #endif
  13. #ifndef CONFIG_MPC83XX_GPIO_1_INIT_DIRECTION
  14. #define CONFIG_MPC83XX_GPIO_1_INIT_DIRECTION 0
  15. #endif
  16. #ifndef CONFIG_MPC83XX_GPIO_0_INIT_OPEN_DRAIN
  17. #define CONFIG_MPC83XX_GPIO_0_INIT_OPEN_DRAIN 0
  18. #endif
  19. #ifndef CONFIG_MPC83XX_GPIO_1_INIT_OPEN_DRAIN
  20. #define CONFIG_MPC83XX_GPIO_1_INIT_OPEN_DRAIN 0
  21. #endif
  22. #ifndef CONFIG_MPC83XX_GPIO_0_INIT_VALUE
  23. #define CONFIG_MPC83XX_GPIO_0_INIT_VALUE 0
  24. #endif
  25. #ifndef CONFIG_MPC83XX_GPIO_1_INIT_VALUE
  26. #define CONFIG_MPC83XX_GPIO_1_INIT_VALUE 0
  27. #endif
  28. static unsigned int gpio_output_value[MPC83XX_GPIO_CTRLRS];
  29. /*
  30. * Generic_GPIO primitives.
  31. */
  32. int gpio_request(unsigned gpio, const char *label)
  33. {
  34. if (gpio >= MAX_NUM_GPIOS)
  35. return -1;
  36. return 0;
  37. }
  38. int gpio_free(unsigned gpio)
  39. {
  40. /* Do not set to input */
  41. return 0;
  42. }
  43. /* set GPIO pin 'gpio' as an input */
  44. int gpio_direction_input(unsigned gpio)
  45. {
  46. immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
  47. unsigned int ctrlr;
  48. unsigned int line;
  49. unsigned int line_mask;
  50. /* 32-bits per controller */
  51. ctrlr = gpio >> 5;
  52. line = gpio & (0x1F);
  53. /* Big endian */
  54. line_mask = 1 << (31 - line);
  55. clrbits_be32(&im->gpio[ctrlr].dir, line_mask);
  56. return 0;
  57. }
  58. /* set GPIO pin 'gpio' as an output, with polarity 'value' */
  59. int gpio_direction_output(unsigned gpio, int value)
  60. {
  61. immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
  62. unsigned int ctrlr;
  63. unsigned int line;
  64. unsigned int line_mask;
  65. if (value != 0 && value != 1) {
  66. printf("Error: Value parameter must be 0 or 1.\n");
  67. return -1;
  68. }
  69. gpio_set_value(gpio, value);
  70. /* 32-bits per controller */
  71. ctrlr = gpio >> 5;
  72. line = gpio & (0x1F);
  73. /* Big endian */
  74. line_mask = 1 << (31 - line);
  75. /* Make the line output */
  76. setbits_be32(&im->gpio[ctrlr].dir, line_mask);
  77. return 0;
  78. }
  79. /* read GPIO IN value of pin 'gpio' */
  80. int gpio_get_value(unsigned gpio)
  81. {
  82. immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
  83. unsigned int ctrlr;
  84. unsigned int line;
  85. unsigned int line_mask;
  86. /* 32-bits per controller */
  87. ctrlr = gpio >> 5;
  88. line = gpio & (0x1F);
  89. /* Big endian */
  90. line_mask = 1 << (31 - line);
  91. /* Read the value and mask off the bit */
  92. return (in_be32(&im->gpio[ctrlr].dat) & line_mask) != 0;
  93. }
  94. /* write GPIO OUT value to pin 'gpio' */
  95. int gpio_set_value(unsigned gpio, int value)
  96. {
  97. immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
  98. unsigned int ctrlr;
  99. unsigned int line;
  100. unsigned int line_mask;
  101. if (value != 0 && value != 1) {
  102. printf("Error: Value parameter must be 0 or 1.\n");
  103. return -1;
  104. }
  105. /* 32-bits per controller */
  106. ctrlr = gpio >> 5;
  107. line = gpio & (0x1F);
  108. /* Big endian */
  109. line_mask = 1 << (31 - line);
  110. /* Update the local output buffer soft copy */
  111. gpio_output_value[ctrlr] =
  112. (gpio_output_value[ctrlr] & ~line_mask) | \
  113. (value ? line_mask : 0);
  114. /* Write the output */
  115. out_be32(&im->gpio[ctrlr].dat, gpio_output_value[ctrlr]);
  116. return 0;
  117. }
  118. /* Configure GPIO registers early */
  119. void mpc83xx_gpio_init_f(void)
  120. {
  121. immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
  122. #if MPC83XX_GPIO_CTRLRS >= 1
  123. out_be32(&im->gpio[0].dir, CONFIG_MPC83XX_GPIO_0_INIT_DIRECTION);
  124. out_be32(&im->gpio[0].odr, CONFIG_MPC83XX_GPIO_0_INIT_OPEN_DRAIN);
  125. out_be32(&im->gpio[0].dat, CONFIG_MPC83XX_GPIO_0_INIT_VALUE);
  126. out_be32(&im->gpio[0].ier, 0xFFFFFFFF); /* Clear all events */
  127. out_be32(&im->gpio[0].imr, 0);
  128. out_be32(&im->gpio[0].icr, 0);
  129. #endif
  130. #if MPC83XX_GPIO_CTRLRS >= 2
  131. out_be32(&im->gpio[1].dir, CONFIG_MPC83XX_GPIO_1_INIT_DIRECTION);
  132. out_be32(&im->gpio[1].odr, CONFIG_MPC83XX_GPIO_1_INIT_OPEN_DRAIN);
  133. out_be32(&im->gpio[1].dat, CONFIG_MPC83XX_GPIO_1_INIT_VALUE);
  134. out_be32(&im->gpio[1].ier, 0xFFFFFFFF); /* Clear all events */
  135. out_be32(&im->gpio[1].imr, 0);
  136. out_be32(&im->gpio[1].icr, 0);
  137. #endif
  138. }
  139. /* Initialize GPIO soft-copies */
  140. void mpc83xx_gpio_init_r(void)
  141. {
  142. #if MPC83XX_GPIO_CTRLRS >= 1
  143. gpio_output_value[0] = CONFIG_MPC83XX_GPIO_0_INIT_VALUE;
  144. #endif
  145. #if MPC83XX_GPIO_CTRLRS >= 2
  146. gpio_output_value[1] = CONFIG_MPC83XX_GPIO_1_INIT_VALUE;
  147. #endif
  148. }