Lines Matching +full:uniphier +full:- +full:pro5 +full:- +full:pcie +full:- +full:ep
1 // SPDX-License-Identifier: GPL-2.0
3 * PCIe endpoint controller driver for UniPhier SoCs
19 #include "pcie-designware.h"
66 #define to_uniphier_pcie(x) dev_get_drvdata((x)->dev)
73 val = readl(priv->base + PCL_APP_READY_CTRL); in uniphier_pcie_ltssm_enable()
78 writel(val, priv->base + PCL_APP_READY_CTRL); in uniphier_pcie_ltssm_enable()
86 val = readl(priv->base + PCL_RSTCTRL2); in uniphier_pcie_phy_reset()
91 writel(val, priv->base + PCL_RSTCTRL2); in uniphier_pcie_phy_reset()
98 /* set EP mode */ in uniphier_pcie_init_ep()
99 val = readl(priv->base + PCL_MODE); in uniphier_pcie_init_ep()
101 writel(val, priv->base + PCL_MODE); in uniphier_pcie_init_ep()
104 val = readl(priv->base + PCL_APP_CLK_CTRL); in uniphier_pcie_init_ep()
106 writel(val, priv->base + PCL_APP_CLK_CTRL); in uniphier_pcie_init_ep()
109 val = readl(priv->base + PCL_RSTCTRL0); in uniphier_pcie_init_ep()
112 writel(val, priv->base + PCL_RSTCTRL0); in uniphier_pcie_init_ep()
135 static void uniphier_pcie_ep_init(struct dw_pcie_ep *ep) in uniphier_pcie_ep_init() argument
137 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_ep_init()
144 static int uniphier_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep) in uniphier_pcie_ep_raise_legacy_irq() argument
146 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_ep_raise_legacy_irq()
156 val = readl(priv->base + PCL_APP_INTX); in uniphier_pcie_ep_raise_legacy_irq()
158 writel(val, priv->base + PCL_APP_INTX); in uniphier_pcie_ep_raise_legacy_irq()
164 writel(val, priv->base + PCL_APP_INTX); in uniphier_pcie_ep_raise_legacy_irq()
169 static int uniphier_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, in uniphier_pcie_ep_raise_msi_irq() argument
172 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_ep_raise_msi_irq()
177 | FIELD_PREP(PCL_APP_VEN_MSI_VECTOR_MASK, interrupt_num - 1); in uniphier_pcie_ep_raise_msi_irq()
178 writel(val, priv->base + PCL_APP_MSI0); in uniphier_pcie_ep_raise_msi_irq()
180 val = readl(priv->base + PCL_APP_MSI1); in uniphier_pcie_ep_raise_msi_irq()
182 writel(val, priv->base + PCL_APP_MSI1); in uniphier_pcie_ep_raise_msi_irq()
187 static int uniphier_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no, in uniphier_pcie_ep_raise_irq() argument
191 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_ep_raise_irq()
195 return uniphier_pcie_ep_raise_legacy_irq(ep); in uniphier_pcie_ep_raise_irq()
197 return uniphier_pcie_ep_raise_msi_irq(ep, func_no, in uniphier_pcie_ep_raise_irq()
200 dev_err(pci->dev, "UNKNOWN IRQ type (%d)\n", type); in uniphier_pcie_ep_raise_irq()
207 uniphier_pcie_get_features(struct dw_pcie_ep *ep) in uniphier_pcie_get_features() argument
209 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_get_features()
212 return priv->features; in uniphier_pcie_get_features()
224 struct dw_pcie *pci = &priv->pci; in uniphier_add_pcie_ep()
225 struct dw_pcie_ep *ep = &pci->ep; in uniphier_add_pcie_ep() local
226 struct device *dev = &pdev->dev; in uniphier_add_pcie_ep()
230 ep->ops = &uniphier_pcie_ep_ops; in uniphier_add_pcie_ep()
232 pci->dbi_base2 = devm_platform_ioremap_resource_byname(pdev, "dbi2"); in uniphier_add_pcie_ep()
233 if (IS_ERR(pci->dbi_base2)) in uniphier_add_pcie_ep()
234 return PTR_ERR(pci->dbi_base2); in uniphier_add_pcie_ep()
238 return -EINVAL; in uniphier_add_pcie_ep()
240 ep->phys_base = res->start; in uniphier_add_pcie_ep()
241 ep->addr_size = resource_size(res); in uniphier_add_pcie_ep()
243 ret = dw_pcie_ep_init(ep); in uniphier_add_pcie_ep()
254 ret = clk_prepare_enable(priv->clk); in uniphier_pcie_ep_enable()
258 ret = clk_prepare_enable(priv->clk_gio); in uniphier_pcie_ep_enable()
262 ret = reset_control_deassert(priv->rst); in uniphier_pcie_ep_enable()
266 ret = reset_control_deassert(priv->rst_gio); in uniphier_pcie_ep_enable()
274 ret = phy_init(priv->phy); in uniphier_pcie_ep_enable()
283 reset_control_assert(priv->rst_gio); in uniphier_pcie_ep_enable()
285 reset_control_assert(priv->rst); in uniphier_pcie_ep_enable()
287 clk_disable_unprepare(priv->clk_gio); in uniphier_pcie_ep_enable()
289 clk_disable_unprepare(priv->clk); in uniphier_pcie_ep_enable()
301 struct device *dev = &pdev->dev; in uniphier_pcie_ep_probe()
308 return -ENOMEM; in uniphier_pcie_ep_probe()
310 priv->features = of_device_get_match_data(dev); in uniphier_pcie_ep_probe()
311 if (WARN_ON(!priv->features)) in uniphier_pcie_ep_probe()
312 return -EINVAL; in uniphier_pcie_ep_probe()
314 priv->pci.dev = dev; in uniphier_pcie_ep_probe()
315 priv->pci.ops = &dw_pcie_ops; in uniphier_pcie_ep_probe()
318 priv->pci.dbi_base = devm_pci_remap_cfg_resource(dev, res); in uniphier_pcie_ep_probe()
319 if (IS_ERR(priv->pci.dbi_base)) in uniphier_pcie_ep_probe()
320 return PTR_ERR(priv->pci.dbi_base); in uniphier_pcie_ep_probe()
322 priv->base = devm_platform_ioremap_resource_byname(pdev, "link"); in uniphier_pcie_ep_probe()
323 if (IS_ERR(priv->base)) in uniphier_pcie_ep_probe()
324 return PTR_ERR(priv->base); in uniphier_pcie_ep_probe()
326 priv->clk_gio = devm_clk_get(dev, "gio"); in uniphier_pcie_ep_probe()
327 if (IS_ERR(priv->clk_gio)) in uniphier_pcie_ep_probe()
328 return PTR_ERR(priv->clk_gio); in uniphier_pcie_ep_probe()
330 priv->rst_gio = devm_reset_control_get_shared(dev, "gio"); in uniphier_pcie_ep_probe()
331 if (IS_ERR(priv->rst_gio)) in uniphier_pcie_ep_probe()
332 return PTR_ERR(priv->rst_gio); in uniphier_pcie_ep_probe()
334 priv->clk = devm_clk_get(dev, "link"); in uniphier_pcie_ep_probe()
335 if (IS_ERR(priv->clk)) in uniphier_pcie_ep_probe()
336 return PTR_ERR(priv->clk); in uniphier_pcie_ep_probe()
338 priv->rst = devm_reset_control_get_shared(dev, "link"); in uniphier_pcie_ep_probe()
339 if (IS_ERR(priv->rst)) in uniphier_pcie_ep_probe()
340 return PTR_ERR(priv->rst); in uniphier_pcie_ep_probe()
342 priv->phy = devm_phy_optional_get(dev, "pcie-phy"); in uniphier_pcie_ep_probe()
343 if (IS_ERR(priv->phy)) { in uniphier_pcie_ep_probe()
344 ret = PTR_ERR(priv->phy); in uniphier_pcie_ep_probe()
369 .compatible = "socionext,uniphier-pro5-pcie-ep",
378 .name = "uniphier-pcie-ep",