mach-archer-c59-v1.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. /*
  2. * TP-Link Archer C58/C59 v1 board support
  3. *
  4. * Copyright (C) 2017 Henryk Heisig <[email protected]>
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License version 2 as published
  8. * by the Free Software Foundation.
  9. */
  10. #include <linux/platform_device.h>
  11. #include <linux/ath9k_platform.h>
  12. #include <linux/ar8216_platform.h>
  13. #include <asm/mach-ath79/ar71xx_regs.h>
  14. #include <linux/gpio.h>
  15. #include <linux/init.h>
  16. #include <linux/spi/spi_gpio.h>
  17. #include <linux/spi/74x164.h>
  18. #include "common.h"
  19. #include "dev-m25p80.h"
  20. #include "machtypes.h"
  21. #include "pci.h"
  22. #include "dev-ap9x-pci.h"
  23. #include "dev-eth.h"
  24. #include "dev-gpio-buttons.h"
  25. #include "dev-leds-gpio.h"
  26. #include "dev-spi.h"
  27. #include "dev-usb.h"
  28. #include "dev-wmac.h"
  29. #define ARCHER_C59_V1_KEYS_POLL_INTERVAL 20
  30. #define ARCHER_C59_V1_KEYS_DEBOUNCE_INTERVAL (3 * ARCHER_C59_V1_KEYS_POLL_INTERVAL)
  31. #define ARCHER_C59_V1_GPIO_BTN_RESET 21
  32. #define ARCHER_C59_V1_GPIO_BTN_RFKILL 2
  33. #define ARCHER_C59_V1_GPIO_BTN_WPS 1
  34. #define ARCHER_C59_V1_GPIO_USB_POWER 22
  35. #define ARCHER_C59_GPIO_SHIFT_OE 16
  36. #define ARCHER_C59_GPIO_SHIFT_SER 17
  37. #define ARCHER_C59_GPIO_SHIFT_SRCLK 18
  38. #define ARCHER_C59_GPIO_SHIFT_SRCLR 19
  39. #define ARCHER_C59_GPIO_SHIFT_RCLK 20
  40. #define ARCHER_C59_74HC_GPIO_BASE 32
  41. #define ARCHER_C59_74HC_GPIO_LED_POWER (ARCHER_C59_74HC_GPIO_BASE + 0)
  42. #define ARCHER_C59_74HC_GPIO_LED_WLAN2 (ARCHER_C59_74HC_GPIO_BASE + 1)
  43. #define ARCHER_C59_74HC_GPIO_LED_WLAN5 (ARCHER_C59_74HC_GPIO_BASE + 2)
  44. #define ARCHER_C59_74HC_GPIO_LED_LAN (ARCHER_C59_74HC_GPIO_BASE + 3)
  45. #define ARCHER_C59_74HC_GPIO_LED_WAN_GREEN (ARCHER_C59_74HC_GPIO_BASE + 4)
  46. #define ARCHER_C59_74HC_GPIO_LED_WAN_AMBER (ARCHER_C59_74HC_GPIO_BASE + 5)
  47. #define ARCHER_C59_74HC_GPIO_LED_WPS (ARCHER_C59_74HC_GPIO_BASE + 6)
  48. #define ARCHER_C59_74HC_GPIO_LED_USB (ARCHER_C59_74HC_GPIO_BASE + 7)
  49. #define ARCHER_C59_V1_SSR_BIT_0 0
  50. #define ARCHER_C59_V1_SSR_BIT_1 1
  51. #define ARCHER_C59_V1_SSR_BIT_2 2
  52. #define ARCHER_C59_V1_SSR_BIT_3 3
  53. #define ARCHER_C59_V1_SSR_BIT_4 4
  54. #define ARCHER_C59_V1_SSR_BIT_5 5
  55. #define ARCHER_C59_V1_SSR_BIT_6 6
  56. #define ARCHER_C59_V1_SSR_BIT_7 7
  57. #define ARCHER_C59_V1_WMAC_CALDATA_OFFSET 0x1000
  58. #define ARCHER_C59_V1_PCI_CALDATA_OFFSET 0x5000
  59. static struct gpio_led archer_c58_v1_leds_gpio[] __initdata = {
  60. {
  61. .name = "archer-c58-v1:green:power",
  62. .gpio = ARCHER_C59_74HC_GPIO_LED_POWER,
  63. .active_low = 1,
  64. },
  65. {
  66. .name = "archer-c58-v1:green:wlan2g",
  67. .gpio = ARCHER_C59_74HC_GPIO_LED_WLAN2,
  68. .active_low = 1,
  69. },
  70. {
  71. .name = "archer-c58-v1:green:wlan5g",
  72. .gpio = ARCHER_C59_74HC_GPIO_LED_WLAN5,
  73. .active_low = 1,
  74. },
  75. {
  76. .name = "archer-c58-v1:green:lan",
  77. .gpio = ARCHER_C59_74HC_GPIO_LED_LAN,
  78. .active_low = 1,
  79. },
  80. {
  81. .name = "archer-c58-v1:green:wan",
  82. .gpio = ARCHER_C59_74HC_GPIO_LED_WAN_GREEN,
  83. .active_low = 1,
  84. },
  85. {
  86. .name = "archer-c58-v1:amber:wan",
  87. .gpio = ARCHER_C59_74HC_GPIO_LED_WAN_AMBER,
  88. .active_low = 1,
  89. },
  90. {
  91. .name = "archer-c58-v1:green:wps",
  92. .gpio = ARCHER_C59_74HC_GPIO_LED_WPS,
  93. .active_low = 1,
  94. },
  95. };
  96. static struct gpio_led archer_c59_v1_leds_gpio[] __initdata = {
  97. {
  98. .name = "archer-c59-v1:green:power",
  99. .gpio = ARCHER_C59_74HC_GPIO_LED_POWER,
  100. .active_low = 1,
  101. },
  102. {
  103. .name = "archer-c59-v1:green:wlan2g",
  104. .gpio = ARCHER_C59_74HC_GPIO_LED_WLAN2,
  105. .active_low = 1,
  106. },
  107. {
  108. .name = "archer-c59-v1:green:wlan5g",
  109. .gpio = ARCHER_C59_74HC_GPIO_LED_WLAN5,
  110. .active_low = 1,
  111. },
  112. {
  113. .name = "archer-c59-v1:green:lan",
  114. .gpio = ARCHER_C59_74HC_GPIO_LED_LAN,
  115. .active_low = 1,
  116. },
  117. {
  118. .name = "archer-c59-v1:green:wan",
  119. .gpio = ARCHER_C59_74HC_GPIO_LED_WAN_GREEN,
  120. .active_low = 1,
  121. },
  122. {
  123. .name = "archer-c59-v1:amber:wan",
  124. .gpio = ARCHER_C59_74HC_GPIO_LED_WAN_AMBER,
  125. .active_low = 1,
  126. },
  127. {
  128. .name = "archer-c59-v1:green:wps",
  129. .gpio = ARCHER_C59_74HC_GPIO_LED_WPS,
  130. .active_low = 1,
  131. },
  132. {
  133. .name = "archer-c59-v1:green:usb",
  134. .gpio = ARCHER_C59_74HC_GPIO_LED_USB,
  135. .active_low = 1,
  136. },
  137. };
  138. static struct gpio_keys_button archer_c59_v1_gpio_keys[] __initdata = {
  139. {
  140. .desc = "Reset button",
  141. .type = EV_KEY,
  142. .code = KEY_RESTART,
  143. .debounce_interval = ARCHER_C59_V1_KEYS_DEBOUNCE_INTERVAL,
  144. .gpio = ARCHER_C59_V1_GPIO_BTN_RESET,
  145. .active_low = 1,
  146. },
  147. {
  148. .desc = "RFKILL button",
  149. .type = EV_KEY,
  150. .code = KEY_RFKILL,
  151. .debounce_interval = ARCHER_C59_V1_KEYS_DEBOUNCE_INTERVAL,
  152. .gpio = ARCHER_C59_V1_GPIO_BTN_RFKILL,
  153. .active_low = 1,
  154. },
  155. {
  156. .desc = "WPS button",
  157. .type = EV_KEY,
  158. .code = KEY_WPS_BUTTON,
  159. .debounce_interval = ARCHER_C59_V1_KEYS_DEBOUNCE_INTERVAL,
  160. .gpio = ARCHER_C59_V1_GPIO_BTN_WPS,
  161. .active_low = 1,
  162. },
  163. };
  164. static struct spi_gpio_platform_data archer_c59_v1_spi_data = {
  165. .sck = ARCHER_C59_GPIO_SHIFT_SRCLK,
  166. .miso = SPI_GPIO_NO_MISO,
  167. .mosi = ARCHER_C59_GPIO_SHIFT_SER,
  168. .num_chipselect = 1,
  169. };
  170. static u8 archer_c59_v1_ssr_initdata[] = {
  171. BIT(ARCHER_C59_V1_SSR_BIT_7) |
  172. BIT(ARCHER_C59_V1_SSR_BIT_6) |
  173. BIT(ARCHER_C59_V1_SSR_BIT_5) |
  174. BIT(ARCHER_C59_V1_SSR_BIT_4) |
  175. BIT(ARCHER_C59_V1_SSR_BIT_3) |
  176. BIT(ARCHER_C59_V1_SSR_BIT_2) |
  177. BIT(ARCHER_C59_V1_SSR_BIT_1)
  178. };
  179. static struct gen_74x164_chip_platform_data archer_c59_v1_ssr_data = {
  180. .base = ARCHER_C59_74HC_GPIO_BASE,
  181. .num_registers = ARRAY_SIZE(archer_c59_v1_ssr_initdata),
  182. .init_data = archer_c59_v1_ssr_initdata,
  183. };
  184. static struct platform_device archer_c59_v1_spi_device = {
  185. .name = "spi_gpio",
  186. .id = 1,
  187. .dev = {
  188. .platform_data = &archer_c59_v1_spi_data,
  189. },
  190. };
  191. static struct spi_board_info archer_c59_v1_spi_info[] = {
  192. {
  193. .bus_num = 1,
  194. .chip_select = 0,
  195. .max_speed_hz = 10000000,
  196. .modalias = "74x164",
  197. .platform_data = &archer_c59_v1_ssr_data,
  198. .controller_data = (void *) ARCHER_C59_GPIO_SHIFT_RCLK,
  199. },
  200. };
  201. static void __init archer_c5x_v1_setup(void)
  202. {
  203. u8 *mac = (u8 *) KSEG1ADDR(0x1f010008);
  204. u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
  205. ath79_register_m25p80(NULL);
  206. spi_register_board_info(archer_c59_v1_spi_info,
  207. ARRAY_SIZE(archer_c59_v1_spi_info));
  208. platform_device_register(&archer_c59_v1_spi_device);
  209. ath79_register_gpio_keys_polled(-1, ARCHER_C59_V1_KEYS_POLL_INTERVAL,
  210. ARRAY_SIZE(archer_c59_v1_gpio_keys),
  211. archer_c59_v1_gpio_keys);
  212. ath79_setup_qca956x_eth_cfg(QCA956X_ETH_CFG_SW_PHY_SWAP |
  213. QCA956X_ETH_CFG_SW_PHY_ADDR_SWAP);
  214. ath79_register_mdio(0, 0x0);
  215. ath79_register_mdio(1, 0x0);
  216. ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1);
  217. ath79_init_mac(ath79_eth1_data.mac_addr, mac, 0);
  218. /* WAN port */
  219. ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
  220. ath79_eth0_data.speed = SPEED_100;
  221. ath79_eth0_data.duplex = DUPLEX_FULL;
  222. ath79_eth0_data.phy_mask = BIT(0);
  223. ath79_register_eth(0);
  224. /* LAN ports */
  225. ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
  226. ath79_eth1_data.speed = SPEED_1000;
  227. ath79_eth1_data.duplex = DUPLEX_FULL;
  228. ath79_switch_data.phy_poll_mask |= BIT(0);
  229. ath79_switch_data.phy4_mii_en = 1;
  230. ath79_register_eth(1);
  231. ath79_register_wmac(art + ARCHER_C59_V1_WMAC_CALDATA_OFFSET, mac);
  232. ap91_pci_init(art + ARCHER_C59_V1_PCI_CALDATA_OFFSET, NULL);
  233. ath79_register_usb();
  234. gpio_request_one(ARCHER_C59_V1_GPIO_USB_POWER,
  235. GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
  236. "USB power");
  237. gpio_request_one(ARCHER_C59_GPIO_SHIFT_OE,
  238. GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED,
  239. "LED control");
  240. gpio_request_one(ARCHER_C59_GPIO_SHIFT_SRCLR,
  241. GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
  242. "LED reset");
  243. }
  244. static void __init archer_c58_v1_setup(void)
  245. {
  246. archer_c5x_v1_setup();
  247. ath79_register_leds_gpio(-1, ARRAY_SIZE(archer_c58_v1_leds_gpio),
  248. archer_c58_v1_leds_gpio);
  249. }
  250. MIPS_MACHINE(ATH79_MACH_ARCHER_C58_V1, "ARCHER-C58-V1",
  251. "TP-LINK Archer C58 v1", archer_c58_v1_setup);
  252. static void __init archer_c59_v1_setup(void)
  253. {
  254. archer_c5x_v1_setup();
  255. ath79_register_leds_gpio(-1, ARRAY_SIZE(archer_c59_v1_leds_gpio),
  256. archer_c59_v1_leds_gpio);
  257. }
  258. MIPS_MACHINE(ATH79_MACH_ARCHER_C59_V1, "ARCHER-C59-V1",
  259. "TP-LINK Archer C59 v1", archer_c59_v1_setup);