提交 5ca328d2 编写于 作者: K Krzysztof Hałasa

IXP4xx: add Ethernet and NPE support for IXP43x CPU.

Signed-off-by: NKrzysztof Hałasa <khc@pm.waw.pl>
上级 0a07232f
...@@ -575,8 +575,8 @@ int npe_load_firmware(struct npe *npe, const char *name, struct device *dev) ...@@ -575,8 +575,8 @@ int npe_load_firmware(struct npe *npe, const char *name, struct device *dev)
for (i = 0; i < image->size; i++) for (i = 0; i < image->size; i++)
image->data[i] = swab32(image->data[i]); image->data[i] = swab32(image->data[i]);
if (!cpu_is_ixp46x() && ((image->id >> 28) & 0xF /* device ID */)) { if (cpu_is_ixp42x() && ((image->id >> 28) & 0xF /* device ID */)) {
print_npe(KERN_INFO, npe, "IXP46x firmware ignored on " print_npe(KERN_INFO, npe, "IXP43x/IXP46x firmware ignored on "
"IXP42x\n"); "IXP42x\n");
goto err; goto err;
} }
...@@ -596,7 +596,7 @@ int npe_load_firmware(struct npe *npe, const char *name, struct device *dev) ...@@ -596,7 +596,7 @@ int npe_load_firmware(struct npe *npe, const char *name, struct device *dev)
"revision 0x%X:%X\n", (image->id >> 16) & 0xFF, "revision 0x%X:%X\n", (image->id >> 16) & 0xFF,
(image->id >> 8) & 0xFF, image->id & 0xFF); (image->id >> 8) & 0xFF, image->id & 0xFF);
if (!cpu_is_ixp46x()) { if (cpu_is_ixp42x()) {
if (!npe->id) if (!npe->id)
instr_size = NPE_A_42X_INSTR_SIZE; instr_size = NPE_A_42X_INSTR_SIZE;
else else
......
...@@ -335,11 +335,20 @@ static int ixp4xx_mdio_register(void) ...@@ -335,11 +335,20 @@ static int ixp4xx_mdio_register(void)
if (!(mdio_bus = mdiobus_alloc())) if (!(mdio_bus = mdiobus_alloc()))
return -ENOMEM; return -ENOMEM;
if (cpu_is_ixp43x()) {
/* IXP43x lacks NPE-B and uses NPE-C for MII PHY access */
if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEC_ETH))
return -ENOSYS;
mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthC_BASE_VIRT;
} else {
/* All MII PHY accesses use NPE-B Ethernet registers */ /* All MII PHY accesses use NPE-B Ethernet registers */
spin_lock_init(&mdio_lock); if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEB_ETH0))
return -ENOSYS;
mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT; mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT;
__raw_writel(DEFAULT_CORE_CNTRL, &mdio_regs->core_control); }
__raw_writel(DEFAULT_CORE_CNTRL, &mdio_regs->core_control);
spin_lock_init(&mdio_lock);
mdio_bus->name = "IXP4xx MII Bus"; mdio_bus->name = "IXP4xx MII Bus";
mdio_bus->read = &ixp4xx_mdio_read; mdio_bus->read = &ixp4xx_mdio_read;
mdio_bus->write = &ixp4xx_mdio_write; mdio_bus->write = &ixp4xx_mdio_write;
...@@ -1250,9 +1259,6 @@ static struct platform_driver ixp4xx_eth_driver = { ...@@ -1250,9 +1259,6 @@ static struct platform_driver ixp4xx_eth_driver = {
static int __init eth_init_module(void) static int __init eth_init_module(void)
{ {
int err; int err;
if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEB_ETH0))
return -ENOSYS;
if ((err = ixp4xx_mdio_register())) if ((err = ixp4xx_mdio_register()))
return err; return err;
return platform_driver_register(&ixp4xx_eth_driver); return platform_driver_register(&ixp4xx_eth_driver);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册