diff options
Diffstat (limited to 'drivers/pci/controller/dwc')
| -rw-r--r-- | drivers/pci/controller/dwc/pci-keystone.c | 37 | 
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c index 95997885a05c..dfe54553d832 100644 --- a/drivers/pci/controller/dwc/pci-keystone.c +++ b/drivers/pci/controller/dwc/pci-keystone.c @@ -79,6 +79,15 @@  #define PCIE_RC_K2L			0xb00a  #define PCIE_RC_K2G			0xb00b +#define KS_PCIE_DEV_TYPE_MASK		(0x3 << 1) +#define KS_PCIE_DEV_TYPE(mode)		((mode) << 1) + +#define EP				0x0 +#define LEG_EP				0x1 +#define RC				0x2 + +#define KS_PCIE_SYSCLOCKOUTEN		BIT(0) +  #define to_keystone_pcie(x)		dev_get_drvdata((x)->dev)  struct keystone_pcie { @@ -876,6 +885,30 @@ err_phy:  	return ret;  } +static int ks_pcie_set_mode(struct device *dev) +{ +	struct device_node *np = dev->of_node; +	struct regmap *syscon; +	u32 val; +	u32 mask; +	int ret = 0; + +	syscon = syscon_regmap_lookup_by_phandle(np, "ti,syscon-pcie-mode"); +	if (IS_ERR(syscon)) +		return 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); +	if (ret) { +		dev_err(dev, "failed to set pcie mode\n"); +		return ret; +	} + +	return 0; +} +  static int __init ks_pcie_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev; @@ -988,6 +1021,10 @@ static int __init ks_pcie_probe(struct platform_device *pdev)  		goto err_get_sync;  	} +	ret = ks_pcie_set_mode(dev); +	if (ret < 0) +		goto err_get_sync; +  	ret = ks_pcie_add_pcie_port(ks_pcie, pdev);  	if (ret < 0)  		goto err_get_sync;  | 
