sbx81lifkw.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2010, 2018
  4. * Allied Telesis <www.alliedtelesis.com>
  5. */
  6. #include <common.h>
  7. #include <linux/io.h>
  8. #include <miiphy.h>
  9. #include <netdev.h>
  10. #include <asm/arch/cpu.h>
  11. #include <asm/arch/soc.h>
  12. #include <asm/arch/mpp.h>
  13. #include <asm/arch/gpio.h>
  14. /* Note: GPIO differences between specific boards
  15. *
  16. * We're trying to avoid having multiple build targets for all the Kirkwood
  17. * based boards one area where things tend to differ is GPIO usage. For the
  18. * most part the GPIOs driven by the bootloader are similar enough in function
  19. * that there is no harm in driving them.
  20. *
  21. * XZ4 XS6 XS16 GS24A GT40 GP24A GT24A
  22. * GPIO39 - INT(<) NC MUX_RST_N(>) NC POE_DIS_N(>) NC
  23. */
  24. #define SBX81LIFKW_OE_LOW ~(BIT(31) | BIT(30) | BIT(28) | BIT(27) | \
  25. BIT(18) | BIT(17) | BIT(13) | BIT(12) | \
  26. BIT(10))
  27. #define SBX81LIFKW_OE_HIGH ~(BIT(0) | BIT(1) | BIT(7))
  28. #define SBX81LIFKW_OE_VAL_LOW (BIT(31) | BIT(30) | BIT(28) | BIT(27))
  29. #define SBX81LIFKW_OE_VAL_HIGH (BIT(0) | BIT(1))
  30. #define MV88E6097_RESET 27
  31. DECLARE_GLOBAL_DATA_PTR;
  32. struct led {
  33. u32 reg;
  34. u32 value;
  35. u32 mask;
  36. };
  37. struct led amber_solid = {
  38. MVEBU_GPIO0_BASE,
  39. BIT(10),
  40. BIT(18) | BIT(10)
  41. };
  42. struct led green_solid = {
  43. MVEBU_GPIO0_BASE,
  44. BIT(18) | BIT(10),
  45. BIT(18) | BIT(10)
  46. };
  47. struct led amber_flash = {
  48. MVEBU_GPIO0_BASE,
  49. 0,
  50. BIT(18) | BIT(10)
  51. };
  52. struct led green_flash = {
  53. MVEBU_GPIO0_BASE,
  54. BIT(18),
  55. BIT(18) | BIT(10)
  56. };
  57. static void status_led_set(struct led *led)
  58. {
  59. clrsetbits_le32(led->reg, led->mask, led->value);
  60. }
  61. int board_early_init_f(void)
  62. {
  63. /*
  64. * default gpio configuration
  65. * There are maximum 64 gpios controlled through 2 sets of registers
  66. * the below configuration configures mainly initial LED status
  67. */
  68. mvebu_config_gpio(SBX81LIFKW_OE_VAL_LOW,
  69. SBX81LIFKW_OE_VAL_HIGH,
  70. SBX81LIFKW_OE_LOW, SBX81LIFKW_OE_HIGH);
  71. /* Multi-Purpose Pins Functionality configuration */
  72. static const u32 kwmpp_config[] = {
  73. MPP0_SPI_SCn,
  74. MPP1_SPI_MOSI,
  75. MPP2_SPI_SCK,
  76. MPP3_SPI_MISO,
  77. MPP4_UART0_RXD,
  78. MPP5_UART0_TXD,
  79. MPP6_SYSRST_OUTn,
  80. MPP7_PEX_RST_OUTn,
  81. MPP8_TW_SDA,
  82. MPP9_TW_SCK,
  83. MPP10_GPO,
  84. MPP11_GPIO,
  85. MPP12_GPO,
  86. MPP13_GPIO,
  87. MPP14_GPIO,
  88. MPP15_UART0_RTS,
  89. MPP16_UART0_CTS,
  90. MPP17_GPIO,
  91. MPP18_GPO,
  92. MPP19_GPO,
  93. MPP20_GPIO,
  94. MPP21_GPIO,
  95. MPP22_GPIO,
  96. MPP23_GPIO,
  97. MPP24_GPIO,
  98. MPP25_GPIO,
  99. MPP26_GPIO,
  100. MPP27_GPIO,
  101. MPP28_GPIO,
  102. MPP29_GPIO,
  103. MPP30_GPIO,
  104. MPP31_GPIO,
  105. MPP32_GPIO,
  106. MPP33_GPIO,
  107. MPP34_GPIO,
  108. MPP35_GPIO,
  109. MPP36_GPIO,
  110. MPP37_GPIO,
  111. MPP38_GPIO,
  112. MPP39_GPIO,
  113. MPP40_GPIO,
  114. MPP41_GPIO,
  115. MPP42_GPIO,
  116. MPP43_GPIO,
  117. MPP44_GPIO,
  118. MPP45_GPIO,
  119. MPP46_GPIO,
  120. MPP47_GPIO,
  121. MPP48_GPIO,
  122. MPP49_GPIO,
  123. 0
  124. };
  125. kirkwood_mpp_conf(kwmpp_config, NULL);
  126. return 0;
  127. }
  128. int board_init(void)
  129. {
  130. /* Power-down unused subsystems. The required
  131. * subsystems are:
  132. *
  133. * GE0 b0
  134. * PEX0 PHY b1
  135. * PEX0.0 b2
  136. * TSU b5
  137. * SDRAM b6
  138. * RUNIT b7
  139. */
  140. writel((BIT(0) | BIT(1) | BIT(2) |
  141. BIT(5) | BIT(6) | BIT(7)),
  142. KW_CPU_REG_BASE + 0x1c);
  143. /* address of boot parameters */
  144. gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
  145. status_led_set(&amber_solid);
  146. return 0;
  147. }
  148. #ifdef CONFIG_RESET_PHY_R
  149. /* automatically defined by kirkwood config.h */
  150. void reset_phy(void)
  151. {
  152. }
  153. #endif
  154. #ifdef CONFIG_MV88E61XX_SWITCH
  155. int mv88e61xx_hw_reset(struct phy_device *phydev)
  156. {
  157. /* Ensure the 88e6097 gets at least 10ms Reset
  158. */
  159. kw_gpio_set_value(MV88E6097_RESET, 0);
  160. mdelay(20);
  161. kw_gpio_set_value(MV88E6097_RESET, 1);
  162. mdelay(20);
  163. phydev->advertising = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full;
  164. return 0;
  165. }
  166. #endif
  167. #ifdef CONFIG_MISC_INIT_R
  168. int misc_init_r(void)
  169. {
  170. status_led_set(&green_flash);
  171. return 0;
  172. }
  173. #endif