Map DRM FourCC codes to pixel descriptions with internal type struct hdlcd_format. Reorder formats by preference. Avoid simplefb's struct simplefb_format, which is for parsing "simple-framebuffer" DT nodes.
The HDLCD drivers uses struct simplefb_format and its default initializer SIMPLEFB_FORMATS to map DRM_FORMAT_ constants to pixel descriptions. The simplefb helpers are for parsing "simple-framebuffer" DT nodes and should be avoided in other context. Therefore replace it in hdlcd with the custom type struct hdlcd_format and the pixel descriptions from PIXEL_FORMAT_ constants. Plane formats exported to userspace are roughly sorted as preferred by hardware and/or driver. SIMPLEFB_FORMATS currently puts 16-bit formats to the top of the list. Changing to struct hdlcd_format allows for reordering the format list. 32-bit formats are now the preferred ones. This change also removes including <linux/platform_data/simplefb.h>, which includes several unrelated headers, such as <linux/fb.h>. Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de> --- drivers/gpu/drm/arm/hdlcd_crtc.c | 32 +++++++++++++++++++++++--------- include/video/pixel_format.h | 15 +++++++++++++++ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c index 3cfefadc7c9d..6fabe65ec0a2 100644 --- a/drivers/gpu/drm/arm/hdlcd_crtc.c +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c @@ -11,8 +11,8 @@ #include <linux/clk.h> #include <linux/of_graph.h> -#include <linux/platform_data/simplefb.h> +#include <video/pixel_format.h> #include <video/videomode.h> #include <drm/drm_atomic.h> @@ -28,6 +28,25 @@ #include "hdlcd_drv.h" #include "hdlcd_regs.h" +struct hdlcd_format { + u32 fourcc; + struct pixel_format pixel; +}; + +static const struct hdlcd_format supported_formats[] = { + { DRM_FORMAT_XRGB8888, PIXEL_FORMAT_XRGB8888 }, + { DRM_FORMAT_ARGB8888, PIXEL_FORMAT_ARGB8888 }, + { DRM_FORMAT_XBGR8888, PIXEL_FORMAT_XBGR8888 }, + { DRM_FORMAT_ABGR8888, PIXEL_FORMAT_ABGR8888 }, + { DRM_FORMAT_XRGB2101010, PIXEL_FORMAT_XRGB2101010}, + { DRM_FORMAT_ARGB2101010, PIXEL_FORMAT_ARGB2101010}, + { DRM_FORMAT_RGB565, PIXEL_FORMAT_RGB565 }, + { DRM_FORMAT_RGBA5551, PIXEL_FORMAT_RGBA5551 }, + { DRM_FORMAT_XRGB1555, PIXEL_FORMAT_XRGB1555 }, + { DRM_FORMAT_ARGB1555, PIXEL_FORMAT_ARGB1555 }, + { DRM_FORMAT_RGB888, PIXEL_FORMAT_RGB888 }, +}; + /* * The HDLCD controller is a dumb RGB streamer that gets connected to * a single HDMI transmitter or in the case of the ARM Models it gets @@ -73,8 +92,6 @@ static const struct drm_crtc_funcs hdlcd_crtc_funcs = { .disable_vblank = hdlcd_crtc_disable_vblank, }; -static struct simplefb_format supported_formats[] = SIMPLEFB_FORMATS; - /* * Setup the HDLCD registers for decoding the pixels out of the framebuffer */ @@ -83,15 +100,12 @@ static int hdlcd_set_pxl_fmt(struct drm_crtc *crtc) unsigned int btpp; struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc); const struct drm_framebuffer *fb = crtc->primary->state->fb; - uint32_t pixel_format; - struct simplefb_format *format = NULL; + const struct pixel_format *format = NULL; int i; - pixel_format = fb->format->format; - for (i = 0; i < ARRAY_SIZE(supported_formats); i++) { - if (supported_formats[i].fourcc == pixel_format) - format = &supported_formats[i]; + if (supported_formats[i].fourcc == fb->format->format) + format = &supported_formats[i].pixel; } if (WARN_ON(!format)) diff --git a/include/video/pixel_format.h b/include/video/pixel_format.h index b5104b2a3a13..5ad2386e2014 100644 --- a/include/video/pixel_format.h +++ b/include/video/pixel_format.h @@ -23,6 +23,12 @@ struct pixel_format { #define PIXEL_FORMAT_XRGB1555 \ { 16, false, { .alpha = {0, 0}, .red = {10, 5}, .green = {5, 5}, .blue = {0, 5} } } +#define PIXEL_FORMAT_ARGB1555 \ + { 16, false, { .alpha = {15, 1}, .red = {10, 5}, .green = {5, 5}, .blue = {0, 5} } } + +#define PIXEL_FORMAT_RGBA5551 \ + { 16, false, { .alpha = {0, 1}, .red = {11, 5}, .green = {6, 5}, .blue = {1, 5} } } + #define PIXEL_FORMAT_RGB565 \ { 16, false, { .alpha = {0, 0}, .red = {11, 5}, .green = {5, 6}, .blue = {0, 5} } } @@ -32,10 +38,19 @@ struct pixel_format { #define PIXEL_FORMAT_XRGB8888 \ { 32, false, { .alpha = {0, 0}, .red = {16, 8}, .green = {8, 8}, .blue = {0, 8} } } +#define PIXEL_FORMAT_ARGB8888 \ + { 32, false, { .alpha = {24, 8}, .red = {16, 8}, .green = {8, 8}, .blue = {0, 8} } } + #define PIXEL_FORMAT_XBGR8888 \ { 32, false, { .alpha = {0, 0}, .red = {0, 8}, .green = {8, 8}, .blue = {16, 8} } } +#define PIXEL_FORMAT_ABGR8888 \ + { 32, false, { .alpha = {24, 8}, .red = {0, 8}, .green = {8, 8}, .blue = {16, 8} } } + #define PIXEL_FORMAT_XRGB2101010 \ { 32, false, { .alpha = {0, 0}, .red = {20, 10}, .green = {10, 10}, .blue = {0, 10} } } +#define PIXEL_FORMAT_ARGB2101010 \ + { 32, false, { .alpha = {30, 1}, .red = {20, 10}, .green = {10, 10}, .blue = {0, 10} } } + #endif -- 2.49.0