Branch data Line data Source code
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 : : 14 : : enum 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 : : */ 40 : : struct 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 : : */ 63 : : struct 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 : : */ 85 : : struct 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 */ 93 : : static inline struct display_timing *display_timings_get(const struct 94 : : display_timings *disp, 95 : : unsigned int index) 96 : : { 97 : 0 : if (disp->num_timings > index) 98 : 0 : return disp->timings[index]; 99 : : else 100 : : return NULL; 101 : : } 102 : : 103 : : void display_timings_release(struct display_timings *disp); 104 : : 105 : : #endif