OMAPDSS: hide dss_select_dispc_clk_source()
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Mon, 22 Oct 2012 13:58:36 +0000 (16:58 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Mon, 5 Nov 2012 09:17:39 +0000 (11:17 +0200)
dss.c currently exposes functions to configure the dispc source clock
and lcd source clock. There are configured separately from the output
drivers.

However, there is no safe way for the output drivers to handle dispc
clock, as it's shared between the outputs. Thus, if, say, the DSI driver
sets up DSI PLL and configures both the dispc and lcd clock sources to
that DSI PLL, the resulting dispc clock could be too low for, say, HDMI.

Thus the output drivers should really only be concerned about the lcd
clock, which is what the output drivers actually use. There's lot to do
to clean up the dss clock handling, but this patch takes one step
forward and removes the use of dss_select_dispc_clk_source() from the
output drivers.

After this patch, the output drivers only configure the lcd source
clock. On omap4+ the dispc src clock is never changed from the default
PRCM source. On omap3, where the dispc and lcd clocks are actually the
same, setting the lcd clock source sets the dispc clock source.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/video/omap2/dss/dpi.c
drivers/video/omap2/dss/dsi.c
drivers/video/omap2/dss/dss.c
drivers/video/omap2/dss/dss.h
drivers/video/omap2/dss/hdmi.c

index 11d64b09cffec3fab33aa203544eb86dcab50eac..8b9be0d3f420f66c13d0d87c5b6849da3af6fe47 100644 (file)
@@ -77,6 +77,7 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev,
                unsigned long pck_req, unsigned long *fck, int *lck_div,
                int *pck_div)
 {
+       struct omap_overlay_manager *mgr = dssdev->output->manager;
        struct dsi_clock_info dsi_cinfo;
        struct dispc_clock_info dispc_cinfo;
        int r;
@@ -90,7 +91,8 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev,
        if (r)
                return r;
 
-       dss_select_dispc_clk_source(dssdev->clocks.dispc.dispc_fclk_src);
+       dss_select_lcd_clk_source(mgr->id,
+                       dssdev->clocks.dispc.channel.lcd_clk_src);
 
        dpi.mgr_config.clock_info = dispc_cinfo;
 
@@ -272,7 +274,7 @@ void omapdss_dpi_display_disable(struct omap_dss_device *dssdev)
        dss_mgr_disable(mgr);
 
        if (dpi_use_dsi_pll(dssdev)) {
-               dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
+               dss_select_lcd_clk_source(mgr->id, OMAP_DSS_CLK_SRC_FCK);
                dsi_pll_uninit(dpi.dsidev, true);
                dsi_runtime_put(dpi.dsidev);
        }
index e773f44b523d0db23b5c1722d412d73d8288a4bc..d9797da39e69dae6313cdb81454c1274eff46ef7 100644 (file)
@@ -4720,7 +4720,6 @@ static int dsi_display_init_dsi(struct omap_dss_device *dssdev)
        if (r)
                goto err1;
 
-       dss_select_dispc_clk_source(dssdev->clocks.dispc.dispc_fclk_src);
        dss_select_dsi_clk_source(dsi->module_id, dssdev->clocks.dsi.dsi_fclk_src);
        dss_select_lcd_clk_source(mgr->id,
                        dssdev->clocks.dispc.channel.lcd_clk_src);
@@ -4755,7 +4754,6 @@ static int dsi_display_init_dsi(struct omap_dss_device *dssdev)
 err3:
        dsi_cio_uninit(dsidev);
 err2:
-       dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
        dss_select_dsi_clk_source(dsi->module_id, OMAP_DSS_CLK_SRC_FCK);
        dss_select_lcd_clk_source(mgr->id, OMAP_DSS_CLK_SRC_FCK);
 
@@ -4782,7 +4780,6 @@ static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev,
        dsi_vc_enable(dsidev, 2, 0);
        dsi_vc_enable(dsidev, 3, 0);
 
-       dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
        dss_select_dsi_clk_source(dsi->module_id, OMAP_DSS_CLK_SRC_FCK);
        dss_select_lcd_clk_source(mgr->id, OMAP_DSS_CLK_SRC_FCK);
        dsi_cio_uninit(dsidev);
index 844bb1fda9118f358d4b08161bae1fda2447c6f3..df3d89a8c8a993667ea78a8bd9cf239fdae0e63b 100644 (file)
@@ -304,7 +304,7 @@ static void dss_dump_regs(struct seq_file *s)
 #undef DUMPREG
 }
 
-void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src)
+static void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src)
 {
        struct platform_device *dsidev;
        int b;
@@ -375,8 +375,10 @@ void dss_select_lcd_clk_source(enum omap_channel channel,
        struct platform_device *dsidev;
        int b, ix, pos;
 
-       if (!dss_has_feature(FEAT_LCD_CLK_SRC))
+       if (!dss_has_feature(FEAT_LCD_CLK_SRC)) {
+               dss_select_dispc_clk_source(clk_src);
                return;
+       }
 
        switch (clk_src) {
        case OMAP_DSS_CLK_SRC_FCK:
@@ -935,6 +937,8 @@ static int __init omap_dsshw_probe(struct platform_device *pdev)
        /* Select DPLL */
        REG_FLD_MOD(DSS_CONTROL, 0, 0, 0);
 
+       dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
+
 #ifdef CONFIG_OMAP2_DSS_VENC
        REG_FLD_MOD(DSS_CONTROL, 1, 4, 4);      /* venc dac demen */
        REG_FLD_MOD(DSS_CONTROL, 1, 3, 3);      /* venc clock 4x enable */
index e637f8d9dcf35966357668d31850fcf74cc4feb6..84a7f6a2bfc4221ee6d10e45a476b10ace201eb9 100644 (file)
@@ -283,7 +283,6 @@ void dss_sdi_init(int datapairs);
 int dss_sdi_enable(void);
 void dss_sdi_disable(void);
 
-void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src);
 void dss_select_dsi_clk_source(int dsi_module,
                enum omap_dss_clk_source clk_src);
 void dss_select_lcd_clk_source(enum omap_channel channel,
index 2aada9db0a04493c460e17b6b5e07eeb2c6e4925..a43ac3f2a48c1205338b2ee92d57c6ba39c1cfd7 100644 (file)
@@ -528,14 +528,6 @@ static int hdmi_power_on_core(struct omap_dss_device *dssdev)
        /* Make selection of HDMI in DSS */
        dss_select_hdmi_venc_clk_source(DSS_HDMI_M_PCLK);
 
-       /* Select the dispc clock source as PRCM clock, to ensure that it is not
-        * DSI PLL source as the clock selected by DSI PLL might not be
-        * sufficient for the resolution selected / that can be changed
-        * dynamically by user. This can be moved to single location , say
-        * Boardfile.
-        */
-       dss_select_dispc_clk_source(dssdev->clocks.dispc.dispc_fclk_src);
-
        return 0;
 
 err_runtime_get: