ar71xx: add v4.14 support
[openwrt/openwrt.git] / target / linux / ar71xx / files / arch / mips / ath79 / mach-rut9xx.c
1 /*
2 * Teltonika RUT900 series boards support
3 *
4 * Copyright (C) 2018 Piotr Dymacz <pepe2k@gmail.com>
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
11 #include <linux/gpio.h>
12 #include <linux/i2c.h>
13 #include <linux/i2c-algo-bit.h>
14 #include <linux/i2c-gpio.h>
15 #include <linux/platform_data/pca953x.h>
16 #include <linux/platform_device.h>
17
18 #include <asm/mach-ath79/ath79.h>
19 #include <asm/mach-ath79/ar71xx_regs.h>
20
21 #include "common.h"
22 #include "dev-eth.h"
23 #include "dev-gpio-buttons.h"
24 #include "dev-leds-gpio.h"
25 #include "dev-m25p80.h"
26 #include "dev-usb.h"
27 #include "dev-wmac.h"
28 #include "machtypes.h"
29
30 #define RUT9XX_GPIO_LED_LAN1 14
31 #define RUT9XX_GPIO_LED_LAN2 13
32 #define RUT9XX_GPIO_LED_LAN3 22
33 #define RUT9XX_GPIO_LED_WAN 1
34
35 #define RUT9XX_PCA9539_GPIO_BASE 32
36 #define RUT9XX_PCA9539_GPIO_SIGNAL1 (0 + RUT9XX_PCA9539_GPIO_BASE)
37 #define RUT9XX_PCA9539_GPIO_SIGNAL2 (1 + RUT9XX_PCA9539_GPIO_BASE)
38 #define RUT9XX_PCA9539_GPIO_SIGNAL3 (2 + RUT9XX_PCA9539_GPIO_BASE)
39 #define RUT9XX_PCA9539_GPIO_SIGNAL4 (3 + RUT9XX_PCA9539_GPIO_BASE)
40 #define RUT9XX_PCA9539_GPIO_SIGNAL5 (4 + RUT9XX_PCA9539_GPIO_BASE)
41 #define RUT9XX_PCA9539_GPIO_STATUS_R (5 + RUT9XX_PCA9539_GPIO_BASE)
42 #define RUT9XX_PCA9539_GPIO_STATUS_G (6 + RUT9XX_PCA9539_GPIO_BASE)
43
44 #define RUT9XX_GPIO_BTN_RESET 15
45
46 #define RUT9XX_GPIO_I2C_SCK 16
47 #define RUT9XX_GPIO_I2C_SDA 17
48
49 #define RUT9XX_GPIO_EXT_LNA0 2
50
51 #define RUT9XX_WMAC_CALDATA_OFFSET 0x1000
52
53 #define RUT9XX_KEYS_POLL_INTERVAL 20
54 #define RUT9XX_KEYS_DEBOUNCE_INTERVAL (3 * RUT9XX_KEYS_POLL_INTERVAL)
55
56 static struct gpio_led rut900_leds_gpio[] __initdata = {
57 {
58 .name = "rut900:green:lan1",
59 .gpio = RUT9XX_GPIO_LED_LAN1,
60 .active_low = 1,
61 }, {
62 .name = "rut900:green:lan2",
63 .gpio = RUT9XX_GPIO_LED_LAN2,
64 .active_low = 1,
65 }, {
66 .name = "rut900:green:lan3",
67 .gpio = RUT9XX_GPIO_LED_LAN3,
68 .active_low = 1,
69 }, {
70 .name = "rut900:green:signal1",
71 .gpio = RUT9XX_PCA9539_GPIO_SIGNAL1,
72 .active_low = 0,
73 }, {
74 .name = "rut900:green:signal2",
75 .gpio = RUT9XX_PCA9539_GPIO_SIGNAL2,
76 .active_low = 0,
77 }, {
78 .name = "rut900:green:signal3",
79 .gpio = RUT9XX_PCA9539_GPIO_SIGNAL3,
80 .active_low = 0,
81 }, {
82 .name = "rut900:green:signal4",
83 .gpio = RUT9XX_PCA9539_GPIO_SIGNAL4,
84 .active_low = 0,
85 }, {
86 .name = "rut900:green:signal5",
87 .gpio = RUT9XX_PCA9539_GPIO_SIGNAL5,
88 .active_low = 0,
89 }, {
90 .name = "rut900:green:status",
91 .gpio = RUT9XX_PCA9539_GPIO_STATUS_G,
92 .active_low = 0,
93 }, {
94 .name = "rut900:green:wan",
95 .gpio = RUT9XX_GPIO_LED_WAN,
96 .active_low = 1,
97 }, {
98 .name = "rut900:red:status",
99 .gpio = RUT9XX_PCA9539_GPIO_STATUS_R,
100 .active_low = 0,
101 },
102 };
103
104 static struct gpio_keys_button rut900_gpio_keys[] __initdata = {
105 {
106 .desc = "reset",
107 .type = EV_KEY,
108 .code = KEY_RESTART,
109 .debounce_interval = RUT9XX_KEYS_DEBOUNCE_INTERVAL,
110 .gpio = RUT9XX_GPIO_BTN_RESET,
111 .active_low = 1,
112 },
113 };
114
115 static struct i2c_gpio_platform_data rut900_i2c_gpio_data = {
116 .sda_pin = RUT9XX_GPIO_I2C_SDA,
117 .scl_pin = RUT9XX_GPIO_I2C_SCK,
118 .udelay = 10,
119 };
120
121 static struct platform_device rut900_i2c_device = {
122 .name = "i2c-gpio",
123 .id = 0,
124 .dev = {
125 .platform_data = &rut900_i2c_gpio_data,
126 },
127 };
128
129 static struct pca953x_platform_data rut9xx_pca9539_data = {
130 .gpio_base = RUT9XX_PCA9539_GPIO_BASE,
131 .irq_base = -1,
132 };
133
134 static struct i2c_board_info rut900_i2c_devs[] __initdata = {
135 {
136 I2C_BOARD_INFO("pca9539", 0x74),
137 .platform_data = &rut9xx_pca9539_data,
138 },
139 };
140
141 static void __init rut900_setup(void)
142 {
143 u8 *art = (u8 *) KSEG1ADDR(0x1f030000);
144 u8 *mac = (u8 *) KSEG1ADDR(0x1f020000);
145 u8 wlan_mac[ETH_ALEN];
146
147 ath79_register_m25p80(NULL);
148
149 ath79_register_mdio(1, 0x0);
150
151 ath79_switch_data.phy4_mii_en = 1;
152 ath79_switch_data.phy_poll_mask = 0xf1;
153
154 /* LAN */
155 ath79_eth1_data.duplex = DUPLEX_FULL;
156 ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
157 ath79_init_mac(ath79_eth1_data.mac_addr, mac, 0);
158 ath79_register_eth(1);
159
160 /* WAN */
161 ath79_eth0_data.duplex = DUPLEX_FULL;
162 ath79_eth0_data.mii_bus_dev = &ath79_mdio1_device.dev;
163 ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
164 ath79_eth0_data.phy_mask = BIT(4);
165 ath79_eth0_data.speed = SPEED_100;
166 ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1);
167 ath79_register_eth(0);
168
169 platform_device_register(&rut900_i2c_device);
170 i2c_register_board_info(0, rut900_i2c_devs,
171 ARRAY_SIZE(rut900_i2c_devs));
172
173 /* Disable JTAG (enables GPIO0-3) */
174 ath79_gpio_function_enable(AR934X_GPIO_FUNC_JTAG_DISABLE);
175
176 ath79_register_leds_gpio(-1, ARRAY_SIZE(rut900_leds_gpio),
177 rut900_leds_gpio);
178
179 ath79_register_gpio_keys_polled(-1, RUT9XX_KEYS_POLL_INTERVAL,
180 ARRAY_SIZE(rut900_gpio_keys),
181 rut900_gpio_keys);
182
183 ath79_wmac_set_ext_lna_gpio(0, RUT9XX_GPIO_EXT_LNA0);
184
185 ath79_init_mac(wlan_mac, mac, 2);
186 ath79_register_wmac(art + RUT9XX_WMAC_CALDATA_OFFSET, wlan_mac);
187
188 ath79_register_usb();
189 }
190
191 MIPS_MACHINE(ATH79_MACH_RUT9XX, "RUT900", "Teltonika RUT900", rut900_setup);