OMAPDSS: APPLY: add dss_ovl_simple_check()
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 17 Nov 2011 12:26:48 +0000 (14:26 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 2 Dec 2011 06:54:52 +0000 (08:54 +0200)
Add dss_ovl_simple_check() which is used to check the validity of
certain overlay attributes. Only attributes that can be checked
independently, without knowing the display being used, is done here
(thus "simple").

We can use this function in dss_ovl_set_info().

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/video/omap2/dss/apply.c

index 4cc7c37acbb41e8d8dc7b99030e0697c0f25db83..dccddd2644364018f76b0f3123c922530446a0f9 100644 (file)
@@ -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);