ramips: allow to specify port layout for the switch of the RT305x/RT3350
Based on a patch by Roman Yeryomin <roman@advem.lv> SVN-Revision: 27990
This commit is contained in:
parent
bb64fb2e58
commit
1ebcf03789
13 changed files with 62 additions and 13 deletions
|
@ -11,8 +11,15 @@
|
||||||
#ifndef _RT305X_ESW_PLATFORM_H
|
#ifndef _RT305X_ESW_PLATFORM_H
|
||||||
#define _RT305X_ESW_PLATFORM_H
|
#define _RT305X_ESW_PLATFORM_H
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RT305X_ESW_VLAN_CONFIG_NONE = 0,
|
||||||
|
RT305X_ESW_VLAN_CONFIG_LLLLW,
|
||||||
|
RT305X_ESW_VLAN_CONFIG_WLLLL,
|
||||||
|
};
|
||||||
|
|
||||||
struct rt305x_esw_platform_data
|
struct rt305x_esw_platform_data
|
||||||
{
|
{
|
||||||
|
u8 vlan_config;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _RT305X_ESW_PLATFORM_H */
|
#endif /* _RT305X_ESW_PLATFORM_H */
|
||||||
|
|
|
@ -110,6 +110,7 @@ static void __init dir_300b_init(void)
|
||||||
rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
||||||
|
|
||||||
rt305x_register_flash(0, &dir_300b_flash_data);
|
rt305x_register_flash(0, &dir_300b_flash_data);
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
ramips_register_gpio_leds(-1, ARRAY_SIZE(dir_300b_leds_gpio),
|
ramips_register_gpio_leds(-1, ARRAY_SIZE(dir_300b_leds_gpio),
|
||||||
dir_300b_leds_gpio);
|
dir_300b_leds_gpio);
|
||||||
|
|
|
@ -132,6 +132,7 @@ static void __init f5d8235v2_init(void)
|
||||||
rt305x_register_flash(0, &f5d8235v2_flash_data);
|
rt305x_register_flash(0, &f5d8235v2_flash_data);
|
||||||
ramips_register_gpio_leds(-1, ARRAY_SIZE(f5d8235v2_leds_gpio),
|
ramips_register_gpio_leds(-1, ARRAY_SIZE(f5d8235v2_leds_gpio),
|
||||||
f5d8235v2_leds_gpio);
|
f5d8235v2_leds_gpio);
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_NONE;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
platform_device_register(&f5d8235v2_switch);
|
platform_device_register(&f5d8235v2_switch);
|
||||||
rt305x_register_wifi();
|
rt305x_register_wifi();
|
||||||
|
|
|
@ -118,6 +118,7 @@ static void __init fonera20n_init(void)
|
||||||
ARRAY_SIZE(fonera20n_gpio_buttons),
|
ARRAY_SIZE(fonera20n_gpio_buttons),
|
||||||
fonera20n_gpio_buttons);
|
fonera20n_gpio_buttons);
|
||||||
|
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
rt305x_register_wifi();
|
rt305x_register_wifi();
|
||||||
rt305x_register_wdt();
|
rt305x_register_wdt();
|
||||||
|
|
|
@ -127,6 +127,7 @@ static void __init hw550_3g_init(void)
|
||||||
rt305x_gpio_init(HW550_3G_GPIO_MODE);
|
rt305x_gpio_init(HW550_3G_GPIO_MODE);
|
||||||
|
|
||||||
rt305x_register_flash(0, &hw550_3g_flash_data);
|
rt305x_register_flash(0, &hw550_3g_flash_data);
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
ramips_register_gpio_leds(-1, ARRAY_SIZE(hw550_3g_leds_gpio),
|
ramips_register_gpio_leds(-1, ARRAY_SIZE(hw550_3g_leds_gpio),
|
||||||
hw550_3g_leds_gpio);
|
hw550_3g_leds_gpio);
|
||||||
|
|
|
@ -127,6 +127,7 @@ static void __init mofi3500_3gn_init(void)
|
||||||
rt305x_gpio_init(MOFI3500_3GN_GPIO_MODE);
|
rt305x_gpio_init(MOFI3500_3GN_GPIO_MODE);
|
||||||
|
|
||||||
rt305x_register_flash(0, &mofi3500_3gn_flash_data);
|
rt305x_register_flash(0, &mofi3500_3gn_flash_data);
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
ramips_register_gpio_leds(-1, ARRAY_SIZE(mofi3500_3gn_leds_gpio),
|
ramips_register_gpio_leds(-1, ARRAY_SIZE(mofi3500_3gn_leds_gpio),
|
||||||
mofi3500_3gn_leds_gpio);
|
mofi3500_3gn_leds_gpio);
|
||||||
|
|
|
@ -129,6 +129,7 @@ static void __init nw718_init(void)
|
||||||
rt305x_gpio_init(RT305X_GPIO_MODE_I2C |
|
rt305x_gpio_init(RT305X_GPIO_MODE_I2C |
|
||||||
RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
||||||
|
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
ramips_register_gpio_leds(-1, ARRAY_SIZE(nw718_leds_gpio),
|
ramips_register_gpio_leds(-1, ARRAY_SIZE(nw718_leds_gpio),
|
||||||
nw718_leds_gpio);
|
nw718_leds_gpio);
|
||||||
|
|
|
@ -95,6 +95,7 @@ static void __init pwh2004_init(void)
|
||||||
ramips_register_gpio_buttons(-1, PWH2004_BUTTONS_POLL_INTERVAL,
|
ramips_register_gpio_buttons(-1, PWH2004_BUTTONS_POLL_INTERVAL,
|
||||||
ARRAY_SIZE(pwh2004_gpio_buttons),
|
ARRAY_SIZE(pwh2004_gpio_buttons),
|
||||||
pwh2004_gpio_buttons);
|
pwh2004_gpio_buttons);
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
rt305x_register_wifi();
|
rt305x_register_wifi();
|
||||||
rt305x_register_wdt();
|
rt305x_register_wdt();
|
||||||
|
|
|
@ -103,6 +103,7 @@ static void __init rt_g32b_init(void)
|
||||||
rt305x_register_spi(rt_g32b_spi_slave_info,
|
rt305x_register_spi(rt_g32b_spi_slave_info,
|
||||||
ARRAY_SIZE(rt_g32b_spi_slave_info));
|
ARRAY_SIZE(rt_g32b_spi_slave_info));
|
||||||
|
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
ramips_register_gpio_buttons(-1, RT_G32B_BUTTONS_POLL_INTERVAL,
|
ramips_register_gpio_buttons(-1, RT_G32B_BUTTONS_POLL_INTERVAL,
|
||||||
ARRAY_SIZE(rt_g32b_gpio_buttons),
|
ARRAY_SIZE(rt_g32b_gpio_buttons),
|
||||||
|
|
|
@ -104,6 +104,7 @@ static void __init v22rw_2x2_init(void)
|
||||||
rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
||||||
|
|
||||||
rt305x_register_flash(0, &v22rw_2x2_flash_data);
|
rt305x_register_flash(0, &v22rw_2x2_flash_data);
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
ramips_register_gpio_leds(-1, ARRAY_SIZE(v22rw_2x2_leds_gpio),
|
ramips_register_gpio_leds(-1, ARRAY_SIZE(v22rw_2x2_leds_gpio),
|
||||||
v22rw_2x2_leds_gpio);
|
v22rw_2x2_leds_gpio);
|
||||||
|
|
|
@ -60,6 +60,7 @@ static void __init wcr150gn_init(void)
|
||||||
{
|
{
|
||||||
rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
||||||
rt305x_register_flash(0, &wcr150gn_flash_data);
|
rt305x_register_flash(0, &wcr150gn_flash_data);
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
rt305x_register_wifi();
|
rt305x_register_wifi();
|
||||||
rt305x_register_wdt();
|
rt305x_register_wdt();
|
||||||
|
|
|
@ -130,6 +130,7 @@ static void __init whr_g300n_init(void)
|
||||||
rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
|
||||||
|
|
||||||
rt305x_register_flash(0, &whr_g300n_flash_data);
|
rt305x_register_flash(0, &whr_g300n_flash_data);
|
||||||
|
rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW;
|
||||||
rt305x_register_ethernet();
|
rt305x_register_ethernet();
|
||||||
ramips_register_gpio_leds(-1, ARRAY_SIZE(whr_g300n_leds_gpio),
|
ramips_register_gpio_leds(-1, ARRAY_SIZE(whr_g300n_leds_gpio),
|
||||||
whr_g300n_leds_gpio);
|
whr_g300n_leds_gpio);
|
||||||
|
|
|
@ -72,6 +72,9 @@
|
||||||
#define RT305X_ESW_PORTS_ALL \
|
#define RT305X_ESW_PORTS_ALL \
|
||||||
(RT305X_ESW_PORTS_NOCPU | RT305X_ESW_PORTS_CPU)
|
(RT305X_ESW_PORTS_NOCPU | RT305X_ESW_PORTS_CPU)
|
||||||
|
|
||||||
|
#define RT305X_ESW_NUM_VLANS 16
|
||||||
|
#define RT305X_ESW_NUM_PORTS 7
|
||||||
|
|
||||||
struct rt305x_esw {
|
struct rt305x_esw {
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
struct rt305x_esw_platform_data *pdata;
|
struct rt305x_esw_platform_data *pdata;
|
||||||
|
@ -221,8 +224,6 @@ rt305x_esw_hw_init(struct rt305x_esw *esw)
|
||||||
(RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISBC2CPU_S)),
|
(RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISBC2CPU_S)),
|
||||||
RT305X_ESW_REG_SOCPC);
|
RT305X_ESW_REG_SOCPC);
|
||||||
|
|
||||||
rt305x_esw_set_pvid(esw, RT305X_ESW_PORT4, 2);
|
|
||||||
rt305x_esw_set_pvid(esw, RT305X_ESW_PORT5, 1);
|
|
||||||
rt305x_esw_wr(esw, 0x3f502b28, RT305X_ESW_REG_FPA2);
|
rt305x_esw_wr(esw, 0x3f502b28, RT305X_ESW_REG_FPA2);
|
||||||
rt305x_esw_wr(esw, 0x00000000, RT305X_ESW_REG_FPA);
|
rt305x_esw_wr(esw, 0x00000000, RT305X_ESW_REG_FPA);
|
||||||
|
|
||||||
|
@ -252,17 +253,47 @@ rt305x_esw_hw_init(struct rt305x_esw *esw)
|
||||||
/* select local register */
|
/* select local register */
|
||||||
rt305x_mii_write(esw, 0, 31, 0x8000);
|
rt305x_mii_write(esw, 0, 31, 0x8000);
|
||||||
|
|
||||||
/* set default vlan */
|
for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) {
|
||||||
|
rt305x_esw_set_vlan_id(esw, i, 0);
|
||||||
|
rt305x_esw_set_vmsc(esw, i, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < RT305X_ESW_NUM_PORTS; i++)
|
||||||
|
rt305x_esw_set_pvid(esw, i, 1);
|
||||||
|
|
||||||
|
switch (esw->pdata->vlan_config) {
|
||||||
|
case RT305X_ESW_VLAN_CONFIG_NONE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RT305X_ESW_VLAN_CONFIG_LLLLW:
|
||||||
rt305x_esw_set_vlan_id(esw, 0, 1);
|
rt305x_esw_set_vlan_id(esw, 0, 1);
|
||||||
rt305x_esw_set_vlan_id(esw, 1, 2);
|
rt305x_esw_set_vlan_id(esw, 1, 2);
|
||||||
|
rt305x_esw_set_pvid(esw, RT305X_ESW_PORT4, 2);
|
||||||
|
|
||||||
rt305x_esw_set_vmsc(esw, 0,
|
rt305x_esw_set_vmsc(esw, 0,
|
||||||
(BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT1) |
|
BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT1) |
|
||||||
BIT(RT305X_ESW_PORT2) | BIT(RT305X_ESW_PORT3) |
|
BIT(RT305X_ESW_PORT2) | BIT(RT305X_ESW_PORT3) |
|
||||||
BIT(RT305X_ESW_PORT6)));
|
BIT(RT305X_ESW_PORT6));
|
||||||
rt305x_esw_set_vmsc(esw, 1,
|
rt305x_esw_set_vmsc(esw, 1,
|
||||||
(BIT(RT305X_ESW_PORT4) | BIT(RT305X_ESW_PORT6)));
|
BIT(RT305X_ESW_PORT4) | BIT(RT305X_ESW_PORT6));
|
||||||
rt305x_esw_set_vmsc(esw, 2, 0);
|
break;
|
||||||
rt305x_esw_set_vmsc(esw, 3, 0);
|
|
||||||
|
case RT305X_ESW_VLAN_CONFIG_WLLLL:
|
||||||
|
rt305x_esw_set_vlan_id(esw, 0, 1);
|
||||||
|
rt305x_esw_set_vlan_id(esw, 1, 2);
|
||||||
|
rt305x_esw_set_pvid(esw, RT305X_ESW_PORT0, 2);
|
||||||
|
|
||||||
|
rt305x_esw_set_vmsc(esw, 0,
|
||||||
|
BIT(RT305X_ESW_PORT1) | BIT(RT305X_ESW_PORT2) |
|
||||||
|
BIT(RT305X_ESW_PORT3) | BIT(RT305X_ESW_PORT4) |
|
||||||
|
BIT(RT305X_ESW_PORT6));
|
||||||
|
rt305x_esw_set_vmsc(esw, 1,
|
||||||
|
BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT6));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in a new issue