#include <linux/prefetch.h>
 #include <linux/debugfs.h>
 #include <linux/mii.h>
+#include <linux/of_device.h>
+#include <linux/of_net.h>
 
 #include <asm/irq.h>
 
 {
        struct sky2_port *sky2;
        struct net_device *dev = alloc_etherdev(sizeof(*sky2));
+       const void *iap;
 
        if (!dev)
                return NULL;
 
        dev->features |= dev->hw_features;
 
-       /* read the mac address */
-       memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN);
+       /* try to get mac address in the following order:
+        * 1) from device tree data
+        * 2) from internal registers set by bootloader
+        */
+       iap = of_get_mac_address(hw->pdev->dev.of_node);
+       if (iap)
+               memcpy(dev->dev_addr, iap, ETH_ALEN);
+       else
+               memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8,
+                             ETH_ALEN);
 
        return dev;
 }