Introduce driver data struct. This will simplify handling of device
specific differences.

Signed-off-by: Stefan Agner <[email protected]>
[[email protected] reformatted drvdata, to simplify future diffs]
Signed-off-by: Andrey Smirnov <[email protected]>
Reviewed-by: Lucas Stach <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
Cc: Fabio Estevam <[email protected]>
Cc: Chris Healy <[email protected]>
Cc: Lucas Stach <[email protected]>
Cc: Leonard Crestez <[email protected]>
Cc: "A.s. Dong" <[email protected]>
Cc: Richard Zhu <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
 drivers/pci/controller/dwc/pci-imx6.c | 56 ++++++++++++++++++---------
 1 file 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 {
        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 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie 
*imx6_pcie)
 
 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],  },
        {},
 };
 
-- 
2.20.1

Reply via email to