summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Agner <stefan.agner@toradex.com>2018-06-15 18:58:11 +0200
committerStefan Agner <stefan.agner@toradex.com>2018-06-15 18:58:11 +0200
commitb8046ce583ddaf8c90b9479a0894ad571ef08509 (patch)
tree93931af9707a816a25541a47670d000e25feaf25
parentd1ddc471c32dc7c1218d4ea375f93280ab48b39a (diff)
Revert "PCI: imx6: make sure peripheral clock is available early"
This reverts commit 91165e6fe1c95e7786385cafed9897ef9c7803c1.
-rw-r--r--drivers/pci/host/pci-imx6.c52
1 files changed, 22 insertions, 30 deletions
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 84db823d04dc..a92679e13eb0 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -541,6 +541,12 @@ static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie)
dev_err(dev, "unable to enable pcie_axi clock\n");
break;
}
+ ret = clk_prepare_enable(imx6_pcie->pcie_per);
+ if (ret) {
+ dev_err(dev, "unable to enable pcie_per clock\n");
+ clk_disable_unprepare(imx6_pcie->pcie_inbound_axi);
+ break;
+ }
break;
}
@@ -660,12 +666,10 @@ static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
goto err_pcie_bus;
}
- if (imx6_pcie->pcie_ext) {
- ret = clk_prepare_enable(imx6_pcie->pcie_ext);
- if (ret) {
- dev_err(pp->dev, "unable to enable pcie_ext clock\n");
- goto err_pcie_bus;
- }
+ ret = clk_prepare_enable(imx6_pcie->pcie_ext);
+ if (ret) {
+ dev_err(pp->dev, "unable to enable pcie_ext clock\n");
+ goto err_pcie_bus;
}
@@ -1235,6 +1239,7 @@ static void pci_imx_clk_disable(struct device *dev)
break;
case IMX8QXP:
case IMX8QM:
+ clk_disable_unprepare(imx6_pcie->pcie_per);
clk_disable_unprepare(imx6_pcie->pcie_inbound_axi);
break;
}
@@ -2123,6 +2128,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
dev_err(dev, "pcie_per clock source missing or invalid\n");
return PTR_ERR(imx6_pcie->pcie_per);
}
+
imx6_pcie->iomuxc_gpr =
syscon_regmap_lookup_by_phandle(node, "hsio");
imx6_pcie->pcie_inbound_axi = devm_clk_get(&pdev->dev,
@@ -2132,12 +2138,6 @@ static int imx6_pcie_probe(struct platform_device *pdev)
"pcie clock source missing or invalid\n");
return PTR_ERR(imx6_pcie->pcie_inbound_axi);
}
-
- ret = clk_prepare_enable(imx6_pcie->pcie_per);
- if (ret) {
- dev_err(dev, "unable to enable pcie_per clock\n");
- return ret;
- }
} else {
imx6_pcie->iomuxc_gpr =
syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
@@ -2145,8 +2145,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
if (IS_ERR(imx6_pcie->iomuxc_gpr)) {
dev_err(dev, "unable to find iomuxc registers\n");
- ret = PTR_ERR(imx6_pcie->iomuxc_gpr);
- goto err_disable_pcie_per;
+ return PTR_ERR(imx6_pcie->iomuxc_gpr);
}
/* Grab PCIe PHY Tx Settings */
@@ -2193,18 +2192,18 @@ static int imx6_pcie_probe(struct platform_device *pdev)
/* add attributes for device */
ret = sysfs_create_group(&pdev->dev.kobj, &imx_pcie_attrgroup);
if (ret)
- goto err_disable_pcie_per;
+ return -EINVAL;
ret = of_pci_get_host_bridge_resources(np, 0, 0xff, &res,
&pp->io_base);
if (ret)
- goto err_disable_pcie_per;
+ return ret;
ret = devm_request_pci_bus_resources(&pdev->dev, &res);
if (ret) {
dev_err(pp->dev, "missing ranges property\n");
pci_free_resource_list(&res);
- goto err_disable_pcie_per;
+ return ret;
}
/* Get the I/O and memory ranges from DT */
@@ -2225,7 +2224,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
ret = imx6_pcie_host_init(pp);
if (ret) {
dev_info(dev, " fail to initialize pcie ep.\n");
- goto err_disable_pcie_per;
+ return ret;
}
imx6_pcie_setup_ep(pp);
@@ -2262,7 +2261,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
if (!test_reg1) {
dev_err(dev, "pcie ep: can't alloc the test reg1.\n");
ret = PTR_ERR(test_reg1);
- goto err_disable_pcie_per;
+ return ret;
}
test_reg2 = devm_kzalloc(&pdev->dev,
@@ -2270,7 +2269,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
if (!test_reg2) {
dev_err(dev, "pcie ep: can't alloc the test reg2.\n");
ret = PTR_ERR(test_reg1);
- goto err_disable_pcie_per;
+ return ret;
}
/*
@@ -2285,7 +2284,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
if (!pcie_arb_base_addr) {
dev_err(dev, "error with ioremap in ep selftest\n");
ret = PTR_ERR(pcie_arb_base_addr);
- goto err_disable_pcie_per;
+ return ret;
}
for (i = 0; i < test_region_size; i = i + 4) {
@@ -2338,7 +2337,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
imx_pcie_attrgroup.attrs = imx_pcie_rc_attrs;
ret = sysfs_create_group(&pdev->dev.kobj, &imx_pcie_attrgroup);
if (ret)
- goto err_disable_pcie_per;
+ return -EINVAL;
ret = imx6_add_pcie_port(imx6_pcie, pdev);
if (ret < 0) {
@@ -2349,18 +2348,13 @@ static int imx6_pcie_probe(struct platform_device *pdev)
} else {
dev_err(dev, "unable to add pcie port.\n");
}
- goto err_disable_pcie_per;
+ return ret;
}
if (IS_ENABLED(CONFIG_RC_MODE_IN_EP_RC_SYS)
&& (imx6_pcie->hard_wired == 0))
imx_pcie_regions_setup(&pdev->dev);
}
-
return 0;
-
-err_disable_pcie_per:
- clk_disable_unprepare(imx6_pcie->pcie_per);
- return ret;
}
static void imx6_pcie_shutdown(struct platform_device *pdev)
@@ -2370,8 +2364,6 @@ static void imx6_pcie_shutdown(struct platform_device *pdev)
/* bring down link, so bootloader gets clean state in case of reboot */
if (imx6_pcie->variant == IMX6Q)
imx6_pcie_assert_core_reset(imx6_pcie);
-
- clk_disable_unprepare(imx6_pcie->pcie_per);
}
static const struct of_device_id imx6_pcie_of_match[] = {