summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2017-05-04 10:27:53 +0300
committerTomi Valkeinen <tomi.valkeinen@ti.com>2017-06-02 10:57:23 +0300
commit18c0d6217a4898b9cae1b999e0dd37f8239ba0ae (patch)
tree4570f702f9937ad113d06d3e8684e78c2e3c3018
parent22245f531a769164402f4e63f1f1e18de981aff3 (diff)
drm/omap: change supported_modes to an array
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> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dispc.c2
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dss_features.c153
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dss_features.h2
-rw-r--r--drivers/gpu/drm/omapdrm/dss/omapdss.h2
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.h2
-rw-r--r--drivers/gpu/drm/omapdrm/omap_fb.c14
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 ee874129b202..5836756a23a9 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 e12cfaeb5b24..83be1f57fdb5 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -734,7 +734,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 ea3f575931c3..ef061a53e231 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -151,7 +151,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 1d2a94df7054..6fb25d35bc0a 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;
}