|
@@ -128,6 +128,7 @@ static int cygnus_pcie_phy_probe(struct platform_device *pdev)
|
|
|
struct phy_provider *provider;
|
|
|
struct resource *res;
|
|
|
unsigned cnt = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
if (of_get_child_count(node) == 0) {
|
|
|
dev_err(dev, "PHY no child node\n");
|
|
@@ -154,24 +155,28 @@ static int cygnus_pcie_phy_probe(struct platform_device *pdev)
|
|
|
if (of_property_read_u32(child, "reg", &id)) {
|
|
|
dev_err(dev, "missing reg property for %s\n",
|
|
|
child->name);
|
|
|
- return -EINVAL;
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto put_child;
|
|
|
}
|
|
|
|
|
|
if (id >= MAX_NUM_PHYS) {
|
|
|
dev_err(dev, "invalid PHY id: %u\n", id);
|
|
|
- return -EINVAL;
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto put_child;
|
|
|
}
|
|
|
|
|
|
if (core->phys[id].phy) {
|
|
|
dev_err(dev, "duplicated PHY id: %u\n", id);
|
|
|
- return -EINVAL;
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto put_child;
|
|
|
}
|
|
|
|
|
|
p = &core->phys[id];
|
|
|
p->phy = devm_phy_create(dev, child, &cygnus_pcie_phy_ops);
|
|
|
if (IS_ERR(p->phy)) {
|
|
|
dev_err(dev, "failed to create PHY\n");
|
|
|
- return PTR_ERR(p->phy);
|
|
|
+ ret = PTR_ERR(p->phy);
|
|
|
+ goto put_child;
|
|
|
}
|
|
|
|
|
|
p->core = core;
|
|
@@ -191,6 +196,9 @@ static int cygnus_pcie_phy_probe(struct platform_device *pdev)
|
|
|
dev_dbg(dev, "registered %u PCIe PHY(s)\n", cnt);
|
|
|
|
|
|
return 0;
|
|
|
+put_child:
|
|
|
+ of_node_put(child);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static const struct of_device_id cygnus_pcie_phy_match_table[] = {
|