OMAPDSS: Add support for DPI source selection
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 21 Sep 2012 09:09:54 +0000 (12:09 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Mon, 24 Sep 2012 13:50:08 +0000 (16:50 +0300)
We can select the video source for DPI output as follows:

OMAP2/3: always LCD1
OMAP4: LCD2 or DIGIT
OMAP5: LCD1/LCD2/LCD3/DIGIT

This patch adds support to select the source, and makes dpi.c call the
function to set the source.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: David Anders <x0132446@ti.com>
drivers/video/omap2/dss/dpi.c
drivers/video/omap2/dss/dss.c
drivers/video/omap2/dss/dss.h

index 5ccce9b69e428fd555508bccbd2c5bddc0da64b3..b7233882fcfdc54ec1176830fbf59d1a3469f285 100644 (file)
@@ -203,6 +203,10 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
        if (r)
                goto err_get_dispc;
 
+       r = dss_dpi_select_source(dssdev->channel);
+       if (r)
+               goto err_src_sel;
+
        if (dpi_use_dsi_pll(dssdev)) {
                r = dsi_runtime_get(dpi.dsidev);
                if (r)
@@ -237,6 +241,7 @@ err_dsi_pll_init:
        if (dpi_use_dsi_pll(dssdev))
                dsi_runtime_put(dpi.dsidev);
 err_get_dsi:
+err_src_sel:
        dispc_runtime_put();
 err_get_dispc:
        if (dss_has_feature(FEAT_DPI_USES_VDDS_DSI))
index 660813b01197896a4123d0d52b0a5b7dbfbf67b8..2ab1c3e96553d81297ad5f942eed2cfb76a5064b 100644 (file)
@@ -69,6 +69,7 @@ struct dss_features {
        u8 fck_div_max;
        u8 dss_fck_multiplier;
        const char *clk_name;
+       int (*dpi_select_source)(enum omap_channel channel);
 };
 
 static struct {
@@ -623,6 +624,65 @@ enum dss_hdmi_venc_clk_source_select dss_get_hdmi_venc_clk_source(void)
        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;
@@ -701,30 +761,35 @@ static const struct dss_features omap24xx_dss_feats __initconst = {
        .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)
index 5e9fd7691728817ce0bdcea310fe0d43a73b163f..2a51ae99474c4fe67ac7b5784cc6b791b3a7c2d0 100644 (file)
@@ -277,6 +277,7 @@ void dss_overlay_kobj_uninit(struct omap_overlay *ovl);
 int dss_init_platform_driver(void) __init;
 void dss_uninit_platform_driver(void);
 
+int dss_dpi_select_source(enum omap_channel channel);
 void dss_select_hdmi_venc_clk_source(enum dss_hdmi_venc_clk_source_select);
 enum dss_hdmi_venc_clk_source_select dss_get_hdmi_venc_clk_source(void);
 const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src);