Lines Matching +full:pci +full:- +full:ep

1 // SPDX-License-Identifier: GPL-2.0-only
18 #include <linux/pci.h>
22 #include "pcie-designware.h"
59 struct dw_pcie pci; member
74 gpiod_set_value_cansleep(pcie->reset, 1); in keembay_ep_reset_assert()
83 * For more details, refer to PCI Express Card Electromechanical in keembay_ep_reset_deassert()
84 * Specification Revision 1.1, Table-2.4. in keembay_ep_reset_deassert()
88 gpiod_set_value_cansleep(pcie->reset, 0); in keembay_ep_reset_deassert()
96 val = readl(pcie->apb_base + PCIE_REGS_PCIE_APP_CNTRL); in keembay_pcie_ltssm_set()
101 writel(val, pcie->apb_base + PCIE_REGS_PCIE_APP_CNTRL); in keembay_pcie_ltssm_set()
104 static int keembay_pcie_link_up(struct dw_pcie *pci) in keembay_pcie_link_up() argument
106 struct keembay_pcie *pcie = dev_get_drvdata(pci->dev); in keembay_pcie_link_up()
109 val = readl(pcie->apb_base + PCIE_REGS_PCIE_SII_PM_STATE); in keembay_pcie_link_up()
114 static int keembay_pcie_start_link(struct dw_pcie *pci) in keembay_pcie_start_link() argument
116 struct keembay_pcie *pcie = dev_get_drvdata(pci->dev); in keembay_pcie_start_link()
120 if (pcie->mode == DW_PCIE_EP_TYPE) in keembay_pcie_start_link()
125 ret = readl_poll_timeout(pcie->apb_base + PCIE_REGS_PCIE_PHY_STAT, in keembay_pcie_start_link()
129 dev_err(pci->dev, "MPLLA is not locked\n"); in keembay_pcie_start_link()
138 static void keembay_pcie_stop_link(struct dw_pcie *pci) in keembay_pcie_stop_link() argument
140 struct keembay_pcie *pcie = dev_get_drvdata(pci->dev); in keembay_pcie_stop_link()
187 struct dw_pcie *pci = &pcie->pci; in keembay_pcie_probe_clocks() local
188 struct device *dev = pci->dev; in keembay_pcie_probe_clocks()
190 pcie->clk_master = keembay_pcie_probe_clock(dev, "master", 0); in keembay_pcie_probe_clocks()
191 if (IS_ERR(pcie->clk_master)) in keembay_pcie_probe_clocks()
192 return dev_err_probe(dev, PTR_ERR(pcie->clk_master), in keembay_pcie_probe_clocks()
195 pcie->clk_aux = keembay_pcie_probe_clock(dev, "aux", AUX_CLK_RATE_HZ); in keembay_pcie_probe_clocks()
196 if (IS_ERR(pcie->clk_aux)) in keembay_pcie_probe_clocks()
197 return dev_err_probe(dev, PTR_ERR(pcie->clk_aux), in keembay_pcie_probe_clocks()
211 struct dw_pcie *pci = &pcie->pci; in keembay_pcie_pll_init() local
216 writel(val, pcie->apb_base + PCIE_REGS_LJPLL_CNTRL_2); in keembay_pcie_pll_init()
220 writel(val, pcie->apb_base + PCIE_REGS_LJPLL_CNTRL_3); in keembay_pcie_pll_init()
223 writel(val, pcie->apb_base + PCIE_REGS_LJPLL_CNTRL_0); in keembay_pcie_pll_init()
225 ret = readl_poll_timeout(pcie->apb_base + PCIE_REGS_LJPLL_STA, in keembay_pcie_pll_init()
229 dev_err(pci->dev, "Low jitter PLL is not locked\n"); in keembay_pcie_pll_init()
252 pp = &pcie->pci.pp; in keembay_pcie_msi_irq_handler()
253 val = readl(pcie->apb_base + PCIE_REGS_INTERRUPT_STATUS); in keembay_pcie_msi_irq_handler()
254 mask = readl(pcie->apb_base + PCIE_REGS_INTERRUPT_ENABLE); in keembay_pcie_msi_irq_handler()
260 writel(status, pcie->apb_base + PCIE_REGS_INTERRUPT_STATUS); in keembay_pcie_msi_irq_handler()
268 struct dw_pcie *pci = &pcie->pci; in keembay_pcie_setup_msi_irq() local
269 struct device *dev = pci->dev; in keembay_pcie_setup_msi_irq()
283 static void keembay_pcie_ep_init(struct dw_pcie_ep *ep) in keembay_pcie_ep_init() argument
285 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in keembay_pcie_ep_init() local
286 struct keembay_pcie *pcie = dev_get_drvdata(pci->dev); in keembay_pcie_ep_init()
288 writel(EDMA_INT_EN, pcie->apb_base + PCIE_REGS_INTERRUPT_ENABLE); in keembay_pcie_ep_init()
291 static int keembay_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no, in keembay_pcie_ep_raise_irq() argument
295 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in keembay_pcie_ep_raise_irq() local
300 dev_err(pci->dev, "Legacy IRQ is not supported\n"); in keembay_pcie_ep_raise_irq()
301 return -EINVAL; in keembay_pcie_ep_raise_irq()
303 return dw_pcie_ep_raise_msi_irq(ep, func_no, interrupt_num); in keembay_pcie_ep_raise_irq()
305 return dw_pcie_ep_raise_msix_irq(ep, func_no, interrupt_num); in keembay_pcie_ep_raise_irq()
307 dev_err(pci->dev, "Unknown IRQ type %d\n", type); in keembay_pcie_ep_raise_irq()
308 return -EINVAL; in keembay_pcie_ep_raise_irq()
322 keembay_pcie_get_features(struct dw_pcie_ep *ep) in keembay_pcie_get_features() argument
339 struct dw_pcie *pci = &pcie->pci; in keembay_pcie_add_pcie_port() local
340 struct dw_pcie_rp *pp = &pci->pp; in keembay_pcie_add_pcie_port()
341 struct device *dev = &pdev->dev; in keembay_pcie_add_pcie_port()
345 pp->ops = &keembay_pcie_host_ops; in keembay_pcie_add_pcie_port()
346 pp->msi_irq[0] = -ENODEV; in keembay_pcie_add_pcie_port()
352 pcie->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); in keembay_pcie_add_pcie_port()
353 if (IS_ERR(pcie->reset)) in keembay_pcie_add_pcie_port()
354 return PTR_ERR(pcie->reset); in keembay_pcie_add_pcie_port()
360 val = readl(pcie->apb_base + PCIE_REGS_PCIE_PHY_CNTL); in keembay_pcie_add_pcie_port()
362 writel(val, pcie->apb_base + PCIE_REGS_PCIE_PHY_CNTL); in keembay_pcie_add_pcie_port()
364 writel(PCIE_DEVICE_TYPE, pcie->apb_base + PCIE_REGS_PCIE_CFG); in keembay_pcie_add_pcie_port()
370 val = readl(pcie->apb_base + PCIE_REGS_PCIE_CFG); in keembay_pcie_add_pcie_port()
371 writel(val | PCIE_RSTN, pcie->apb_base + PCIE_REGS_PCIE_CFG); in keembay_pcie_add_pcie_port()
381 val = readl(pcie->apb_base + PCIE_REGS_INTERRUPT_ENABLE); in keembay_pcie_add_pcie_port()
384 writel(val, pcie->apb_base + PCIE_REGS_INTERRUPT_ENABLE); in keembay_pcie_add_pcie_port()
392 struct device *dev = &pdev->dev; in keembay_pcie_probe()
394 struct dw_pcie *pci; in keembay_pcie_probe() local
399 return -ENODEV; in keembay_pcie_probe()
401 mode = (enum dw_pcie_device_mode)data->mode; in keembay_pcie_probe()
405 return -ENOMEM; in keembay_pcie_probe()
407 pci = &pcie->pci; in keembay_pcie_probe()
408 pci->dev = dev; in keembay_pcie_probe()
409 pci->ops = &keembay_pcie_ops; in keembay_pcie_probe()
411 pcie->mode = mode; in keembay_pcie_probe()
413 pcie->apb_base = devm_platform_ioremap_resource_byname(pdev, "apb"); in keembay_pcie_probe()
414 if (IS_ERR(pcie->apb_base)) in keembay_pcie_probe()
415 return PTR_ERR(pcie->apb_base); in keembay_pcie_probe()
419 switch (pcie->mode) { in keembay_pcie_probe()
422 return -ENODEV; in keembay_pcie_probe()
427 return -ENODEV; in keembay_pcie_probe()
429 pci->ep.ops = &keembay_pcie_ep_ops; in keembay_pcie_probe()
430 return dw_pcie_ep_init(&pci->ep); in keembay_pcie_probe()
432 dev_err(dev, "Invalid device type %d\n", pcie->mode); in keembay_pcie_probe()
433 return -ENODEV; in keembay_pcie_probe()
447 .compatible = "intel,keembay-pcie",
451 .compatible = "intel,keembay-pcie-ep",
459 .name = "keembay-pcie",