Lines Matching refs:imx6_pcie
42 struct imx6_pcie { struct
107 static int pcie_phy_poll_ack(struct imx6_pcie *imx6_pcie, int exp_val) in pcie_phy_poll_ack() argument
109 struct dw_pcie *pci = imx6_pcie->pci; in pcie_phy_poll_ack()
128 static int pcie_phy_wait_ack(struct imx6_pcie *imx6_pcie, int addr) in pcie_phy_wait_ack() argument
130 struct dw_pcie *pci = imx6_pcie->pci; in pcie_phy_wait_ack()
140 ret = pcie_phy_poll_ack(imx6_pcie, 1); in pcie_phy_wait_ack()
147 return pcie_phy_poll_ack(imx6_pcie, 0); in pcie_phy_wait_ack()
151 static int pcie_phy_read(struct imx6_pcie *imx6_pcie, int addr, int *data) in pcie_phy_read() argument
153 struct dw_pcie *pci = imx6_pcie->pci; in pcie_phy_read()
157 ret = pcie_phy_wait_ack(imx6_pcie, addr); in pcie_phy_read()
165 ret = pcie_phy_poll_ack(imx6_pcie, 1); in pcie_phy_read()
175 return pcie_phy_poll_ack(imx6_pcie, 0); in pcie_phy_read()
178 static int pcie_phy_write(struct imx6_pcie *imx6_pcie, int addr, int data) in pcie_phy_write() argument
180 struct dw_pcie *pci = imx6_pcie->pci; in pcie_phy_write()
186 ret = pcie_phy_wait_ack(imx6_pcie, addr); in pcie_phy_write()
197 ret = pcie_phy_poll_ack(imx6_pcie, 1); in pcie_phy_write()
206 ret = pcie_phy_poll_ack(imx6_pcie, 0); in pcie_phy_write()
215 ret = pcie_phy_poll_ack(imx6_pcie, 1); in pcie_phy_write()
224 ret = pcie_phy_poll_ack(imx6_pcie, 0); in pcie_phy_write()
233 static void imx6_pcie_reset_phy(struct imx6_pcie *imx6_pcie) in imx6_pcie_reset_phy() argument
237 pcie_phy_read(imx6_pcie, PHY_RX_OVRD_IN_LO, &tmp); in imx6_pcie_reset_phy()
240 pcie_phy_write(imx6_pcie, PHY_RX_OVRD_IN_LO, tmp); in imx6_pcie_reset_phy()
244 pcie_phy_read(imx6_pcie, PHY_RX_OVRD_IN_LO, &tmp); in imx6_pcie_reset_phy()
247 pcie_phy_write(imx6_pcie, PHY_RX_OVRD_IN_LO, tmp); in imx6_pcie_reset_phy()
284 static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie) in imx6_pcie_assert_core_reset() argument
286 struct device *dev = imx6_pcie->pci->dev; in imx6_pcie_assert_core_reset()
288 switch (imx6_pcie->variant) { in imx6_pcie_assert_core_reset()
290 reset_control_assert(imx6_pcie->pciephy_reset); in imx6_pcie_assert_core_reset()
291 reset_control_assert(imx6_pcie->apps_reset); in imx6_pcie_assert_core_reset()
294 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, in imx6_pcie_assert_core_reset()
298 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5, in imx6_pcie_assert_core_reset()
303 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, in imx6_pcie_assert_core_reset()
308 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, in imx6_pcie_assert_core_reset()
310 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, in imx6_pcie_assert_core_reset()
315 if (imx6_pcie->vpcie && regulator_is_enabled(imx6_pcie->vpcie) > 0) { in imx6_pcie_assert_core_reset()
316 int ret = regulator_disable(imx6_pcie->vpcie); in imx6_pcie_assert_core_reset()
324 static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie) in imx6_pcie_enable_ref_clk() argument
326 struct dw_pcie *pci = imx6_pcie->pci; in imx6_pcie_enable_ref_clk()
330 switch (imx6_pcie->variant) { in imx6_pcie_enable_ref_clk()
332 ret = clk_prepare_enable(imx6_pcie->pcie_inbound_axi); in imx6_pcie_enable_ref_clk()
338 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, in imx6_pcie_enable_ref_clk()
344 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, in imx6_pcie_enable_ref_clk()
353 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, in imx6_pcie_enable_ref_clk()
363 static void imx7d_pcie_wait_for_phy_pll_lock(struct imx6_pcie *imx6_pcie) in imx7d_pcie_wait_for_phy_pll_lock() argument
367 struct device *dev = imx6_pcie->pci->dev; in imx7d_pcie_wait_for_phy_pll_lock()
370 regmap_read(imx6_pcie->iomuxc_gpr, IOMUXC_GPR22, &val); in imx7d_pcie_wait_for_phy_pll_lock()
382 static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) in imx6_pcie_deassert_core_reset() argument
384 struct dw_pcie *pci = imx6_pcie->pci; in imx6_pcie_deassert_core_reset()
388 if (imx6_pcie->vpcie && !regulator_is_enabled(imx6_pcie->vpcie)) { in imx6_pcie_deassert_core_reset()
389 ret = regulator_enable(imx6_pcie->vpcie); in imx6_pcie_deassert_core_reset()
397 ret = clk_prepare_enable(imx6_pcie->pcie_phy); in imx6_pcie_deassert_core_reset()
403 ret = clk_prepare_enable(imx6_pcie->pcie_bus); in imx6_pcie_deassert_core_reset()
409 ret = clk_prepare_enable(imx6_pcie->pcie); in imx6_pcie_deassert_core_reset()
415 ret = imx6_pcie_enable_ref_clk(imx6_pcie); in imx6_pcie_deassert_core_reset()
425 if (gpio_is_valid(imx6_pcie->reset_gpio)) { in imx6_pcie_deassert_core_reset()
426 gpio_set_value_cansleep(imx6_pcie->reset_gpio, in imx6_pcie_deassert_core_reset()
427 imx6_pcie->gpio_active_high); in imx6_pcie_deassert_core_reset()
429 gpio_set_value_cansleep(imx6_pcie->reset_gpio, in imx6_pcie_deassert_core_reset()
430 !imx6_pcie->gpio_active_high); in imx6_pcie_deassert_core_reset()
433 switch (imx6_pcie->variant) { in imx6_pcie_deassert_core_reset()
435 reset_control_deassert(imx6_pcie->pciephy_reset); in imx6_pcie_deassert_core_reset()
436 imx7d_pcie_wait_for_phy_pll_lock(imx6_pcie); in imx6_pcie_deassert_core_reset()
439 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5, in imx6_pcie_deassert_core_reset()
443 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, in imx6_pcie_deassert_core_reset()
455 clk_disable_unprepare(imx6_pcie->pcie); in imx6_pcie_deassert_core_reset()
457 clk_disable_unprepare(imx6_pcie->pcie_bus); in imx6_pcie_deassert_core_reset()
459 clk_disable_unprepare(imx6_pcie->pcie_phy); in imx6_pcie_deassert_core_reset()
461 if (imx6_pcie->vpcie && regulator_is_enabled(imx6_pcie->vpcie) > 0) { in imx6_pcie_deassert_core_reset()
462 ret = regulator_disable(imx6_pcie->vpcie); in imx6_pcie_deassert_core_reset()
469 static void imx6_pcie_init_phy(struct imx6_pcie *imx6_pcie) in imx6_pcie_init_phy() argument
471 switch (imx6_pcie->variant) { in imx6_pcie_init_phy()
473 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, in imx6_pcie_init_phy()
477 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, in imx6_pcie_init_phy()
482 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, in imx6_pcie_init_phy()
486 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, in imx6_pcie_init_phy()
489 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, in imx6_pcie_init_phy()
491 imx6_pcie->tx_deemph_gen1 << 0); in imx6_pcie_init_phy()
492 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, in imx6_pcie_init_phy()
494 imx6_pcie->tx_deemph_gen2_3p5db << 6); in imx6_pcie_init_phy()
495 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, in imx6_pcie_init_phy()
497 imx6_pcie->tx_deemph_gen2_6db << 12); in imx6_pcie_init_phy()
498 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, in imx6_pcie_init_phy()
500 imx6_pcie->tx_swing_full << 18); in imx6_pcie_init_phy()
501 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, in imx6_pcie_init_phy()
503 imx6_pcie->tx_swing_low << 25); in imx6_pcie_init_phy()
507 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, in imx6_pcie_init_phy()
511 static int imx6_pcie_wait_for_link(struct imx6_pcie *imx6_pcie) in imx6_pcie_wait_for_link() argument
513 struct dw_pcie *pci = imx6_pcie->pci; in imx6_pcie_wait_for_link()
526 static int imx6_pcie_wait_for_speed_change(struct imx6_pcie *imx6_pcie) in imx6_pcie_wait_for_speed_change() argument
528 struct dw_pcie *pci = imx6_pcie->pci; in imx6_pcie_wait_for_speed_change()
545 static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie) in imx6_pcie_establish_link() argument
547 struct dw_pcie *pci = imx6_pcie->pci; in imx6_pcie_establish_link()
563 if (imx6_pcie->variant == IMX7D) in imx6_pcie_establish_link()
564 reset_control_deassert(imx6_pcie->apps_reset); in imx6_pcie_establish_link()
566 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, in imx6_pcie_establish_link()
569 ret = imx6_pcie_wait_for_link(imx6_pcie); in imx6_pcie_establish_link()
573 if (imx6_pcie->link_gen == 2) { in imx6_pcie_establish_link()
588 if (imx6_pcie->variant != IMX7D) { in imx6_pcie_establish_link()
598 ret = imx6_pcie_wait_for_speed_change(imx6_pcie); in imx6_pcie_establish_link()
606 ret = imx6_pcie_wait_for_link(imx6_pcie); in imx6_pcie_establish_link()
623 imx6_pcie_reset_phy(imx6_pcie); in imx6_pcie_establish_link()
630 struct imx6_pcie *imx6_pcie = to_imx6_pcie(pci); in imx6_pcie_host_init() local
632 imx6_pcie_assert_core_reset(imx6_pcie); in imx6_pcie_host_init()
633 imx6_pcie_init_phy(imx6_pcie); in imx6_pcie_host_init()
634 imx6_pcie_deassert_core_reset(imx6_pcie); in imx6_pcie_host_init()
636 imx6_pcie_establish_link(imx6_pcie); in imx6_pcie_host_init()
654 static int imx6_add_pcie_port(struct imx6_pcie *imx6_pcie, in imx6_add_pcie_port() argument
657 struct dw_pcie *pci = imx6_pcie->pci; in imx6_add_pcie_port()
689 struct imx6_pcie *imx6_pcie; in imx6_pcie_probe() local
694 imx6_pcie = devm_kzalloc(dev, sizeof(*imx6_pcie), GFP_KERNEL); in imx6_pcie_probe()
695 if (!imx6_pcie) in imx6_pcie_probe()
705 imx6_pcie->pci = pci; in imx6_pcie_probe()
706 imx6_pcie->variant = in imx6_pcie_probe()
715 imx6_pcie->reset_gpio = of_get_named_gpio(node, "reset-gpio", 0); in imx6_pcie_probe()
716 imx6_pcie->gpio_active_high = of_property_read_bool(node, in imx6_pcie_probe()
718 if (gpio_is_valid(imx6_pcie->reset_gpio)) { in imx6_pcie_probe()
719 ret = devm_gpio_request_one(dev, imx6_pcie->reset_gpio, in imx6_pcie_probe()
720 imx6_pcie->gpio_active_high ? in imx6_pcie_probe()
728 } else if (imx6_pcie->reset_gpio == -EPROBE_DEFER) { in imx6_pcie_probe()
729 return imx6_pcie->reset_gpio; in imx6_pcie_probe()
733 imx6_pcie->pcie_phy = devm_clk_get(dev, "pcie_phy"); in imx6_pcie_probe()
734 if (IS_ERR(imx6_pcie->pcie_phy)) { in imx6_pcie_probe()
736 return PTR_ERR(imx6_pcie->pcie_phy); in imx6_pcie_probe()
739 imx6_pcie->pcie_bus = devm_clk_get(dev, "pcie_bus"); in imx6_pcie_probe()
740 if (IS_ERR(imx6_pcie->pcie_bus)) { in imx6_pcie_probe()
742 return PTR_ERR(imx6_pcie->pcie_bus); in imx6_pcie_probe()
745 imx6_pcie->pcie = devm_clk_get(dev, "pcie"); in imx6_pcie_probe()
746 if (IS_ERR(imx6_pcie->pcie)) { in imx6_pcie_probe()
748 return PTR_ERR(imx6_pcie->pcie); in imx6_pcie_probe()
751 switch (imx6_pcie->variant) { in imx6_pcie_probe()
753 imx6_pcie->pcie_inbound_axi = devm_clk_get(dev, in imx6_pcie_probe()
755 if (IS_ERR(imx6_pcie->pcie_inbound_axi)) { in imx6_pcie_probe()
757 return PTR_ERR(imx6_pcie->pcie_inbound_axi); in imx6_pcie_probe()
761 imx6_pcie->pciephy_reset = devm_reset_control_get_exclusive(dev, in imx6_pcie_probe()
763 if (IS_ERR(imx6_pcie->pciephy_reset)) { in imx6_pcie_probe()
765 return PTR_ERR(imx6_pcie->pciephy_reset); in imx6_pcie_probe()
768 imx6_pcie->apps_reset = devm_reset_control_get_exclusive(dev, in imx6_pcie_probe()
770 if (IS_ERR(imx6_pcie->apps_reset)) { in imx6_pcie_probe()
772 return PTR_ERR(imx6_pcie->apps_reset); in imx6_pcie_probe()
780 imx6_pcie->iomuxc_gpr = in imx6_pcie_probe()
782 if (IS_ERR(imx6_pcie->iomuxc_gpr)) { in imx6_pcie_probe()
784 return PTR_ERR(imx6_pcie->iomuxc_gpr); in imx6_pcie_probe()
789 &imx6_pcie->tx_deemph_gen1)) in imx6_pcie_probe()
790 imx6_pcie->tx_deemph_gen1 = 0; in imx6_pcie_probe()
793 &imx6_pcie->tx_deemph_gen2_3p5db)) in imx6_pcie_probe()
794 imx6_pcie->tx_deemph_gen2_3p5db = 0; in imx6_pcie_probe()
797 &imx6_pcie->tx_deemph_gen2_6db)) in imx6_pcie_probe()
798 imx6_pcie->tx_deemph_gen2_6db = 20; in imx6_pcie_probe()
801 &imx6_pcie->tx_swing_full)) in imx6_pcie_probe()
802 imx6_pcie->tx_swing_full = 127; in imx6_pcie_probe()
805 &imx6_pcie->tx_swing_low)) in imx6_pcie_probe()
806 imx6_pcie->tx_swing_low = 127; in imx6_pcie_probe()
810 &imx6_pcie->link_gen); in imx6_pcie_probe()
812 imx6_pcie->link_gen = 1; in imx6_pcie_probe()
814 imx6_pcie->vpcie = devm_regulator_get_optional(&pdev->dev, "vpcie"); in imx6_pcie_probe()
815 if (IS_ERR(imx6_pcie->vpcie)) { in imx6_pcie_probe()
816 if (PTR_ERR(imx6_pcie->vpcie) == -EPROBE_DEFER) in imx6_pcie_probe()
818 imx6_pcie->vpcie = NULL; in imx6_pcie_probe()
821 platform_set_drvdata(pdev, imx6_pcie); in imx6_pcie_probe()
823 ret = imx6_add_pcie_port(imx6_pcie, pdev); in imx6_pcie_probe()
832 struct imx6_pcie *imx6_pcie = platform_get_drvdata(pdev); in imx6_pcie_shutdown() local
835 imx6_pcie_assert_core_reset(imx6_pcie); in imx6_pcie_shutdown()