The PHY driver should create the PHY in order for other peripheral controllers
 to make use of it. The PHY framework provides 2 APIs to create the PHY.
 
-struct phy *phy_create(struct device *dev, const struct phy_ops *ops,
-        struct phy_init_data *init_data);
-struct phy *devm_phy_create(struct device *dev, const struct phy_ops *ops,
-       struct phy_init_data *init_data);
+struct phy *phy_create(struct device *dev, struct device_node *node,
+                      const struct phy_ops *ops,
+                      struct phy_init_data *init_data);
+struct phy *devm_phy_create(struct device *dev, struct device_node *node,
+                           const struct phy_ops *ops,
+                           struct phy_init_data *init_data);
 
 The PHY drivers can use one of the above 2 APIs to create the PHY by passing
 the device pointer, phy ops and init_data.
 
 
        platform_set_drvdata(pdev, phy);
 
-       gphy = devm_phy_create(dev, &ops, NULL);
+       gphy = devm_phy_create(dev, NULL, &ops, NULL);
        if (IS_ERR(gphy))
                return PTR_ERR(gphy);
 
 
                if (!phy_desc)
                        return -ENOMEM;
 
-               phy = devm_phy_create(dev, &phy_berlin_sata_ops, NULL);
+               phy = devm_phy_create(dev, NULL, &phy_berlin_sata_ops, NULL);
                if (IS_ERR(phy)) {
                        dev_err(dev, "failed to create PHY %d\n", phy_id);
                        return PTR_ERR(phy);
 
        struct phy *phy;
        struct class_dev_iter iter;
        struct device_node *node = dev->of_node;
+       struct device_node *child;
 
        class_dev_iter_init(&iter, phy_class, NULL, NULL);
        while ((dev = class_dev_iter_next(&iter))) {
                phy = to_phy(dev);
-               if (node != phy->dev.of_node)
+               if (node != phy->dev.of_node) {
+                       for_each_child_of_node(node, child) {
+                               if (child == phy->dev.of_node)
+                                       goto phy_found;
+                       }
                        continue;
+               }
 
+phy_found:
                class_dev_iter_exit(&iter);
                return phy;
        }
 /**
  * phy_create() - create a new phy
  * @dev: device that is creating the new phy
+ * @node: device node of the phy
  * @ops: function pointers for performing phy operations
  * @init_data: contains the list of PHY consumers or NULL
  *
  * Called to create a phy using phy framework.
  */
-struct phy *phy_create(struct device *dev, const struct phy_ops *ops,
-       struct phy_init_data *init_data)
+struct phy *phy_create(struct device *dev, struct device_node *node,
+                      const struct phy_ops *ops,
+                      struct phy_init_data *init_data)
 {
        int ret;
        int id;
 
        phy->dev.class = phy_class;
        phy->dev.parent = dev;
-       phy->dev.of_node = dev->of_node;
+       phy->dev.of_node = node ?: dev->of_node;
        phy->id = id;
        phy->ops = ops;
        phy->init_data = init_data;
 /**
  * devm_phy_create() - create a new phy
  * @dev: device that is creating the new phy
+ * @node: device node of the phy
  * @ops: function pointers for performing phy operations
  * @init_data: contains the list of PHY consumers or NULL
  *
  * On driver detach, release function is invoked on the devres data,
  * then, devres data is freed.
  */
-struct phy *devm_phy_create(struct device *dev, const struct phy_ops *ops,
-       struct phy_init_data *init_data)
+struct phy *devm_phy_create(struct device *dev, struct device_node *node,
+                           const struct phy_ops *ops,
+                           struct phy_init_data *init_data)
 {
        struct phy **ptr, *phy;
 
        if (!ptr)
                return ERR_PTR(-ENOMEM);
 
-       phy = phy_create(dev, ops, init_data);
+       phy = phy_create(dev, node, ops, init_data);
        if (!IS_ERR(phy)) {
                *ptr = phy;
                devres_add(dev, ptr);
 
        if (IS_ERR(state->regs))
                return PTR_ERR(state->regs);
 
-       phy = devm_phy_create(dev, &exynos_dp_video_phy_ops, NULL);
+       phy = devm_phy_create(dev, NULL, &exynos_dp_video_phy_ops, NULL);
        if (IS_ERR(phy)) {
                dev_err(dev, "failed to create Display Port PHY\n");
                return PTR_ERR(phy);
 
        spin_lock_init(&state->slock);
 
        for (i = 0; i < EXYNOS_MIPI_PHYS_NUM; i++) {
-               struct phy *phy = devm_phy_create(dev,
+               struct phy *phy = devm_phy_create(dev, NULL,
                                        &exynos_mipi_video_phy_ops, NULL);
                if (IS_ERR(phy)) {
                        dev_err(dev, "failed to create PHY %d\n", i);
 
        dev_vdbg(dev, "Creating usbdrd_phy phy\n");
 
        for (i = 0; i < EXYNOS5_DRDPHYS_NUM; i++) {
-               struct phy *phy = devm_phy_create(dev, &exynos5_usbdrd_phy_ops,
+               struct phy *phy = devm_phy_create(dev, NULL,
+                                                 &exynos5_usbdrd_phy_ops,
                                                  NULL);
                if (IS_ERR(phy)) {
                        dev_err(dev, "Failed to create usbdrd_phy phy\n");
 
                return ret;
        }
 
-       sata_phy->phy = devm_phy_create(dev, &exynos_sata_phy_ops, NULL);
+       sata_phy->phy = devm_phy_create(dev, NULL, &exynos_sata_phy_ops, NULL);
        if (IS_ERR(sata_phy->phy)) {
                clk_disable_unprepare(sata_phy->phyclk);
                dev_err(dev, "failed to create PHY\n");
 
        if (IS_ERR(priv->peri_ctrl))
                priv->peri_ctrl = NULL;
 
-       phy = devm_phy_create(dev, &hix5hd2_sata_phy_ops, NULL);
+       phy = devm_phy_create(dev, NULL, &hix5hd2_sata_phy_ops, NULL);
        if (IS_ERR(phy)) {
                dev_err(dev, "failed to create PHY\n");
                return PTR_ERR(phy);
 
        if (IS_ERR(priv->clk))
                return PTR_ERR(priv->clk);
 
-       phy = devm_phy_create(&pdev->dev, &phy_mvebu_sata_ops, NULL);
+       phy = devm_phy_create(&pdev->dev, NULL, &phy_mvebu_sata_ops, NULL);
        if (IS_ERR(phy))
                return PTR_ERR(phy);
 
 
 
        platform_set_drvdata(pdev, phy);
 
-       generic_phy = devm_phy_create(phy->dev, &ops, NULL);
+       generic_phy = devm_phy_create(phy->dev, NULL, &ops, NULL);
        if (IS_ERR(generic_phy))
                return PTR_ERR(generic_phy);
 
 
        if (IS_ERR(phy->mmio))
                return PTR_ERR(phy->mmio);
 
-       generic_phy = devm_phy_create(dev, &qcom_apq8064_sata_phy_ops, NULL);
+       generic_phy = devm_phy_create(dev, NULL, &qcom_apq8064_sata_phy_ops,
+                                     NULL);
        if (IS_ERR(generic_phy)) {
                dev_err(dev, "%s: failed to create phy\n", __func__);
                return PTR_ERR(generic_phy);
 
                struct samsung_usb2_phy_instance *p = &drv->instances[i];
 
                dev_dbg(dev, "Creating phy \"%s\"\n", label);
-               p->phy = devm_phy_create(dev, &samsung_usb2_phy_ops, NULL);
+               p->phy = devm_phy_create(dev, NULL, &samsung_usb2_phy_ops,
+                                        NULL);
                if (IS_ERR(p->phy)) {
                        dev_err(drv->dev, "Failed to create usb2_phy \"%s\"\n",
                                label);
 
                                return PTR_ERR(phy->pmu);
                }
 
-               phy->phy = devm_phy_create(dev, &sun4i_usb_phy_ops, NULL);
+               phy->phy = devm_phy_create(dev, NULL, &sun4i_usb_phy_ops, NULL);
                if (IS_ERR(phy->phy)) {
                        dev_err(dev, "failed to create PHY %d\n", i);
                        return PTR_ERR(phy->phy);
 
        platform_set_drvdata(pdev, phy);
        pm_runtime_enable(phy->dev);
 
-       generic_phy = devm_phy_create(phy->dev, &ops, NULL);
+       generic_phy = devm_phy_create(phy->dev, NULL, &ops, NULL);
        if (IS_ERR(generic_phy))
                return PTR_ERR(generic_phy);
 
 
        otg->set_host           = twl4030_set_host;
        otg->set_peripheral     = twl4030_set_peripheral;
 
-       phy = devm_phy_create(twl->dev, &ops, init_data);
+       phy = devm_phy_create(twl->dev, NULL, &ops, init_data);
        if (IS_ERR(phy)) {
                dev_dbg(&pdev->dev, "Failed to create PHY\n");
                return PTR_ERR(phy);
 
        ctx->dev = &pdev->dev;
        platform_set_drvdata(pdev, ctx);
 
-       ctx->phy = devm_phy_create(ctx->dev, &xgene_phy_ops, NULL);
+       ctx->phy = devm_phy_create(ctx->dev, NULL, &xgene_phy_ops, NULL);
        if (IS_ERR(ctx->phy)) {
                dev_dbg(&pdev->dev, "Failed to create PHY\n");
                rc = PTR_ERR(ctx->phy);
 
 struct phy *of_phy_get(struct device_node *np, const char *con_id);
 struct phy *of_phy_simple_xlate(struct device *dev,
        struct of_phandle_args *args);
-struct phy *phy_create(struct device *dev, const struct phy_ops *ops,
-       struct phy_init_data *init_data);
-struct phy *devm_phy_create(struct device *dev,
+struct phy *phy_create(struct device *dev, struct device_node *node,
+                      const struct phy_ops *ops,
+                      struct phy_init_data *init_data);
+struct phy *devm_phy_create(struct device *dev, struct device_node *node,
        const struct phy_ops *ops, struct phy_init_data *init_data);
 void phy_destroy(struct phy *phy);
 void devm_phy_destroy(struct device *dev, struct phy *phy);
 }
 
 static inline struct phy *phy_create(struct device *dev,
-       const struct phy_ops *ops, struct phy_init_data *init_data)
+                                    struct device_node *node,
+                                    const struct phy_ops *ops,
+                                    struct phy_init_data *init_data)
 {
        return ERR_PTR(-ENOSYS);
 }
 
 static inline struct phy *devm_phy_create(struct device *dev,
-       const struct phy_ops *ops, struct phy_init_data *init_data)
+                                         struct device_node *node,
+                                         const struct phy_ops *ops,
+                                         struct phy_init_data *init_data)
 {
        return ERR_PTR(-ENOSYS);
 }