Merge branch 'master' of git://git.denx.de/u-boot-arm
[platform/kernel/u-boot.git] / drivers / net / macb.c
index af0409b..dcb8850 100644 (file)
@@ -42,6 +42,7 @@
 #include <net.h>
 #include <netdev.h>
 #include <malloc.h>
+#include <miiphy.h>
 
 #include <linux/mii.h>
 #include <asm/io.h>
@@ -164,6 +165,36 @@ static u16 macb_mdio_read(struct macb_device *macb, u8 reg)
        return MACB_BFEXT(DATA, frame);
 }
 
+#if defined(CONFIG_CMD_MII)
+
+int macb_miiphy_read(char *devname, u8 phy_adr, u8 reg, u16 *value)
+{
+       struct eth_device *dev = eth_get_dev_by_name(devname);
+       struct macb_device *macb = to_macb(dev);
+
+       if ( macb->phy_addr != phy_adr )
+               return -1;
+
+       *value = macb_mdio_read(macb, reg);
+
+       return 0;
+}
+
+int macb_miiphy_write(char *devname, u8 phy_adr, u8 reg, u16 value)
+{
+       struct eth_device *dev = eth_get_dev_by_name(devname);
+       struct macb_device *macb = to_macb(dev);
+
+       if ( macb->phy_addr != phy_adr )
+               return -1;
+
+       macb_mdio_write(macb, reg, value);
+
+       return 0;
+}
+#endif
+
+
 #if defined(CONFIG_CMD_NET)
 
 static int macb_send(struct eth_device *netdev, volatile void *packet,
@@ -447,14 +478,16 @@ static int macb_init(struct eth_device *netdev, bd_t *bd)
        /* choose RMII or MII mode. This depends on the board */
 #ifdef CONFIG_RMII
 #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
-    defined(CONFIG_AT91SAM9263)
+    defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) || \
+       defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45)
        macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
 #else
        macb_writel(macb, USRIO, 0);
 #endif
 #else
 #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
-    defined(CONFIG_AT91SAM9263)
+    defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) || \
+       defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45)
        macb_writel(macb, USRIO, MACB_BIT(CLKEN));
 #else
        macb_writel(macb, USRIO, MACB_BIT(MII));
@@ -540,84 +573,9 @@ int macb_eth_initialize(int id, void *regs, unsigned int phy_addr)
 
        eth_register(netdev);
 
-       return 0;
-}
-
-#endif
-
 #if defined(CONFIG_CMD_MII)
-
-int miiphy_read(unsigned char addr, unsigned char reg, unsigned short *value)
-{
-       unsigned long netctl;
-       unsigned long netstat;
-       unsigned long frame;
-       int iflag;
-
-       iflag = disable_interrupts();
-       netctl = macb_readl(&macb, EMACB_NCR);
-       netctl |= MACB_BIT(MPE);
-       macb_writel(&macb, EMACB_NCR, netctl);
-       if (iflag)
-               enable_interrupts();
-
-       frame = (MACB_BF(SOF, 1)
-                | MACB_BF(RW, 2)
-                | MACB_BF(PHYA, addr)
-                | MACB_BF(REGA, reg)
-                | MACB_BF(CODE, 2));
-       macb_writel(&macb, EMACB_MAN, frame);
-
-       do {
-               netstat = macb_readl(&macb, EMACB_NSR);
-       } while (!(netstat & MACB_BIT(IDLE)));
-
-       frame = macb_readl(&macb, EMACB_MAN);
-       *value = MACB_BFEXT(DATA, frame);
-
-       iflag = disable_interrupts();
-       netctl = macb_readl(&macb, EMACB_NCR);
-       netctl &= ~MACB_BIT(MPE);
-       macb_writel(&macb, EMACB_NCR, netctl);
-       if (iflag)
-               enable_interrupts();
-
-       return 0;
-}
-
-int miiphy_write(unsigned char addr, unsigned char reg, unsigned short value)
-{
-       unsigned long netctl;
-       unsigned long netstat;
-       unsigned long frame;
-       int iflag;
-
-       iflag = disable_interrupts();
-       netctl = macb_readl(&macb, EMACB_NCR);
-       netctl |= MACB_BIT(MPE);
-       macb_writel(&macb, EMACB_NCR, netctl);
-       if (iflag)
-               enable_interrupts();
-
-       frame = (MACB_BF(SOF, 1)
-                | MACB_BF(RW, 1)
-                | MACB_BF(PHYA, addr)
-                | MACB_BF(REGA, reg)
-                | MACB_BF(CODE, 2)
-                | MACB_BF(DATA, value));
-       macb_writel(&macb, EMACB_MAN, frame);
-
-       do {
-               netstat = macb_readl(&macb, EMACB_NSR);
-       } while (!(netstat & MACB_BIT(IDLE)));
-
-       iflag = disable_interrupts();
-       netctl = macb_readl(&macb, EMACB_NCR);
-       netctl &= ~MACB_BIT(MPE);
-       macb_writel(&macb, EMACB_NCR, netctl);
-       if (iflag)
-               enable_interrupts();
-
+       miiphy_register(netdev->name, macb_miiphy_read, macb_miiphy_write);
+#endif
        return 0;
 }