Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 310322
b: refs/heads/master
c: 81ab95b
h: refs/heads/master
v: v3
  • Loading branch information
Archit Taneja authored and Tomi Valkeinen committed May 9, 2012
1 parent b94e5cc commit f316651
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 33 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3fa03ba8542c40b90c95facfecd9b2789f71c0b6
refs/heads/master: 81ab95b7ec91e47c81e5e6ef4aac7b08c1ae90aa
6 changes: 3 additions & 3 deletions trunk/drivers/video/omap2/dss/apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -548,11 +548,13 @@ static void dss_ovl_write_regs(struct omap_overlay *ovl)

oi = &op->info;

mp = get_mgr_priv(ovl->manager);

replication = dss_use_replication(ovl->manager->device, oi->color_mode);

ilace = ovl->manager->device->type == OMAP_DISPLAY_TYPE_VENC;

r = dispc_ovl_setup(ovl->id, oi, ilace, replication);
r = dispc_ovl_setup(ovl->id, oi, ilace, replication, &mp->timings);
if (r) {
/*
* We can't do much here, as this function can be called from
Expand All @@ -566,8 +568,6 @@ static void dss_ovl_write_regs(struct omap_overlay *ovl)
return;
}

mp = get_mgr_priv(ovl->manager);

op->info_dirty = false;
if (mp->updating)
op->shadow_info_dirty = true;
Expand Down
51 changes: 23 additions & 28 deletions trunk/drivers/video/omap2/dss/dispc.c
Original file line number Diff line number Diff line change
Expand Up @@ -413,14 +413,6 @@ static inline bool dispc_mgr_is_lcd(enum omap_channel channel)
return false;
}

static struct omap_dss_device *dispc_mgr_get_device(enum omap_channel channel)
{
struct omap_overlay_manager *mgr =
omap_dss_get_overlay_manager(channel);

return mgr ? mgr->device : NULL;
}

u32 dispc_mgr_get_vsync_irq(enum omap_channel channel)
{
switch (channel) {
Expand Down Expand Up @@ -1661,18 +1653,17 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
* This function is used to avoid synclosts in OMAP3, because of some
* undocumented horizontal position and timing related limitations.
*/
static int check_horiz_timing_omap3(enum omap_channel channel, u16 pos_x,
static int check_horiz_timing_omap3(enum omap_channel channel,
const struct omap_video_timings *t, u16 pos_x,
u16 width, u16 height, u16 out_width, u16 out_height)
{
int DS = DIV_ROUND_UP(height, out_height);
struct omap_dss_device *dssdev = dispc_mgr_get_device(channel);
struct omap_video_timings t = dssdev->panel.timings;
unsigned long nonactive, lclk, pclk;
static const u8 limits[3] = { 8, 10, 20 };
u64 val, blank;
int i;

nonactive = t.x_res + t.hfp + t.hsw + t.hbp - out_width;
nonactive = t->x_res + t->hfp + t->hsw + t->hbp - out_width;
pclk = dispc_mgr_pclk_rate(channel);
if (dispc_mgr_is_lcd(channel))
lclk = dispc_mgr_lclk_rate(channel);
Expand All @@ -1684,7 +1675,7 @@ static int check_horiz_timing_omap3(enum omap_channel channel, u16 pos_x,
i++;
if (out_width < width)
i++;
blank = div_u64((u64)(t.hbp + t.hsw + t.hfp) * lclk, pclk);
blank = div_u64((u64)(t->hbp + t->hsw + t->hfp) * lclk, pclk);
DSSDBG("blanking period + ppl = %llu (limit = %u)\n", blank, limits[i]);
if (blank <= limits[i])
return -EINVAL;
Expand Down Expand Up @@ -1715,7 +1706,8 @@ static int check_horiz_timing_omap3(enum omap_channel channel, u16 pos_x,
}

static unsigned long calc_core_clk_five_taps(enum omap_channel channel,
u16 width, u16 height, u16 out_width, u16 out_height,
const struct omap_video_timings *mgr_timings, u16 width,
u16 height, u16 out_width, u16 out_height,
enum omap_color_mode color_mode)
{
u32 core_clk = 0;
Expand All @@ -1725,8 +1717,7 @@ static unsigned long calc_core_clk_five_taps(enum omap_channel channel,
return (unsigned long) pclk;

if (height > out_height) {
struct omap_dss_device *dssdev = dispc_mgr_get_device(channel);
unsigned int ppl = dssdev->panel.timings.x_res;
unsigned int ppl = mgr_timings->x_res;

tmp = pclk * height * out_width;
do_div(tmp, 2 * out_height * ppl);
Expand Down Expand Up @@ -1795,8 +1786,9 @@ static unsigned long calc_core_clk(enum omap_channel channel, u16 width,
}

static int dispc_ovl_calc_scaling(enum omap_plane plane,
enum omap_channel channel, u16 width, u16 height,
u16 out_width, u16 out_height,
enum omap_channel channel,
const struct omap_video_timings *mgr_timings,
u16 width, u16 height, u16 out_width, u16 out_height,
enum omap_color_mode color_mode, bool *five_taps,
int *x_predecim, int *y_predecim, u16 pos_x)
{
Expand Down Expand Up @@ -1871,11 +1863,13 @@ static int dispc_ovl_calc_scaling(enum omap_plane plane,
do {
in_height = DIV_ROUND_UP(height, decim_y);
in_width = DIV_ROUND_UP(width, decim_x);
core_clk = calc_core_clk_five_taps(channel, in_width,
in_height, out_width, out_height, color_mode);
core_clk = calc_core_clk_five_taps(channel, mgr_timings,
in_width, in_height, out_width, out_height,
color_mode);

error = check_horiz_timing_omap3(channel, pos_x,
in_width, in_height, out_width, out_height);
error = check_horiz_timing_omap3(channel, mgr_timings,
pos_x, in_width, in_height, out_width,
out_height);

if (in_width > maxsinglelinewidth)
if (in_height > out_height &&
Expand All @@ -1900,8 +1894,8 @@ static int dispc_ovl_calc_scaling(enum omap_plane plane,
} while (decim_x <= *x_predecim && decim_y <= *y_predecim
&& error);

if (check_horiz_timing_omap3(channel, pos_x, width, height,
out_width, out_height)){
if (check_horiz_timing_omap3(channel, mgr_timings, pos_x, width,
height, out_width, out_height)){
DSSERR("horizontal timing too tight\n");
return -EINVAL;
}
Expand Down Expand Up @@ -1959,7 +1953,8 @@ static int dispc_ovl_calc_scaling(enum omap_plane plane,
}

int dispc_ovl_setup(enum omap_plane plane, struct omap_overlay_info *oi,
bool ilace, bool replication)
bool ilace, bool replication,
const struct omap_video_timings *mgr_timings)
{
struct omap_overlay *ovl = omap_dss_get_overlay(plane);
bool five_taps = true;
Expand Down Expand Up @@ -2008,9 +2003,9 @@ int dispc_ovl_setup(enum omap_plane plane, struct omap_overlay_info *oi,
if (!dss_feat_color_mode_supported(plane, oi->color_mode))
return -EINVAL;

r = dispc_ovl_calc_scaling(plane, channel, in_width, in_height,
out_width, out_height, oi->color_mode, &five_taps,
&x_predecim, &y_predecim, oi->pos_x);
r = dispc_ovl_calc_scaling(plane, channel, mgr_timings, in_width,
in_height, out_width, out_height, oi->color_mode,
&five_taps, &x_predecim, &y_predecim, oi->pos_x);
if (r)
return r;

Expand Down
3 changes: 2 additions & 1 deletion trunk/drivers/video/omap2/dss/dss.h
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,8 @@ void dispc_ovl_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high);
void dispc_ovl_compute_fifo_thresholds(enum omap_plane plane,
u32 *fifo_low, u32 *fifo_high, bool use_fifomerge);
int dispc_ovl_setup(enum omap_plane plane, struct omap_overlay_info *oi,
bool ilace, bool replication);
bool ilace, bool replication,
const struct omap_video_timings *mgr_timings);
int dispc_ovl_enable(enum omap_plane plane, bool enable);
void dispc_ovl_set_channel_out(enum omap_plane plane,
enum omap_channel channel);
Expand Down

0 comments on commit f316651

Please sign in to comment.