tsi109@c0000000 {
                device_type = "tsi-bridge";
-               compatible = "tsi-bridge";
+               compatible = "tsi109-bridge", "tsi108-bridge";
                #address-cells = <1>;
                #size-cells = <1>;
                ranges = <00000000 c0000000 00010000>;
 
                i2c@7000 {
                        device_type = "i2c";
-                       compatible  = "tsi-i2c";
-                       interrupt-parent = < &/tsi109@c0000000/pic@7400 >;
+                       compatible  = "tsi109-i2c", "tsi108-i2c";
+                       interrupt-parent = <&MPIC>;
                        interrupts = <e 2>;
                        reg = <7000 400>;
                };
 
-               mdio@6000 {
+               MDIO: mdio@6000 {
                        device_type = "mdio";
-                       compatible = "tsi-ethernet";
+                       compatible = "tsi109-mdio", "tsi108-mdio";
+                       reg = <6000 50>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
 
-                       PHY1: ethernet-phy@6000 {
-                               device_type = "ethernet-phy";
-                               compatible = "bcm54xx";
-                               reg = <6000 50>;
-                               phy-id = <1>;
+                       PHY1: ethernet-phy@1 {
+                               compatible = "bcm5461a";
+                               reg = <1>;
+                               txc-rxc-delay-disable;
                        };
 
-                       PHY2: ethernet-phy@6400 {
-                               device_type = "ethernet-phy";
-                               compatible = "bcm54xx";
-                               reg = <6000 50>;
-                               phy-id = <2>;
+                       PHY2: ethernet-phy@2 {
+                               compatible = "bcm5461a";
+                               reg = <2>;
+                               txc-rxc-delay-disable;
                        };
                };
 
                ethernet@6200 {
                        device_type = "network";
-                       compatible = "tsi-ethernet";
+                       compatible = "tsi109-ethernet", "tsi108-ethernet";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        reg = <6000 200>;
                        local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupt-parent = < &/tsi109@c0000000/pic@7400 >;
+                       interrupt-parent = <&MPIC>;
                        interrupts = <10 2>;
+                       mdio-handle = <&MDIO>;
                        phy-handle = <&PHY1>;
                };
 
                ethernet@6600 {
                        device_type = "network";
-                       compatible = "tsi-ethernet";
+                       compatible = "tsi109-ethernet", "tsi108-ethernet";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        reg = <6400 200>;
                        local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupt-parent = < &/tsi109@c0000000/pic@7400 >;
+                       interrupt-parent = <&MPIC>;
                        interrupts = <11 2>;
+                       mdio-handle = <&MDIO>;
                        phy-handle = <&PHY2>;
                };
 
                        virtual-reg = <c0007808>;
                        clock-frequency = <3F9C6000>;
                        current-speed = <1c200>;
-                       interrupt-parent = < &/tsi109@c0000000/pic@7400 >;
+                       interrupt-parent = <&MPIC>;
                        interrupts = <c 2>;
                };
 
                        virtual-reg = <c0007c08>;
                        clock-frequency = <3F9C6000>;
                        current-speed = <1c200>;
-                       interrupt-parent = < &/tsi109@c0000000/pic@7400 >;
+                       interrupt-parent = <&MPIC>;
                        interrupts = <d 2>;
                };
 
 
                pci@1000 {
                        device_type = "pci";
-                       compatible = "tsi109";
+                       compatible = "tsi109-pci", "tsi108-pci";
                        #interrupt-cells = <1>;
                        #size-cells = <2>;
                        #address-cells = <3>;
                        ranges = <02000000 0 40000000 40000000 0 10000000
                                  01000000 0 00000000 7e000000 0 00010000>;
                        clock-frequency = <7f28154>;
-                       interrupt-parent = < &/tsi109@c0000000/pic@7400 >;
+                       interrupt-parent = <&MPIC>;
                        interrupts = <17 2>;
                        interrupt-map-mask = <f800 0 0 7>;
                        /*----------------------------------------------------+
                                #address-cells = <0>;
                                #interrupt-cells = <2>;
                                interrupts = <17 2>;
-                               interrupt-parent = < &/tsi109@c0000000/pic@7400 >;
+                               interrupt-parent = <&MPIC>;
                        };
                };
        };
 
                #address-cells = <1>;
                #size-cells = <1>;
                #interrupt-cells = <2>;
-               device_type = "tsi-bridge";
+               device_type = "tsi108-bridge";
                ranges = <00000000 c0000000 00010000>;
                reg = <c0000000 00010000>;
                bus-frequency = <0>;
                        interrupts = <E 0>;
                        reg = <7000 400>;
                        device_type = "i2c";
-                       compatible  = "tsi-i2c";
+                       compatible  = "tsi108-i2c";
                };
 
-               mdio@6000 {
+               MDIO: mdio@6000 {
                        device_type = "mdio";
-                       compatible = "tsi-ethernet";
+                       compatible = "tsi108-mdio";
+                       reg = <6000 50>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
 
-                       phy8: ethernet-phy@6000 {
+                       phy8: ethernet-phy@8 {
                                interrupt-parent = <&mpic>;
                                interrupts = <2 1>;
-                               reg = <6000 50>;
-                               phy-id = <8>;
-                               device_type = "ethernet-phy";
+                               reg = <8>;
                        };
 
-                       phy9: ethernet-phy@6400 {
+                       phy9: ethernet-phy@9 {
                                interrupt-parent = <&mpic>;
                                interrupts = <2 1>;
-                               reg = <6000 50>;
-                               phy-id = <9>;
-                               device_type = "ethernet-phy";
+                               reg = <9>;
                        };
 
                };
                ethernet@6200 {
                        #size-cells = <0>;
                        device_type = "network";
-                       model = "TSI-ETH";
-                       compatible = "tsi-ethernet";
+                       compatible = "tsi108-ethernet";
                        reg = <6000 200>;
                        address = [ 00 06 D2 00 00 01 ];
                        interrupts = <10 2>;
                        interrupt-parent = <&mpic>;
+                       mdio-handle = <&MDIO>;
                        phy-handle = <&phy8>;
                };
 
                        #address-cells = <1>;
                        #size-cells = <0>;
                        device_type = "network";
-                       model = "TSI-ETH";
-                       compatible = "tsi-ethernet";
+                       compatible = "tsi108-ethernet";
                        reg = <6400 200>;
                        address = [ 00 06 D2 00 00 02 ];
                        interrupts = <11 2>;
                        interrupt-parent = <&mpic>;
+                       mdio-handle = <&MDIO>;
                        phy-handle = <&phy9>;
                };
 
                                big-endian;
                };
                pci@1000 {
-                       compatible = "tsi10x";
+                       compatible = "tsi108-pci";
                        device_type = "pci";
                        #interrupt-cells = <1>;
                        #size-cells = <2>;
 
        int ret;
 
        for (np = NULL, i = 0;
-            (np = of_find_compatible_node(np, "network", "tsi-ethernet")) != NULL;
+            (np = of_find_compatible_node(np, "network", "tsi108-ethernet")) != NULL;
             i++) {
                struct resource r[2];
-               struct device_node *phy;
+               struct device_node *phy, *mdio;
                hw_info tsi_eth_data;
-               const unsigned int *id;
                const unsigned int *phy_id;
                const void *mac_addr;
                const phandle *ph;
                if (mac_addr)
                        memcpy(tsi_eth_data.mac_addr, mac_addr, 6);
 
+               ph = of_get_property(np, "mdio-handle", NULL);
+               mdio = of_find_node_by_phandle(*ph);
+               ret = of_address_to_resource(mdio, 0, &res);
+               of_node_put(mdio);
+               if (ret)
+                       goto unreg;
+
                ph = of_get_property(np, "phy-handle", NULL);
                phy = of_find_node_by_phandle(*ph);
 
                        goto unreg;
                }
 
-               id = of_get_property(phy, "reg", NULL);
-               phy_id = of_get_property(phy, "phy-id", NULL);
-               ret = of_address_to_resource(phy, 0, &res);
-               if (ret) {
-                       of_node_put(phy);
-                       goto unreg;
-               }
+               phy_id = of_get_property(phy, "reg", NULL);
+
                tsi_eth_data.regs = r[0].start;
                tsi_eth_data.phyregs = res.start;
                tsi_eth_data.phy = *phy_id;
                tsi_eth_data.irq_num = irq_of_parse_and_map(np, 0);
-               if (of_device_is_compatible(phy, "bcm54xx"))
+
+               /* Some boards with the TSI108 bridge (e.g. Holly)
+                * have a miswiring of the ethernet PHYs which
+                * requires a workaround.  The special
+                * "txc-rxc-delay-disable" property enables this
+                * workaround.  FIXME: Need to port the tsi108_eth
+                * driver itself to phylib and use a non-misleading
+                * name for the workaround flag - it's not actually to
+                * do with the model of PHY in use */
+               if (of_get_property(phy, "txc-rxc-delay-disable", NULL))
                        tsi_eth_data.phy_type = TSI108_PHY_BCM54XX;
                of_node_put(phy);
+
                ret =
                    platform_device_add_data(tsi_eth_dev, &tsi_eth_data,
                                             sizeof(hw_info));