mpc83xx_gpio.c 4.1 KB

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