Lines Matching full:pcie

3  * PCIe controller driver for Intel Keem Bay
22 #include "pcie-designware.h"
72 static void keembay_ep_reset_assert(struct keembay_pcie *pcie) in keembay_ep_reset_assert() argument
74 gpiod_set_value_cansleep(pcie->reset, 1); in keembay_ep_reset_assert()
78 static void keembay_ep_reset_deassert(struct keembay_pcie *pcie) in keembay_ep_reset_deassert() argument
88 gpiod_set_value_cansleep(pcie->reset, 0); in keembay_ep_reset_deassert()
92 static void keembay_pcie_ltssm_set(struct keembay_pcie *pcie, bool enable) in keembay_pcie_ltssm_set() argument
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()
106 struct keembay_pcie *pcie = dev_get_drvdata(pci->dev); in keembay_pcie_link_up() local
109 val = readl(pcie->apb_base + PCIE_REGS_PCIE_SII_PM_STATE); in keembay_pcie_link_up()
116 struct keembay_pcie *pcie = dev_get_drvdata(pci->dev); in keembay_pcie_start_link() local
120 if (pcie->mode == DW_PCIE_EP_TYPE) in keembay_pcie_start_link()
123 keembay_pcie_ltssm_set(pcie, false); in keembay_pcie_start_link()
125 ret = readl_poll_timeout(pcie->apb_base + PCIE_REGS_PCIE_PHY_STAT, in keembay_pcie_start_link()
133 keembay_pcie_ltssm_set(pcie, true); in keembay_pcie_start_link()
140 struct keembay_pcie *pcie = dev_get_drvdata(pci->dev); in keembay_pcie_stop_link() local
142 keembay_pcie_ltssm_set(pcie, false); in keembay_pcie_stop_link()
185 static int keembay_pcie_probe_clocks(struct keembay_pcie *pcie) in keembay_pcie_probe_clocks() argument
187 struct dw_pcie *pci = &pcie->pci; 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()
204 * Initialize the internal PCIe PLL in Host mode.
206 * (1) 6.4.6.1 PCIe Subsystem Example Initialization,
207 * (2) 6.8 PCIe Low Jitter PLL for Ref Clk Generation.
209 static int keembay_pcie_pll_init(struct keembay_pcie *pcie) in keembay_pcie_pll_init() argument
211 struct dw_pcie *pci = &pcie->pci; in keembay_pcie_pll_init()
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()
236 struct keembay_pcie *pcie = irq_desc_get_handler_data(desc); in keembay_pcie_msi_irq_handler() local
242 * Keem Bay PCIe Controller provides an additional IP logic on top of in keembay_pcie_msi_irq_handler()
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()
266 static int keembay_pcie_setup_msi_irq(struct keembay_pcie *pcie) in keembay_pcie_setup_msi_irq() argument
268 struct dw_pcie *pci = &pcie->pci; in keembay_pcie_setup_msi_irq()
273 irq = platform_get_irq_byname(pdev, "pcie"); in keembay_pcie_setup_msi_irq()
278 pcie); in keembay_pcie_setup_msi_irq()
286 struct keembay_pcie *pcie = dev_get_drvdata(pci->dev); in keembay_pcie_ep_init() local
288 writel(EDMA_INT_EN, pcie->apb_base + PCIE_REGS_INTERRUPT_ENABLE); in keembay_pcie_ep_init()
339 static int keembay_pcie_add_pcie_port(struct keembay_pcie *pcie, in keembay_pcie_add_pcie_port() argument
342 struct dw_pcie *pci = &pcie->pci; in keembay_pcie_add_pcie_port()
351 ret = keembay_pcie_setup_msi_irq(pcie); 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()
359 ret = keembay_pcie_probe_clocks(pcie); 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()
369 ret = keembay_pcie_pll_init(pcie); 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()
375 keembay_ep_reset_deassert(pcie); in keembay_pcie_add_pcie_port()
379 keembay_ep_reset_assert(pcie); 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()
396 struct keembay_pcie *pcie; in keembay_pcie_probe() local
407 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); in keembay_pcie_probe()
408 if (!pcie) in keembay_pcie_probe()
411 pci = &pcie->pci; 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()
421 platform_set_drvdata(pdev, pcie); in keembay_pcie_probe()
423 switch (pcie->mode) { in keembay_pcie_probe()
428 return keembay_pcie_add_pcie_port(pcie, pdev); in keembay_pcie_probe()
449 dev_err(dev, "Invalid device type %d\n", pcie->mode); in keembay_pcie_probe()
466 .compatible = "intel,keembay-pcie",
470 .compatible = "intel,keembay-pcie-ep",
478 .name = "keembay-pcie",