/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (c) 2016 Google, Inc * Written by Simon Glass */ #ifndef _PANEL_H #define _PANEL_H #include #include /* DRM mode flags mapped to U-Boot DISPLAY_FLAGS for direct compatibility */ #define DRM_MODE_FLAG_NHSYNC DISPLAY_FLAGS_HSYNC_LOW #define DRM_MODE_FLAG_PHSYNC DISPLAY_FLAGS_HSYNC_HIGH #define DRM_MODE_FLAG_NVSYNC DISPLAY_FLAGS_VSYNC_LOW #define DRM_MODE_FLAG_PVSYNC DISPLAY_FLAGS_VSYNC_HIGH #define DRM_MODE_FLAG_INTERLACE DISPLAY_FLAGS_INTERLACED #define DRM_MODE_FLAG_DBLSCAN DISPLAY_FLAGS_DOUBLESCAN #define DRM_MODE_FLAG_DBLCLK DISPLAY_FLAGS_DOUBLECLK /** * struct drm_display_mode - DRM kernel-internal display mode structure * simplified for U-Boot * @hdisplay: horizontal display size * @hsync_start: horizontal sync start * @hsync_end: horizontal sync end * @htotal: horizontal total size * @vdisplay: vertical display size * @vsync_start: vertical sync start * @vsync_end: vertical sync end * @vtotal: vertical total size * * The horizontal and vertical timings are defined per the following diagram. * * :: * * * Active Front Sync Back * Region Porch Porch * <-----------------------><----------------><-------------><--------------> * //////////////////////| * ////////////////////// | * ////////////////////// |.................. ................ * _______________ * <----- [hv]display -----> * <------------- [hv]sync_start ------------> * <--------------------- [hv]sync_end ---------------------> * <-------------------------------- [hv]total ----------------------------->* */ struct drm_display_mode { unsigned int clock; /* in kHz */ u16 hdisplay; u16 hsync_start; u16 hsync_end; u16 htotal; u16 vdisplay; u16 vsync_start; u16 vsync_end; u16 vtotal; u32 flags; }; struct panel_ops { /** * enable_backlight() - Enable the panel backlight * * @dev: Panel device containing the backlight to enable * @return 0 if OK, -ve on error */ int (*enable_backlight)(struct udevice *dev); /** * set_backlight - Set panel backlight brightness * * @dev: Panel device containing the backlight to update * @percent: Brightness value (0 to 100, or BACKLIGHT_... value) * @return 0 if OK, -ve on error */ int (*set_backlight)(struct udevice *dev, int percent); /** * get_timings() - Get display timings from panel. * * @dev: Panel device containing the display timings * @timing: Pointer to the timing for storing * @return 0 if OK, -ve on error */ int (*get_display_timing)(struct udevice *dev, struct display_timing *timing); /** * get_modes() - Get display modes from panel * * Returns an array of display modes supported by the panel. * Similar to Linux's drm_panel_funcs->get_modes(). * * @dev: Panel device * @modes: Pointer to an array of modes * @return number of modes if OK, -ve on error */ int (*get_modes)(struct udevice *dev, const struct drm_display_mode **modes); }; #define panel_get_ops(dev) ((struct panel_ops *)(dev)->driver->ops) /** * panel_enable_backlight() - Enable/disable the panel backlight * * @dev: Panel device containing the backlight to enable * @enable: true to enable the backlight, false to dis * Return: 0 if OK, -ve on error */ int panel_enable_backlight(struct udevice *dev); /** * panel_set_backlight - Set brightness for the panel backlight * * @dev: Panel device containing the backlight to update * @percent: Brightness value (0 to 100, or BACKLIGHT_... value) * Return: 0 if OK, -ve on error */ int panel_set_backlight(struct udevice *dev, int percent); /** * panel_get_display_timing() - Get display timings from panel. * * @dev: Panel device containing the display timings * @timing: Pointer to the timing for storing * Return: 0 if OK, -ve on error */ int panel_get_display_timing(struct udevice *dev, struct display_timing *timing); #endif