diff options
Diffstat (limited to 'drivers/pci/host')
| -rw-r--r-- | drivers/pci/host/pcie-designware.c | 7 | ||||
| -rw-r--r-- | drivers/pci/host/pcie-qcom.c | 2 | ||||
| -rw-r--r-- | drivers/pci/host/pcie-rockchip.c | 62 | 
3 files changed, 68 insertions, 3 deletions
| diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 035f50c03281..bed19994c1e9 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c @@ -637,8 +637,6 @@ int dw_pcie_host_init(struct pcie_port *pp)  		}  	} -	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp); -  	if (pp->ops->host_init)  		pp->ops->host_init(pp); @@ -809,6 +807,11 @@ void dw_pcie_setup_rc(struct pcie_port *pp)  {  	u32 val; +	/* get iATU unroll support */ +	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp); +	dev_dbg(pp->dev, "iATU unroll: %s\n", +		pp->iatu_unroll_enabled ? "enabled" : "disabled"); +  	/* set the number of lanes */  	val = dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL);  	val &= ~PORT_LINK_MODE_MASK; diff --git a/drivers/pci/host/pcie-qcom.c b/drivers/pci/host/pcie-qcom.c index ef0a84c7a588..35936409b2d4 100644 --- a/drivers/pci/host/pcie-qcom.c +++ b/drivers/pci/host/pcie-qcom.c @@ -533,11 +533,11 @@ static int qcom_pcie_probe(struct platform_device *pdev)  	if (IS_ERR(pcie->phy))  		return PTR_ERR(pcie->phy); +	pp->dev = dev;  	ret = pcie->ops->get_resources(pcie);  	if (ret)  		return ret; -	pp->dev = dev;  	pp->root_bus_nr = -1;  	pp->ops = &qcom_pcie_dw_ops; diff --git a/drivers/pci/host/pcie-rockchip.c b/drivers/pci/host/pcie-rockchip.c index e0b22dab9b7a..e04f69beb42d 100644 --- a/drivers/pci/host/pcie-rockchip.c +++ b/drivers/pci/host/pcie-rockchip.c @@ -190,6 +190,9 @@ struct rockchip_pcie {  	struct	reset_control *mgmt_rst;  	struct	reset_control *mgmt_sticky_rst;  	struct	reset_control *pipe_rst; +	struct	reset_control *pm_rst; +	struct	reset_control *aclk_rst; +	struct	reset_control *pclk_rst;  	struct	clk *aclk_pcie;  	struct	clk *aclk_perf_pcie;  	struct	clk *hclk_pcie; @@ -408,6 +411,44 @@ static int rockchip_pcie_init_port(struct rockchip_pcie *rockchip)  	gpiod_set_value(rockchip->ep_gpio, 0); +	err = reset_control_assert(rockchip->aclk_rst); +	if (err) { +		dev_err(dev, "assert aclk_rst err %d\n", err); +		return err; +	} + +	err = reset_control_assert(rockchip->pclk_rst); +	if (err) { +		dev_err(dev, "assert pclk_rst err %d\n", err); +		return err; +	} + +	err = reset_control_assert(rockchip->pm_rst); +	if (err) { +		dev_err(dev, "assert pm_rst err %d\n", err); +		return err; +	} + +	udelay(10); + +	err = reset_control_deassert(rockchip->pm_rst); +	if (err) { +		dev_err(dev, "deassert pm_rst err %d\n", err); +		return err; +	} + +	err = reset_control_deassert(rockchip->aclk_rst); +	if (err) { +		dev_err(dev, "deassert mgmt_sticky_rst err %d\n", err); +		return err; +	} + +	err = reset_control_deassert(rockchip->pclk_rst); +	if (err) { +		dev_err(dev, "deassert mgmt_sticky_rst err %d\n", err); +		return err; +	} +  	err = phy_init(rockchip->phy);  	if (err < 0) {  		dev_err(dev, "fail to init phy, err %d\n", err); @@ -781,6 +822,27 @@ static int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip)  		return PTR_ERR(rockchip->pipe_rst);  	} +	rockchip->pm_rst = devm_reset_control_get(dev, "pm"); +	if (IS_ERR(rockchip->pm_rst)) { +		if (PTR_ERR(rockchip->pm_rst) != -EPROBE_DEFER) +			dev_err(dev, "missing pm reset property in node\n"); +		return PTR_ERR(rockchip->pm_rst); +	} + +	rockchip->pclk_rst = devm_reset_control_get(dev, "pclk"); +	if (IS_ERR(rockchip->pclk_rst)) { +		if (PTR_ERR(rockchip->pclk_rst) != -EPROBE_DEFER) +			dev_err(dev, "missing pclk reset property in node\n"); +		return PTR_ERR(rockchip->pclk_rst); +	} + +	rockchip->aclk_rst = devm_reset_control_get(dev, "aclk"); +	if (IS_ERR(rockchip->aclk_rst)) { +		if (PTR_ERR(rockchip->aclk_rst) != -EPROBE_DEFER) +			dev_err(dev, "missing aclk reset property in node\n"); +		return PTR_ERR(rockchip->aclk_rst); +	} +  	rockchip->ep_gpio = devm_gpiod_get(dev, "ep", GPIOD_OUT_HIGH);  	if (IS_ERR(rockchip->ep_gpio)) {  		dev_err(dev, "missing ep-gpios property in node\n"); |