|
@@ -2320,6 +2320,46 @@ static int dispc_ovl_calc_scaling(unsigned long pclk, unsigned long lclk,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int dispc_ovl_check(enum omap_plane plane, enum omap_channel channel,
|
|
|
+ const struct omap_overlay_info *oi,
|
|
|
+ const struct omap_video_timings *timings,
|
|
|
+ int *x_predecim, int *y_predecim)
|
|
|
+{
|
|
|
+ enum omap_overlay_caps caps = dss_feat_get_overlay_caps(plane);
|
|
|
+ bool five_taps = true;
|
|
|
+ bool fieldmode = 0;
|
|
|
+ u16 in_height = oi->height;
|
|
|
+ u16 in_width = oi->width;
|
|
|
+ bool ilace = timings->interlace;
|
|
|
+ u16 out_width, out_height;
|
|
|
+ int pos_x = oi->pos_x;
|
|
|
+ unsigned long pclk = dispc_mgr_pclk_rate(channel);
|
|
|
+ unsigned long lclk = dispc_mgr_lclk_rate(channel);
|
|
|
+
|
|
|
+ out_width = oi->out_width == 0 ? oi->width : oi->out_width;
|
|
|
+ out_height = oi->out_height == 0 ? oi->height : oi->out_height;
|
|
|
+
|
|
|
+ if (ilace && oi->height == out_height)
|
|
|
+ fieldmode = 1;
|
|
|
+
|
|
|
+ if (ilace) {
|
|
|
+ if (fieldmode)
|
|
|
+ in_height /= 2;
|
|
|
+ out_height /= 2;
|
|
|
+
|
|
|
+ DSSDBG("adjusting for ilace: height %d, out_height %d\n",
|
|
|
+ in_height, out_height);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!dss_feat_color_mode_supported(plane, oi->color_mode))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return dispc_ovl_calc_scaling(pclk, lclk, caps, timings, in_width,
|
|
|
+ in_height, out_width, out_height, oi->color_mode,
|
|
|
+ &five_taps, x_predecim, y_predecim, pos_x,
|
|
|
+ oi->rotation_type, false);
|
|
|
+}
|
|
|
+
|
|
|
static int dispc_ovl_setup_common(enum omap_plane plane,
|
|
|
enum omap_overlay_caps caps, u32 paddr, u32 p_uv_addr,
|
|
|
u16 screen_width, int pos_x, int pos_y, u16 width, u16 height,
|