OMAPDSS: remove dispc's dependency to VENC/HDMI
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>
This commit is contained in:
Родитель
94954fcb80
Коммит
5391e87d12
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче