ar71xx: introduce ar71xx_switch_data

SVN-Revision: 29549
This commit is contained in:
Gabor Juhos 2011-12-15 22:25:11 +00:00
parent bfe747b7d9
commit 9ae65588d8
5 changed files with 20 additions and 8 deletions

View File

@ -527,6 +527,8 @@ struct platform_device ar71xx_eth1_device = {
}, },
}; };
struct ag71xx_switch_platform_data ar71xx_switch_data;
#define AR71XX_PLL_VAL_1000 0x00110000 #define AR71XX_PLL_VAL_1000 0x00110000
#define AR71XX_PLL_VAL_100 0x00001099 #define AR71XX_PLL_VAL_100 0x00001099
#define AR71XX_PLL_VAL_10 0x00991099 #define AR71XX_PLL_VAL_10 0x00991099
@ -830,7 +832,7 @@ void __init ar71xx_add_device_eth(unsigned int id)
pdata->speed = SPEED_1000; pdata->speed = SPEED_1000;
pdata->duplex = DUPLEX_FULL; pdata->duplex = DUPLEX_FULL;
pdata->has_ar7240_switch = 1; pdata->switch_data = &ar71xx_switch_data;
} }
pdata->has_gbit = 1; pdata->has_gbit = 1;
pdata->is_ar724x = 1; pdata->is_ar724x = 1;
@ -885,7 +887,7 @@ void __init ar71xx_add_device_eth(unsigned int id)
pdata->speed = SPEED_1000; pdata->speed = SPEED_1000;
pdata->duplex = DUPLEX_FULL; pdata->duplex = DUPLEX_FULL;
pdata->has_ar7240_switch = 1; pdata->switch_data = &ar71xx_switch_data;
} }
pdata->has_gbit = 1; pdata->has_gbit = 1;

View File

@ -40,6 +40,8 @@ extern struct platform_device ar71xx_eth0_device;
extern struct platform_device ar71xx_eth1_device; extern struct platform_device ar71xx_eth1_device;
void ar71xx_add_device_eth(unsigned int id) __init; void ar71xx_add_device_eth(unsigned int id) __init;
extern struct ag71xx_switch_platform_data ar71xx_switch_data;
extern struct platform_device ar71xx_mdio0_device; extern struct platform_device ar71xx_mdio0_device;
extern struct platform_device ar71xx_mdio1_device; extern struct platform_device ar71xx_mdio1_device;
void ar71xx_add_device_mdio(unsigned int id, u32 phy_mask) __init; void ar71xx_add_device_mdio(unsigned int id, u32 phy_mask) __init;

View File

@ -17,6 +17,10 @@
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
struct ag71xx_switch_platform_data {
int dummy;
};
struct ag71xx_platform_data { struct ag71xx_platform_data {
phy_interface_t phy_if_mode; phy_interface_t phy_if_mode;
u32 phy_mask; u32 phy_mask;
@ -31,7 +35,8 @@ struct ag71xx_platform_data {
u8 is_ar7240:1; u8 is_ar7240:1;
u8 is_ar724x:1; u8 is_ar724x:1;
u8 has_ar8216:1; u8 has_ar8216:1;
u8 has_ar7240_switch:1;
struct ag71xx_switch_platform_data *switch_data;
void (*ddr_flush)(void); void (*ddr_flush)(void);
void (*set_speed)(int speed); void (*set_speed)(int speed);

View File

@ -198,6 +198,7 @@
struct ar7240sw { struct ar7240sw {
struct mii_bus *mii_bus; struct mii_bus *mii_bus;
struct ag71xx_switch_platform_data *swdata;
struct switch_dev swdev; struct switch_dev swdev;
int num_ports; int num_ports;
bool vlan; bool vlan;
@ -843,6 +844,7 @@ static const struct switch_dev_ops ar7240_ops = {
static struct ar7240sw *ar7240_probe(struct ag71xx *ag) static struct ar7240sw *ar7240_probe(struct ag71xx *ag)
{ {
struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
struct mii_bus *mii = ag->mii_bus; struct mii_bus *mii = ag->mii_bus;
struct ar7240sw *as; struct ar7240sw *as;
struct switch_dev *swdev; struct switch_dev *swdev;
@ -865,6 +867,7 @@ static struct ar7240sw *ar7240_probe(struct ag71xx *ag)
return NULL; return NULL;
as->mii_bus = mii; as->mii_bus = mii;
as->swdata = pdata->switch_data;
ctrl = ar7240sw_reg_read(mii, AR7240_REG_MASK_CTRL); ctrl = ar7240sw_reg_read(mii, AR7240_REG_MASK_CTRL);
ver = (ctrl >> AR7240_MASK_CTRL_VERSION_S) & AR7240_MASK_CTRL_VERSION_M; ver = (ctrl >> AR7240_MASK_CTRL_VERSION_S) & AR7240_MASK_CTRL_VERSION_M;

View File

@ -48,7 +48,7 @@ void ag71xx_phy_start(struct ag71xx *ag)
if (ag->phy_dev) { if (ag->phy_dev) {
phy_start(ag->phy_dev); phy_start(ag->phy_dev);
} else if (pdata->has_ar7240_switch) { } else if (pdata->switch_data) {
ag71xx_ar7240_start(ag); ag71xx_ar7240_start(ag);
} else { } else {
ag->link = 1; ag->link = 1;
@ -63,8 +63,8 @@ void ag71xx_phy_stop(struct ag71xx *ag)
if (ag->phy_dev) if (ag->phy_dev)
phy_stop(ag->phy_dev); phy_stop(ag->phy_dev);
else if (pdata->has_ar7240_switch) else if (pdata->switch_data)
ag71xx_ar7240_stop(ag); ag71xx_ar7240_stop(ag);
spin_lock_irqsave(&ag->lock, flags); spin_lock_irqsave(&ag->lock, flags);
if (ag->link) { if (ag->link) {
@ -216,7 +216,7 @@ int __devinit ag71xx_phy_connect(struct ag71xx *ag)
mutex_unlock(&ag->mii_bus->mdio_lock); mutex_unlock(&ag->mii_bus->mdio_lock);
} }
if (pdata->has_ar7240_switch) if (pdata->switch_data)
return ag71xx_ar7240_init(ag); return ag71xx_ar7240_init(ag);
if (pdata->phy_mask) if (pdata->phy_mask)
@ -229,7 +229,7 @@ void ag71xx_phy_disconnect(struct ag71xx *ag)
{ {
struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
if (pdata->has_ar7240_switch) if (pdata->switch_data)
ag71xx_ar7240_cleanup(ag); ag71xx_ar7240_cleanup(ag);
else if (ag->phy_dev) else if (ag->phy_dev)
phy_disconnect(ag->phy_dev); phy_disconnect(ag->phy_dev);