diff options
Diffstat (limited to 'drivers/pci/controller/dwc/pci-keystone.c')
| -rw-r--r-- | drivers/pci/controller/dwc/pci-keystone.c | 79 | 
1 files changed, 12 insertions, 67 deletions
diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c index a222728238ca..53aa35cb3a49 100644 --- a/drivers/pci/controller/dwc/pci-keystone.c +++ b/drivers/pci/controller/dwc/pci-keystone.c @@ -121,6 +121,7 @@ struct keystone_pcie {  	int			msi_host_irq;  	int			num_lanes; +	u32			num_viewport;  	struct phy		**phy;  	struct device_link	**link;  	struct			device_node *msi_intc_np; @@ -272,14 +273,6 @@ static void ks_pcie_handle_legacy_irq(struct keystone_pcie *ks_pcie,  	ks_pcie_app_writel(ks_pcie, IRQ_EOI, offset);  } -/* - * Dummy function so that DW core doesn't configure MSI - */ -static int ks_pcie_am654_msi_host_init(struct pcie_port *pp) -{ -	return 0; -} -  static void ks_pcie_enable_error_irq(struct keystone_pcie *ks_pcie)  {  	ks_pcie_app_writel(ks_pcie, ERR_IRQ_ENABLE_SET, ERR_IRQ_ALL); @@ -394,9 +387,9 @@ static void ks_pcie_clear_dbi_mode(struct keystone_pcie *ks_pcie)  static void ks_pcie_setup_rc_app_regs(struct keystone_pcie *ks_pcie)  {  	u32 val; +	u32 num_viewport = ks_pcie->num_viewport;  	struct dw_pcie *pci = ks_pcie->pci;  	struct pcie_port *pp = &pci->pp; -	u32 num_viewport = pci->num_viewport;  	u64 start, end;  	struct resource *mem;  	int i; @@ -519,14 +512,8 @@ static void ks_pcie_stop_link(struct dw_pcie *pci)  static int ks_pcie_start_link(struct dw_pcie *pci)  {  	struct keystone_pcie *ks_pcie = to_keystone_pcie(pci); -	struct device *dev = pci->dev;  	u32 val; -	if (dw_pcie_link_up(pci)) { -		dev_dbg(dev, "link is already up\n"); -		return 0; -	} -  	/* Initiate Link Training */  	val = ks_pcie_app_readl(ks_pcie, CMD_STATUS);  	ks_pcie_app_writel(ks_pcie, CMD_STATUS, LTSSM_EN_VAL | val); @@ -821,8 +808,6 @@ static int __init ks_pcie_host_init(struct pcie_port *pp)  	if (ret)  		return ret; -	dw_pcie_setup_rc(pp); -  	ks_pcie_stop_link(pci);  	ks_pcie_setup_rc_app_regs(ks_pcie);  	writew(PCI_IO_RANGE_TYPE_32 | (PCI_IO_RANGE_TYPE_32 << 8), @@ -841,9 +826,6 @@ static int __init ks_pcie_host_init(struct pcie_port *pp)  			"Asynchronous external abort");  #endif -	ks_pcie_start_link(pci); -	dw_pcie_wait_for_link(pci); -  	return 0;  } @@ -854,7 +836,6 @@ static const struct dw_pcie_host_ops ks_pcie_host_ops = {  static const struct dw_pcie_host_ops ks_pcie_am654_host_ops = {  	.host_init = ks_pcie_host_init, -	.msi_host_init = ks_pcie_am654_msi_host_init,  };  static irqreturn_t ks_pcie_err_irq_handler(int irq, void *priv) @@ -864,23 +845,6 @@ static irqreturn_t ks_pcie_err_irq_handler(int irq, void *priv)  	return ks_pcie_handle_error_irq(ks_pcie);  } -static int __init ks_pcie_add_pcie_port(struct keystone_pcie *ks_pcie, -					struct platform_device *pdev) -{ -	struct dw_pcie *pci = ks_pcie->pci; -	struct pcie_port *pp = &pci->pp; -	struct device *dev = &pdev->dev; -	int ret; - -	ret = dw_pcie_host_init(pp); -	if (ret) { -		dev_err(dev, "failed to initialize host\n"); -		return ret; -	} - -	return 0; -} -  static void ks_pcie_am654_write_dbi2(struct dw_pcie *pci, void __iomem *base,  				     u32 reg, size_t size, u32 val)  { @@ -977,33 +941,6 @@ static const struct dw_pcie_ep_ops ks_pcie_am654_ep_ops = {  	.get_features = &ks_pcie_am654_get_features,  }; -static int __init ks_pcie_add_pcie_ep(struct keystone_pcie *ks_pcie, -				      struct platform_device *pdev) -{ -	int ret; -	struct dw_pcie_ep *ep; -	struct resource *res; -	struct device *dev = &pdev->dev; -	struct dw_pcie *pci = ks_pcie->pci; - -	ep = &pci->ep; - -	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "addr_space"); -	if (!res) -		return -EINVAL; - -	ep->phys_base = res->start; -	ep->addr_size = resource_size(res); - -	ret = dw_pcie_ep_init(ep); -	if (ret) { -		dev_err(dev, "failed to initialize endpoint\n"); -		return ret; -	} - -	return 0; -} -  static void ks_pcie_disable_phy(struct keystone_pcie *ks_pcie)  {  	int num_lanes = ks_pcie->num_lanes; @@ -1157,6 +1094,7 @@ static int __init ks_pcie_probe(struct platform_device *pdev)  	struct resource *res;  	unsigned int version;  	void __iomem *base; +	u32 num_viewport;  	struct phy **phy;  	u32 num_lanes;  	char name[10]; @@ -1288,6 +1226,12 @@ static int __init ks_pcie_probe(struct platform_device *pdev)  			goto err_get_sync;  		} +		ret = of_property_read_u32(np, "num-viewport", &num_viewport); +		if (ret < 0) { +			dev_err(dev, "unable to read *num-viewport* property\n"); +			goto err_get_sync; +		} +  		/*  		 * "Power Sequencing and Reset Signal Timings" table in  		 * PCI EXPRESS CARD ELECTROMECHANICAL SPECIFICATION, REV. 2.0 @@ -1301,8 +1245,9 @@ static int __init ks_pcie_probe(struct platform_device *pdev)  			gpiod_set_value_cansleep(gpiod, 1);  		} +		ks_pcie->num_viewport = num_viewport;  		pci->pp.ops = host_ops; -		ret = ks_pcie_add_pcie_port(ks_pcie, pdev); +		ret = dw_pcie_host_init(&pci->pp);  		if (ret < 0)  			goto err_get_sync;  		break; @@ -1313,7 +1258,7 @@ static int __init ks_pcie_probe(struct platform_device *pdev)  		}  		pci->ep.ops = ep_ops; -		ret = ks_pcie_add_pcie_ep(ks_pcie, pdev); +		ret = dw_pcie_ep_init(&pci->ep);  		if (ret < 0)  			goto err_get_sync;  		break;  |