lkml.org 
[lkml]   [2019]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[RFC PATCH 10/30] PCI: cadence: Use *_start_link() and *_wait_for_link() to establish link
Date
Use cdns_pcie_start_link() to start link training and
cdns_pcie_wait_for_link() in order to wait to establish the link.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/pci/controller/pcie-cadence-ep.c | 11 ++++++++++-
drivers/pci/controller/pcie-cadence-host.c | 11 +++++++++++
2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/pcie-cadence-ep.c b/drivers/pci/controller/pcie-cadence-ep.c
index b044167071e6..825a515821c3 100644
--- a/drivers/pci/controller/pcie-cadence-ep.c
+++ b/drivers/pci/controller/pcie-cadence-ep.c
@@ -21,6 +21,7 @@
/**
* struct cdns_pcie_ep - private data for this PCIe endpoint controller driver
* @pcie: Cadence PCIe controller
+ * @dev: pointer to PCIe EP device
* @max_regions: maximum number of regions supported by hardware
* @ob_region_map: bitmask of mapped outbound regions
* @ob_addr: base addresses in the AXI bus where the outbound regions start
@@ -37,6 +38,7 @@
*/
struct cdns_pcie_ep {
struct cdns_pcie pcie;
+ struct device *dev;
u32 max_regions;
unsigned long ob_region_map;
phys_addr_t *ob_addr;
@@ -386,6 +388,7 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
struct cdns_pcie *pcie = &ep->pcie;
struct pci_epf *epf;
+ int ret = 0;
u32 cfg;

/*
@@ -397,7 +400,11 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
cfg |= BIT(epf->func_no);
cdns_pcie_writel(pcie, CDNS_PCIE_LM_EP_FUNC_CFG, cfg);

- return 0;
+ ret = cdns_pcie_start_link(pcie, true);
+ if (ret)
+ dev_err(ep->dev, "Failed to start link\n");
+
+ return ret;
}

static const struct pci_epc_features cdns_pcie_epc_features = {
@@ -460,6 +467,8 @@ static int cdns_pcie_ep_probe(struct platform_device *pdev)
if (!ep)
return -ENOMEM;

+ ep->dev = dev;
+
pcie = &ep->pcie;
pcie->is_rc = false;
pcie->plat_data = pdev->dev.platform_data;
diff --git a/drivers/pci/controller/pcie-cadence-host.c b/drivers/pci/controller/pcie-cadence-host.c
index 2363f05e7c58..4ad8f2ece6e2 100644
--- a/drivers/pci/controller/pcie-cadence-host.c
+++ b/drivers/pci/controller/pcie-cadence-host.c
@@ -365,6 +365,14 @@ static int cdns_pcie_host_probe(struct platform_device *pdev)
goto err_get_sync;
}

+ ret = cdns_pcie_start_link(pcie, true);
+ if (ret) {
+ dev_err(dev, "Failed to start link\n");
+ goto err_start_link;
+ }
+
+ cdns_pcie_wait_for_link(dev, pcie);
+
ret = cdns_pcie_host_init(dev, &resources, rc);
if (ret)
goto err_init;
@@ -386,6 +394,9 @@ static int cdns_pcie_host_probe(struct platform_device *pdev)
pci_free_resource_list(&resources);

err_init:
+ cdns_pcie_start_link(pcie, false);
+
+ err_start_link:
pm_runtime_put_sync(dev);

err_get_sync:
--
2.17.1
\
 
 \ /
  Last update: 2019-06-04 15:20    [W:4.666 / U:0.016 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site