linux/include/video/display_timing.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>
   4 *
   5 * description of display timings
   6 */
   7
   8#ifndef __LINUX_DISPLAY_TIMING_H
   9#define __LINUX_DISPLAY_TIMING_H
  10
  11#include <linux/bitops.h>
  12#include <linux/types.h>
  13
  14enum display_flags {
  15        DISPLAY_FLAGS_HSYNC_LOW         = BIT(0),
  16        DISPLAY_FLAGS_HSYNC_HIGH        = BIT(1),
  17        DISPLAY_FLAGS_VSYNC_LOW         = BIT(2),
  18        DISPLAY_FLAGS_VSYNC_HIGH        = BIT(3),
  19
  20        /* data enable flag */
  21        DISPLAY_FLAGS_DE_LOW            = BIT(4),
  22        DISPLAY_FLAGS_DE_HIGH           = BIT(5),
  23        /* drive data on pos. edge */
  24        DISPLAY_FLAGS_PIXDATA_POSEDGE   = BIT(6),
  25        /* drive data on neg. edge */
  26        DISPLAY_FLAGS_PIXDATA_NEGEDGE   = BIT(7),
  27        DISPLAY_FLAGS_INTERLACED        = BIT(8),
  28        DISPLAY_FLAGS_DOUBLESCAN        = BIT(9),
  29        DISPLAY_FLAGS_DOUBLECLK         = BIT(10),
  30        /* drive sync on pos. edge */
  31        DISPLAY_FLAGS_SYNC_POSEDGE      = BIT(11),
  32        /* drive sync on neg. edge */
  33        DISPLAY_FLAGS_SYNC_NEGEDGE      = BIT(12),
  34};
  35
  36/*
  37 * A single signal can be specified via a range of minimal and maximal values
  38 * with a typical value, that lies somewhere inbetween.
  39 */
  40struct timing_entry {
  41        u32 min;
  42        u32 typ;
  43        u32 max;
  44};
  45
  46/*
  47 * Single "mode" entry. This describes one set of signal timings a display can
  48 * have in one setting. This struct can later be converted to struct videomode
  49 * (see include/video/videomode.h). As each timing_entry can be defined as a
  50 * range, one struct display_timing may become multiple struct videomodes.
  51 *
  52 * Example: hsync active high, vsync active low
  53 *
  54 *                                  Active Video
  55 * Video  ______________________XXXXXXXXXXXXXXXXXXXXXX_____________________
  56 *        |<- sync ->|<- back ->|<----- active ----->|<- front ->|<- sync..
  57 *        |          |   porch  |                    |   porch   |
  58 *
  59 * HSync _|¯¯¯¯¯¯¯¯¯¯|___________________________________________|¯¯¯¯¯¯¯¯¯
  60 *
  61 * VSync ¯|__________|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|_________
  62 */
  63struct display_timing {
  64        struct timing_entry pixelclock;
  65
  66        struct timing_entry hactive;            /* hor. active video */
  67        struct timing_entry hfront_porch;       /* hor. front porch */
  68        struct timing_entry hback_porch;        /* hor. back porch */
  69        struct timing_entry hsync_len;          /* hor. sync len */
  70
  71        struct timing_entry vactive;            /* ver. active video */
  72        struct timing_entry vfront_porch;       /* ver. front porch */
  73        struct timing_entry vback_porch;        /* ver. back porch */
  74        struct timing_entry vsync_len;          /* ver. sync len */
  75
  76        enum display_flags flags;               /* display flags */
  77};
  78
  79/*
  80 * This describes all timing settings a display provides.
  81 * The native_mode is the default setting for this display.
  82 * Drivers that can handle multiple videomodes should work with this struct and
  83 * convert each entry to the desired end result.
  84 */
  85struct display_timings {
  86        unsigned int num_timings;
  87        unsigned int native_mode;
  88
  89        struct display_timing **timings;
  90};
  91
  92/* get one entry from struct display_timings */
  93static inline struct display_timing *display_timings_get(const struct
  94                                                         display_timings *disp,
  95                                                         unsigned int index)
  96{
  97        if (disp->num_timings > index)
  98                return disp->timings[index];
  99        else
 100                return NULL;
 101}
 102
 103void display_timings_release(struct display_timings *disp);
 104
 105#endif
 106