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
20 #include "pcie-designware.h"
88 #define to_uniphier_pcie(x) dev_get_drvdata((x)->dev)
95 val = readl(priv->base + PCL_APP_READY_CTRL); in uniphier_pcie_ltssm_enable()
100 writel(val, priv->base + PCL_APP_READY_CTRL); in uniphier_pcie_ltssm_enable()
108 val = readl(priv->base + PCL_RSTCTRL2); in uniphier_pcie_phy_reset()
113 writel(val, priv->base + PCL_RSTCTRL2); in uniphier_pcie_phy_reset()
120 /* set EP mode */ in uniphier_pcie_pro5_init_ep()
121 val = readl(priv->base + PCL_MODE); in uniphier_pcie_pro5_init_ep()
123 writel(val, priv->base + PCL_MODE); in uniphier_pcie_pro5_init_ep()
126 val = readl(priv->base + PCL_APP_CLK_CTRL); in uniphier_pcie_pro5_init_ep()
128 writel(val, priv->base + PCL_APP_CLK_CTRL); in uniphier_pcie_pro5_init_ep()
131 val = readl(priv->base + PCL_RSTCTRL0); in uniphier_pcie_pro5_init_ep()
134 writel(val, priv->base + PCL_RSTCTRL0); in uniphier_pcie_pro5_init_ep()
145 /* set EP mode */ in uniphier_pcie_nx1_init_ep()
146 val = readl(priv->base + PCL_MODE); in uniphier_pcie_nx1_init_ep()
148 writel(val, priv->base + PCL_MODE); in uniphier_pcie_nx1_init_ep()
151 val = readl(priv->base + PCL_APP_PM0); in uniphier_pcie_nx1_init_ep()
153 writel(val, priv->base + PCL_APP_PM0); in uniphier_pcie_nx1_init_ep()
156 val = readl(priv->base + PCL_PINCTRL0); in uniphier_pcie_nx1_init_ep()
161 writel(val, priv->base + PCL_PINCTRL0); in uniphier_pcie_nx1_init_ep()
168 val = readl(priv->base + PCL_PINCTRL0); in uniphier_pcie_nx1_init_ep()
170 writel(val, priv->base + PCL_PINCTRL0); in uniphier_pcie_nx1_init_ep()
179 ret = readl_poll_timeout(priv->base + PCL_PIPEMON, status, in uniphier_pcie_nx1_wait_ep()
182 dev_err(priv->pci.dev, in uniphier_pcie_nx1_wait_ep()
183 "Failed to initialize controller in EP mode\n"); in uniphier_pcie_nx1_wait_ep()
206 static void uniphier_pcie_ep_init(struct dw_pcie_ep *ep) in uniphier_pcie_ep_init() argument
208 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_ep_init()
215 static int uniphier_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep) in uniphier_pcie_ep_raise_legacy_irq() argument
217 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_ep_raise_legacy_irq()
227 val = readl(priv->base + PCL_APP_INTX); in uniphier_pcie_ep_raise_legacy_irq()
229 writel(val, priv->base + PCL_APP_INTX); in uniphier_pcie_ep_raise_legacy_irq()
235 writel(val, priv->base + PCL_APP_INTX); in uniphier_pcie_ep_raise_legacy_irq()
240 static int uniphier_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, in uniphier_pcie_ep_raise_msi_irq() argument
243 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_ep_raise_msi_irq()
248 | FIELD_PREP(PCL_APP_VEN_MSI_VECTOR_MASK, interrupt_num - 1); in uniphier_pcie_ep_raise_msi_irq()
249 writel(val, priv->base + PCL_APP_MSI0); in uniphier_pcie_ep_raise_msi_irq()
251 val = readl(priv->base + PCL_APP_MSI1); in uniphier_pcie_ep_raise_msi_irq()
253 writel(val, priv->base + PCL_APP_MSI1); in uniphier_pcie_ep_raise_msi_irq()
258 static int uniphier_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no, in uniphier_pcie_ep_raise_irq() argument
262 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_ep_raise_irq()
266 return uniphier_pcie_ep_raise_legacy_irq(ep); in uniphier_pcie_ep_raise_irq()
268 return uniphier_pcie_ep_raise_msi_irq(ep, func_no, in uniphier_pcie_ep_raise_irq()
271 dev_err(pci->dev, "UNKNOWN IRQ type (%d)\n", type); in uniphier_pcie_ep_raise_irq()
278 uniphier_pcie_get_features(struct dw_pcie_ep *ep) in uniphier_pcie_get_features() argument
280 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in uniphier_pcie_get_features()
283 return &priv->data->features; in uniphier_pcie_get_features()
296 ret = clk_prepare_enable(priv->clk); in uniphier_pcie_ep_enable()
300 ret = clk_prepare_enable(priv->clk_gio); in uniphier_pcie_ep_enable()
304 ret = reset_control_deassert(priv->rst); in uniphier_pcie_ep_enable()
308 ret = reset_control_deassert(priv->rst_gio); in uniphier_pcie_ep_enable()
312 if (priv->data->init) in uniphier_pcie_ep_enable()
313 priv->data->init(priv); in uniphier_pcie_ep_enable()
317 ret = phy_init(priv->phy); in uniphier_pcie_ep_enable()
323 if (priv->data->wait) { in uniphier_pcie_ep_enable()
324 ret = priv->data->wait(priv); in uniphier_pcie_ep_enable()
332 phy_exit(priv->phy); in uniphier_pcie_ep_enable()
334 reset_control_assert(priv->rst_gio); in uniphier_pcie_ep_enable()
336 reset_control_assert(priv->rst); in uniphier_pcie_ep_enable()
338 clk_disable_unprepare(priv->clk_gio); in uniphier_pcie_ep_enable()
340 clk_disable_unprepare(priv->clk); in uniphier_pcie_ep_enable()
352 struct device *dev = &pdev->dev; in uniphier_pcie_ep_probe()
358 return -ENOMEM; in uniphier_pcie_ep_probe()
360 priv->data = of_device_get_match_data(dev); in uniphier_pcie_ep_probe()
361 if (WARN_ON(!priv->data)) in uniphier_pcie_ep_probe()
362 return -EINVAL; in uniphier_pcie_ep_probe()
364 priv->pci.dev = dev; in uniphier_pcie_ep_probe()
365 priv->pci.ops = &dw_pcie_ops; in uniphier_pcie_ep_probe()
367 priv->base = devm_platform_ioremap_resource_byname(pdev, "link"); in uniphier_pcie_ep_probe()
368 if (IS_ERR(priv->base)) in uniphier_pcie_ep_probe()
369 return PTR_ERR(priv->base); in uniphier_pcie_ep_probe()
371 if (priv->data->has_gio) { in uniphier_pcie_ep_probe()
372 priv->clk_gio = devm_clk_get(dev, "gio"); in uniphier_pcie_ep_probe()
373 if (IS_ERR(priv->clk_gio)) in uniphier_pcie_ep_probe()
374 return PTR_ERR(priv->clk_gio); in uniphier_pcie_ep_probe()
376 priv->rst_gio = devm_reset_control_get_shared(dev, "gio"); in uniphier_pcie_ep_probe()
377 if (IS_ERR(priv->rst_gio)) in uniphier_pcie_ep_probe()
378 return PTR_ERR(priv->rst_gio); in uniphier_pcie_ep_probe()
381 priv->clk = devm_clk_get(dev, "link"); in uniphier_pcie_ep_probe()
382 if (IS_ERR(priv->clk)) in uniphier_pcie_ep_probe()
383 return PTR_ERR(priv->clk); in uniphier_pcie_ep_probe()
385 priv->rst = devm_reset_control_get_shared(dev, "link"); in uniphier_pcie_ep_probe()
386 if (IS_ERR(priv->rst)) in uniphier_pcie_ep_probe()
387 return PTR_ERR(priv->rst); in uniphier_pcie_ep_probe()
389 priv->phy = devm_phy_optional_get(dev, "pcie-phy"); in uniphier_pcie_ep_probe()
390 if (IS_ERR(priv->phy)) { in uniphier_pcie_ep_probe()
391 ret = PTR_ERR(priv->phy); in uniphier_pcie_ep_probe()
402 priv->pci.ep.ops = &uniphier_pcie_ep_ops; in uniphier_pcie_ep_probe()
403 return dw_pcie_ep_init(&priv->pci.ep); in uniphier_pcie_ep_probe()
435 .compatible = "socionext,uniphier-pro5-pcie-ep",
439 .compatible = "socionext,uniphier-nx1-pcie-ep",
448 .name = "uniphier-pcie-ep",