Skip to content

Commit

Permalink
OMAPDSS: remove dispc's dependency to VENC/HDMI
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tomi Valkeinen committed Jun 17, 2013
1 parent 94954fc commit 5391e87
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 43 deletions.
20 changes: 7 additions & 13 deletions drivers/video/omap2/dss/dispc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down
19 changes: 1 addition & 18 deletions drivers/video/omap2/dss/dss.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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,
Expand All @@ -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);
Expand Down
8 changes: 2 additions & 6 deletions drivers/video/omap2/dss/hdmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
}

Expand Down
8 changes: 2 additions & 6 deletions drivers/video/omap2/dss/venc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit 5391e87

Please sign in to comment.