diff options
author | Archit Taneja <archit@ti.com> | 2012-04-16 12:53:44 +0530 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-04-23 10:48:10 +0300 |
commit | 8f366162d213f21d9d77560429085033278830c5 (patch) | |
tree | e45918b90ba174e58f3ea609e35e7aa34ec67e31 /drivers/video/omap2/dss/dispc.c | |
parent | c51d921a0cd83ecc768de7176bc7b7c2d76db278 (diff) | |
download | lwn-8f366162d213f21d9d77560429085033278830c5.tar.gz lwn-8f366162d213f21d9d77560429085033278830c5.zip |
OMAPDSS: DISPC: Clean up manager timing/size functions
Clean up the DISPC manager timings related function by:
- Create a common function to set size for LCD and TV.
- Create a common function to check timings for LCD and TV.
- Add dss params to get the range of manager size.
Signed-off-by: Archit Taneja <archit@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video/omap2/dss/dispc.c')
-rw-r--r-- | drivers/video/omap2/dss/dispc.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index d6a4b31fa0be..7a65eb07a2c4 100644 --- a/drivers/video/omap2/dss/dispc.c +++ b/drivers/video/omap2/dss/dispc.c @@ -983,21 +983,13 @@ static void dispc_ovl_enable_replication(enum omap_plane plane, bool enable) REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable, shift, shift); } -static void dispc_mgr_set_lcd_size(enum omap_channel channel, u16 width, +static void dispc_mgr_set_size(enum omap_channel channel, u16 width, u16 height) { u32 val; - BUG_ON((width > (1 << 11)) || (height > (1 << 11))); - val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); - dispc_write_reg(DISPC_SIZE_MGR(channel), val); -} -static void dispc_mgr_set_digit_size(u16 width, u16 height) -{ - u32 val; - BUG_ON((width > (1 << 11)) || (height > (1 << 11))); val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); - dispc_write_reg(DISPC_SIZE_MGR(OMAP_DSS_CHANNEL_DIGIT), val); + dispc_write_reg(DISPC_SIZE_MGR(channel), val); } static void dispc_read_plane_fifo_sizes(void) @@ -2286,6 +2278,12 @@ void dispc_mgr_enable_stallmode(enum omap_channel channel, bool enable) REG_FLD_MOD(DISPC_CONTROL, enable, 11, 11); } +static bool _dispc_mgr_size_ok(u16 width, u16 height) +{ + return width <= dss_feat_get_param_max(FEAT_PARAM_MGR_WIDTH) && + height <= dss_feat_get_param_max(FEAT_PARAM_MGR_HEIGHT); +} + static bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp, int vsw, int vfp, int vbp) { @@ -2310,11 +2308,20 @@ static bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp, return true; } -bool dispc_lcd_timings_ok(struct omap_video_timings *timings) +bool dispc_mgr_timings_ok(enum omap_channel channel, + struct omap_video_timings *timings) { - return _dispc_lcd_timings_ok(timings->hsw, timings->hfp, - timings->hbp, timings->vsw, - timings->vfp, timings->vbp); + bool timings_ok; + + timings_ok = _dispc_mgr_size_ok(timings->x_res, timings->y_res); + + if (dispc_mgr_is_lcd(channel)) + timings_ok = timings_ok && _dispc_lcd_timings_ok(timings->hsw, + timings->hfp, timings->hbp, + timings->vsw, timings->vfp, + timings->vbp); + + return timings_ok; } static void _dispc_mgr_set_lcd_timings(enum omap_channel channel, int hsw, @@ -2350,16 +2357,14 @@ void dispc_mgr_set_timings(enum omap_channel channel, DSSDBG("channel %d xres %u yres %u\n", channel, timings->x_res, timings->y_res); - if (dispc_mgr_is_lcd(channel)) { - if (!dispc_lcd_timings_ok(timings)) - BUG(); + if (!dispc_mgr_timings_ok(channel, timings)) + BUG(); + if (dispc_mgr_is_lcd(channel)) { _dispc_mgr_set_lcd_timings(channel, timings->hsw, timings->hfp, timings->hbp, timings->vsw, timings->vfp, timings->vbp); - dispc_mgr_set_lcd_size(channel, timings->x_res, timings->y_res); - xtot = timings->x_res + timings->hfp + timings->hsw + timings->hbp; ytot = timings->y_res + timings->vfp + timings->vsw + @@ -2374,9 +2379,9 @@ void dispc_mgr_set_timings(enum omap_channel channel, timings->vsw, timings->vfp, timings->vbp); DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt); - } else { - dispc_mgr_set_digit_size(timings->x_res, timings->y_res); } + + dispc_mgr_set_size(channel, timings->x_res, timings->y_res); } static void dispc_mgr_set_lcd_divisor(enum omap_channel channel, u16 lck_div, |