diff options
Diffstat (limited to 'drivers/pci/controller/dwc/pci-keystone.c')
| -rw-r--r-- | drivers/pci/controller/dwc/pci-keystone.c | 37 | 
1 files changed, 28 insertions, 9 deletions
| diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c index 865258d8c53c..1c2ee4e13f1c 100644 --- a/drivers/pci/controller/dwc/pci-keystone.c +++ b/drivers/pci/controller/dwc/pci-keystone.c @@ -747,9 +747,9 @@ err:  #ifdef CONFIG_ARM  /* - * When a PCI device does not exist during config cycles, keystone host gets a - * bus error instead of returning 0xffffffff. This handler always returns 0 - * for this kind of faults. + * When a PCI device does not exist during config cycles, keystone host + * gets a bus error instead of returning 0xffffffff (PCI_ERROR_RESPONSE). + * This handler always returns 0 for this kind of fault.   */  static int ks_pcie_fault(unsigned long addr, unsigned int fsr,  			 struct pt_regs *regs) @@ -775,12 +775,19 @@ static int __init ks_pcie_init_id(struct keystone_pcie *ks_pcie)  	struct dw_pcie *pci = ks_pcie->pci;  	struct device *dev = pci->dev;  	struct device_node *np = dev->of_node; +	struct of_phandle_args args; +	unsigned int offset = 0;  	devctrl_regs = syscon_regmap_lookup_by_phandle(np, "ti,syscon-pcie-id");  	if (IS_ERR(devctrl_regs))  		return PTR_ERR(devctrl_regs); -	ret = regmap_read(devctrl_regs, 0, &id); +	/* Do not error out to maintain old DT compatibility */ +	ret = of_parse_phandle_with_fixed_args(np, "ti,syscon-pcie-id", 1, 0, &args); +	if (!ret) +		offset = args.args[0]; + +	ret = regmap_read(devctrl_regs, offset, &id);  	if (ret)  		return ret; @@ -989,6 +996,8 @@ err_phy:  static int ks_pcie_set_mode(struct device *dev)  {  	struct device_node *np = dev->of_node; +	struct of_phandle_args args; +	unsigned int offset = 0;  	struct regmap *syscon;  	u32 val;  	u32 mask; @@ -998,10 +1007,15 @@ static int ks_pcie_set_mode(struct device *dev)  	if (IS_ERR(syscon))  		return 0; +	/* Do not error out to maintain old DT compatibility */ +	ret = of_parse_phandle_with_fixed_args(np, "ti,syscon-pcie-mode", 1, 0, &args); +	if (!ret) +		offset = args.args[0]; +  	mask = KS_PCIE_DEV_TYPE_MASK | KS_PCIE_SYSCLOCKOUTEN;  	val = KS_PCIE_DEV_TYPE(RC) | KS_PCIE_SYSCLOCKOUTEN; -	ret = regmap_update_bits(syscon, 0, mask, val); +	ret = regmap_update_bits(syscon, offset, mask, val);  	if (ret) {  		dev_err(dev, "failed to set pcie mode\n");  		return ret; @@ -1014,6 +1028,8 @@ static int ks_pcie_am654_set_mode(struct device *dev,  				  enum dw_pcie_device_mode mode)  {  	struct device_node *np = dev->of_node; +	struct of_phandle_args args; +	unsigned int offset = 0;  	struct regmap *syscon;  	u32 val;  	u32 mask; @@ -1023,6 +1039,11 @@ static int ks_pcie_am654_set_mode(struct device *dev,  	if (IS_ERR(syscon))  		return 0; +	/* Do not error out to maintain old DT compatibility */ +	ret = of_parse_phandle_with_fixed_args(np, "ti,syscon-pcie-mode", 1, 0, &args); +	if (!ret) +		offset = args.args[0]; +  	mask = AM654_PCIE_DEV_TYPE_MASK;  	switch (mode) { @@ -1037,7 +1058,7 @@ static int ks_pcie_am654_set_mode(struct device *dev,  		return -EINVAL;  	} -	ret = regmap_update_bits(syscon, 0, mask, val); +	ret = regmap_update_bits(syscon, offset, mask, val);  	if (ret) {  		dev_err(dev, "failed to set pcie mode\n");  		return ret; @@ -1087,7 +1108,6 @@ static int __init ks_pcie_probe(struct platform_device *pdev)  	struct device *dev = &pdev->dev;  	struct device_node *np = dev->of_node;  	const struct ks_pcie_of_data *data; -	const struct of_device_id *match;  	enum dw_pcie_device_mode mode;  	struct dw_pcie *pci;  	struct keystone_pcie *ks_pcie; @@ -1104,8 +1124,7 @@ static int __init ks_pcie_probe(struct platform_device *pdev)  	int irq;  	int i; -	match = of_match_device(of_match_ptr(ks_pcie_of_match), dev); -	data = (struct ks_pcie_of_data *)match->data; +	data = of_device_get_match_data(dev);  	if (!data)  		return -EINVAL; |