summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/host/pci-imx6.c52
1 files changed, 30 insertions, 22 deletions
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index a92679e13eb0..84db823d04dc 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -541,12 +541,6 @@ 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;
}
@@ -666,10 +660,12 @@ static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
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;
+ 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;
+ }
}
@@ -1239,7 +1235,6 @@ 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;
}
@@ -2128,7 +2123,6 @@ 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,
@@ -2138,6 +2132,12 @@ 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,7 +2145,8 @@ 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");
- return PTR_ERR(imx6_pcie->iomuxc_gpr);
+ ret = PTR_ERR(imx6_pcie->iomuxc_gpr);
+ goto err_disable_pcie_per;
}
/* Grab PCIe PHY Tx Settings */
@@ -2192,18 +2193,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)
- return -EINVAL;
+ goto err_disable_pcie_per;
ret = of_pci_get_host_bridge_resources(np, 0, 0xff, &res,
&pp->io_base);
if (ret)
- return ret;
+ goto err_disable_pcie_per;
ret = devm_request_pci_bus_resources(&pdev->dev, &res);
if (ret) {
dev_err(pp->dev, "missing ranges property\n");
pci_free_resource_list(&res);
- return ret;
+ goto err_disable_pcie_per;
}
/* Get the I/O and memory ranges from DT */
@@ -2224,7 +2225,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");
- return ret;
+ goto err_disable_pcie_per;
}
imx6_pcie_setup_ep(pp);
@@ -2261,7 +2262,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);
- return ret;
+ goto err_disable_pcie_per;
}
test_reg2 = devm_kzalloc(&pdev->dev,
@@ -2269,7 +2270,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);
- return ret;
+ goto err_disable_pcie_per;
}
/*
@@ -2284,7 +2285,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);
- return ret;
+ goto err_disable_pcie_per;
}
for (i = 0; i < test_region_size; i = i + 4) {
@@ -2337,7 +2338,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)
- return -EINVAL;
+ goto err_disable_pcie_per;
ret = imx6_add_pcie_port(imx6_pcie, pdev);
if (ret < 0) {
@@ -2348,13 +2349,18 @@ static int imx6_pcie_probe(struct platform_device *pdev)
} else {
dev_err(dev, "unable to add pcie port.\n");
}
- return ret;
+ goto err_disable_pcie_per;
}
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)
@@ -2364,6 +2370,8 @@ 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[] = {