diff options
author | Krzysztof Kozlowski <k.kozlowski@samsung.com> | 2015-05-08 10:33:27 +0900 |
---|---|---|
committer | Seung-Woo Kim <sw0312.kim@samsung.com> | 2016-12-14 13:44:54 +0900 |
commit | dc4081ce913a5862a2131d0dd0467924ae6fed91 (patch) | |
tree | 1a3ed8f2cc3ec5e376964a381ed2f1cacdceda83 /drivers/pci | |
parent | c9a2c6ac8c8902b06f6c02a98825b0ae3b412cb8 (diff) |
local/pci: pci-exynos5433: Fix invalid GPIO accesses when of_get_named_gpio() fails
Before each use of GPIO (wlanen_gpio or reset_gpio) the driver compared
it to 0. But on error of_get_named_gpio() returns -ERRNO, not 0.
Actually 0 may be a valid GPIO.
If of_get_named_gpio() fails then fail the probe. Otherwise just work on
provided GPIO without further checks in the driver for its validity.
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/host/pci-exynos5433.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/pci/host/pci-exynos5433.c b/drivers/pci/host/pci-exynos5433.c index 22a0c3cda766..9ebce33084b0 100644 --- a/drivers/pci/host/pci-exynos5433.c +++ b/drivers/pci/host/pci-exynos5433.c @@ -420,12 +420,8 @@ static int exynos_pcie_wr_own_conf(struct pcie_port *pp, int where, int size, static int exynos_pcie_power_enabled(struct pcie_port *pp) { struct exynos_pcie *ep = to_exynos_pcie(pp); - int ret = 1; - if (ep->wlanen_gpio) - ret = gpio_get_value(ep->wlanen_gpio); - - return ret; + return gpio_get_value(ep->wlanen_gpio); } static struct pcie_host_ops exynos_pcie_host_ops = { @@ -455,7 +451,12 @@ static int __init exynos_pcie_probe(struct platform_device *pdev) pp->dev = &pdev->dev; exynos_pcie->reset_gpio = of_get_named_gpio(np, "reset-gpio", 0); + if (exynos_pcie->reset_gpio < 0) + return exynos_pcie->reset_gpio; + exynos_pcie->wlanen_gpio = of_get_named_gpio(np, "wlanen-gpio", 0); + if (exynos_pcie->wlanen_gpio < 0) + return exynos_pcie->wlanen_gpio; exynos_pcie->clk = devm_clk_get(&pdev->dev, "pcie"); if (IS_ERR(exynos_pcie->clk)) { @@ -609,7 +610,7 @@ static int exynos_pcie_suspend_noirq(struct device *dev) struct exynos_pcie *ep = dev_get_drvdata(dev); u32 val, count = 0; - if (ep->wlanen_gpio && !gpio_get_value(ep->wlanen_gpio)) + if (!gpio_get_value(ep->wlanen_gpio)) return 0; exynos_pcie_writel(ep->elbi_base, VEN_MSG_REQ_DISABLE, @@ -657,7 +658,7 @@ static int exynos_pcie_resume_noirq(struct device *dev) struct pcie_port *pp = &ep->pp; u32 val; - if (ep->wlanen_gpio && !gpio_get_value(ep->wlanen_gpio)) { + if (!gpio_get_value(ep->wlanen_gpio)) { clk_prepare_enable(ep->clk); clk_prepare_enable(ep->bus_clk); |