106 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>4 *5 * description of display timings6 */7 8#ifndef __LINUX_DISPLAY_TIMING_H9#define __LINUX_DISPLAY_TIMING_H10 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 values38 * 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 can48 * have in one setting. This struct can later be converted to struct videomode49 * (see include/video/videomode.h). As each timing_entry can be defined as a50 * range, one struct display_timing may become multiple struct videomodes.51 *52 * Example: hsync active high, vsync active low53 *54 * Active Video55 * 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 and83 * 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 struct94 display_timings *disp,95 unsigned int index)96{97 if (disp->num_timings > index)98 return disp->timings[index];99 else100 return NULL;101}102 103void display_timings_release(struct display_timings *disp);104 105#endif106