OSDN Git Service

drm: Implement the drm_format_*() helpers as drm_format_info() wrappers
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Mon, 17 Oct 2016 22:41:10 +0000 (01:41 +0300)
committerArchit Taneja <architt@codeaurora.org>
Tue, 18 Oct 2016 09:51:17 +0000 (15:21 +0530)
Turn the drm_format_*() helpers into wrappers around the drm_format_info
lookup function to centralize all format information in a single place.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
Link: http://patchwork.freedesktop.org/patch/msgid/1476744081-24485-3-git-send-email-laurent.pinchart@ideasonboard.com
drivers/gpu/drm/drm_fourcc.c

index 39f09c5..23d4b82 100644 (file)
@@ -198,69 +198,22 @@ EXPORT_SYMBOL(drm_format_info);
 void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
                          int *bpp)
 {
-       char *format_name;
-
-       switch (format) {
-       case DRM_FORMAT_C8:
-       case DRM_FORMAT_RGB332:
-       case DRM_FORMAT_BGR233:
-               *depth = 8;
-               *bpp = 8;
-               break;
-       case DRM_FORMAT_XRGB1555:
-       case DRM_FORMAT_XBGR1555:
-       case DRM_FORMAT_RGBX5551:
-       case DRM_FORMAT_BGRX5551:
-       case DRM_FORMAT_ARGB1555:
-       case DRM_FORMAT_ABGR1555:
-       case DRM_FORMAT_RGBA5551:
-       case DRM_FORMAT_BGRA5551:
-               *depth = 15;
-               *bpp = 16;
-               break;
-       case DRM_FORMAT_RGB565:
-       case DRM_FORMAT_BGR565:
-               *depth = 16;
-               *bpp = 16;
-               break;
-       case DRM_FORMAT_RGB888:
-       case DRM_FORMAT_BGR888:
-               *depth = 24;
-               *bpp = 24;
-               break;
-       case DRM_FORMAT_XRGB8888:
-       case DRM_FORMAT_XBGR8888:
-       case DRM_FORMAT_RGBX8888:
-       case DRM_FORMAT_BGRX8888:
-               *depth = 24;
-               *bpp = 32;
-               break;
-       case DRM_FORMAT_XRGB2101010:
-       case DRM_FORMAT_XBGR2101010:
-       case DRM_FORMAT_RGBX1010102:
-       case DRM_FORMAT_BGRX1010102:
-       case DRM_FORMAT_ARGB2101010:
-       case DRM_FORMAT_ABGR2101010:
-       case DRM_FORMAT_RGBA1010102:
-       case DRM_FORMAT_BGRA1010102:
-               *depth = 30;
-               *bpp = 32;
-               break;
-       case DRM_FORMAT_ARGB8888:
-       case DRM_FORMAT_ABGR8888:
-       case DRM_FORMAT_RGBA8888:
-       case DRM_FORMAT_BGRA8888:
-               *depth = 32;
-               *bpp = 32;
-               break;
-       default:
-               format_name = drm_get_format_name(format);
+       const struct drm_format_info *info;
+
+       info = drm_format_info(format);
+       if (!info || !info->depth) {
+               char *format_name = drm_get_format_name(format);
+
                DRM_DEBUG_KMS("unsupported pixel format %s\n", format_name);
                kfree(format_name);
+
                *depth = 0;
                *bpp = 0;
-               break;
+               return;
        }
+
+       *depth = info->depth;
+       *bpp = info->cpp[0] * 8;
 }
 EXPORT_SYMBOL(drm_fb_get_bpp_depth);
 
@@ -273,28 +226,10 @@ EXPORT_SYMBOL(drm_fb_get_bpp_depth);
  */
 int drm_format_num_planes(uint32_t format)
 {
-       switch (format) {
-       case DRM_FORMAT_YUV410:
-       case DRM_FORMAT_YVU410:
-       case DRM_FORMAT_YUV411:
-       case DRM_FORMAT_YVU411:
-       case DRM_FORMAT_YUV420:
-       case DRM_FORMAT_YVU420:
-       case DRM_FORMAT_YUV422:
-       case DRM_FORMAT_YVU422:
-       case DRM_FORMAT_YUV444:
-       case DRM_FORMAT_YVU444:
-               return 3;
-       case DRM_FORMAT_NV12:
-       case DRM_FORMAT_NV21:
-       case DRM_FORMAT_NV16:
-       case DRM_FORMAT_NV61:
-       case DRM_FORMAT_NV24:
-       case DRM_FORMAT_NV42:
-               return 2;
-       default:
-               return 1;
-       }
+       const struct drm_format_info *info;
+
+       info = drm_format_info(format);
+       return info ? info->num_planes : 1;
 }
 EXPORT_SYMBOL(drm_format_num_planes);
 
@@ -308,40 +243,13 @@ EXPORT_SYMBOL(drm_format_num_planes);
  */
 int drm_format_plane_cpp(uint32_t format, int plane)
 {
-       unsigned int depth;
-       int bpp;
+       const struct drm_format_info *info;
 
-       if (plane >= drm_format_num_planes(format))
+       info = drm_format_info(format);
+       if (!info || plane >= info->num_planes)
                return 0;
 
-       switch (format) {
-       case DRM_FORMAT_YUYV:
-       case DRM_FORMAT_YVYU:
-       case DRM_FORMAT_UYVY:
-       case DRM_FORMAT_VYUY:
-               return 2;
-       case DRM_FORMAT_NV12:
-       case DRM_FORMAT_NV21:
-       case DRM_FORMAT_NV16:
-       case DRM_FORMAT_NV61:
-       case DRM_FORMAT_NV24:
-       case DRM_FORMAT_NV42:
-               return plane ? 2 : 1;
-       case DRM_FORMAT_YUV410:
-       case DRM_FORMAT_YVU410:
-       case DRM_FORMAT_YUV411:
-       case DRM_FORMAT_YVU411:
-       case DRM_FORMAT_YUV420:
-       case DRM_FORMAT_YVU420:
-       case DRM_FORMAT_YUV422:
-       case DRM_FORMAT_YVU422:
-       case DRM_FORMAT_YUV444:
-       case DRM_FORMAT_YVU444:
-               return 1;
-       default:
-               drm_fb_get_bpp_depth(format, &depth, &bpp);
-               return bpp >> 3;
-       }
+       return info->cpp[plane];
 }
 EXPORT_SYMBOL(drm_format_plane_cpp);
 
@@ -355,28 +263,10 @@ EXPORT_SYMBOL(drm_format_plane_cpp);
  */
 int drm_format_horz_chroma_subsampling(uint32_t format)
 {
-       switch (format) {
-       case DRM_FORMAT_YUV411:
-       case DRM_FORMAT_YVU411:
-       case DRM_FORMAT_YUV410:
-       case DRM_FORMAT_YVU410:
-               return 4;
-       case DRM_FORMAT_YUYV:
-       case DRM_FORMAT_YVYU:
-       case DRM_FORMAT_UYVY:
-       case DRM_FORMAT_VYUY:
-       case DRM_FORMAT_NV12:
-       case DRM_FORMAT_NV21:
-       case DRM_FORMAT_NV16:
-       case DRM_FORMAT_NV61:
-       case DRM_FORMAT_YUV422:
-       case DRM_FORMAT_YVU422:
-       case DRM_FORMAT_YUV420:
-       case DRM_FORMAT_YVU420:
-               return 2;
-       default:
-               return 1;
-       }
+       const struct drm_format_info *info;
+
+       info = drm_format_info(format);
+       return info ? info->hsub : 1;
 }
 EXPORT_SYMBOL(drm_format_horz_chroma_subsampling);
 
@@ -390,18 +280,10 @@ EXPORT_SYMBOL(drm_format_horz_chroma_subsampling);
  */
 int drm_format_vert_chroma_subsampling(uint32_t format)
 {
-       switch (format) {
-       case DRM_FORMAT_YUV410:
-       case DRM_FORMAT_YVU410:
-               return 4;
-       case DRM_FORMAT_YUV420:
-       case DRM_FORMAT_YVU420:
-       case DRM_FORMAT_NV12:
-       case DRM_FORMAT_NV21:
-               return 2;
-       default:
-               return 1;
-       }
+       const struct drm_format_info *info;
+
+       info = drm_format_info(format);
+       return info ? info->vsub : 1;
 }
 EXPORT_SYMBOL(drm_format_vert_chroma_subsampling);
 
@@ -416,13 +298,16 @@ EXPORT_SYMBOL(drm_format_vert_chroma_subsampling);
  */
 int drm_format_plane_width(int width, uint32_t format, int plane)
 {
-       if (plane >= drm_format_num_planes(format))
+       const struct drm_format_info *info;
+
+       info = drm_format_info(format);
+       if (!info || plane >= info->num_planes)
                return 0;
 
        if (plane == 0)
                return width;
 
-       return width / drm_format_horz_chroma_subsampling(format);
+       return width / info->hsub;
 }
 EXPORT_SYMBOL(drm_format_plane_width);
 
@@ -437,12 +322,15 @@ EXPORT_SYMBOL(drm_format_plane_width);
  */
 int drm_format_plane_height(int height, uint32_t format, int plane)
 {
-       if (plane >= drm_format_num_planes(format))
+       const struct drm_format_info *info;
+
+       info = drm_format_info(format);
+       if (!info || plane >= info->num_planes)
                return 0;
 
        if (plane == 0)
                return height;
 
-       return height / drm_format_vert_chroma_subsampling(format);
+       return height / info->vsub;
 }
 EXPORT_SYMBOL(drm_format_plane_height);