Commit ae19161e authored by Jeff Garzik's avatar Jeff Garzik Committed by Jeff Garzik

Merge branch 'for-2.6.28' of git://git.marvell.com/mv643xx_eth into upstream-next

parents 152cbcf9 042af53c
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include "common.h" #include "common.h"
static struct mv643xx_eth_platform_data db88f6281_ge00_data = { static struct mv643xx_eth_platform_data db88f6281_ge00_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
static struct mv_sata_platform_data db88f6281_sata_data = { static struct mv_sata_platform_data db88f6281_sata_data = {
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#define RD88F6192_GPIO_USB_VBUS 10 #define RD88F6192_GPIO_USB_VBUS 10
static struct mv643xx_eth_platform_data rd88f6192_ge00_data = { static struct mv643xx_eth_platform_data rd88f6192_ge00_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
static struct mv_sata_platform_data rd88f6192_sata_data = { static struct mv_sata_platform_data rd88f6192_sata_data = {
......
...@@ -69,7 +69,7 @@ static struct platform_device rd88f6281_nand_flash = { ...@@ -69,7 +69,7 @@ static struct platform_device rd88f6281_nand_flash = {
}; };
static struct mv643xx_eth_platform_data rd88f6281_ge00_data = { static struct mv643xx_eth_platform_data rd88f6281_ge00_data = {
.phy_addr = -1, .phy_addr = MV643XX_ETH_PHY_NONE,
.speed = SPEED_1000, .speed = SPEED_1000,
.duplex = DUPLEX_FULL, .duplex = DUPLEX_FULL,
}; };
......
...@@ -67,7 +67,7 @@ static struct platform_device lb88rc8480_boot_flash = { ...@@ -67,7 +67,7 @@ static struct platform_device lb88rc8480_boot_flash = {
}; };
static struct mv643xx_eth_platform_data lb88rc8480_ge0_data = { static struct mv643xx_eth_platform_data lb88rc8480_ge0_data = {
.phy_addr = 1, .phy_addr = MV643XX_ETH_PHY_ADDR(1),
.mac_addr = { 0x00, 0x50, 0x43, 0x11, 0x22, 0x33 }, .mac_addr = { 0x00, 0x50, 0x43, 0x11, 0x22, 0x33 },
}; };
......
...@@ -330,6 +330,7 @@ void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data) ...@@ -330,6 +330,7 @@ void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data)
struct mv643xx_eth_shared_platform_data mv78xx0_ge01_shared_data = { struct mv643xx_eth_shared_platform_data mv78xx0_ge01_shared_data = {
.t_clk = 0, .t_clk = 0,
.dram = &mv78xx0_mbus_dram_info, .dram = &mv78xx0_mbus_dram_info,
.shared_smi = &mv78xx0_ge00_shared,
}; };
static struct resource mv78xx0_ge01_shared_resources[] = { static struct resource mv78xx0_ge01_shared_resources[] = {
...@@ -370,7 +371,6 @@ static struct platform_device mv78xx0_ge01 = { ...@@ -370,7 +371,6 @@ static struct platform_device mv78xx0_ge01 = {
void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data) void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data)
{ {
eth_data->shared = &mv78xx0_ge01_shared; eth_data->shared = &mv78xx0_ge01_shared;
eth_data->shared_smi = &mv78xx0_ge00_shared;
mv78xx0_ge01.dev.platform_data = eth_data; mv78xx0_ge01.dev.platform_data = eth_data;
platform_device_register(&mv78xx0_ge01_shared); platform_device_register(&mv78xx0_ge01_shared);
...@@ -384,6 +384,7 @@ void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data) ...@@ -384,6 +384,7 @@ void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data)
struct mv643xx_eth_shared_platform_data mv78xx0_ge10_shared_data = { struct mv643xx_eth_shared_platform_data mv78xx0_ge10_shared_data = {
.t_clk = 0, .t_clk = 0,
.dram = &mv78xx0_mbus_dram_info, .dram = &mv78xx0_mbus_dram_info,
.shared_smi = &mv78xx0_ge00_shared,
}; };
static struct resource mv78xx0_ge10_shared_resources[] = { static struct resource mv78xx0_ge10_shared_resources[] = {
...@@ -424,7 +425,6 @@ static struct platform_device mv78xx0_ge10 = { ...@@ -424,7 +425,6 @@ static struct platform_device mv78xx0_ge10 = {
void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data) void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data)
{ {
eth_data->shared = &mv78xx0_ge10_shared; eth_data->shared = &mv78xx0_ge10_shared;
eth_data->shared_smi = &mv78xx0_ge00_shared;
mv78xx0_ge10.dev.platform_data = eth_data; mv78xx0_ge10.dev.platform_data = eth_data;
platform_device_register(&mv78xx0_ge10_shared); platform_device_register(&mv78xx0_ge10_shared);
...@@ -438,6 +438,7 @@ void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data) ...@@ -438,6 +438,7 @@ void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data)
struct mv643xx_eth_shared_platform_data mv78xx0_ge11_shared_data = { struct mv643xx_eth_shared_platform_data mv78xx0_ge11_shared_data = {
.t_clk = 0, .t_clk = 0,
.dram = &mv78xx0_mbus_dram_info, .dram = &mv78xx0_mbus_dram_info,
.shared_smi = &mv78xx0_ge00_shared,
}; };
static struct resource mv78xx0_ge11_shared_resources[] = { static struct resource mv78xx0_ge11_shared_resources[] = {
...@@ -478,7 +479,6 @@ static struct platform_device mv78xx0_ge11 = { ...@@ -478,7 +479,6 @@ static struct platform_device mv78xx0_ge11 = {
void __init mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data) void __init mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data)
{ {
eth_data->shared = &mv78xx0_ge11_shared; eth_data->shared = &mv78xx0_ge11_shared;
eth_data->shared_smi = &mv78xx0_ge00_shared;
mv78xx0_ge11.dev.platform_data = eth_data; mv78xx0_ge11.dev.platform_data = eth_data;
platform_device_register(&mv78xx0_ge11_shared); platform_device_register(&mv78xx0_ge11_shared);
......
...@@ -19,19 +19,19 @@ ...@@ -19,19 +19,19 @@
#include "common.h" #include "common.h"
static struct mv643xx_eth_platform_data db78x00_ge00_data = { static struct mv643xx_eth_platform_data db78x00_ge00_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
static struct mv643xx_eth_platform_data db78x00_ge01_data = { static struct mv643xx_eth_platform_data db78x00_ge01_data = {
.phy_addr = 9, .phy_addr = MV643XX_ETH_PHY_ADDR(9),
}; };
static struct mv643xx_eth_platform_data db78x00_ge10_data = { static struct mv643xx_eth_platform_data db78x00_ge10_data = {
.phy_addr = -1, .phy_addr = MV643XX_ETH_PHY_NONE,
}; };
static struct mv643xx_eth_platform_data db78x00_ge11_data = { static struct mv643xx_eth_platform_data db78x00_ge11_data = {
.phy_addr = -1, .phy_addr = MV643XX_ETH_PHY_NONE,
}; };
static struct mv_sata_platform_data db78x00_sata_data = { static struct mv_sata_platform_data db78x00_sata_data = {
......
...@@ -285,7 +285,7 @@ subsys_initcall(db88f5281_pci_init); ...@@ -285,7 +285,7 @@ subsys_initcall(db88f5281_pci_init);
* Ethernet * Ethernet
****************************************************************************/ ****************************************************************************/
static struct mv643xx_eth_platform_data db88f5281_eth_data = { static struct mv643xx_eth_platform_data db88f5281_eth_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
/***************************************************************************** /*****************************************************************************
......
...@@ -79,7 +79,7 @@ subsys_initcall(dns323_pci_init); ...@@ -79,7 +79,7 @@ subsys_initcall(dns323_pci_init);
*/ */
static struct mv643xx_eth_platform_data dns323_eth_data = { static struct mv643xx_eth_platform_data dns323_eth_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
/**************************************************************************** /****************************************************************************
......
...@@ -161,7 +161,7 @@ subsys_initcall(kurobox_pro_pci_init); ...@@ -161,7 +161,7 @@ subsys_initcall(kurobox_pro_pci_init);
****************************************************************************/ ****************************************************************************/
static struct mv643xx_eth_platform_data kurobox_pro_eth_data = { static struct mv643xx_eth_platform_data kurobox_pro_eth_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
/***************************************************************************** /*****************************************************************************
......
...@@ -109,7 +109,7 @@ subsys_initcall(mss2_pci_init); ...@@ -109,7 +109,7 @@ subsys_initcall(mss2_pci_init);
****************************************************************************/ ****************************************************************************/
static struct mv643xx_eth_platform_data mss2_eth_data = { static struct mv643xx_eth_platform_data mss2_eth_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
/***************************************************************************** /*****************************************************************************
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
* Ethernet * Ethernet
****************************************************************************/ ****************************************************************************/
static struct mv643xx_eth_platform_data mv2120_eth_data = { static struct mv643xx_eth_platform_data mv2120_eth_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
static struct mv_sata_platform_data mv2120_sata_data = { static struct mv_sata_platform_data mv2120_sata_data = {
......
...@@ -88,7 +88,7 @@ static struct orion5x_mpp_mode rd88f5181l_fxo_mpp_modes[] __initdata = { ...@@ -88,7 +88,7 @@ static struct orion5x_mpp_mode rd88f5181l_fxo_mpp_modes[] __initdata = {
}; };
static struct mv643xx_eth_platform_data rd88f5181l_fxo_eth_data = { static struct mv643xx_eth_platform_data rd88f5181l_fxo_eth_data = {
.phy_addr = -1, .phy_addr = MV643XX_ETH_PHY_NONE,
.speed = SPEED_1000, .speed = SPEED_1000,
.duplex = DUPLEX_FULL, .duplex = DUPLEX_FULL,
}; };
......
...@@ -89,7 +89,7 @@ static struct orion5x_mpp_mode rd88f5181l_ge_mpp_modes[] __initdata = { ...@@ -89,7 +89,7 @@ static struct orion5x_mpp_mode rd88f5181l_ge_mpp_modes[] __initdata = {
}; };
static struct mv643xx_eth_platform_data rd88f5181l_ge_eth_data = { static struct mv643xx_eth_platform_data rd88f5181l_ge_eth_data = {
.phy_addr = -1, .phy_addr = MV643XX_ETH_PHY_NONE,
.speed = SPEED_1000, .speed = SPEED_1000,
.duplex = DUPLEX_FULL, .duplex = DUPLEX_FULL,
}; };
......
...@@ -221,7 +221,7 @@ subsys_initcall(rd88f5182_pci_init); ...@@ -221,7 +221,7 @@ subsys_initcall(rd88f5182_pci_init);
****************************************************************************/ ****************************************************************************/
static struct mv643xx_eth_platform_data rd88f5182_eth_data = { static struct mv643xx_eth_platform_data rd88f5182_eth_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
/***************************************************************************** /*****************************************************************************
......
...@@ -103,8 +103,7 @@ static struct platform_device ts78xx_nor_boot_flash = { ...@@ -103,8 +103,7 @@ static struct platform_device ts78xx_nor_boot_flash = {
* Ethernet * Ethernet
****************************************************************************/ ****************************************************************************/
static struct mv643xx_eth_platform_data ts78xx_eth_data = { static struct mv643xx_eth_platform_data ts78xx_eth_data = {
.phy_addr = 0, .phy_addr = MV643XX_ETH_PHY_ADDR(0),
.force_phy_addr = 1,
}; };
/***************************************************************************** /*****************************************************************************
......
...@@ -48,7 +48,7 @@ void qnap_tsx09_power_off(void) ...@@ -48,7 +48,7 @@ void qnap_tsx09_power_off(void)
****************************************************************************/ ****************************************************************************/
struct mv643xx_eth_platform_data qnap_tsx09_eth_data = { struct mv643xx_eth_platform_data qnap_tsx09_eth_data = {
.phy_addr = 8, .phy_addr = MV643XX_ETH_PHY_ADDR(8),
}; };
static int __init qnap_tsx09_parse_hex_nibble(char n) static int __init qnap_tsx09_parse_hex_nibble(char n)
......
...@@ -92,7 +92,7 @@ static struct platform_device wnr854t_nor_flash = { ...@@ -92,7 +92,7 @@ static struct platform_device wnr854t_nor_flash = {
}; };
static struct mv643xx_eth_platform_data wnr854t_eth_data = { static struct mv643xx_eth_platform_data wnr854t_eth_data = {
.phy_addr = -1, .phy_addr = MV643XX_ETH_PHY_NONE,
.speed = SPEED_1000, .speed = SPEED_1000,
.duplex = DUPLEX_FULL, .duplex = DUPLEX_FULL,
}; };
......
...@@ -100,7 +100,7 @@ static struct platform_device wrt350n_v2_nor_flash = { ...@@ -100,7 +100,7 @@ static struct platform_device wrt350n_v2_nor_flash = {
}; };
static struct mv643xx_eth_platform_data wrt350n_v2_eth_data = { static struct mv643xx_eth_platform_data wrt350n_v2_eth_data = {
.phy_addr = -1, .phy_addr = MV643XX_ETH_PHY_NONE,
.speed = SPEED_1000, .speed = SPEED_1000,
.duplex = DUPLEX_FULL, .duplex = DUPLEX_FULL,
}; };
......
...@@ -293,10 +293,8 @@ static int __init mv64x60_eth_device_setup(struct device_node *np, int id, ...@@ -293,10 +293,8 @@ static int __init mv64x60_eth_device_setup(struct device_node *np, int id,
return -ENODEV; return -ENODEV;
prop = of_get_property(phy, "reg", NULL); prop = of_get_property(phy, "reg", NULL);
if (prop) { if (prop)
pdata.force_phy_addr = 1; pdata.phy_addr = MV643XX_ETH_PHY_ADDR(*prop);
pdata.phy_addr = *prop;
}
of_node_put(phy); of_node_put(phy);
......
...@@ -2274,7 +2274,7 @@ config UGETH_TX_ON_DEMAND ...@@ -2274,7 +2274,7 @@ config UGETH_TX_ON_DEMAND
config MV643XX_ETH config MV643XX_ETH
tristate "Marvell Discovery (643XX) and Orion ethernet support" tristate "Marvell Discovery (643XX) and Orion ethernet support"
depends on MV64360 || MV64X60 || (PPC_MULTIPLATFORM && PPC32) || PLAT_ORION depends on MV64360 || MV64X60 || (PPC_MULTIPLATFORM && PPC32) || PLAT_ORION
select MII select PHYLIB
help help
This driver supports the gigabit ethernet MACs in the This driver supports the gigabit ethernet MACs in the
Marvell Discovery PPC/MIPS chipset family (MV643XX) and Marvell Discovery PPC/MIPS chipset family (MV643XX) and
......
This diff is collapsed.
...@@ -60,17 +60,41 @@ int mdiobus_register(struct mii_bus *bus) ...@@ -60,17 +60,41 @@ int mdiobus_register(struct mii_bus *bus)
bus->reset(bus); bus->reset(bus);
for (i = 0; i < PHY_MAX_ADDR; i++) { for (i = 0; i < PHY_MAX_ADDR; i++) {
bus->phy_map[i] = NULL;
if ((bus->phy_mask & (1 << i)) == 0) {
struct phy_device *phydev; struct phy_device *phydev;
if (bus->phy_mask & (1 << i)) { phydev = mdiobus_scan(bus, i);
bus->phy_map[i] = NULL; if (IS_ERR(phydev))
continue; err = PTR_ERR(phydev);
}
} }
phydev = get_phy_device(bus, i); pr_info("%s: probed\n", bus->name);
if (IS_ERR(phydev)) return err;
return PTR_ERR(phydev); }
EXPORT_SYMBOL(mdiobus_register);
void mdiobus_unregister(struct mii_bus *bus)
{
int i;
for (i = 0; i < PHY_MAX_ADDR; i++) {
if (bus->phy_map[i])
device_unregister(&bus->phy_map[i]->dev);
}
}
EXPORT_SYMBOL(mdiobus_unregister);
struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
{
struct phy_device *phydev;
int err;
phydev = get_phy_device(bus, addr);
if (IS_ERR(phydev) || phydev == NULL)
return phydev;
/* There's a PHY at this address /* There's a PHY at this address
* We need to set: * We need to set:
...@@ -80,12 +104,12 @@ int mdiobus_register(struct mii_bus *bus) ...@@ -80,12 +104,12 @@ int mdiobus_register(struct mii_bus *bus)
* 4) bus * 4) bus
* 5) mii_bus * 5) mii_bus
* And, we need to register it */ * And, we need to register it */
if (phydev) {
phydev->irq = bus->irq[i]; phydev->irq = bus->irq != NULL ? bus->irq[addr] : PHY_POLL;
phydev->dev.parent = bus->dev; phydev->dev.parent = bus->dev;
phydev->dev.bus = &mdio_bus_type; phydev->dev.bus = &mdio_bus_type;
snprintf(phydev->dev.bus_id, BUS_ID_SIZE, PHY_ID_FMT, bus->id, i); snprintf(phydev->dev.bus_id, BUS_ID_SIZE, PHY_ID_FMT, bus->id, addr);
phydev->bus = bus; phydev->bus = bus;
...@@ -93,34 +117,17 @@ int mdiobus_register(struct mii_bus *bus) ...@@ -93,34 +117,17 @@ int mdiobus_register(struct mii_bus *bus)
phy_scan_fixups(phydev); phy_scan_fixups(phydev);
err = device_register(&phydev->dev); err = device_register(&phydev->dev);
if (err) { if (err) {
printk(KERN_ERR "phy %d failed to register\n", printk(KERN_ERR "phy %d failed to register\n", addr);
i);
phy_device_free(phydev); phy_device_free(phydev);
phydev = NULL; phydev = NULL;
} }
}
bus->phy_map[i] = phydev; bus->phy_map[addr] = phydev;
}
pr_info("%s: probed\n", bus->name); return phydev;
return err;
} }
EXPORT_SYMBOL(mdiobus_register); EXPORT_SYMBOL(mdiobus_scan);
void mdiobus_unregister(struct mii_bus *bus)
{
int i;
for (i = 0; i < PHY_MAX_ADDR; i++) {
if (bus->phy_map[i])
device_unregister(&bus->phy_map[i]->dev);
}
}
EXPORT_SYMBOL(mdiobus_unregister);
/** /**
* mdio_bus_match - determine if given PHY driver supports the given PHY device * mdio_bus_match - determine if given PHY driver supports the given PHY device
......
...@@ -17,9 +17,14 @@ ...@@ -17,9 +17,14 @@
struct mv643xx_eth_shared_platform_data { struct mv643xx_eth_shared_platform_data {
struct mbus_dram_target_info *dram; struct mbus_dram_target_info *dram;
struct platform_device *shared_smi;
unsigned int t_clk; unsigned int t_clk;
}; };
#define MV643XX_ETH_PHY_ADDR_DEFAULT 0
#define MV643XX_ETH_PHY_ADDR(x) (0x80 | (x))
#define MV643XX_ETH_PHY_NONE 0xff
struct mv643xx_eth_platform_data { struct mv643xx_eth_platform_data {
/* /*
* Pointer back to our parent instance, and our port number. * Pointer back to our parent instance, and our port number.
...@@ -30,8 +35,6 @@ struct mv643xx_eth_platform_data { ...@@ -30,8 +35,6 @@ struct mv643xx_eth_platform_data {
/* /*
* Whether a PHY is present, and if yes, at which address. * Whether a PHY is present, and if yes, at which address.
*/ */
struct platform_device *shared_smi;
int force_phy_addr;
int phy_addr; int phy_addr;
/* /*
...@@ -49,10 +52,10 @@ struct mv643xx_eth_platform_data { ...@@ -49,10 +52,10 @@ struct mv643xx_eth_platform_data {
int duplex; int duplex;
/* /*
* Which RX/TX queues to use. * How many RX/TX queues to use.
*/ */
int rx_queue_mask; int rx_queue_count;
int tx_queue_mask; int tx_queue_count;
/* /*
* Override default RX/TX queue sizes if nonzero. * Override default RX/TX queue sizes if nonzero.
......
...@@ -410,6 +410,8 @@ int phy_start_aneg(struct phy_device *phydev); ...@@ -410,6 +410,8 @@ int phy_start_aneg(struct phy_device *phydev);
int mdiobus_register(struct mii_bus *bus); int mdiobus_register(struct mii_bus *bus);
void mdiobus_unregister(struct mii_bus *bus); void mdiobus_unregister(struct mii_bus *bus);
struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr);
void phy_sanitize_settings(struct phy_device *phydev); void phy_sanitize_settings(struct phy_device *phydev);
int phy_stop_interrupts(struct phy_device *phydev); int phy_stop_interrupts(struct phy_device *phydev);
int phy_enable_interrupts(struct phy_device *phydev); int phy_enable_interrupts(struct phy_device *phydev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment