Commit 02460d08 authored by Sonic Zhang's avatar Sonic Zhang Committed by Mike Frysinger

netdev: bfin_mac: push settings to platform resources

Move all the pin settings out of the Kconfig and into the platform
resources (MII vs RMII).  This clean up also lets us push out the
phy settings so that board porters may control the layout.
Signed-off-by: default avatarSonic Zhang <sonic.zhang@analog.com>
Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
parent 229aebb8
...@@ -87,13 +87,55 @@ static struct platform_device rtc_device = { ...@@ -87,13 +87,55 @@ static struct platform_device rtc_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = {
P_MII0_ETxD0,
P_MII0_ETxD1,
P_MII0_ETxEN,
P_MII0_ERxD0,
P_MII0_ERxD1,
P_MII0_TxCLK,
P_MII0_PHYINT,
P_MII0_CRS,
P_MII0_MDC,
P_MII0_MDIO,
0
};
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
{
.addr = 2,
.irq = IRQ_MAC_PHYINT,
},
{
.addr = 3,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 3,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_MII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE) #if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
......
...@@ -81,13 +81,35 @@ static struct platform_device rtc_device = { ...@@ -81,13 +81,35 @@ static struct platform_device rtc_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_MII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_MII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -273,13 +273,35 @@ static struct platform_device dm9000_device = { ...@@ -273,13 +273,35 @@ static struct platform_device dm9000_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_RMII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_RMII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -193,13 +193,35 @@ static struct platform_device rtc_device = { ...@@ -193,13 +193,35 @@ static struct platform_device rtc_device = {
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_RMII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_RMII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -366,13 +366,35 @@ static struct platform_device dm9000_device = { ...@@ -366,13 +366,35 @@ static struct platform_device dm9000_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_RMII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_RMII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -257,13 +257,35 @@ static struct platform_device rtc_device = { ...@@ -257,13 +257,35 @@ static struct platform_device rtc_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_RMII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_RMII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -597,13 +597,35 @@ static struct platform_device bfin_sport1_uart_device = { ...@@ -597,13 +597,35 @@ static struct platform_device bfin_sport1_uart_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_MII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_MII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -562,13 +562,35 @@ static struct platform_device bfin_sport1_uart_device = { ...@@ -562,13 +562,35 @@ static struct platform_device bfin_sport1_uart_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_MII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_MII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -68,13 +68,35 @@ static struct platform_device rtc_device = { ...@@ -68,13 +68,35 @@ static struct platform_device rtc_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_MII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_MII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -99,13 +99,35 @@ static struct platform_device smc91x_device = { ...@@ -99,13 +99,35 @@ static struct platform_device smc91x_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_RMII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_RMII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -327,13 +327,35 @@ static struct platform_device bfin_can_device = { ...@@ -327,13 +327,35 @@ static struct platform_device bfin_can_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_MII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = PHY_POLL, /* IRQ_MAC_PHYINT */
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_MII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -564,13 +564,35 @@ static struct platform_device bfin_sport1_uart_device = { ...@@ -564,13 +564,35 @@ static struct platform_device bfin_sport1_uart_device = {
#endif #endif
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
#include <linux/bfin_mac.h>
static const unsigned short bfin_mac_peripherals[] = P_MII0;
static struct bfin_phydev_platform_data bfin_phydev_data[] = {
{
.addr = 1,
.irq = IRQ_MAC_PHYINT,
},
};
static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
.phydev_number = 1,
.phydev_data = bfin_phydev_data,
.phy_mode = PHY_INTERFACE_MODE_MII,
.mac_peripherals = bfin_mac_peripherals,
};
static struct platform_device bfin_mii_bus = { static struct platform_device bfin_mii_bus = {
.name = "bfin_mii_bus", .name = "bfin_mii_bus",
.dev = {
.platform_data = &bfin_mii_bus_data,
}
}; };
static struct platform_device bfin_mac_device = { static struct platform_device bfin_mac_device = {
.name = "bfin_mac", .name = "bfin_mac",
.dev.platform_data = &bfin_mii_bus, .dev = {
.platform_data = &bfin_mii_bus,
}
}; };
#endif #endif
......
...@@ -883,14 +883,6 @@ config BFIN_RX_DESC_NUM ...@@ -883,14 +883,6 @@ config BFIN_RX_DESC_NUM
help help
Set the number of buffer packets used in driver. Set the number of buffer packets used in driver.
config BFIN_MAC_RMII
bool "RMII PHY Interface"
depends on BFIN_MAC
default y if BFIN527_EZKIT
default n if BFIN537_STAMP
help
Use Reduced PHY MII Interface
config BFIN_MAC_USE_HWSTAMP config BFIN_MAC_USE_HWSTAMP
bool "Use IEEE 1588 hwstamp" bool "Use IEEE 1588 hwstamp"
depends on BFIN_MAC && BF518 depends on BFIN_MAC && BF518
......
/* /*
* Blackfin On-Chip MAC Driver * Blackfin On-Chip MAC Driver
* *
* Copyright 2004-2007 Analog Devices Inc. * Copyright 2004-2010 Analog Devices Inc.
* *
* Enter bugs at http://blackfin.uclinux.org/ * Enter bugs at http://blackfin.uclinux.org/
* *
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/mii.h> #include <linux/mii.h>
#include <linux/phy.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
...@@ -76,12 +75,6 @@ static struct net_dma_desc_tx *current_tx_ptr; ...@@ -76,12 +75,6 @@ static struct net_dma_desc_tx *current_tx_ptr;
static struct net_dma_desc_tx *tx_desc; static struct net_dma_desc_tx *tx_desc;
static struct net_dma_desc_rx *rx_desc; static struct net_dma_desc_rx *rx_desc;
#if defined(CONFIG_BFIN_MAC_RMII)
static u16 pin_req[] = P_RMII0;
#else
static u16 pin_req[] = P_MII0;
#endif
static void desc_list_free(void) static void desc_list_free(void)
{ {
struct net_dma_desc_rx *r; struct net_dma_desc_rx *r;
...@@ -347,23 +340,23 @@ static void bfin_mac_adjust_link(struct net_device *dev) ...@@ -347,23 +340,23 @@ static void bfin_mac_adjust_link(struct net_device *dev)
} }
if (phydev->speed != lp->old_speed) { if (phydev->speed != lp->old_speed) {
#if defined(CONFIG_BFIN_MAC_RMII) if (phydev->interface == PHY_INTERFACE_MODE_RMII) {
u32 opmode = bfin_read_EMAC_OPMODE(); u32 opmode = bfin_read_EMAC_OPMODE();
switch (phydev->speed) { switch (phydev->speed) {
case 10: case 10:
opmode |= RMII_10; opmode |= RMII_10;
break; break;
case 100: case 100:
opmode &= ~(RMII_10); opmode &= ~RMII_10;
break; break;
default: default:
printk(KERN_WARNING printk(KERN_WARNING
"%s: Ack! Speed (%d) is not 10/100!\n", "%s: Ack! Speed (%d) is not 10/100!\n",
DRV_NAME, phydev->speed); DRV_NAME, phydev->speed);
break; break;
}
bfin_write_EMAC_OPMODE(opmode);
} }
bfin_write_EMAC_OPMODE(opmode);
#endif
new_state = 1; new_state = 1;
lp->old_speed = phydev->speed; lp->old_speed = phydev->speed;
...@@ -392,7 +385,7 @@ static void bfin_mac_adjust_link(struct net_device *dev) ...@@ -392,7 +385,7 @@ static void bfin_mac_adjust_link(struct net_device *dev)
/* MDC = 2.5 MHz */ /* MDC = 2.5 MHz */
#define MDC_CLK 2500000 #define MDC_CLK 2500000
static int mii_probe(struct net_device *dev) static int mii_probe(struct net_device *dev, int phy_mode)
{ {
struct bfin_mac_local *lp = netdev_priv(dev); struct bfin_mac_local *lp = netdev_priv(dev);
struct phy_device *phydev = NULL; struct phy_device *phydev = NULL;
...@@ -411,8 +404,8 @@ static int mii_probe(struct net_device *dev) ...@@ -411,8 +404,8 @@ static int mii_probe(struct net_device *dev)
sysctl = (sysctl & ~MDCDIV) | SET_MDCDIV(mdc_div); sysctl = (sysctl & ~MDCDIV) | SET_MDCDIV(mdc_div);
bfin_write_EMAC_SYSCTL(sysctl); bfin_write_EMAC_SYSCTL(sysctl);
/* search for connect PHY device */ /* search for connected PHY device */
for (i = 0; i < PHY_MAX_ADDR; i++) { for (i = 0; i < PHY_MAX_ADDR; ++i) {
struct phy_device *const tmp_phydev = lp->mii_bus->phy_map[i]; struct phy_device *const tmp_phydev = lp->mii_bus->phy_map[i];
if (!tmp_phydev) if (!tmp_phydev)
...@@ -429,13 +422,14 @@ static int mii_probe(struct net_device *dev) ...@@ -429,13 +422,14 @@ static int mii_probe(struct net_device *dev)
return -ENODEV; return -ENODEV;
} }
#if defined(CONFIG_BFIN_MAC_RMII) if (phy_mode != PHY_INTERFACE_MODE_RMII &&
phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link, phy_mode != PHY_INTERFACE_MODE_MII) {
0, PHY_INTERFACE_MODE_RMII); printk(KERN_INFO "%s: Invalid phy interface mode\n", dev->name);
#else return -EINVAL;
}
phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link, phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link,
0, PHY_INTERFACE_MODE_MII); 0, phy_mode);
#endif
if (IS_ERR(phydev)) { if (IS_ERR(phydev)) {
printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
...@@ -570,6 +564,8 @@ static const struct ethtool_ops bfin_mac_ethtool_ops = { ...@@ -570,6 +564,8 @@ static const struct ethtool_ops bfin_mac_ethtool_ops = {
/**************************************************************************/ /**************************************************************************/
void setup_system_regs(struct net_device *dev) void setup_system_regs(struct net_device *dev)
{ {
struct bfin_mac_local *lp = netdev_priv(dev);
int i;
unsigned short sysctl; unsigned short sysctl;
/* /*
...@@ -577,6 +573,15 @@ void setup_system_regs(struct net_device *dev) ...@@ -577,6 +573,15 @@ void setup_system_regs(struct net_device *dev)
* Configure checksum support and rcve frame word alignment * Configure checksum support and rcve frame word alignment
*/ */
sysctl = bfin_read_EMAC_SYSCTL(); sysctl = bfin_read_EMAC_SYSCTL();
/*
* check if interrupt is requested for any PHY,
* enable PHY interrupt only if needed
*/
for (i = 0; i < PHY_MAX_ADDR; ++i)
if (lp->mii_bus->irq[i] != PHY_POLL)
break;
if (i < PHY_MAX_ADDR)
sysctl |= PHYIE;
sysctl |= RXDWA; sysctl |= RXDWA;
#if defined(BFIN_MAC_CSUM_OFFLOAD) #if defined(BFIN_MAC_CSUM_OFFLOAD)
sysctl |= RXCKS; sysctl |= RXCKS;
...@@ -1203,7 +1208,7 @@ static void bfin_mac_disable(void) ...@@ -1203,7 +1208,7 @@ static void bfin_mac_disable(void)
/* /*
* Enable Interrupts, Receive, and Transmit * Enable Interrupts, Receive, and Transmit
*/ */
static int bfin_mac_enable(void) static int bfin_mac_enable(struct phy_device *phydev)
{ {
int ret; int ret;
u32 opmode; u32 opmode;
...@@ -1233,12 +1238,13 @@ static int bfin_mac_enable(void) ...@@ -1233,12 +1238,13 @@ static int bfin_mac_enable(void)
opmode |= DRO | DC | PSF; opmode |= DRO | DC | PSF;
opmode |= RE; opmode |= RE;
#if defined(CONFIG_BFIN_MAC_RMII) if (phydev->interface == PHY_INTERFACE_MODE_RMII) {
opmode |= RMII; /* For Now only 100MBit are supported */ opmode |= RMII; /* For Now only 100MBit are supported */
#if (defined(CONFIG_BF537) || defined(CONFIG_BF536)) && CONFIG_BF_REV_0_2 #if (defined(CONFIG_BF537) || defined(CONFIG_BF536)) && CONFIG_BF_REV_0_2
opmode |= TE; opmode |= TE;
#endif
#endif #endif
}
/* Turn on the EMAC rx */ /* Turn on the EMAC rx */
bfin_write_EMAC_OPMODE(opmode); bfin_write_EMAC_OPMODE(opmode);
...@@ -1270,7 +1276,7 @@ static void bfin_mac_timeout(struct net_device *dev) ...@@ -1270,7 +1276,7 @@ static void bfin_mac_timeout(struct net_device *dev)
if (netif_queue_stopped(lp->ndev)) if (netif_queue_stopped(lp->ndev))
netif_wake_queue(lp->ndev); netif_wake_queue(lp->ndev);
bfin_mac_enable(); bfin_mac_enable(lp->phydev);
/* We can accept TX packets again */ /* We can accept TX packets again */
dev->trans_start = jiffies; /* prevent tx timeout */ dev->trans_start = jiffies; /* prevent tx timeout */
...@@ -1342,11 +1348,19 @@ static void bfin_mac_set_multicast_list(struct net_device *dev) ...@@ -1342,11 +1348,19 @@ static void bfin_mac_set_multicast_list(struct net_device *dev)
static int bfin_mac_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) static int bfin_mac_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
{ {
struct bfin_mac_local *lp = netdev_priv(netdev);
if (!netif_running(netdev))
return -EINVAL;
switch (cmd) { switch (cmd) {
case SIOCSHWTSTAMP: case SIOCSHWTSTAMP:
return bfin_mac_hwtstamp_ioctl(netdev, ifr, cmd); return bfin_mac_hwtstamp_ioctl(netdev, ifr, cmd);
default: default:
return -EOPNOTSUPP; if (lp->phydev)
return phy_mii_ioctl(lp->phydev, ifr, cmd);
else
return -EOPNOTSUPP;
} }
} }
...@@ -1394,7 +1408,7 @@ static int bfin_mac_open(struct net_device *dev) ...@@ -1394,7 +1408,7 @@ static int bfin_mac_open(struct net_device *dev)
setup_mac_addr(dev->dev_addr); setup_mac_addr(dev->dev_addr);
bfin_mac_disable(); bfin_mac_disable();
ret = bfin_mac_enable(); ret = bfin_mac_enable(lp->phydev);
if (ret) if (ret)
return ret; return ret;
pr_debug("hardware init finished\n"); pr_debug("hardware init finished\n");
...@@ -1450,6 +1464,7 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev) ...@@ -1450,6 +1464,7 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
struct net_device *ndev; struct net_device *ndev;
struct bfin_mac_local *lp; struct bfin_mac_local *lp;
struct platform_device *pd; struct platform_device *pd;
struct bfin_mii_bus_platform_data *mii_bus_data;
int rc; int rc;
ndev = alloc_etherdev(sizeof(struct bfin_mac_local)); ndev = alloc_etherdev(sizeof(struct bfin_mac_local));
...@@ -1501,11 +1516,12 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev) ...@@ -1501,11 +1516,12 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
if (!lp->mii_bus) { if (!lp->mii_bus) {
dev_err(&pdev->dev, "Cannot get mii_bus!\n"); dev_err(&pdev->dev, "Cannot get mii_bus!\n");
rc = -ENODEV; rc = -ENODEV;
goto out_err_mii_bus_probe; goto out_err_probe_mac;
} }
lp->mii_bus->priv = ndev; lp->mii_bus->priv = ndev;
mii_bus_data = pd->dev.platform_data;
rc = mii_probe(ndev); rc = mii_probe(ndev, mii_bus_data->phy_mode);
if (rc) { if (rc) {
dev_err(&pdev->dev, "MII Probe failed!\n"); dev_err(&pdev->dev, "MII Probe failed!\n");
goto out_err_mii_probe; goto out_err_mii_probe;
...@@ -1552,8 +1568,6 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev) ...@@ -1552,8 +1568,6 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
out_err_mii_probe: out_err_mii_probe:
mdiobus_unregister(lp->mii_bus); mdiobus_unregister(lp->mii_bus);
mdiobus_free(lp->mii_bus); mdiobus_free(lp->mii_bus);
out_err_mii_bus_probe:
peripheral_free_list(pin_req);
out_err_probe_mac: out_err_probe_mac:
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
free_netdev(ndev); free_netdev(ndev);
...@@ -1576,8 +1590,6 @@ static int __devexit bfin_mac_remove(struct platform_device *pdev) ...@@ -1576,8 +1590,6 @@ static int __devexit bfin_mac_remove(struct platform_device *pdev)
free_netdev(ndev); free_netdev(ndev);
peripheral_free_list(pin_req);
return 0; return 0;
} }
...@@ -1623,12 +1635,21 @@ static int bfin_mac_resume(struct platform_device *pdev) ...@@ -1623,12 +1635,21 @@ static int bfin_mac_resume(struct platform_device *pdev)
static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
{ {
struct mii_bus *miibus; struct mii_bus *miibus;
struct bfin_mii_bus_platform_data *mii_bus_pd;
const unsigned short *pin_req;
int rc, i; int rc, i;
mii_bus_pd = dev_get_platdata(&pdev->dev);
if (!mii_bus_pd) {
dev_err(&pdev->dev, "No peripherals in platform data!\n");
return -EINVAL;
}
/* /*
* We are setting up a network card, * We are setting up a network card,
* so set the GPIO pins to Ethernet mode * so set the GPIO pins to Ethernet mode
*/ */
pin_req = mii_bus_pd->mac_peripherals;
rc = peripheral_request_list(pin_req, DRV_NAME); rc = peripheral_request_list(pin_req, DRV_NAME);
if (rc) { if (rc) {
dev_err(&pdev->dev, "Requesting peripherals failed!\n"); dev_err(&pdev->dev, "Requesting peripherals failed!\n");
...@@ -1645,13 +1666,30 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) ...@@ -1645,13 +1666,30 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
miibus->parent = &pdev->dev; miibus->parent = &pdev->dev;
miibus->name = "bfin_mii_bus"; miibus->name = "bfin_mii_bus";
miibus->phy_mask = mii_bus_pd->phy_mask;
snprintf(miibus->id, MII_BUS_ID_SIZE, "0"); snprintf(miibus->id, MII_BUS_ID_SIZE, "0");
miibus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); miibus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
if (miibus->irq == NULL) if (!miibus->irq)
goto out_err_alloc; goto out_err_irq_alloc;
for (i = 0; i < PHY_MAX_ADDR; ++i)
for (i = rc; i < PHY_MAX_ADDR; ++i)
miibus->irq[i] = PHY_POLL; miibus->irq[i] = PHY_POLL;
rc = clamp(mii_bus_pd->phydev_number, 0, PHY_MAX_ADDR);
if (rc != mii_bus_pd->phydev_number)
dev_err(&pdev->dev, "Invalid number (%i) of phydevs\n",
mii_bus_pd->phydev_number);
for (i = 0; i < rc; ++i) {
unsigned short phyaddr = mii_bus_pd->phydev_data[i].addr;
if (phyaddr < PHY_MAX_ADDR)
miibus->irq[phyaddr] = mii_bus_pd->phydev_data[i].irq;
else
dev_err(&pdev->dev,
"Invalid PHY address %i for phydev %i\n",
phyaddr, i);
}
rc = mdiobus_register(miibus); rc = mdiobus_register(miibus);
if (rc) { if (rc) {
dev_err(&pdev->dev, "Cannot register MDIO bus!\n"); dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
...@@ -1663,6 +1701,7 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) ...@@ -1663,6 +1701,7 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
out_err_mdiobus_register: out_err_mdiobus_register:
kfree(miibus->irq); kfree(miibus->irq);
out_err_irq_alloc:
mdiobus_free(miibus); mdiobus_free(miibus);
out_err_alloc: out_err_alloc:
peripheral_free_list(pin_req); peripheral_free_list(pin_req);
...@@ -1673,11 +1712,15 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) ...@@ -1673,11 +1712,15 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
static int __devexit bfin_mii_bus_remove(struct platform_device *pdev) static int __devexit bfin_mii_bus_remove(struct platform_device *pdev)
{ {
struct mii_bus *miibus = platform_get_drvdata(pdev); struct mii_bus *miibus = platform_get_drvdata(pdev);
struct bfin_mii_bus_platform_data *mii_bus_pd =
dev_get_platdata(&pdev->dev);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
mdiobus_unregister(miibus); mdiobus_unregister(miibus);
kfree(miibus->irq); kfree(miibus->irq);
mdiobus_free(miibus); mdiobus_free(miibus);
peripheral_free_list(pin_req); peripheral_free_list(mii_bus_pd->mac_peripherals);
return 0; return 0;
} }
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include <linux/clocksource.h> #include <linux/clocksource.h>
#include <linux/timecompare.h> #include <linux/timecompare.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/etherdevice.h>
#include <linux/bfin_mac.h>
#define BFIN_MAC_CSUM_OFFLOAD #define BFIN_MAC_CSUM_OFFLOAD
......
/*
* Blackfin On-Chip MAC Driver
*
* Copyright 2004-2010 Analog Devices Inc.
*
* Enter bugs at http://blackfin.uclinux.org/
*
* Licensed under the GPL-2 or later.
*/
#ifndef _LINUX_BFIN_MAC_H_
#define _LINUX_BFIN_MAC_H_
#include <linux/phy.h>
struct bfin_phydev_platform_data {
unsigned short addr;
int irq;
};
struct bfin_mii_bus_platform_data {
int phydev_number;
struct bfin_phydev_platform_data *phydev_data;
const unsigned short *mac_peripherals;
int phy_mode;
unsigned int phy_mask;
};
#endif
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