OMAP: DSS2: Clean up DISPC color mode validation checks
authorArchit Taneja <archit@ti.com>
Thu, 25 Nov 2010 12:28:10 +0000 (17:58 +0530)
committerTomi Valkeinen <tomi.valkeinen@nokia.com>
Mon, 10 Jan 2011 09:09:54 +0000 (11:09 +0200)
The supported set of color modes varies for different DISPC pipelines(plane)
and omap version. This makes the checks for validation of a color mode more
complicated as new omap versions are added.

A dss_feature function is created which tells if a color_mode is supported
for a plane on the current omap revision.

Signed-off-by: Archit Taneja <archit@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
drivers/video/omap2/dss/dispc.c
drivers/video/omap2/dss/dss_features.c
drivers/video/omap2/dss/dss_features.h

index 54ba8d3..4e9ebde 100644 (file)
@@ -1550,29 +1550,12 @@ static int _dispc_setup_plane(enum omap_plane plane,
                                height, pos_y, out_height);
        }
 
+       if (!dss_feat_color_mode_supported(plane, color_mode))
+               return -EINVAL;
+
        if (plane == OMAP_DSS_GFX) {
                if (width != out_width || height != out_height)
                        return -EINVAL;
-
-               switch (color_mode) {
-               case OMAP_DSS_COLOR_ARGB16:
-               case OMAP_DSS_COLOR_ARGB32:
-               case OMAP_DSS_COLOR_RGBA32:
-                       if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
-                               return -EINVAL;
-               case OMAP_DSS_COLOR_RGBX32:
-                       if (cpu_is_omap24xx())
-                               return -EINVAL;
-                       /* fall through */
-               case OMAP_DSS_COLOR_RGB12U:
-               case OMAP_DSS_COLOR_RGB16:
-               case OMAP_DSS_COLOR_RGB24P:
-               case OMAP_DSS_COLOR_RGB24U:
-                       break;
-
-               default:
-                       return -EINVAL;
-               }
        } else {
                /* video plane */
 
@@ -1586,35 +1569,9 @@ static int _dispc_setup_plane(enum omap_plane plane,
                   out_height > height * 8)
                        return -EINVAL;
 
-               switch (color_mode) {
-               case OMAP_DSS_COLOR_RGBX32:
-               case OMAP_DSS_COLOR_RGB12U:
-                       if (cpu_is_omap24xx())
-                               return -EINVAL;
-                       /* fall through */
-               case OMAP_DSS_COLOR_RGB16:
-               case OMAP_DSS_COLOR_RGB24P:
-               case OMAP_DSS_COLOR_RGB24U:
-                       break;
-
-               case OMAP_DSS_COLOR_ARGB16:
-               case OMAP_DSS_COLOR_ARGB32:
-               case OMAP_DSS_COLOR_RGBA32:
-                       if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
-                               return -EINVAL;
-                       if (!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) &&
-                                       plane == OMAP_DSS_VIDEO1)
-                               return -EINVAL;
-                       break;
-
-               case OMAP_DSS_COLOR_YUV2:
-               case OMAP_DSS_COLOR_UYVY:
+               if (color_mode == OMAP_DSS_COLOR_YUV2 ||
+                       color_mode == OMAP_DSS_COLOR_UYVY)
                        cconv = 1;
-                       break;
-
-               default:
-                       return -EINVAL;
-               }
 
                /* Must use 5-tap filter? */
                five_taps = height > out_height * 2;
index 854deba..620221f 100644 (file)
@@ -179,6 +179,13 @@ enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane)
        return omap_current_dss_features->supported_color_modes[plane];
 }
 
+bool dss_feat_color_mode_supported(enum omap_plane plane,
+               enum omap_color_mode color_mode)
+{
+       return omap_current_dss_features->supported_color_modes[plane] &
+                       color_mode;
+}
+
 /* DSS has_feature check */
 bool dss_has_feature(enum dss_feat_id id)
 {
index aeb2eea..806db43 100644 (file)
@@ -44,6 +44,8 @@ int dss_feat_get_num_mgrs(void);
 int dss_feat_get_num_ovls(void);
 enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel);
 enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane);
+bool dss_feat_color_mode_supported(enum omap_plane plane,
+               enum omap_color_mode color_mode);
 
 bool dss_has_feature(enum dss_feat_id id);
 void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end);