aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/controller/dwc
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2019-02-01 19:15:20 -0500
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>2019-02-04 06:52:19 -0500
commite8e4d4e95701a10691c53165c55789e5e50ba3f5 (patch)
treed148d48df846fc20b816fc65d83f5f88e9bc3206 /drivers/pci/controller/dwc
parent657722570a555c728c59f17f7825c812c124dc28 (diff)
PCI: imx6: Introduce drvdata
Introduce driver data struct. This will simplify handling of device specific differences. Signed-off-by: Stefan Agner <stefan@agner.ch> [andrew.smirnov@gmail.com reformatted drvdata, to simplify future diffs] Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Reviewed-by: Lucas Stach <l.stach@pengutronix.de> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Fabio Estevam <fabio.estevam@nxp.com> Cc: Chris Healy <cphealy@gmail.com> Cc: Lucas Stach <l.stach@pengutronix.de> Cc: Leonard Crestez <leonard.crestez@nxp.com> Cc: "A.s. Dong" <aisheng.dong@nxp.com> Cc: Richard Zhu <hongxing.zhu@nxp.com>
Diffstat (limited to 'drivers/pci/controller/dwc')
-rw-r--r--drivers/pci/controller/dwc/pci-imx6.c56
1 files changed, 37 insertions, 19 deletions
diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c
index 52e47dac028f..1e940ba7e4c4 100644
--- a/drivers/pci/controller/dwc/pci-imx6.c
+++ b/drivers/pci/controller/dwc/pci-imx6.c
@@ -41,6 +41,10 @@ enum imx6_pcie_variants {
41 IMX7D, 41 IMX7D,
42}; 42};
43 43
44struct imx6_pcie_drvdata {
45 enum imx6_pcie_variants variant;
46};
47
44struct imx6_pcie { 48struct imx6_pcie {
45 struct dw_pcie *pci; 49 struct dw_pcie *pci;
46 int reset_gpio; 50 int reset_gpio;
@@ -53,7 +57,6 @@ struct imx6_pcie {
53 struct reset_control *pciephy_reset; 57 struct reset_control *pciephy_reset;
54 struct reset_control *apps_reset; 58 struct reset_control *apps_reset;
55 struct reset_control *turnoff_reset; 59 struct reset_control *turnoff_reset;
56 enum imx6_pcie_variants variant;
57 u32 tx_deemph_gen1; 60 u32 tx_deemph_gen1;
58 u32 tx_deemph_gen2_3p5db; 61 u32 tx_deemph_gen2_3p5db;
59 u32 tx_deemph_gen2_6db; 62 u32 tx_deemph_gen2_6db;
@@ -66,6 +69,7 @@ struct imx6_pcie {
66 struct device *pd_pcie; 69 struct device *pd_pcie;
67 /* power domain for pcie phy */ 70 /* power domain for pcie phy */
68 struct device *pd_pcie_phy; 71 struct device *pd_pcie_phy;
72 const struct imx6_pcie_drvdata *drvdata;
69}; 73};
70 74
71/* Parameters for the waiting for PCIe PHY PLL to lock on i.MX7 */ 75/* Parameters for the waiting for PCIe PHY PLL to lock on i.MX7 */
@@ -339,7 +343,7 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie)
339{ 343{
340 struct device *dev = imx6_pcie->pci->dev; 344 struct device *dev = imx6_pcie->pci->dev;
341 345
342 switch (imx6_pcie->variant) { 346 switch (imx6_pcie->drvdata->variant) {
343 case IMX7D: 347 case IMX7D:
344 reset_control_assert(imx6_pcie->pciephy_reset); 348 reset_control_assert(imx6_pcie->pciephy_reset);
345 reset_control_assert(imx6_pcie->apps_reset); 349 reset_control_assert(imx6_pcie->apps_reset);
@@ -381,7 +385,7 @@ static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie)
381 struct device *dev = pci->dev; 385 struct device *dev = pci->dev;
382 int ret = 0; 386 int ret = 0;
383 387
384 switch (imx6_pcie->variant) { 388 switch (imx6_pcie->drvdata->variant) {
385 case IMX6SX: 389 case IMX6SX:
386 ret = clk_prepare_enable(imx6_pcie->pcie_inbound_axi); 390 ret = clk_prepare_enable(imx6_pcie->pcie_inbound_axi);
387 if (ret) { 391 if (ret) {
@@ -484,7 +488,7 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
484 !imx6_pcie->gpio_active_high); 488 !imx6_pcie->gpio_active_high);
485 } 489 }
486 490
487 switch (imx6_pcie->variant) { 491 switch (imx6_pcie->drvdata->variant) {
488 case IMX7D: 492 case IMX7D:
489 reset_control_deassert(imx6_pcie->pciephy_reset); 493 reset_control_deassert(imx6_pcie->pciephy_reset);
490 imx7d_pcie_wait_for_phy_pll_lock(imx6_pcie); 494 imx7d_pcie_wait_for_phy_pll_lock(imx6_pcie);
@@ -522,7 +526,7 @@ err_pcie_phy:
522 526
523static void imx6_pcie_init_phy(struct imx6_pcie *imx6_pcie) 527static void imx6_pcie_init_phy(struct imx6_pcie *imx6_pcie)
524{ 528{
525 switch (imx6_pcie->variant) { 529 switch (imx6_pcie->drvdata->variant) {
526 case IMX7D: 530 case IMX7D:
527 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, 531 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
528 IMX7D_GPR12_PCIE_PHY_REFCLK_SEL, 0); 532 IMX7D_GPR12_PCIE_PHY_REFCLK_SEL, 0);
@@ -644,7 +648,7 @@ static void imx6_pcie_ltssm_enable(struct device *dev)
644{ 648{
645 struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev); 649 struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
646 650
647 switch (imx6_pcie->variant) { 651 switch (imx6_pcie->drvdata->variant) {
648 case IMX6Q: 652 case IMX6Q:
649 case IMX6SX: 653 case IMX6SX:
650 case IMX6QP: 654 case IMX6QP:
@@ -697,7 +701,7 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie)
697 tmp |= PORT_LOGIC_SPEED_CHANGE; 701 tmp |= PORT_LOGIC_SPEED_CHANGE;
698 dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp); 702 dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp);
699 703
700 if (imx6_pcie->variant != IMX7D) { 704 if (imx6_pcie->drvdata->variant != IMX7D) {
701 /* 705 /*
702 * On i.MX7, DIRECT_SPEED_CHANGE behaves differently 706 * On i.MX7, DIRECT_SPEED_CHANGE behaves differently
703 * from i.MX6 family when no link speed transition 707 * from i.MX6 family when no link speed transition
@@ -794,7 +798,7 @@ static void imx6_pcie_ltssm_disable(struct device *dev)
794{ 798{
795 struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev); 799 struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
796 800
797 switch (imx6_pcie->variant) { 801 switch (imx6_pcie->drvdata->variant) {
798 case IMX6SX: 802 case IMX6SX:
799 case IMX6QP: 803 case IMX6QP:
800 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, 804 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
@@ -820,7 +824,7 @@ static void imx6_pcie_pm_turnoff(struct imx6_pcie *imx6_pcie)
820 } 824 }
821 825
822 /* Others poke directly at IOMUXC registers */ 826 /* Others poke directly at IOMUXC registers */
823 switch (imx6_pcie->variant) { 827 switch (imx6_pcie->drvdata->variant) {
824 case IMX6SX: 828 case IMX6SX:
825 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, 829 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
826 IMX6SX_GPR12_PCIE_PM_TURN_OFF, 830 IMX6SX_GPR12_PCIE_PM_TURN_OFF,
@@ -850,7 +854,7 @@ static void imx6_pcie_clk_disable(struct imx6_pcie *imx6_pcie)
850 clk_disable_unprepare(imx6_pcie->pcie_phy); 854 clk_disable_unprepare(imx6_pcie->pcie_phy);
851 clk_disable_unprepare(imx6_pcie->pcie_bus); 855 clk_disable_unprepare(imx6_pcie->pcie_bus);
852 856
853 switch (imx6_pcie->variant) { 857 switch (imx6_pcie->drvdata->variant) {
854 case IMX6SX: 858 case IMX6SX:
855 clk_disable_unprepare(imx6_pcie->pcie_inbound_axi); 859 clk_disable_unprepare(imx6_pcie->pcie_inbound_axi);
856 break; 860 break;
@@ -866,8 +870,8 @@ static void imx6_pcie_clk_disable(struct imx6_pcie *imx6_pcie)
866 870
867static inline bool imx6_pcie_supports_suspend(struct imx6_pcie *imx6_pcie) 871static inline bool imx6_pcie_supports_suspend(struct imx6_pcie *imx6_pcie)
868{ 872{
869 return (imx6_pcie->variant == IMX7D || 873 return (imx6_pcie->drvdata->variant == IMX7D ||
870 imx6_pcie->variant == IMX6SX); 874 imx6_pcie->drvdata->variant == IMX6SX);
871} 875}
872 876
873static int imx6_pcie_suspend_noirq(struct device *dev) 877static int imx6_pcie_suspend_noirq(struct device *dev)
@@ -933,8 +937,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
933 pci->ops = &dw_pcie_ops; 937 pci->ops = &dw_pcie_ops;
934 938
935 imx6_pcie->pci = pci; 939 imx6_pcie->pci = pci;
936 imx6_pcie->variant = 940 imx6_pcie->drvdata = of_device_get_match_data(dev);
937 (enum imx6_pcie_variants)of_device_get_match_data(dev);
938 941
939 dbi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0); 942 dbi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
940 pci->dbi_base = devm_ioremap_resource(dev, dbi_base); 943 pci->dbi_base = devm_ioremap_resource(dev, dbi_base);
@@ -978,7 +981,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
978 return PTR_ERR(imx6_pcie->pcie); 981 return PTR_ERR(imx6_pcie->pcie);
979 } 982 }
980 983
981 switch (imx6_pcie->variant) { 984 switch (imx6_pcie->drvdata->variant) {
982 case IMX6SX: 985 case IMX6SX:
983 imx6_pcie->pcie_inbound_axi = devm_clk_get(dev, 986 imx6_pcie->pcie_inbound_axi = devm_clk_get(dev,
984 "pcie_inbound_axi"); 987 "pcie_inbound_axi");
@@ -1084,11 +1087,26 @@ static void imx6_pcie_shutdown(struct platform_device *pdev)
1084 imx6_pcie_assert_core_reset(imx6_pcie); 1087 imx6_pcie_assert_core_reset(imx6_pcie);
1085} 1088}
1086 1089
1090static const struct imx6_pcie_drvdata drvdata[] = {
1091 [IMX6Q] = {
1092 .variant = IMX6Q,
1093 },
1094 [IMX6SX] = {
1095 .variant = IMX6SX,
1096 },
1097 [IMX6QP] = {
1098 .variant = IMX6QP,
1099 },
1100 [IMX7D] = {
1101 .variant = IMX7D,
1102 },
1103};
1104
1087static const struct of_device_id imx6_pcie_of_match[] = { 1105static const struct of_device_id imx6_pcie_of_match[] = {
1088 { .compatible = "fsl,imx6q-pcie", .data = (void *)IMX6Q, }, 1106 { .compatible = "fsl,imx6q-pcie", .data = &drvdata[IMX6Q], },
1089 { .compatible = "fsl,imx6sx-pcie", .data = (void *)IMX6SX, }, 1107 { .compatible = "fsl,imx6sx-pcie", .data = &drvdata[IMX6SX], },
1090 { .compatible = "fsl,imx6qp-pcie", .data = (void *)IMX6QP, }, 1108 { .compatible = "fsl,imx6qp-pcie", .data = &drvdata[IMX6QP], },
1091 { .compatible = "fsl,imx7d-pcie", .data = (void *)IMX7D, }, 1109 { .compatible = "fsl,imx7d-pcie", .data = &drvdata[IMX7D], },
1092 {}, 1110 {},
1093}; 1111};
1094 1112