diff mbox

[11/16] drm/omap: change supported_modes to an array

Message ID 1493893412-12178-12-git-send-email-tomi.valkeinen@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Tomi Valkeinen May 4, 2017, 10:23 a.m. UTC
enum omap_color_mode is a bitmask, so at the moment we present the
supported color modes as mask. To be able to move to fourccs, we need to
use an array to present the supported color modes.

As a first step towards fourccs, this patch changes the code to use an
array to store the enums.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
---
 drivers/gpu/drm/omapdrm/dss/dispc.c        |   2 +-
 drivers/gpu/drm/omapdrm/dss/dss_features.c | 153 +++++++++++++++++------------
 drivers/gpu/drm/omapdrm/dss/dss_features.h |   2 +-
 drivers/gpu/drm/omapdrm/dss/omapdss.h      |   2 +-
 drivers/gpu/drm/omapdrm/omap_drv.h         |   2 +-
 drivers/gpu/drm/omapdrm/omap_fb.c          |  14 ++-
 6 files changed, 103 insertions(+), 72 deletions(-)

Comments

Laurent Pinchart May 24, 2017, 10:44 a.m. UTC | #1
Hi Tomi,

Thank you for the patch.

On Thursday 04 May 2017 13:23:27 Tomi Valkeinen wrote:
> enum omap_color_mode is a bitmask, so at the moment we present the
> supported color modes as mask. To be able to move to fourccs, we need to
> use an array to present the supported color modes.
> 
> As a first step towards fourccs, this patch changes the code to use an
> array to store the enums.
> 
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
> ---
>  drivers/gpu/drm/omapdrm/dss/dispc.c        |   2 +-
>  drivers/gpu/drm/omapdrm/dss/dss_features.c | 153 +++++++++++++++----------
>  drivers/gpu/drm/omapdrm/dss/dss_features.h |   2 +-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h      |   2 +-
>  drivers/gpu/drm/omapdrm/omap_drv.h         |   2 +-
>  drivers/gpu/drm/omapdrm/omap_fb.c          |  14 ++-
>  6 files changed, 103 insertions(+), 72 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c
> b/drivers/gpu/drm/omapdrm/dss/dispc.c index 9dfef8fdff67..dcd83efda3af
> 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dispc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
> @@ -1140,7 +1140,7 @@ static u32 dispc_ovl_get_burst_size(enum omap_plane_id
> plane) return unit * 8;
>  }
> 
> -static enum omap_color_mode dispc_ovl_get_color_modes(enum omap_plane_id
> plane) +static const enum omap_color_mode *dispc_ovl_get_color_modes(enum
> omap_plane_id plane) {
>  	return dss_feat_get_supported_color_modes(plane);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss_features.c
> b/drivers/gpu/drm/omapdrm/dss/dss_features.c index
> bdac1d645ef0..f9b0324cc263 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss_features.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss_features.c

[snip]

> @@ -229,90 +229,104 @@ static const enum omap_dss_output_id
> omap5_dss_supported_outputs[] = { OMAP_DSS_OUTPUT_DSI2,
>  };
> 
> -static const enum omap_color_mode omap2_dss_supported_color_modes[] = {
> +#define COLOR_ARRAY(arr...) (const enum omap_color_mode[]) { arr, 0 }

I don't like this macro much, but I don't think I have a much better proposal 
beside just typing the cast out :-/, so

Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> +static const enum omap_color_mode *omap2_dss_supported_color_modes[] = {
> +
>  	/* OMAP_DSS_GFX */
> -	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
> -	OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P,
> +	COLOR_ARRAY(
> +	OMAP_DSS_COLOR_RGB12U, OMAP_DSS_COLOR_RGB16,
> +	OMAP_DSS_COLOR_RGB24U, OMAP_DSS_COLOR_RGB24P),
> 
>  	/* OMAP_DSS_VIDEO1 */
> -	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
> -	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
> -	OMAP_DSS_COLOR_UYVY,
> +	COLOR_ARRAY(
> +	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB24U,
> +	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_YUV2,
> +	OMAP_DSS_COLOR_UYVY),
> 
>  	/* OMAP_DSS_VIDEO2 */
> -	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
> -	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
> -	OMAP_DSS_COLOR_UYVY,
> +	COLOR_ARRAY(
> +	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB24U,
> +	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_YUV2,
> +	OMAP_DSS_COLOR_UYVY),
>  };

[snip]
diff mbox

Patch

diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c
index 9dfef8fdff67..dcd83efda3af 100644
--- a/drivers/gpu/drm/omapdrm/dss/dispc.c
+++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
@@ -1140,7 +1140,7 @@  static u32 dispc_ovl_get_burst_size(enum omap_plane_id plane)
 	return unit * 8;
 }
 
-static enum omap_color_mode dispc_ovl_get_color_modes(enum omap_plane_id plane)
+static const enum omap_color_mode *dispc_ovl_get_color_modes(enum omap_plane_id plane)
 {
 	return dss_feat_get_supported_color_modes(plane);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/dss_features.c b/drivers/gpu/drm/omapdrm/dss/dss_features.c
index bdac1d645ef0..f9b0324cc263 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss_features.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss_features.c
@@ -47,7 +47,7 @@  struct omap_dss_features {
 	const int num_ovls;
 	const enum omap_display_type *supported_displays;
 	const enum omap_dss_output_id *supported_outputs;
-	const enum omap_color_mode *supported_color_modes;
+	const enum omap_color_mode **supported_color_modes;
 	const enum omap_overlay_caps *overlay_caps;
 	const struct dss_param_range *dss_params;
 
@@ -229,90 +229,104 @@  static const enum omap_dss_output_id omap5_dss_supported_outputs[] = {
 	OMAP_DSS_OUTPUT_DSI2,
 };
 
-static const enum omap_color_mode omap2_dss_supported_color_modes[] = {
+#define COLOR_ARRAY(arr...) (const enum omap_color_mode[]) { arr, 0 }
+
+static const enum omap_color_mode *omap2_dss_supported_color_modes[] = {
+
 	/* OMAP_DSS_GFX */
-	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
-	OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB12U, OMAP_DSS_COLOR_RGB16,
+	OMAP_DSS_COLOR_RGB24U, OMAP_DSS_COLOR_RGB24P),
 
 	/* OMAP_DSS_VIDEO1 */
-	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
-	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
-	OMAP_DSS_COLOR_UYVY,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB24U,
+	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_YUV2,
+	OMAP_DSS_COLOR_UYVY),
 
 	/* OMAP_DSS_VIDEO2 */
-	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
-	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
-	OMAP_DSS_COLOR_UYVY,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB24U,
+	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_YUV2,
+	OMAP_DSS_COLOR_UYVY),
 };
 
-static const enum omap_color_mode omap3_dss_supported_color_modes[] = {
+static const enum omap_color_mode *omap3_dss_supported_color_modes[] = {
 	/* OMAP_DSS_GFX */
-	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
-	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
-	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |
-	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB12U, OMAP_DSS_COLOR_ARGB16,
+	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB24U,
+	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_ARGB32,
+	OMAP_DSS_COLOR_RGBA32, OMAP_DSS_COLOR_RGBX32),
 
 	/* OMAP_DSS_VIDEO1 */
-	OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P |
-	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
-	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB24U, OMAP_DSS_COLOR_RGB24P,
+	OMAP_DSS_COLOR_RGB12U, OMAP_DSS_COLOR_RGB16,
+	OMAP_DSS_COLOR_YUV2, OMAP_DSS_COLOR_UYVY),
 
 	/* OMAP_DSS_VIDEO2 */
-	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
-	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
-	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
-	OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 |
-	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB12U, OMAP_DSS_COLOR_ARGB16,
+	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB24U,
+	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_YUV2,
+	OMAP_DSS_COLOR_UYVY, OMAP_DSS_COLOR_ARGB32,
+	OMAP_DSS_COLOR_RGBA32, OMAP_DSS_COLOR_RGBX32),
 };
 
