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 | if (disp->num_timings > index) |
98 | return disp->timings[index]; |
99 | else |
100 | return NULL; |
101 | } |
102 | |
103 | void display_timings_release(struct display_timings *disp); |
104 | |
105 | #endif |
106 | |