diff options
Diffstat (limited to 'drivers/pci/controller/pcie-cadence.c')
| -rw-r--r-- | drivers/pci/controller/pcie-cadence.c | 24 | 
1 files changed, 14 insertions, 10 deletions
| diff --git a/drivers/pci/controller/pcie-cadence.c b/drivers/pci/controller/pcie-cadence.c index 86f1b002c846..cd795f6fc1e2 100644 --- a/drivers/pci/controller/pcie-cadence.c +++ b/drivers/pci/controller/pcie-cadence.c @@ -180,24 +180,26 @@ int cdns_pcie_init_phy(struct device *dev, struct cdns_pcie *pcie)  		return 0;  	} -	phy = devm_kzalloc(dev, sizeof(*phy) * phy_count, GFP_KERNEL); +	phy = devm_kcalloc(dev, phy_count, sizeof(*phy), GFP_KERNEL);  	if (!phy)  		return -ENOMEM; -	link = devm_kzalloc(dev, sizeof(*link) * phy_count, GFP_KERNEL); +	link = devm_kcalloc(dev, phy_count, sizeof(*link), GFP_KERNEL);  	if (!link)  		return -ENOMEM;  	for (i = 0; i < phy_count; i++) {  		of_property_read_string_index(np, "phy-names", i, &name); -		phy[i] = devm_phy_optional_get(dev, name); -		if (IS_ERR(phy)) -			return PTR_ERR(phy); - +		phy[i] = devm_phy_get(dev, name); +		if (IS_ERR(phy[i])) { +			ret = PTR_ERR(phy[i]); +			goto err_phy; +		}  		link[i] = device_link_add(dev, &phy[i]->dev, DL_FLAG_STATELESS);  		if (!link[i]) { +			devm_phy_put(dev, phy[i]);  			ret = -EINVAL; -			goto err_link; +			goto err_phy;  		}  	} @@ -207,13 +209,15 @@ int cdns_pcie_init_phy(struct device *dev, struct cdns_pcie *pcie)  	ret =  cdns_pcie_enable_phy(pcie);  	if (ret) -		goto err_link; +		goto err_phy;  	return 0; -err_link: -	while (--i >= 0) +err_phy: +	while (--i >= 0) {  		device_link_del(link[i]); +		devm_phy_put(dev, phy[i]); +	}  	return ret;  } |