-static const enum omap_color_mode omap4_dss_supported_color_modes[] = {
+static const enum omap_color_mode *omap4_dss_supported_color_modes[] = {
 	/* OMAP_DSS_GFX */
-	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
-	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
-	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |
-	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32 |
-	OMAP_DSS_COLOR_ARGB16_1555 | OMAP_DSS_COLOR_RGBX16 |
-	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_XRGB16_1555,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB12U, OMAP_DSS_COLOR_ARGB16,
+	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB24U,
+	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_ARGB32,
+	OMAP_DSS_COLOR_RGBA32, OMAP_DSS_COLOR_RGBX32,
+	OMAP_DSS_COLOR_ARGB16_1555, OMAP_DSS_COLOR_RGBX16,
+	OMAP_DSS_COLOR_RGBA16, OMAP_DSS_COLOR_XRGB16_1555),
 
 	/* OMAP_DSS_VIDEO1 */
-	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |
-	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |
-	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |
-	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |
-	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |
-	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
-	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
-	OMAP_DSS_COLOR_RGBX32,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB12U,
+	OMAP_DSS_COLOR_YUV2, OMAP_DSS_COLOR_ARGB16_1555,
+	OMAP_DSS_COLOR_RGBA32, OMAP_DSS_COLOR_NV12,
+	OMAP_DSS_COLOR_RGBA16, OMAP_DSS_COLOR_RGB24U,
+	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_UYVY,
+	OMAP_DSS_COLOR_ARGB16, OMAP_DSS_COLOR_XRGB16_1555,
+	OMAP_DSS_COLOR_ARGB32, OMAP_DSS_COLOR_RGBX16,
+	OMAP_DSS_COLOR_RGBX32),
 
        /* OMAP_DSS_VIDEO2 */
