OMAPDSS: remove dispc's dependency to VENC/HDMI
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 16 May 2013 07:44:13 +0000 (10:44 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Mon, 17 Jun 2013 11:00:55 +0000 (14:00 +0300)
DISPC needs to know the clock rate for DIGIT (i.e. TV) channel, and this
clock is provided by either VENC or HDMI modules. Currently DISPC will
call a function in VENC/HDMI, asking what the clock rate is. This means
we have a fixed dependency from DISPC to both VENC and HDMI.

To have a more generic approach, and in particular to allow adding OMAP5
HDMI driver, we need to remove this dependency. This patch makes
VENC/HDMI inform DISPC when the their clock changes, thus reversing the
dependency and removing the issue.

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

index 83d7bb9da609a037bef99146497ec6023223beed..02a7340111dfbf4b856122aae670bdbff2c34150 100644 (file)
@@ -103,6 +103,7 @@ static struct {
        int irq;
 
        unsigned long core_clk_rate;
+       unsigned long tv_pclk_rate;
 
        u32 fifo_size[DISPC_MAX_NR_FIFOS];
        /* maps which plane is using a fifo. fifo-id -> plane-id */
@@ -3071,22 +3072,15 @@ unsigned long dispc_mgr_pclk_rate(enum omap_channel channel)
 
                return r / pcd;
        } else {
-               enum dss_hdmi_venc_clk_source_select source;
-
-               source = dss_get_hdmi_venc_clk_source();
-
-               switch (source) {
-               case DSS_VENC_TV_CLK:
-                       return venc_get_pixel_clock();
-               case DSS_HDMI_M_PCLK:
-                       return hdmi_get_pixel_clock();
-               default:
-                       BUG();
-                       return 0;
-               }
+               return dispc.tv_pclk_rate;
        }
 }
 
+void dispc_set_tv_pclk(unsigned long pclk)
+{
+       dispc.tv_pclk_rate = pclk;
+}
+
 unsigned long dispc_core_clk_rate(void)
 {
        return dispc.core_clk_rate;
index 67a509ea1fcb6c99ae08957a74d01cfb77f7b2c6..ed70fa01d192fe7cd4fe449a2e44c339b47bd494 100644 (file)
@@ -426,6 +426,7 @@ void dispc_mgr_set_clock_div(enum omap_channel channel,
                const struct dispc_clock_info *cinfo);
 int dispc_mgr_get_clock_div(enum omap_channel channel,
                struct dispc_clock_info *cinfo);
+void dispc_set_tv_pclk(unsigned long pclk);
 
 u32 dispc_wb_get_framedone_irq(void);
 bool dispc_wb_go_busy(void);
@@ -437,17 +438,8 @@ int dispc_wb_setup(const struct omap_dss_writeback_info *wi,
                bool mem_to_mem, const struct omap_video_timings *timings);
 
 /* VENC */
-#ifdef CONFIG_OMAP2_DSS_VENC
 int venc_init_platform_driver(void) __init;
 void venc_uninit_platform_driver(void) __exit;
-unsigned long venc_get_pixel_clock(void);
-#else
-static inline unsigned long venc_get_pixel_clock(void)
-{
-       WARN("%s: VENC not compiled in, returning pclk as 0\n", __func__);
-       return 0;
-}
-#endif
 int omapdss_venc_display_enable(struct omap_dss_device *dssdev);
 void omapdss_venc_display_disable(struct omap_dss_device *dssdev);
 void omapdss_venc_set_timings(struct omap_dss_device *dssdev,
@@ -464,17 +456,8 @@ int venc_panel_init(void);
 void venc_panel_exit(void);
 
 /* HDMI */
-#ifdef CONFIG_OMAP4_DSS_HDMI
 int hdmi_init_platform_driver(void) __init;
 void hdmi_uninit_platform_driver(void) __exit;
-unsigned long hdmi_get_pixel_clock(void);
-#else
-static inline unsigned long hdmi_get_pixel_clock(void)
-{
-       WARN("%s: HDMI not compiled in, returning pclk as 0\n", __func__);
-       return 0;
-}
-#endif
 int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev);
 void omapdss_hdmi_display_disable(struct omap_dss_device *dssdev);
 int omapdss_hdmi_core_enable(struct omap_dss_device *dssdev);
index 3038eef99baf569e07c8894b98085d7b694fd8ed..e1c0992b522b29c0dfaebf9796dc67926a5e6207 100644 (file)
@@ -465,12 +465,6 @@ end:       return cm;
 
 }
 
-unsigned long hdmi_get_pixel_clock(void)
-{
-       /* HDMI Pixel Clock in Mhz */
-       return hdmi.ip_data.cfg.timings.pixel_clock * 1000;
-}
-
 static void hdmi_compute_pll(struct omap_dss_device *dssdev, int phy,
                struct hdmi_pll_info *pi)
 {
@@ -663,6 +657,8 @@ void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev,
        if (t != NULL)
                hdmi.ip_data.cfg = *t;
 
+       dispc_set_tv_pclk(t->timings.pixel_clock * 1000);
+
        mutex_unlock(&hdmi.lock);
 }
 
index 4a8a214067ab2e57dbc71abe218f037a6305d52b..8720f137d4f8b7800eeaeea0c2a3c7deb4bdcca6 100644 (file)
@@ -492,12 +492,6 @@ static void venc_power_off(struct omap_dss_device *dssdev)
        venc_runtime_put();
 }
 
-unsigned long venc_get_pixel_clock(void)
-{
-       /* VENC Pixel Clock in Mhz */
-       return 13500000;
-}
-
 int omapdss_venc_display_enable(struct omap_dss_device *dssdev)
 {
        struct omap_dss_device *out = &venc.output;
@@ -551,6 +545,8 @@ void omapdss_venc_set_timings(struct omap_dss_device *dssdev,
 
        venc.timings = *timings;
 
+       dispc_set_tv_pclk(13500000);
+
        mutex_unlock(&venc.venc_lock);
 }