Lines Matching refs:imx6_pcie

63 struct imx6_pcie {
144 static int pcie_phy_poll_ack(struct imx6_pcie *imx6_pcie, bool exp_val)
146 struct dw_pcie *pci = imx6_pcie->pci;
165 static int pcie_phy_wait_ack(struct imx6_pcie *imx6_pcie, int addr)
167 struct dw_pcie *pci = imx6_pcie->pci;
177 ret = pcie_phy_poll_ack(imx6_pcie, true);
184 return pcie_phy_poll_ack(imx6_pcie, false);
188 static int pcie_phy_read(struct imx6_pcie *imx6_pcie, int addr, u16 *data)
190 struct dw_pcie *pci = imx6_pcie->pci;
194 ret = pcie_phy_wait_ack(imx6_pcie, addr);
202 ret = pcie_phy_poll_ack(imx6_pcie, true);
211 return pcie_phy_poll_ack(imx6_pcie, false);
214 static int pcie_phy_write(struct imx6_pcie *imx6_pcie, int addr, u16 data)
216 struct dw_pcie *pci = imx6_pcie->pci;
222 ret = pcie_phy_wait_ack(imx6_pcie, addr);
233 ret = pcie_phy_poll_ack(imx6_pcie, true);
242 ret = pcie_phy_poll_ack(imx6_pcie, false);
251 ret = pcie_phy_poll_ack(imx6_pcie, true);
260 ret = pcie_phy_poll_ack(imx6_pcie, false);
269 static void imx6_pcie_reset_phy(struct imx6_pcie *imx6_pcie)
273 if (!(imx6_pcie->drvdata->flags & IMX6_PCIE_FLAG_IMX6_PHY))
276 pcie_phy_read(imx6_pcie, PHY_RX_OVRD_IN_LO, &tmp);
279 pcie_phy_write(imx6_pcie, PHY_RX_OVRD_IN_LO, tmp);
283 pcie_phy_read(imx6_pcie, PHY_RX_OVRD_IN_LO, &tmp);
286 pcie_phy_write(imx6_pcie, PHY_RX_OVRD_IN_LO, tmp);
327 struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
334 imx6_pcie->pd_pcie = dev_pm_domain_attach_by_name(dev, "pcie");
335 if (IS_ERR(imx6_pcie->pd_pcie))
336 return PTR_ERR(imx6_pcie->pd_pcie);
338 if (!imx6_pcie->pd_pcie)
340 link = device_link_add(dev, imx6_pcie->pd_pcie,
349 imx6_pcie->pd_pcie_phy = dev_pm_domain_attach_by_name(dev, "pcie_phy");
350 if (IS_ERR(imx6_pcie->pd_pcie_phy))
351 return PTR_ERR(imx6_pcie->pd_pcie_phy);
353 link = device_link_add(dev, imx6_pcie->pd_pcie_phy,
365 static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie)
367 struct device *dev = imx6_pcie->pci->dev;
369 switch (imx6_pcie->drvdata->variant) {
372 reset_control_assert(imx6_pcie->pciephy_reset);
373 reset_control_assert(imx6_pcie->apps_reset);
376 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
380 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
385 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
390 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
392 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
397 if (imx6_pcie->vpcie && regulator_is_enabled(imx6_pcie->vpcie) > 0) {
398 int ret = regulator_disable(imx6_pcie->vpcie);
406 if (gpio_is_valid(imx6_pcie->reset_gpio))
407 gpio_set_value_cansleep(imx6_pcie->reset_gpio,
408 imx6_pcie->gpio_active_high);
411 static unsigned int imx6_pcie_grp_offset(const struct imx6_pcie *imx6_pcie)
413 WARN_ON(imx6_pcie->drvdata->variant != IMX8MQ);
414 return imx6_pcie->controller_id == 1 ? IOMUXC_GPR16 : IOMUXC_GPR14;
417 static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie)
419 struct dw_pcie *pci = imx6_pcie->pci;
424 switch (imx6_pcie->drvdata->variant) {
426 ret = clk_prepare_enable(imx6_pcie->pcie_inbound_axi);
432 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
438 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
447 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
453 ret = clk_prepare_enable(imx6_pcie->pcie_aux);
459 offset = imx6_pcie_grp_offset(imx6_pcie);
464 regmap_update_bits(imx6_pcie->iomuxc_gpr, offset,
467 regmap_update_bits(imx6_pcie->iomuxc_gpr, offset,
476 static void imx7d_pcie_wait_for_phy_pll_lock(struct imx6_pcie *imx6_pcie)
479 struct device *dev = imx6_pcie->pci->dev;
481 if (regmap_read_poll_timeout(imx6_pcie->iomuxc_gpr,
489 static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
491 struct dw_pcie *pci = imx6_pcie->pci;
495 if (imx6_pcie->vpcie && !regulator_is_enabled(imx6_pcie->vpcie)) {
496 ret = regulator_enable(imx6_pcie->vpcie);
504 ret = clk_prepare_enable(imx6_pcie->pcie_phy);
510 ret = clk_prepare_enable(imx6_pcie->pcie_bus);
516 ret = clk_prepare_enable(imx6_pcie->pcie);
522 ret = imx6_pcie_enable_ref_clk(imx6_pcie);
531 switch (imx6_pcie->drvdata->variant) {
533 reset_control_deassert(imx6_pcie->pciephy_reset);
536 reset_control_deassert(imx6_pcie->pciephy_reset);
542 if (likely(imx6_pcie->phy_base)) {
545 imx6_pcie->phy_base + PCIE_PHY_CMN_REG4);
549 imx6_pcie->phy_base + PCIE_PHY_CMN_REG24);
552 imx6_pcie->phy_base + PCIE_PHY_CMN_REG26);
557 imx7d_pcie_wait_for_phy_pll_lock(imx6_pcie);
560 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
564 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
574 if (gpio_is_valid(imx6_pcie->reset_gpio)) {
576 gpio_set_value_cansleep(imx6_pcie->reset_gpio,
577 !imx6_pcie->gpio_active_high);
585 clk_disable_unprepare(imx6_pcie->pcie);
587 clk_disable_unprepare(imx6_pcie->pcie_bus);
589 clk_disable_unprepare(imx6_pcie->pcie_phy);
591 if (imx6_pcie->vpcie && regulator_is_enabled(imx6_pcie->vpcie) > 0) {
592 ret = regulator_disable(imx6_pcie->vpcie);
599 static void imx6_pcie_configure_type(struct imx6_pcie *imx6_pcie)
603 if (imx6_pcie->drvdata->variant == IMX8MQ &&
604 imx6_pcie->controller_id == 1) {
614 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, mask, val);
617 static void imx6_pcie_init_phy(struct imx6_pcie *imx6_pcie)
619 switch (imx6_pcie->drvdata->variant) {
625 regmap_update_bits(imx6_pcie->iomuxc_gpr,
626 imx6_pcie_grp_offset(imx6_pcie),
631 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
635 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
640 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
644 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
647 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
649 imx6_pcie->tx_deemph_gen1 << 0);
650 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
652 imx6_pcie->tx_deemph_gen2_3p5db << 6);
653 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
655 imx6_pcie->tx_deemph_gen2_6db << 12);
656 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
658 imx6_pcie->tx_swing_full << 18);
659 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
661 imx6_pcie->tx_swing_low << 25);
665 imx6_pcie_configure_type(imx6_pcie);
668 static int imx6_setup_phy_mpll(struct imx6_pcie *imx6_pcie)
670 unsigned long phy_rate = clk_get_rate(imx6_pcie->pcie_phy);
674 if (!(imx6_pcie->drvdata->flags & IMX6_PCIE_FLAG_IMX6_PHY))
693 dev_err(imx6_pcie->pci->dev,
698 pcie_phy_read(imx6_pcie, PCIE_PHY_MPLL_OVRD_IN_LO, &val);
703 pcie_phy_write(imx6_pcie, PCIE_PHY_MPLL_OVRD_IN_LO, val);
705 pcie_phy_read(imx6_pcie, PCIE_PHY_ATEOVRD, &val);
710 pcie_phy_write(imx6_pcie, PCIE_PHY_ATEOVRD, val);
715 static int imx6_pcie_wait_for_speed_change(struct imx6_pcie *imx6_pcie)
717 struct dw_pcie *pci = imx6_pcie->pci;
736 struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
738 switch (imx6_pcie->drvdata->variant) {
742 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
748 reset_control_deassert(imx6_pcie->apps_reset);
753 static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie)
755 struct dw_pcie *pci = imx6_pcie->pci;
793 if (imx6_pcie->drvdata->flags &
804 ret = imx6_pcie_wait_for_speed_change(imx6_pcie);
829 imx6_pcie_reset_phy(imx6_pcie);
836 struct imx6_pcie *imx6_pcie = to_imx6_pcie(pci);
838 imx6_pcie_assert_core_reset(imx6_pcie);
839 imx6_pcie_init_phy(imx6_pcie);
840 imx6_pcie_deassert_core_reset(imx6_pcie);
841 imx6_setup_phy_mpll(imx6_pcie);
843 imx6_pcie_establish_link(imx6_pcie);
853 static int imx6_add_pcie_port(struct imx6_pcie *imx6_pcie,
856 struct dw_pcie *pci = imx6_pcie->pci;
885 struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
887 switch (imx6_pcie->drvdata->variant) {
890 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
894 reset_control_assert(imx6_pcie->apps_reset);
901 static void imx6_pcie_pm_turnoff(struct imx6_pcie *imx6_pcie)
903 struct device *dev = imx6_pcie->pci->dev;
906 if (imx6_pcie->turnoff_reset) {
907 reset_control_assert(imx6_pcie->turnoff_reset);
908 reset_control_deassert(imx6_pcie->turnoff_reset);
913 switch (imx6_pcie->drvdata->variant) {
915 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
918 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
937 static void imx6_pcie_clk_disable(struct imx6_pcie *imx6_pcie)
939 clk_disable_unprepare(imx6_pcie->pcie);
940 clk_disable_unprepare(imx6_pcie->pcie_phy);
941 clk_disable_unprepare(imx6_pcie->pcie_bus);
943 switch (imx6_pcie->drvdata->variant) {
945 clk_disable_unprepare(imx6_pcie->pcie_inbound_axi);
948 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
953 clk_disable_unprepare(imx6_pcie->pcie_aux);
962 struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
964 if (!(imx6_pcie->drvdata->flags & IMX6_PCIE_FLAG_SUPPORTS_SUSPEND))
967 imx6_pcie_pm_turnoff(imx6_pcie);
968 imx6_pcie_clk_disable(imx6_pcie);
977 struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
978 struct pcie_port *pp = &imx6_pcie->pci->pp;
980 if (!(imx6_pcie->drvdata->flags & IMX6_PCIE_FLAG_SUPPORTS_SUSPEND))
983 imx6_pcie_assert_core_reset(imx6_pcie);
984 imx6_pcie_init_phy(imx6_pcie);
985 imx6_pcie_deassert_core_reset(imx6_pcie);
988 ret = imx6_pcie_establish_link(imx6_pcie);
1005 struct imx6_pcie *imx6_pcie;
1012 imx6_pcie = devm_kzalloc(dev, sizeof(*imx6_pcie), GFP_KERNEL);
1013 if (!imx6_pcie)
1023 imx6_pcie->pci = pci;
1024 imx6_pcie->drvdata = of_device_get_match_data(dev);
1036 imx6_pcie->phy_base = devm_ioremap_resource(dev, &res);
1037 if (IS_ERR(imx6_pcie->phy_base)) {
1039 return PTR_ERR(imx6_pcie->phy_base);
1049 imx6_pcie->reset_gpio = of_get_named_gpio(node, "reset-gpio", 0);
1050 imx6_pcie->gpio_active_high = of_property_read_bool(node,
1052 if (gpio_is_valid(imx6_pcie->reset_gpio)) {
1053 ret = devm_gpio_request_one(dev, imx6_pcie->reset_gpio,
1054 imx6_pcie->gpio_active_high ?
1062 } else if (imx6_pcie->reset_gpio == -EPROBE_DEFER) {
1063 return imx6_pcie->reset_gpio;
1067 imx6_pcie->pcie_phy = devm_clk_get(dev, "pcie_phy");
1068 if (IS_ERR(imx6_pcie->pcie_phy))
1069 return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie_phy),
1072 imx6_pcie->pcie_bus = devm_clk_get(dev, "pcie_bus");
1073 if (IS_ERR(imx6_pcie->pcie_bus))
1074 return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie_bus),
1077 imx6_pcie->pcie = devm_clk_get(dev, "pcie");
1078 if (IS_ERR(imx6_pcie->pcie))
1079 return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie),
1082 switch (imx6_pcie->drvdata->variant) {
1084 imx6_pcie->pcie_inbound_axi = devm_clk_get(dev,
1086 if (IS_ERR(imx6_pcie->pcie_inbound_axi))
1087 return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie_inbound_axi),
1091 imx6_pcie->pcie_aux = devm_clk_get(dev, "pcie_aux");
1092 if (IS_ERR(imx6_pcie->pcie_aux))
1093 return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie_aux),
1098 imx6_pcie->controller_id = 1;
1100 imx6_pcie->pciephy_reset = devm_reset_control_get_exclusive(dev,
1102 if (IS_ERR(imx6_pcie->pciephy_reset)) {
1104 return PTR_ERR(imx6_pcie->pciephy_reset);
1107 imx6_pcie->apps_reset = devm_reset_control_get_exclusive(dev,
1109 if (IS_ERR(imx6_pcie->apps_reset)) {
1111 return PTR_ERR(imx6_pcie->apps_reset);
1119 imx6_pcie->turnoff_reset = devm_reset_control_get_optional_exclusive(dev, "turnoff");
1120 if (IS_ERR(imx6_pcie->turnoff_reset)) {
1122 return PTR_ERR(imx6_pcie->turnoff_reset);
1126 imx6_pcie->iomuxc_gpr =
1128 if (IS_ERR(imx6_pcie->iomuxc_gpr)) {
1130 return PTR_ERR(imx6_pcie->iomuxc_gpr);
1135 &imx6_pcie->tx_deemph_gen1))
1136 imx6_pcie->tx_deemph_gen1 = 0;
1139 &imx6_pcie->tx_deemph_gen2_3p5db))
1140 imx6_pcie->tx_deemph_gen2_3p5db = 0;
1143 &imx6_pcie->tx_deemph_gen2_6db))
1144 imx6_pcie->tx_deemph_gen2_6db = 20;
1147 &imx6_pcie->tx_swing_full))
1148 imx6_pcie->tx_swing_full = 127;
1151 &imx6_pcie->tx_swing_low))
1152 imx6_pcie->tx_swing_low = 127;
1158 imx6_pcie->vpcie = devm_regulator_get_optional(&pdev->dev, "vpcie");
1159 if (IS_ERR(imx6_pcie->vpcie)) {
1160 if (PTR_ERR(imx6_pcie->vpcie) != -ENODEV)
1161 return PTR_ERR(imx6_pcie->vpcie);
1162 imx6_pcie->vpcie = NULL;
1165 platform_set_drvdata(pdev, imx6_pcie);
1171 ret = imx6_add_pcie_port(imx6_pcie, pdev);
1187 struct imx6_pcie *imx6_pcie = platform_get_drvdata(pdev);
1190 imx6_pcie_assert_core_reset(imx6_pcie);
1256 struct imx6_pcie *imx6_pcie = to_imx6_pcie(pci);
1262 if (imx6_pcie->drvdata->dbi_length) {
1263 dev->cfg_size = imx6_pcie->drvdata->dbi_length;