err = -EINVAL;
                goto _return_of_node_put;
        }
+       mac_dev->fman_dev = &of_dev->dev;
 
        /* Get the FMan cell-index */
        err = of_property_read_u32(dev_node, "cell-index", &val);
        /* cell-index 0 => FMan id 1 */
        fman_id = (u8)(val + 1);
 
-       priv->fman = fman_bind(&of_dev->dev);
+       priv->fman = fman_bind(mac_dev->fman_dev);
        if (!priv->fman) {
                dev_err(dev, "fman_bind(%pOF) failed\n", dev_node);
                err = -ENODEV;
                        err = -EINVAL;
                        goto _return_of_node_put;
                }
+               mac_dev->fman_port_devs[i] = &of_dev->dev;
 
-               mac_dev->port[i] = fman_port_bind(&of_dev->dev);
+               mac_dev->port[i] = fman_port_bind(mac_dev->fman_port_devs[i]);
                if (!mac_dev->port[i]) {
                        dev_err(dev, "dev_get_drvdata(%pOF) failed\n",
                                dev_node);
 
 struct fman_mac;
 struct mac_priv_s;
 
+#define PORT_NUM 2
 struct mac_device {
        void __iomem            *vaddr;
        struct device           *dev;
        struct resource         *res;
        u8                       addr[ETH_ALEN];
-       struct fman_port        *port[2];
+       struct fman_port        *port[PORT_NUM];
        struct phylink          *phylink;
        struct phylink_config   phylink_config;
        phy_interface_t         phy_if;
 
        struct fman_mac         *fman_mac;
        struct mac_priv_s       *priv;
+
+       struct device           *fman_dev;
+       struct device           *fman_port_devs[PORT_NUM];
 };
 
 static inline struct mac_device