PCI: imx6: Introduce drvdata
authorAndrey Smirnov <andrew.smirnov@gmail.com>
Sat, 2 Feb 2019 00:15:20 +0000 (16:15 -0800)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Mon, 4 Feb 2019 11:52:19 +0000 (11:52 +0000)
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>
drivers/pci/controller/dwc/pci-imx6.c

index 52e47da..1e940ba 100644 (file)
@@ -41,6 +41,10 @@ enum imx6_pcie_variants {
        IMX7D,
 };
 
+struct imx6_pcie_drvdata {
+       enum imx6_pcie_variants variant;
+};
+
 struct imx6_pcie {
        struct dw_pcie          *pci;
        int                     reset_gpio;
@@ -53,7 +57,6 @@ struct imx6_pcie {
        struct reset_control    *pciephy_reset;
        struct reset_control    *apps_reset;
        struct reset_control    *turnoff_reset;
-       enum imx6_pcie_variants variant;
        u32                     tx_deemph_gen1;
        u32                     tx_deemph_gen2_3p5db;
        u32                     tx_deemph_gen2_6db;
@@ -66,6 +69,7 @@ struct imx6_pcie {
        struct device           *pd_pcie;
        /* power domain for pcie phy */
        struct device           *pd_pcie_phy;
+       const struct imx6_pcie_drvdata *drvdata;
 };
 
 /* 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)
 {
        struct device *dev = imx6_pcie->pci->dev;
 
-       switch (imx6_pcie->variant) {
+       switch (imx6_pcie->drvdata->variant) {
        case IMX7D:
                reset_control_assert(imx6_pcie->pciephy_reset);
                reset_control_assert(imx6_pcie->apps_reset);
@@ -381,7 +385,7 @@ static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie)
        struct device *dev = pci->dev;
        int ret = 0;
 
-       switch (imx6_pcie->variant) {
+       switch (imx6_pcie->drvdata->variant) {
        case IMX6SX:
                ret = clk_prepare_enable(imx6_pcie->pcie_inbound_axi);
                if (ret) {
@@ -484,7 +488,7 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
                                        !imx6_pcie->gpio_active_high);
        }
 
-       switch (imx6_pcie->variant) {
+       switch (imx6_pcie->drvdata->variant) {
        case IMX7D:
                reset_control_deassert(imx6_pcie->pciephy_reset);
                imx7d_pcie_wait_for_phy_pll_lock(imx6_pcie);
@@ -522,7 +526,7 @@ err_pcie_phy:
 
 static void imx6_pcie_init_phy(struct imx6_pcie *imx6_pcie)
 {
-       switch (imx6_pcie->variant) {
+       switch (imx6_pcie->drvdata->variant) {
        case IMX7D:
                regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
                                   IMX7D_GPR12_PCIE_PHY_REFCLK_SEL, 0);
@@ -644,7 +648,7 @@ static void imx6_pcie_ltssm_enable(struct device *dev)
 {
        struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
 
-       switch (imx6_pcie->variant) {
+       switch (imx6_pcie->drvdata->variant) {
        case IMX6Q:
        case IMX6SX:
        case IMX6QP:
@@ -697,7 +701,7 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie)
                tmp |= PORT_LOGIC_SPEED_CHANGE;
                dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp);
 
-               if (imx6_pcie->variant != IMX7D) {
+               if (imx6_pcie->drvdata->variant != IMX7D) {
                        /*
                         * On i.MX7, DIRECT_SPEED_CHANGE behaves differently
                         * from i.MX6 family when no link speed transition
@@ -794,7 +798,7 @@ static void imx6_pcie_ltssm_disable(struct device *dev)
 {
        struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev);
 
-       switch (imx6_pcie->variant) {
+       switch (imx6_pcie->drvdata->variant) {
        case IMX6SX:
        case IMX6QP:
                regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
@@ -820,7 +824,7 @@ static void imx6_pcie_pm_turnoff(struct imx6_pcie *imx6_pcie)
        }
 
        /* Others poke directly at IOMUXC registers */
-       switch (imx6_pcie->variant) {
+       switch (imx6_pcie->drvdata->variant) {
        case IMX6SX:
                regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
                                IMX6SX_GPR12_PCIE_PM_TURN_OFF,
@@ -850,7 +854,7 @@ static void imx6_pcie_clk_disable(struct imx6_pcie *imx6_pcie)
        clk_disable_unprepare(imx6_pcie->pcie_phy);
        clk_disable_unprepare(imx6_pcie->pcie_bus);
 
-       switch (imx6_pcie->variant) {
+       switch (imx6_pcie->drvdata->variant) {
        case IMX6SX:
                clk_disable_unprepare(imx6_pcie->pcie_inbound_axi);
                break;
@@ -866,8 +870,8 @@ static void imx6_pcie_clk_disable(struct imx6_pcie *imx6_pcie)
 
 static inline bool imx6_pcie_supports_suspend(struct imx6_pcie *imx6_pcie)
 {
-       return (imx6_pcie->variant == IMX7D ||
-               imx6_pcie->variant == IMX6SX);
+       return (imx6_pcie->drvdata->variant == IMX7D ||
+               imx6_pcie->drvdata->variant == IMX6SX);
 }
 
 static int imx6_pcie_suspend_noirq(struct device *dev)
@@ -933,8 +937,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
        pci->ops = &dw_pcie_ops;
 
        imx6_pcie->pci = pci;
-       imx6_pcie->variant =
-               (enum imx6_pcie_variants)of_device_get_match_data(dev);
+       imx6_pcie->drvdata = of_device_get_match_data(dev);
 
        dbi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        pci->dbi_base = devm_ioremap_resource(dev, dbi_base);
@@ -978,7 +981,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)
                return PTR_ERR(imx6_pcie->pcie);
        }
 
-       switch (imx6_pcie->variant) {
+       switch (imx6_pcie->drvdata->variant) {
        case IMX6SX:
                imx6_pcie->pcie_inbound_axi = devm_clk_get(dev,
                                                           "pcie_inbound_axi");
@@ -1084,11 +1087,26 @@ static void imx6_pcie_shutdown(struct platform_device *pdev)
        imx6_pcie_assert_core_reset(imx6_pcie);
 }
 
+static const struct imx6_pcie_drvdata drvdata[] = {
+       [IMX6Q] = {
+               .variant = IMX6Q,
+       },
+       [IMX6SX] = {
+               .variant = IMX6SX,
+       },
+       [IMX6QP] = {
+               .variant = IMX6QP,
+       },
+       [IMX7D] = {
+               .variant = IMX7D,
+       },
+};
+
 static const struct of_device_id imx6_pcie_of_match[] = {
-       { .compatible = "fsl,imx6q-pcie",  .data = (void *)IMX6Q,  },
-       { .compatible = "fsl,imx6sx-pcie", .data = (void *)IMX6SX, },
-       { .compatible = "fsl,imx6qp-pcie", .data = (void *)IMX6QP, },
-       { .compatible = "fsl,imx7d-pcie",  .data = (void *)IMX7D,  },
+       { .compatible = "fsl,imx6q-pcie",  .data = &drvdata[IMX6Q],  },
+       { .compatible = "fsl,imx6sx-pcie", .data = &drvdata[IMX6SX], },
+       { .compatible = "fsl,imx6qp-pcie", .data = &drvdata[IMX6QP], },
+       { .compatible = "fsl,imx7d-pcie",  .data = &drvdata[IMX7D],  },
        {},
 };