summaryrefslogtreecommitdiff
path: root/drivers/pci
diff options
context:
space:
mode:
authorKrzysztof Kozlowski <k.kozlowski@samsung.com>2015-05-08 10:33:27 +0900
committerSeung-Woo Kim <sw0312.kim@samsung.com>2016-12-14 13:44:54 +0900
commitdc4081ce913a5862a2131d0dd0467924ae6fed91 (patch)
tree1a3ed8f2cc3ec5e376964a381ed2f1cacdceda83 /drivers/pci
parentc9a2c6ac8c8902b06f6c02a98825b0ae3b412cb8 (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.c15
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);