Blackfin: bf518f-ezbrd: handle different PHYs dynamically
[pandora-u-boot.git] / board / bf518f-ezbrd / bf518f-ezbrd.c
index 85b350f..c2ab598 100644 (file)
@@ -61,6 +61,7 @@ static void board_init_enetaddr(uchar *mac_addr)
 #define KSZ_WRITE     0x02
 #define KSZ_READ      0x03
 
+#define KSZ_REG_CHID  0x00     /* Register 0: Chip ID0 */
 #define KSZ_REG_STPID 0x01     /* Register 1: Chip ID1 / Start Switch */
 #define KSZ_REG_GC9   0x0b     /* Register 11: Global Control 9 */
 #define KSZ_REG_P3C0  0x30     /* Register 48: Port 3 Control 0 */
@@ -78,15 +79,17 @@ static int ksz8893m_reg_set(struct spi_slave *slave, uchar reg, uchar data)
        return ksz8893m_transfer(slave, KSZ_WRITE, reg, data, din);
 }
 
-static int ksz8893m_reg_clear(struct spi_slave *slave, uchar reg, uchar mask)
+static int ksz8893m_reg_read(struct spi_slave *slave, uchar reg)
 {
-       int ret = 0;
+       int ret;
        unsigned char din[3];
+       ret = ksz8893m_transfer(slave, KSZ_READ, reg, 0, din);
+       return ret ? ret : din[2];
+}
 
-       ret |= ksz8893m_transfer(slave, KSZ_READ, reg, 0, din);
-       ret |= ksz8893m_reg_set(slave, reg, din[2] & mask);
-
-       return ret;
+static int ksz8893m_reg_clear(struct spi_slave *slave, uchar reg, uchar mask)
+{
+       return ksz8893m_reg_set(slave, reg, ksz8893m_reg_read(slave, reg) & mask);
 }
 
 static int ksz8893m_reset(struct spi_slave *slave)
@@ -107,16 +110,16 @@ static int ksz8893m_reset(struct spi_slave *slave)
 
 int board_eth_init(bd_t *bis)
 {
-       static bool switch_is_alive = false;
+       static bool switch_is_alive = false, phy_is_ksz = true;
        int ret;
 
        if (!switch_is_alive) {
                struct spi_slave *slave = spi_setup_slave(0, 1, KSZ_MAX_HZ, SPI_MODE_3);
                if (slave) {
                        if (!spi_claim_bus(slave)) {
-                               ret = ksz8893m_reset(slave);
-                               if (!ret)
-                                       switch_is_alive = true;
+                               phy_is_ksz = (ksz8893m_reg_read(slave, KSZ_REG_CHID) == 0x88);
+                               ret = phy_is_ksz ? ksz8893m_reset(slave) : 0;
+                               switch_is_alive = (ret == 0);
                                spi_release_bus(slave);
                        }
                        spi_free_slave(slave);