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
294 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in keembay_pcie_ep_raise_irq() local
299 dev_err(pci->dev, "INTx IRQ is not supported\n"); in keembay_pcie_ep_raise_irq()
300 return -EINVAL; in keembay_pcie_ep_raise_irq()
302 return dw_pcie_ep_raise_msi_irq(ep, func_no, interrupt_num); in keembay_pcie_ep_raise_irq()
304 return dw_pcie_ep_raise_msix_irq(ep, func_no, interrupt_num); in keembay_pcie_ep_raise_irq()
306 dev_err(pci->dev, "Unknown IRQ type %d\n", type); in keembay_pcie_ep_raise_irq()
307 return -EINVAL; in keembay_pcie_ep_raise_irq()
325 keembay_pcie_get_features(struct dw_pcie_ep *ep) in keembay_pcie_get_features() argument
342 struct dw_pcie *pci = &pcie->pci; in keembay_pcie_add_pcie_port() local
343 struct dw_pcie_rp *pp = &pci->pp; in keembay_pcie_add_pcie_port()
344 struct device *dev = &pdev->dev; in keembay_pcie_add_pcie_port()
348 pp->ops = &keembay_pcie_host_ops; in keembay_pcie_add_pcie_port()
349 pp->msi_irq[0] = -ENODEV; in keembay_pcie_add_pcie_port()
355 pcie->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); in keembay_pcie_add_pcie_port()
356 if (IS_ERR(pcie->reset)) in keembay_pcie_add_pcie_port()
357 return PTR_ERR(pcie->reset); in keembay_pcie_add_pcie_port()
363 val = readl(pcie->apb_base + PCIE_REGS_PCIE_PHY_CNTL); in keembay_pcie_add_pcie_port()
365 writel(val, pcie->apb_base + PCIE_REGS_PCIE_PHY_CNTL); in keembay_pcie_add_pcie_port()
367 writel(PCIE_DEVICE_TYPE, pcie->apb_base + PCIE_REGS_PCIE_CFG); in keembay_pcie_add_pcie_port()
373 val = readl(pcie->apb_base + PCIE_REGS_PCIE_CFG); in keembay_pcie_add_pcie_port()
374 writel(val | PCIE_RSTN, pcie->apb_base + PCIE_REGS_PCIE_CFG); in keembay_pcie_add_pcie_port()
384 val = readl(pcie->apb_base + PCIE_REGS_INTERRUPT_ENABLE); in keembay_pcie_add_pcie_port()
387 writel(val, pcie->apb_base + PCIE_REGS_INTERRUPT_ENABLE); in keembay_pcie_add_pcie_port()
395 struct device *dev = &pdev->dev; in keembay_pcie_probe()
397 struct dw_pcie *pci; in keembay_pcie_probe() local
403 return -ENODEV; in keembay_pcie_probe()
405 mode = (enum dw_pcie_device_mode)data->mode; in keembay_pcie_probe()
409 return -ENOMEM; in keembay_pcie_probe()
411 pci = &pcie->pci; in keembay_pcie_probe()
412 pci->dev = dev; in keembay_pcie_probe()
413 pci->ops = &keembay_pcie_ops; in keembay_pcie_probe()
415 pcie->mode = mode; in keembay_pcie_probe()
417 pcie->apb_base = devm_platform_ioremap_resource_byname(pdev, "apb"); in keembay_pcie_probe()
418 if (IS_ERR(pcie->apb_base)) in keembay_pcie_probe()
419 return PTR_ERR(pcie->apb_base); in keembay_pcie_probe()
423 switch (pcie->mode) { in keembay_pcie_probe()
426 return -ENODEV; in keembay_pcie_probe()
431 return -ENODEV; in keembay_pcie_probe()
433 pci->ep.ops = &keembay_pcie_ep_ops; in keembay_pcie_probe()
434 ret = dw_pcie_ep_init(&pci->ep); in keembay_pcie_probe()
438 ret = dw_pcie_ep_init_registers(&pci->ep); in keembay_pcie_probe()
441 dw_pcie_ep_deinit(&pci->ep); in keembay_pcie_probe()
445 pci_epc_init_notify(pci->ep.epc); in keembay_pcie_probe()
449 dev_err(dev, "Invalid device type %d\n", pcie->mode); in keembay_pcie_probe()
450 return -ENODEV; in keembay_pcie_probe()
466 .compatible = "intel,keembay-pcie",
470 .compatible = "intel,keembay-pcie-ep",
478 .name = "keembay-pcie",