diff options
Diffstat (limited to 'drivers/pci/controller/pci-tegra.c')
| -rw-r--r-- | drivers/pci/controller/pci-tegra.c | 22 | 
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c index 9a917b2456f6..673a1725ef38 100644 --- a/drivers/pci/controller/pci-tegra.c +++ b/drivers/pci/controller/pci-tegra.c @@ -2237,14 +2237,15 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)  		err = of_pci_get_devfn(port);  		if (err < 0) {  			dev_err(dev, "failed to parse address: %d\n", err); -			return err; +			goto err_node_put;  		}  		index = PCI_SLOT(err);  		if (index < 1 || index > soc->num_ports) {  			dev_err(dev, "invalid port number: %d\n", index); -			return -EINVAL; +			err = -EINVAL; +			goto err_node_put;  		}  		index--; @@ -2253,12 +2254,13 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)  		if (err < 0) {  			dev_err(dev, "failed to parse # of lanes: %d\n",  				err); -			return err; +			goto err_node_put;  		}  		if (value > 16) {  			dev_err(dev, "invalid # of lanes: %u\n", value); -			return -EINVAL; +			err = -EINVAL; +			goto err_node_put;  		}  		lanes |= value << (index << 3); @@ -2272,13 +2274,15 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)  		lane += value;  		rp = devm_kzalloc(dev, sizeof(*rp), GFP_KERNEL); -		if (!rp) -			return -ENOMEM; +		if (!rp) { +			err = -ENOMEM; +			goto err_node_put; +		}  		err = of_address_to_resource(port, 0, &rp->regs);  		if (err < 0) {  			dev_err(dev, "failed to parse address: %d\n", err); -			return err; +			goto err_node_put;  		}  		INIT_LIST_HEAD(&rp->list); @@ -2330,6 +2334,10 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)  		return err;  	return 0; + +err_node_put: +	of_node_put(port); +	return err;  }  /*  |