|
@@ -928,12 +928,52 @@ err:
|
|
|
}
|
|
|
|
|
|
|
|
|
+static int dss_ovl_simple_check(struct omap_overlay *ovl,
|
|
|
+ const struct omap_overlay_info *info)
|
|
|
+{
|
|
|
+ if (info->paddr == 0) {
|
|
|
+ DSSERR("check_overlay: paddr cannot be 0\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) {
|
|
|
+ if (info->out_width != 0 && info->width != info->out_width) {
|
|
|
+ DSSERR("check_overlay: overlay %d doesn't support "
|
|
|
+ "scaling\n", ovl->id);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (info->out_height != 0 && info->height != info->out_height) {
|
|
|
+ DSSERR("check_overlay: overlay %d doesn't support "
|
|
|
+ "scaling\n", ovl->id);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((ovl->supported_modes & info->color_mode) == 0) {
|
|
|
+ DSSERR("check_overlay: overlay %d doesn't support mode %d\n",
|
|
|
+ ovl->id, info->color_mode);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (info->zorder >= omap_dss_get_num_overlays()) {
|
|
|
+ DSSERR("check_overlay: zorder %d too high\n", info->zorder);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
int dss_ovl_set_info(struct omap_overlay *ovl,
|
|
|
struct omap_overlay_info *info)
|
|
|
{
|
|
|
struct ovl_priv_data *op = get_ovl_priv(ovl);
|
|
|
unsigned long flags;
|
|
|
+ int r;
|
|
|
+
|
|
|
+ r = dss_ovl_simple_check(ovl, info);
|
|
|
+ if (r)
|
|
|
+ return r;
|
|
|
|
|
|
spin_lock_irqsave(&data_lock, flags);
|
|
|
|