struct dpi_data {
        struct platform_device *pdev;
+       enum dss_model dss_model;
 
        struct regulator *vdds_dsi_reg;
        enum dss_clk_source clk_src;
        return DSS_CLK_SRC_FCK;
 }
 
-static enum dss_clk_source dpi_get_clk_src(enum omap_channel channel)
+static enum dss_clk_source dpi_get_clk_src(struct dpi_data *dpi)
 {
+       enum omap_channel channel = dpi->output.dispc_channel;
+
        /*
         * XXX we can't currently use DSI PLL for DPI with OMAP3, as the DSI PLL
         * would also be used for DISPC fclk. Meaning, when the DPI output is
         * disabled, DISPC clock will be disabled, and TV out will stop.
         */
-       switch (omapdss_get_version()) {
-       case OMAPDSS_VER_OMAP24xx:
-       case OMAPDSS_VER_OMAP34xx_ES1:
-       case OMAPDSS_VER_OMAP34xx_ES3:
-       case OMAPDSS_VER_OMAP3630:
-       case OMAPDSS_VER_AM35xx:
-       case OMAPDSS_VER_AM43xx:
+       switch (dpi->dss_model) {
+       case DSS_MODEL_OMAP2:
+       case DSS_MODEL_OMAP3:
                return DSS_CLK_SRC_FCK;
 
-       case OMAPDSS_VER_OMAP4430_ES1:
-       case OMAPDSS_VER_OMAP4430_ES2:
-       case OMAPDSS_VER_OMAP4:
+       case DSS_MODEL_OMAP4:
                switch (channel) {
                case OMAP_DSS_CHANNEL_LCD:
                        return DSS_CLK_SRC_PLL1_1;
                        return DSS_CLK_SRC_FCK;
                }
 
-       case OMAPDSS_VER_OMAP5:
+       case DSS_MODEL_OMAP5:
                switch (channel) {
                case OMAP_DSS_CHANNEL_LCD:
                        return DSS_CLK_SRC_PLL1_1;
                        return DSS_CLK_SRC_FCK;
                }
 
-       case OMAPDSS_VER_DRA7xx:
+       case DSS_MODEL_DRA7:
                return dpi_get_clk_src_dra7xx(channel);
 
        default:
        if (dpi->pll)
                return;
 
-       dpi->clk_src = dpi_get_clk_src(dpi->output.dispc_channel);
+       dpi->clk_src = dpi_get_clk_src(dpi);
 
        pll = dss_pll_find_by_src(dpi->clk_src);
        if (!pll)
  * the channel in some more dynamic manner, or get the channel as a user
  * parameter.
  */
-static enum omap_channel dpi_get_channel(int port_num)
+static enum omap_channel dpi_get_channel(struct dpi_data *dpi, int port_num)
 {
-       switch (omapdss_get_version()) {
-       case OMAPDSS_VER_OMAP24xx:
-       case OMAPDSS_VER_OMAP34xx_ES1:
-       case OMAPDSS_VER_OMAP34xx_ES3:
-       case OMAPDSS_VER_OMAP3630:
-       case OMAPDSS_VER_AM35xx:
-       case OMAPDSS_VER_AM43xx:
+       switch (dpi->dss_model) {
+       case DSS_MODEL_OMAP2:
+       case DSS_MODEL_OMAP3:
                return OMAP_DSS_CHANNEL_LCD;
 
-       case OMAPDSS_VER_DRA7xx:
+       case DSS_MODEL_DRA7:
                switch (port_num) {
                case 2:
                        return OMAP_DSS_CHANNEL_LCD3;
                        return OMAP_DSS_CHANNEL_LCD;
                }
 
-       case OMAPDSS_VER_OMAP4430_ES1:
-       case OMAPDSS_VER_OMAP4430_ES2:
-       case OMAPDSS_VER_OMAP4:
+       case DSS_MODEL_OMAP4:
                return OMAP_DSS_CHANNEL_LCD2;
 
-       case OMAPDSS_VER_OMAP5:
+       case DSS_MODEL_OMAP5:
                return OMAP_DSS_CHANNEL_LCD3;
 
        default:
        .get_timings = dpi_get_timings,
 };
 
-static void dpi_init_output_port(struct platform_device *pdev,
-       struct device_node *port)
+static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
 {
-       struct dpi_data *dpi = port->data;
        struct omap_dss_device *out = &dpi->output;
        int r;
        u32 port_num;
                break;
        }
 
-       out->dev = &pdev->dev;
+       out->dev = &dpi->pdev->dev;
        out->id = OMAP_DSS_OUTPUT_DPI;
        out->output_type = OMAP_DISPLAY_TYPE_DPI;
-       out->dispc_channel = dpi_get_channel(port_num);
+       out->dispc_channel = dpi_get_channel(dpi, port_num);
        out->port_num = port_num;
        out->ops.dpi = &dpi_ops;
        out->owner = THIS_MODULE;
        omapdss_unregister_output(out);
 }
 
-int dpi_init_port(struct platform_device *pdev, struct device_node *port)
+int dpi_init_port(struct platform_device *pdev, struct device_node *port,
+                 enum dss_model dss_model)
 {
        struct dpi_data *dpi;
        struct device_node *ep;
        of_node_put(ep);
 
        dpi->pdev = pdev;
+       dpi->dss_model = dss_model;
        port->data = dpi;
 
        mutex_init(&dpi->lock);
 
-       dpi_init_output_port(pdev, port);
+       dpi_init_output_port(dpi, port);
 
        dpi->port_initialized = true;
 
 
 };
 
 struct dss_features {
+       enum dss_model model;
        u8 fck_div_max;
        u8 dss_fck_multiplier;
        const char *parent_clk_name;
 };
 
 static const struct dss_features omap24xx_dss_feats = {
+       .model                  =       DSS_MODEL_OMAP2,
        /*
         * fck div max is really 16, but the divider range has gaps. The range
         * from 1 to 6 has no gaps, so let's use that as a max.
 };
 
 static const struct dss_features omap34xx_dss_feats = {
+       .model                  =       DSS_MODEL_OMAP3,
        .fck_div_max            =       16,
        .dss_fck_multiplier     =       2,
        .parent_clk_name        =       "dpll4_ck",
 };
 
 static const struct dss_features omap3630_dss_feats = {
+       .model                  =       DSS_MODEL_OMAP3,
        .fck_div_max            =       32,
        .dss_fck_multiplier     =       1,
        .parent_clk_name        =       "dpll4_ck",
 };
 
 static const struct dss_features omap44xx_dss_feats = {
+       .model                  =       DSS_MODEL_OMAP4,
        .fck_div_max            =       32,
        .dss_fck_multiplier     =       1,
        .parent_clk_name        =       "dpll_per_x2_ck",
 };
 
 static const struct dss_features omap54xx_dss_feats = {
+       .model                  =       DSS_MODEL_OMAP5,
        .fck_div_max            =       64,
        .dss_fck_multiplier     =       1,
        .parent_clk_name        =       "dpll_per_x2_ck",
 };
 
 static const struct dss_features am43xx_dss_feats = {
+       .model                  =       DSS_MODEL_OMAP3,
        .fck_div_max            =       0,
        .dss_fck_multiplier     =       0,
        .parent_clk_name        =       NULL,
 };
 
 static const struct dss_features dra7xx_dss_feats = {
+       .model                  =       DSS_MODEL_DRA7,
        .fck_div_max            =       64,
        .dss_fck_multiplier     =       1,
        .parent_clk_name        =       "dpll_per_x2_ck",
 
                switch (dss.feat->ports[i]) {
                case OMAP_DISPLAY_TYPE_DPI:
-                       dpi_init_port(pdev, port);
+                       dpi_init_port(pdev, port, dss.feat->model);
                        break;
                case OMAP_DISPLAY_TYPE_SDI:
                        sdi_init_port(pdev, port);