2 * Teltonika RUT900 series boards support
4 * Copyright (C) 2018 Piotr Dymacz <pepe2k@gmail.com>
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.
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>
18 #include <asm/mach-ath79/ath79.h>
19 #include <asm/mach-ath79/ar71xx_regs.h>
23 #include "dev-gpio-buttons.h"
24 #include "dev-leds-gpio.h"
25 #include "dev-m25p80.h"
28 #include "machtypes.h"
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
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)
44 #define RUT9XX_GPIO_BTN_RESET 15
46 #define RUT9XX_GPIO_I2C_SCK 16
47 #define RUT9XX_GPIO_I2C_SDA 17
49 #define RUT9XX_GPIO_EXT_LNA0 2
51 #define RUT9XX_WMAC_CALDATA_OFFSET 0x1000
53 #define RUT9XX_KEYS_POLL_INTERVAL 20
54 #define RUT9XX_KEYS_DEBOUNCE_INTERVAL (3 * RUT9XX_KEYS_POLL_INTERVAL)
56 static struct gpio_led rut900_leds_gpio
[] __initdata
= {
58 .name
= "rut900:green:lan1",
59 .gpio
= RUT9XX_GPIO_LED_LAN1
,
62 .name
= "rut900:green:lan2",
63 .gpio
= RUT9XX_GPIO_LED_LAN2
,
66 .name
= "rut900:green:lan3",
67 .gpio
= RUT9XX_GPIO_LED_LAN3
,
70 .name
= "rut900:green:signal1",
71 .gpio
= RUT9XX_PCA9539_GPIO_SIGNAL1
,
74 .name
= "rut900:green:signal2",
75 .gpio
= RUT9XX_PCA9539_GPIO_SIGNAL2
,
78 .name
= "rut900:green:signal3",
79 .gpio
= RUT9XX_PCA9539_GPIO_SIGNAL3
,
82 .name
= "rut900:green:signal4",
83 .gpio
= RUT9XX_PCA9539_GPIO_SIGNAL4
,
86 .name
= "rut900:green:signal5",
87 .gpio
= RUT9XX_PCA9539_GPIO_SIGNAL5
,
90 .name
= "rut900:green:status",
91 .gpio
= RUT9XX_PCA9539_GPIO_STATUS_G
,
94 .name
= "rut900:green:wan",
95 .gpio
= RUT9XX_GPIO_LED_WAN
,
98 .name
= "rut900:red:status",
99 .gpio
= RUT9XX_PCA9539_GPIO_STATUS_R
,
104 static struct gpio_keys_button rut900_gpio_keys
[] __initdata
= {
109 .debounce_interval
= RUT9XX_KEYS_DEBOUNCE_INTERVAL
,
110 .gpio
= RUT9XX_GPIO_BTN_RESET
,
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
,
121 static struct platform_device rut900_i2c_device
= {
125 .platform_data
= &rut900_i2c_gpio_data
,
129 static struct pca953x_platform_data rut9xx_pca9539_data
= {
130 .gpio_base
= RUT9XX_PCA9539_GPIO_BASE
,
134 static struct i2c_board_info rut900_i2c_devs
[] __initdata
= {
136 I2C_BOARD_INFO("pca9539", 0x74),
137 .platform_data
= &rut9xx_pca9539_data
,
141 static void __init
rut900_setup(void)
143 u8
*art
= (u8
*) KSEG1ADDR(0x1f030000);
144 u8
*mac
= (u8
*) KSEG1ADDR(0x1f020000);
145 u8 wlan_mac
[ETH_ALEN
];
147 ath79_register_m25p80(NULL
);
149 ath79_register_mdio(1, 0x0);
151 ath79_switch_data
.phy4_mii_en
= 1;
152 ath79_switch_data
.phy_poll_mask
= 0xf1;
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);
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);
169 platform_device_register(&rut900_i2c_device
);
170 i2c_register_board_info(0, rut900_i2c_devs
,
171 ARRAY_SIZE(rut900_i2c_devs
));
173 /* Disable JTAG (enables GPIO0-3) */
174 ath79_gpio_function_enable(AR934X_GPIO_FUNC_JTAG_DISABLE
);
176 ath79_register_leds_gpio(-1, ARRAY_SIZE(rut900_leds_gpio
),
179 ath79_register_gpio_keys_polled(-1, RUT9XX_KEYS_POLL_INTERVAL
,
180 ARRAY_SIZE(rut900_gpio_keys
),
183 ath79_wmac_set_ext_lna_gpio(0, RUT9XX_GPIO_EXT_LNA0
);
185 ath79_init_mac(wlan_mac
, mac
, 2);
186 ath79_register_wmac(art
+ RUT9XX_WMAC_CALDATA_OFFSET
, wlan_mac
);
188 ath79_register_usb();
191 MIPS_MACHINE(ATH79_MACH_RUT9XX
, "RUT900", "Teltonika RUT900", rut900_setup
);