-	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |
-	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |
-	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |
-	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |
-	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |
-	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
-	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
-	OMAP_DSS_COLOR_RGBX32,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB12U,
+	OMAP_DSS_COLOR_YUV2, OMAP_DSS_COLOR_ARGB16_1555,
+	OMAP_DSS_COLOR_RGBA32, OMAP_DSS_COLOR_NV12,
+	OMAP_DSS_COLOR_RGBA16, OMAP_DSS_COLOR_RGB24U,
+	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_UYVY,
+	OMAP_DSS_COLOR_ARGB16, OMAP_DSS_COLOR_XRGB16_1555,
+	OMAP_DSS_COLOR_ARGB32, OMAP_DSS_COLOR_RGBX16,
+	OMAP_DSS_COLOR_RGBX32),
 
 	/* OMAP_DSS_VIDEO3 */
-	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |
-	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |
-	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |
-	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |
-	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |
-	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
-	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
-	OMAP_DSS_COLOR_RGBX32,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB12U,
+	OMAP_DSS_COLOR_YUV2, OMAP_DSS_COLOR_ARGB16_1555,
+	OMAP_DSS_COLOR_RGBA32, OMAP_DSS_COLOR_NV12,
+	OMAP_DSS_COLOR_RGBA16, OMAP_DSS_COLOR_RGB24U,
+	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_UYVY,
+	OMAP_DSS_COLOR_ARGB16, OMAP_DSS_COLOR_XRGB16_1555,
+	OMAP_DSS_COLOR_ARGB32, OMAP_DSS_COLOR_RGBX16,
+	OMAP_DSS_COLOR_RGBX32),
 
 	/* OMAP_DSS_WB */
