]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/karo/common/lcd.c
arm64: add support for Ka-Ro TXSD-410E
[karo-tx-uboot.git] / board / karo / common / lcd.c
1 #include <common.h>
2 #include <linux/fb.h>
3 #ifdef CONFIG_VIDEO_IPUV3
4 #include <mxcfb.h>
5 #endif
6
7 #include "karo.h"
8
9 static struct fb_videomode karo_tx_fb_modes[] = {
10 #ifndef CONFIG_SYS_LVDS_IF
11         {
12                 /* Standard VGA timing */
13                 .name           = "VGA",
14                 .refresh        = 60,
15                 .xres           = 640,
16                 .yres           = 480,
17                 .pixclock       = KHZ2PICOS(25175),
18                 .left_margin    = 48,
19                 .hsync_len      = 96,
20                 .right_margin   = 16,
21                 .upper_margin   = 31,
22                 .vsync_len      = 2,
23                 .lower_margin   = 12,
24                 .sync           = FB_SYNC_CLK_LAT_FALL,
25         },
26         {
27                 /* Emerging ETV570 640 x 480 display. Syncs low active,
28                  * DE high active, 115.2 mm x 86.4 mm display area
29                  * VGA compatible timing
30                  */
31                 .name           = "ETV570",
32                 .refresh        = 60,
33                 .xres           = 640,
34                 .yres           = 480,
35                 .pixclock       = KHZ2PICOS(25175),
36                 .left_margin    = 114,
37                 .hsync_len      = 30,
38                 .right_margin   = 16,
39                 .upper_margin   = 32,
40                 .vsync_len      = 3,
41                 .lower_margin   = 10,
42                 .sync           = FB_SYNC_CLK_LAT_FALL,
43         },
44         {
45                 /* Emerging ET0350G0DH6 320 x 240 display.
46                  * 70.08 mm x 52.56 mm display area.
47                  */
48                 .name           = "ET0350",
49                 .refresh        = 60,
50                 .xres           = 320,
51                 .yres           = 240,
52                 .pixclock       = KHZ2PICOS(6500),
53                 .left_margin    = 68 - 34,
54                 .hsync_len      = 34,
55                 .right_margin   = 20,
56                 .upper_margin   = 18 - 3,
57                 .vsync_len      = 3,
58                 .lower_margin   = 4,
59                 .sync           = FB_SYNC_CLK_LAT_FALL,
60         },
61         {
62                 /* Emerging ET0430G0DH6 480 x 272 display.
63                  * 95.04 mm x 53.856 mm display area.
64                  */
65                 .name           = "ET0430",
66                 .refresh        = 60,
67                 .xres           = 480,
68                 .yres           = 272,
69                 .pixclock       = KHZ2PICOS(9000),
70                 .left_margin    = 2,
71                 .hsync_len      = 41,
72                 .right_margin   = 2,
73                 .upper_margin   = 2,
74                 .vsync_len      = 10,
75                 .lower_margin   = 2,
76         },
77         {
78                 /* Emerging ET0500G0DH6 800 x 480 display.
79                  * 109.6 mm x 66.4 mm display area.
80                  */
81                 .name           = "ET0500",
82                 .refresh        = 60,
83                 .xres           = 800,
84                 .yres           = 480,
85                 .pixclock       = KHZ2PICOS(33260),
86                 .left_margin    = 216 - 128,
87                 .hsync_len      = 128,
88                 .right_margin   = 1056 - 800 - 216,
89                 .upper_margin   = 35 - 2,
90                 .vsync_len      = 2,
91                 .lower_margin   = 525 - 480 - 35,
92                 .sync           = FB_SYNC_CLK_LAT_FALL,
93         },
94         {
95                 /* Emerging ETQ570G0DH6 320 x 240 display.
96                  * 115.2 mm x 86.4 mm display area.
97                  */
98                 .name           = "ETQ570",
99                 .refresh        = 60,
100                 .xres           = 320,
101                 .yres           = 240,
102                 .pixclock       = KHZ2PICOS(6400),
103                 .left_margin    = 38,
104                 .hsync_len      = 30,
105                 .right_margin   = 30,
106                 .upper_margin   = 16, /* 15 according to datasheet */
107                 .vsync_len      = 3, /* TVP -> 1>x>5 */
108                 .lower_margin   = 4, /* 4.5 according to datasheet */
109                 .sync           = FB_SYNC_CLK_LAT_FALL,
110         },
111         {
112                 /* Emerging ET0700G0DH6 800 x 480 display.
113                  * 152.4 mm x 91.44 mm display area.
114                  */
115                 .name           = "ET0700",
116                 .refresh        = 60,
117                 .xres           = 800,
118                 .yres           = 480,
119                 .pixclock       = KHZ2PICOS(33260),
120                 .left_margin    = 216 - 128,
121                 .hsync_len      = 128,
122                 .right_margin   = 1056 - 800 - 216,
123                 .upper_margin   = 35 - 2,
124                 .vsync_len      = 2,
125                 .lower_margin   = 525 - 480 - 35,
126                 .sync           = FB_SYNC_CLK_LAT_FALL,
127         },
128         {
129                 /* Emerging ET070001DM6 800 x 480 display.
130                  * 152.4 mm x 91.44 mm display area.
131                  */
132                 .name           = "ET070001DM6",
133                 .refresh        = 60,
134                 .xres           = 800,
135                 .yres           = 480,
136                 .pixclock       = KHZ2PICOS(33260),
137                 .left_margin    = 216 - 128,
138                 .hsync_len      = 128,
139                 .right_margin   = 1056 - 800 - 216,
140                 .upper_margin   = 35 - 2,
141                 .vsync_len      = 2,
142                 .lower_margin   = 525 - 480 - 35,
143                 .sync           = 0,
144         },
145 #else
146         {
147                 /* HannStar HSD100PXN1
148                  * 202.7m mm x 152.06 mm display area.
149                  */
150                 .name           = "HSD100PXN1",
151                 .refresh        = 60,
152                 .xres           = 1024,
153                 .yres           = 768,
154                 .pixclock       = KHZ2PICOS(65000),
155                 .left_margin    = 0,
156                 .hsync_len      = 0,
157                 .right_margin   = 320,
158                 .upper_margin   = 0,
159                 .vsync_len      = 0,
160                 .lower_margin   = 38,
161                 .sync           = FB_SYNC_CLK_LAT_FALL,
162         },
163 #endif
164         {
165                 /* unnamed entry for assigning parameters parsed from 'video_mode' string */
166                 .refresh        = 60,
167                 .left_margin    = 48,
168                 .hsync_len      = 96,
169                 .right_margin   = 16,
170                 .upper_margin   = 31,
171                 .vsync_len      = 2,
172                 .lower_margin   = 12,
173                 .sync           = FB_SYNC_CLK_LAT_FALL,
174         },
175 };
176
177 int karo_get_fb_mode(const char *name, struct fb_videomode **mode)
178 {
179         size_t i;
180
181         if (name == NULL) {
182                 if (mode)
183                         *mode = karo_tx_fb_modes;
184                 return ARRAY_SIZE(karo_tx_fb_modes);
185         }
186         for (i = 0; i < ARRAY_SIZE(karo_tx_fb_modes); i++) {
187                 struct fb_videomode *m = &karo_tx_fb_modes[i];
188
189                 if (m->name && strcmp(m->name, name) == 0) {
190                         if (mode)
191                                 *mode = m;
192                         return i;
193                 }
194         }
195         if (mode)
196                 *mode = NULL;
197         return -ENOENT;
198 }