u8 fck_div_max;
        u8 dss_fck_multiplier;
        const char *clk_name;
+       int (*dpi_select_source)(enum omap_channel channel);
 };
 
 static struct {
        return REG_GET(DSS_CONTROL, 15, 15);
 }
 
+static int dss_dpi_select_source_omap2_omap3(enum omap_channel channel)
+{
+       if (channel != OMAP_DSS_CHANNEL_LCD)
+               return -EINVAL;
+
+       return 0;
+}
+
+static int dss_dpi_select_source_omap4(enum omap_channel channel)
+{
+       int val;
+
+       switch (channel) {
+       case OMAP_DSS_CHANNEL_LCD2:
+               val = 0;
+               break;
+       case OMAP_DSS_CHANNEL_DIGIT:
+               val = 1;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       REG_FLD_MOD(DSS_CONTROL, val, 17, 17);
+
+       return 0;
+}
+
+static int dss_dpi_select_source_omap5(enum omap_channel channel)
+{
+       int val;
+
+       switch (channel) {
+       case OMAP_DSS_CHANNEL_LCD:
+               val = 1;
+               break;
+       case OMAP_DSS_CHANNEL_LCD2:
+               val = 2;
+               break;
+       case OMAP_DSS_CHANNEL_LCD3:
+               val = 3;
+               break;
+       case OMAP_DSS_CHANNEL_DIGIT:
+               val = 0;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       REG_FLD_MOD(DSS_CONTROL, val, 17, 16);
+
+       return 0;
+}
+
+int dss_dpi_select_source(enum omap_channel channel)
+{
+       return dss.feat->dpi_select_source(channel);
+}
+
 static int dss_get_clocks(void)
 {
        struct clk *clk;
        .fck_div_max            =       16,
        .dss_fck_multiplier     =       2,
        .clk_name               =       NULL,
+       .dpi_select_source      =       &dss_dpi_select_source_omap2_omap3,
 };
 
 static const struct dss_features omap34xx_dss_feats __initconst = {
        .fck_div_max            =       16,
        .dss_fck_multiplier     =       2,
        .clk_name               =       "dpll4_m4_ck",
+       .dpi_select_source      =       &dss_dpi_select_source_omap2_omap3,
 };
 
 static const struct dss_features omap3630_dss_feats __initconst = {
        .fck_div_max            =       32,
        .dss_fck_multiplier     =       1,
        .clk_name               =       "dpll4_m4_ck",
+       .dpi_select_source      =       &dss_dpi_select_source_omap2_omap3,
 };
 
 static const struct dss_features omap44xx_dss_feats __initconst = {
        .fck_div_max            =       32,
        .dss_fck_multiplier     =       1,
        .clk_name               =       "dpll_per_m5x2_ck",
+       .dpi_select_source      =       &dss_dpi_select_source_omap4,
 };
 
 static const struct dss_features omap54xx_dss_feats __initconst = {
        .fck_div_max            =       64,
        .dss_fck_multiplier     =       1,
        .clk_name               =       "dpll_per_h12x2_ck",
+       .dpi_select_source      =       &dss_dpi_select_source_omap5,
 };
 
 static int __init dss_init_features(struct device *dev)