-	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |
-	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |
-	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |
-	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |
-	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |
-	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
-	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
-	OMAP_DSS_COLOR_RGBX32,
+	COLOR_ARRAY(
+	OMAP_DSS_COLOR_RGB16, OMAP_DSS_COLOR_RGB12U,
+	OMAP_DSS_COLOR_YUV2, OMAP_DSS_COLOR_ARGB16_1555,
+	OMAP_DSS_COLOR_RGBA32, OMAP_DSS_COLOR_NV12,
+	OMAP_DSS_COLOR_RGBA16, OMAP_DSS_COLOR_RGB24U,
+	OMAP_DSS_COLOR_RGB24P, OMAP_DSS_COLOR_UYVY,
+	OMAP_DSS_COLOR_ARGB16, OMAP_DSS_COLOR_XRGB16_1555,
+	OMAP_DSS_COLOR_ARGB32, OMAP_DSS_COLOR_RGBX16,
+	OMAP_DSS_COLOR_RGBX32),
 };
 
 static const enum omap_overlay_caps omap2_dss_overlay_caps[] = {
@@ -783,7 +797,7 @@  enum omap_dss_output_id dss_feat_get_supported_outputs(enum omap_channel channel
 	return omap_current_dss_features->supported_outputs[channel];
 }
 
-enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane_id plane)
+const enum omap_color_mode *dss_feat_get_supported_color_modes(enum omap_plane_id plane)
 {
 	return omap_current_dss_features->supported_color_modes[plane];
 }
@@ -796,8 +810,17 @@  enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane_id plane)
 bool dss_feat_color_mode_supported(enum omap_plane_id plane,
 		enum omap_color_mode color_mode)
 {
-	return omap_current_dss_features->supported_color_modes[plane] &
-			color_mode;
+	const enum omap_color_mode *modes;
+	unsigned int i;
+
+	modes = omap_current_dss_features->supported_color_modes[plane];
+
+	for (i = 0; modes[i]; ++i) {
+		if (modes[i] == color_mode)
+			return true;
+	}
+
+	return false;
 }
 
 u32 dss_feat_get_buffer_size_unit(void)
diff --git a/drivers/gpu/drm/omapdrm/dss/dss_features.h b/drivers/gpu/drm/omapdrm/dss/dss_features.h
index 6f262887502d..190cf62537b0 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss_features.h
+++ b/drivers/gpu/drm/omapdrm/dss/dss_features.h
@@ -104,6 +104,6 @@  enum omap_dss_output_id dss_feat_get_supported_outputs(enum omap_channel channel
 
 int dss_feat_get_num_mgrs(void);
 int dss_feat_get_num_ovls(void);
-enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane_id plane);
+const enum omap_color_mode *dss_feat_get_supported_color_modes(enum omap_plane_id plane);
 
 #endif
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index cf822dbcfe29..334680673074 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -876,7 +876,7 @@  struct dispc_ops {
 			const struct videomode *vm, bool mem_to_mem,
 			enum omap_channel channel);
 
-	enum omap_color_mode (*ovl_get_color_modes)(enum omap_plane_id plane);
+	const enum omap_color_mode *(*ovl_get_color_modes)(enum omap_plane_id plane);
 };
 
 void dispc_set_ops(const struct dispc_ops *o);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index 7a4c57eb6536..962180790f42 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -159,7 +159,7 @@  struct drm_encoder *omap_connector_attached_encoder(
 bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
 
 uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
-		uint32_t max_formats, enum omap_color_mode supported_modes);
+		uint32_t max_formats, const enum omap_color_mode *supported_modes);
 struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
 		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
 struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
index 0cdbf6ccb6ad..a53022cbb14f 100644
--- a/drivers/gpu/drm/omapdrm/omap_fb.c
+++ b/drivers/gpu/drm/omapdrm/omap_fb.c
@@ -57,14 +57,22 @@  static const struct {
 
 /* convert from overlay's pixel formats bitmask to an array of fourcc's */
 uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
-		uint32_t max_formats, enum omap_color_mode supported_modes)
+		uint32_t max_formats, const enum omap_color_mode *supported_modes)
 {
 	uint32_t nformats = 0;
 	int i = 0;
 
-	for (i = 0; i < ARRAY_SIZE(formats) && nformats < max_formats; i++)
-		if (formats[i].dss_format & supported_modes)
+	for (i = 0; i < ARRAY_SIZE(formats) && nformats < max_formats; i++) {
+		unsigned int t;
+
+		for (t = 0; supported_modes[t]; ++t) {
+			if (supported_modes[t] != formats[i].dss_format)
+				continue;
+
 			pixel_formats[nformats++] = formats[i].pixel_format;
+			break;
+		}
+	}
 
 	return nformats;
 }