Lines Matching refs:pp
32 #define to_imx6_pcie(x) container_of(x, struct imx6_pcie, pp)
39 struct pcie_port pp; member
212 static int imx6_pcie_assert_core_reset(struct pcie_port *pp) in imx6_pcie_assert_core_reset() argument
214 struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp); in imx6_pcie_assert_core_reset()
233 val = readl(pp->dbi_base + PCIE_PL_PFLR); in imx6_pcie_assert_core_reset()
236 writel(val, pp->dbi_base + PCIE_PL_PFLR); in imx6_pcie_assert_core_reset()
250 static int imx6_pcie_deassert_core_reset(struct pcie_port *pp) in imx6_pcie_deassert_core_reset() argument
252 struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp); in imx6_pcie_deassert_core_reset()
257 dev_err(pp->dev, "unable to enable pcie_phy clock\n"); in imx6_pcie_deassert_core_reset()
263 dev_err(pp->dev, "unable to enable pcie_bus clock\n"); in imx6_pcie_deassert_core_reset()
269 dev_err(pp->dev, "unable to enable pcie clock\n"); in imx6_pcie_deassert_core_reset()
306 static void imx6_pcie_init_phy(struct pcie_port *pp) in imx6_pcie_init_phy() argument
308 struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp); in imx6_pcie_init_phy()
331 static int imx6_pcie_wait_for_link(struct pcie_port *pp) in imx6_pcie_wait_for_link() argument
336 if (dw_pcie_link_up(pp)) in imx6_pcie_wait_for_link()
341 dev_err(pp->dev, "phy link never came up\n"); in imx6_pcie_wait_for_link()
342 dev_dbg(pp->dev, "DEBUG_R0: 0x%08x, DEBUG_R1: 0x%08x\n", in imx6_pcie_wait_for_link()
343 readl(pp->dbi_base + PCIE_PHY_DEBUG_R0), in imx6_pcie_wait_for_link()
344 readl(pp->dbi_base + PCIE_PHY_DEBUG_R1)); in imx6_pcie_wait_for_link()
348 static int imx6_pcie_wait_for_speed_change(struct pcie_port *pp) in imx6_pcie_wait_for_speed_change() argument
354 tmp = readl(pp->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); in imx6_pcie_wait_for_speed_change()
361 dev_err(pp->dev, "Speed change timeout\n"); in imx6_pcie_wait_for_speed_change()
367 struct pcie_port *pp = arg; in imx6_pcie_msi_handler() local
369 return dw_handle_msi_irq(pp); in imx6_pcie_msi_handler()
372 static int imx6_pcie_establish_link(struct pcie_port *pp) in imx6_pcie_establish_link() argument
374 struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp); in imx6_pcie_establish_link()
383 tmp = readl(pp->dbi_base + PCIE_RC_LCR); in imx6_pcie_establish_link()
386 writel(tmp, pp->dbi_base + PCIE_RC_LCR); in imx6_pcie_establish_link()
392 ret = imx6_pcie_wait_for_link(pp); in imx6_pcie_establish_link()
397 tmp = readl(pp->dbi_base + PCIE_RC_LCR); in imx6_pcie_establish_link()
400 writel(tmp, pp->dbi_base + PCIE_RC_LCR); in imx6_pcie_establish_link()
406 tmp = readl(pp->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); in imx6_pcie_establish_link()
408 writel(tmp, pp->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); in imx6_pcie_establish_link()
410 ret = imx6_pcie_wait_for_speed_change(pp); in imx6_pcie_establish_link()
412 dev_err(pp->dev, "Failed to bring link up!\n"); in imx6_pcie_establish_link()
417 ret = imx6_pcie_wait_for_link(pp); in imx6_pcie_establish_link()
419 dev_err(pp->dev, "Failed to bring link up!\n"); in imx6_pcie_establish_link()
423 tmp = readl(pp->dbi_base + PCIE_RC_LCSR); in imx6_pcie_establish_link()
424 dev_dbg(pp->dev, "Link up, Gen=%i\n", (tmp >> 16) & 0xf); in imx6_pcie_establish_link()
428 static void imx6_pcie_host_init(struct pcie_port *pp) in imx6_pcie_host_init() argument
430 imx6_pcie_assert_core_reset(pp); in imx6_pcie_host_init()
432 imx6_pcie_init_phy(pp); in imx6_pcie_host_init()
434 imx6_pcie_deassert_core_reset(pp); in imx6_pcie_host_init()
436 dw_pcie_setup_rc(pp); in imx6_pcie_host_init()
438 imx6_pcie_establish_link(pp); in imx6_pcie_host_init()
441 dw_pcie_msi_init(pp); in imx6_pcie_host_init()
444 static void imx6_pcie_reset_phy(struct pcie_port *pp) in imx6_pcie_reset_phy() argument
448 pcie_phy_read(pp->dbi_base, PHY_RX_OVRD_IN_LO, &tmp); in imx6_pcie_reset_phy()
451 pcie_phy_write(pp->dbi_base, PHY_RX_OVRD_IN_LO, tmp); in imx6_pcie_reset_phy()
455 pcie_phy_read(pp->dbi_base, PHY_RX_OVRD_IN_LO, &tmp); in imx6_pcie_reset_phy()
458 pcie_phy_write(pp->dbi_base, PHY_RX_OVRD_IN_LO, tmp); in imx6_pcie_reset_phy()
461 static int imx6_pcie_link_up(struct pcie_port *pp) in imx6_pcie_link_up() argument
483 rc = readl(pp->dbi_base + PCIE_PHY_DEBUG_R1); in imx6_pcie_link_up()
490 dev_dbg(pp->dev, "Link is up, but still in training\n"); in imx6_pcie_link_up()
504 pcie_phy_read(pp->dbi_base, PCIE_PHY_RX_ASIC_OUT, &rx_valid); in imx6_pcie_link_up()
505 debug_r0 = readl(pp->dbi_base + PCIE_PHY_DEBUG_R0); in imx6_pcie_link_up()
513 dev_err(pp->dev, "transition to gen2 is stuck, reset PHY!\n"); in imx6_pcie_link_up()
514 dev_dbg(pp->dev, "debug_r0=%08x debug_r1=%08x\n", debug_r0, rc); in imx6_pcie_link_up()
516 imx6_pcie_reset_phy(pp); in imx6_pcie_link_up()
526 static int __init imx6_add_pcie_port(struct pcie_port *pp, in imx6_add_pcie_port() argument
532 pp->msi_irq = platform_get_irq_byname(pdev, "msi"); in imx6_add_pcie_port()
533 if (pp->msi_irq <= 0) { in imx6_add_pcie_port()
538 ret = devm_request_irq(&pdev->dev, pp->msi_irq, in imx6_add_pcie_port()
541 "mx6-pcie-msi", pp); in imx6_add_pcie_port()
548 pp->root_bus_nr = -1; in imx6_add_pcie_port()
549 pp->ops = &imx6_pcie_host_ops; in imx6_add_pcie_port()
551 ret = dw_pcie_host_init(pp); in imx6_add_pcie_port()
563 struct pcie_port *pp; in imx6_pcie_probe() local
572 pp = &imx6_pcie->pp; in imx6_pcie_probe()
573 pp->dev = &pdev->dev; in imx6_pcie_probe()
580 pp->dbi_base = devm_ioremap_resource(&pdev->dev, dbi_base); in imx6_pcie_probe()
581 if (IS_ERR(pp->dbi_base)) in imx6_pcie_probe()
582 return PTR_ERR(pp->dbi_base); in imx6_pcie_probe()
625 ret = imx6_add_pcie_port(pp, pdev); in imx6_pcie_probe()
638 imx6_pcie_assert_core_reset(&imx6_pcie->pp); in imx6_pcie_shutdown()