]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/gpu/drm/panel/panel-simple.c
drm/panel: add drm_connector argument to get_modes()
[linux.git] / drivers / gpu / drm / panel / panel-simple.c
1 /*
2  * Copyright (C) 2013, NVIDIA Corporation.  All rights reserved.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sub license,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the
12  * next paragraph) shall be included in all copies or substantial portions
13  * of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23
24 #include <linux/delay.h>
25 #include <linux/gpio/consumer.h>
26 #include <linux/module.h>
27 #include <linux/of_platform.h>
28 #include <linux/platform_device.h>
29 #include <linux/regulator/consumer.h>
30
31 #include <video/display_timing.h>
32 #include <video/of_display_timing.h>
33 #include <video/videomode.h>
34
35 #include <drm/drm_crtc.h>
36 #include <drm/drm_device.h>
37 #include <drm/drm_mipi_dsi.h>
38 #include <drm/drm_panel.h>
39
40 /**
41  * @modes: Pointer to array of fixed modes appropriate for this panel.  If
42  *         only one mode then this can just be the address of this the mode.
43  *         NOTE: cannot be used with "timings" and also if this is specified
44  *         then you cannot override the mode in the device tree.
45  * @num_modes: Number of elements in modes array.
46  * @timings: Pointer to array of display timings.  NOTE: cannot be used with
47  *           "modes" and also these will be used to validate a device tree
48  *           override if one is present.
49  * @num_timings: Number of elements in timings array.
50  * @bpc: Bits per color.
51  * @size: Structure containing the physical size of this panel.
52  * @delay: Structure containing various delay values for this panel.
53  * @bus_format: See MEDIA_BUS_FMT_... defines.
54  * @bus_flags: See DRM_BUS_FLAG_... defines.
55  */
56 struct panel_desc {
57         const struct drm_display_mode *modes;
58         unsigned int num_modes;
59         const struct display_timing *timings;
60         unsigned int num_timings;
61
62         unsigned int bpc;
63
64         /**
65          * @width: width (in millimeters) of the panel's active display area
66          * @height: height (in millimeters) of the panel's active display area
67          */
68         struct {
69                 unsigned int width;
70                 unsigned int height;
71         } size;
72
73         /**
74          * @prepare: the time (in milliseconds) that it takes for the panel to
75          *           become ready and start receiving video data
76          * @hpd_absent_delay: Add this to the prepare delay if we know Hot
77          *                    Plug Detect isn't used.
78          * @enable: the time (in milliseconds) that it takes for the panel to
79          *          display the first valid frame after starting to receive
80          *          video data
81          * @disable: the time (in milliseconds) that it takes for the panel to
82          *           turn the display off (no content is visible)
83          * @unprepare: the time (in milliseconds) that it takes for the panel
84          *             to power itself down completely
85          */
86         struct {
87                 unsigned int prepare;
88                 unsigned int hpd_absent_delay;
89                 unsigned int enable;
90                 unsigned int disable;
91                 unsigned int unprepare;
92         } delay;
93
94         u32 bus_format;
95         u32 bus_flags;
96         int connector_type;
97 };
98
99 struct panel_simple {
100         struct drm_panel base;
101         bool prepared;
102         bool enabled;
103         bool no_hpd;
104
105         const struct panel_desc *desc;
106
107         struct regulator *supply;
108         struct i2c_adapter *ddc;
109
110         struct gpio_desc *enable_gpio;
111
112         struct drm_display_mode override_mode;
113 };
114
115 static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
116 {
117         return container_of(panel, struct panel_simple, base);
118 }
119
120 static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel,
121                                                    struct drm_connector *connector)
122 {
123         struct drm_device *drm = panel->base.drm;
124         struct drm_display_mode *mode;
125         unsigned int i, num = 0;
126
127         for (i = 0; i < panel->desc->num_timings; i++) {
128                 const struct display_timing *dt = &panel->desc->timings[i];
129                 struct videomode vm;
130
131                 videomode_from_timing(dt, &vm);
132                 mode = drm_mode_create(drm);
133                 if (!mode) {
134                         dev_err(drm->dev, "failed to add mode %ux%u\n",
135                                 dt->hactive.typ, dt->vactive.typ);
136                         continue;
137                 }
138
139                 drm_display_mode_from_videomode(&vm, mode);
140
141                 mode->type |= DRM_MODE_TYPE_DRIVER;
142
143                 if (panel->desc->num_timings == 1)
144                         mode->type |= DRM_MODE_TYPE_PREFERRED;
145
146                 drm_mode_probed_add(connector, mode);
147                 num++;
148         }
149
150         return num;
151 }
152
153 static unsigned int panel_simple_get_display_modes(struct panel_simple *panel,
154                                                    struct drm_connector *connector)
155 {
156         struct drm_device *drm = panel->base.drm;
157         struct drm_display_mode *mode;
158         unsigned int i, num = 0;
159
160         for (i = 0; i < panel->desc->num_modes; i++) {
161                 const struct drm_display_mode *m = &panel->desc->modes[i];
162
163                 mode = drm_mode_duplicate(drm, m);
164                 if (!mode) {
165                         dev_err(drm->dev, "failed to add mode %ux%u@%u\n",
166                                 m->hdisplay, m->vdisplay, m->vrefresh);
167                         continue;
168                 }
169
170                 mode->type |= DRM_MODE_TYPE_DRIVER;
171
172                 if (panel->desc->num_modes == 1)
173                         mode->type |= DRM_MODE_TYPE_PREFERRED;
174
175                 drm_mode_set_name(mode);
176
177                 drm_mode_probed_add(connector, mode);
178                 num++;
179         }
180
181         return num;
182 }
183
184 static int panel_simple_get_non_edid_modes(struct panel_simple *panel,
185                                            struct drm_connector *connector)
186 {
187         struct drm_device *drm = panel->base.drm;
188         struct drm_display_mode *mode;
189         bool has_override = panel->override_mode.type;
190         unsigned int num = 0;
191
192         if (!panel->desc)
193                 return 0;
194
195         if (has_override) {
196                 mode = drm_mode_duplicate(drm, &panel->override_mode);
197                 if (mode) {
198                         drm_mode_probed_add(connector, mode);
199                         num = 1;
200                 } else {
201                         dev_err(drm->dev, "failed to add override mode\n");
202                 }
203         }
204
205         /* Only add timings if override was not there or failed to validate */
206         if (num == 0 && panel->desc->num_timings)
207                 num = panel_simple_get_timings_modes(panel, connector);
208
209         /*
210          * Only add fixed modes if timings/override added no mode.
211          *
212          * We should only ever have either the display timings specified
213          * or a fixed mode. Anything else is rather bogus.
214          */
215         WARN_ON(panel->desc->num_timings && panel->desc->num_modes);
216         if (num == 0)
217                 num = panel_simple_get_display_modes(panel, connector);
218
219         connector->display_info.bpc = panel->desc->bpc;
220         connector->display_info.width_mm = panel->desc->size.width;
221         connector->display_info.height_mm = panel->desc->size.height;
222         if (panel->desc->bus_format)
223                 drm_display_info_set_bus_formats(&connector->display_info,
224                                                  &panel->desc->bus_format, 1);
225         connector->display_info.bus_flags = panel->desc->bus_flags;
226
227         return num;
228 }
229
230 static int panel_simple_disable(struct drm_panel *panel)
231 {
232         struct panel_simple *p = to_panel_simple(panel);
233
234         if (!p->enabled)
235                 return 0;
236
237         if (p->desc->delay.disable)
238                 msleep(p->desc->delay.disable);
239
240         p->enabled = false;
241
242         return 0;
243 }
244
245 static int panel_simple_unprepare(struct drm_panel *panel)
246 {
247         struct panel_simple *p = to_panel_simple(panel);
248
249         if (!p->prepared)
250                 return 0;
251
252         gpiod_set_value_cansleep(p->enable_gpio, 0);
253
254         regulator_disable(p->supply);
255
256         if (p->desc->delay.unprepare)
257                 msleep(p->desc->delay.unprepare);
258
259         p->prepared = false;
260
261         return 0;
262 }
263
264 static int panel_simple_prepare(struct drm_panel *panel)
265 {
266         struct panel_simple *p = to_panel_simple(panel);
267         unsigned int delay;
268         int err;
269
270         if (p->prepared)
271                 return 0;
272
273         err = regulator_enable(p->supply);
274         if (err < 0) {
275                 dev_err(panel->dev, "failed to enable supply: %d\n", err);
276                 return err;
277         }
278
279         gpiod_set_value_cansleep(p->enable_gpio, 1);
280
281         delay = p->desc->delay.prepare;
282         if (p->no_hpd)
283                 delay += p->desc->delay.hpd_absent_delay;
284         if (delay)
285                 msleep(delay);
286
287         p->prepared = true;
288
289         return 0;
290 }
291
292 static int panel_simple_enable(struct drm_panel *panel)
293 {
294         struct panel_simple *p = to_panel_simple(panel);
295
296         if (p->enabled)
297                 return 0;
298
299         if (p->desc->delay.enable)
300                 msleep(p->desc->delay.enable);
301
302         p->enabled = true;
303
304         return 0;
305 }
306
307 static int panel_simple_get_modes(struct drm_panel *panel,
308                                   struct drm_connector *connector)
309 {
310         struct panel_simple *p = to_panel_simple(panel);
311         int num = 0;
312
313         /* probe EDID if a DDC bus is available */
314         if (p->ddc) {
315                 struct edid *edid = drm_get_edid(connector, p->ddc);
316
317                 drm_connector_update_edid_property(connector, edid);
318                 if (edid) {
319                         num += drm_add_edid_modes(connector, edid);
320                         kfree(edid);
321                 }
322         }
323
324         /* add hard-coded panel modes */
325         num += panel_simple_get_non_edid_modes(p, connector);
326
327         return num;
328 }
329
330 static int panel_simple_get_timings(struct drm_panel *panel,
331                                     unsigned int num_timings,
332                                     struct display_timing *timings)
333 {
334         struct panel_simple *p = to_panel_simple(panel);
335         unsigned int i;
336
337         if (p->desc->num_timings < num_timings)
338                 num_timings = p->desc->num_timings;
339
340         if (timings)
341                 for (i = 0; i < num_timings; i++)
342                         timings[i] = p->desc->timings[i];
343
344         return p->desc->num_timings;
345 }
346
347 static const struct drm_panel_funcs panel_simple_funcs = {
348         .disable = panel_simple_disable,
349         .unprepare = panel_simple_unprepare,
350         .prepare = panel_simple_prepare,
351         .enable = panel_simple_enable,
352         .get_modes = panel_simple_get_modes,
353         .get_timings = panel_simple_get_timings,
354 };
355
356 #define PANEL_SIMPLE_BOUNDS_CHECK(to_check, bounds, field) \
357         (to_check->field.typ >= bounds->field.min && \
358          to_check->field.typ <= bounds->field.max)
359 static void panel_simple_parse_panel_timing_node(struct device *dev,
360                                                  struct panel_simple *panel,
361                                                  const struct display_timing *ot)
362 {
363         const struct panel_desc *desc = panel->desc;
364         struct videomode vm;
365         unsigned int i;
366
367         if (WARN_ON(desc->num_modes)) {
368                 dev_err(dev, "Reject override mode: panel has a fixed mode\n");
369                 return;
370         }
371         if (WARN_ON(!desc->num_timings)) {
372                 dev_err(dev, "Reject override mode: no timings specified\n");
373                 return;
374         }
375
376         for (i = 0; i < panel->desc->num_timings; i++) {
377                 const struct display_timing *dt = &panel->desc->timings[i];
378
379                 if (!PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hactive) ||
380                     !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hfront_porch) ||
381                     !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hback_porch) ||
382                     !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hsync_len) ||
383                     !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vactive) ||
384                     !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vfront_porch) ||
385                     !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vback_porch) ||
386                     !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vsync_len))
387                         continue;
388
389                 if (ot->flags != dt->flags)
390                         continue;
391
392                 videomode_from_timing(ot, &vm);
393                 drm_display_mode_from_videomode(&vm, &panel->override_mode);
394                 panel->override_mode.type |= DRM_MODE_TYPE_DRIVER |
395                                              DRM_MODE_TYPE_PREFERRED;
396                 break;
397         }
398
399         if (WARN_ON(!panel->override_mode.type))
400                 dev_err(dev, "Reject override mode: No display_timing found\n");
401 }
402
403 static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
404 {
405         struct panel_simple *panel;
406         struct display_timing dt;
407         struct device_node *ddc;
408         int err;
409
410         panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL);
411         if (!panel)
412                 return -ENOMEM;
413
414         panel->enabled = false;
415         panel->prepared = false;
416         panel->desc = desc;
417
418         panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd");
419
420         panel->supply = devm_regulator_get(dev, "power");
421         if (IS_ERR(panel->supply))
422                 return PTR_ERR(panel->supply);
423
424         panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
425                                                      GPIOD_OUT_LOW);
426         if (IS_ERR(panel->enable_gpio)) {
427                 err = PTR_ERR(panel->enable_gpio);
428                 if (err != -EPROBE_DEFER)
429                         dev_err(dev, "failed to request GPIO: %d\n", err);
430                 return err;
431         }
432
433         ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
434         if (ddc) {
435                 panel->ddc = of_find_i2c_adapter_by_node(ddc);
436                 of_node_put(ddc);
437
438                 if (!panel->ddc)
439                         return -EPROBE_DEFER;
440         }
441
442         if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
443                 panel_simple_parse_panel_timing_node(dev, panel, &dt);
444
445         drm_panel_init(&panel->base, dev, &panel_simple_funcs,
446                        desc->connector_type);
447
448         err = drm_panel_of_backlight(&panel->base);
449         if (err)
450                 goto free_ddc;
451
452         err = drm_panel_add(&panel->base);
453         if (err < 0)
454                 goto free_ddc;
455
456         dev_set_drvdata(dev, panel);
457
458         return 0;
459
460 free_ddc:
461         if (panel->ddc)
462                 put_device(&panel->ddc->dev);
463
464         return err;
465 }
466
467 static int panel_simple_remove(struct device *dev)
468 {
469         struct panel_simple *panel = dev_get_drvdata(dev);
470
471         drm_panel_remove(&panel->base);
472         drm_panel_disable(&panel->base);
473         drm_panel_unprepare(&panel->base);
474
475         if (panel->ddc)
476                 put_device(&panel->ddc->dev);
477
478         return 0;
479 }
480
481 static void panel_simple_shutdown(struct device *dev)
482 {
483         struct panel_simple *panel = dev_get_drvdata(dev);
484
485         drm_panel_disable(&panel->base);
486         drm_panel_unprepare(&panel->base);
487 }
488
489 static const struct drm_display_mode ampire_am_480272h3tmqw_t01h_mode = {
490         .clock = 9000,
491         .hdisplay = 480,
492         .hsync_start = 480 + 2,
493         .hsync_end = 480 + 2 + 41,
494         .htotal = 480 + 2 + 41 + 2,
495         .vdisplay = 272,
496         .vsync_start = 272 + 2,
497         .vsync_end = 272 + 2 + 10,
498         .vtotal = 272 + 2 + 10 + 2,
499         .vrefresh = 60,
500         .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
501 };
502
503 static const struct panel_desc ampire_am_480272h3tmqw_t01h = {
504         .modes = &ampire_am_480272h3tmqw_t01h_mode,
505         .num_modes = 1,
506         .bpc = 8,
507         .size = {
508                 .width = 105,
509                 .height = 67,
510         },
511         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
512 };
513
514 static const struct drm_display_mode ampire_am800480r3tmqwa1h_mode = {
515         .clock = 33333,
516         .hdisplay = 800,
517         .hsync_start = 800 + 0,
518         .hsync_end = 800 + 0 + 255,
519         .htotal = 800 + 0 + 255 + 0,
520         .vdisplay = 480,
521         .vsync_start = 480 + 2,
522         .vsync_end = 480 + 2 + 45,
523         .vtotal = 480 + 2 + 45 + 0,
524         .vrefresh = 60,
525         .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
526 };
527
528 static const struct panel_desc ampire_am800480r3tmqwa1h = {
529         .modes = &ampire_am800480r3tmqwa1h_mode,
530         .num_modes = 1,
531         .bpc = 6,
532         .size = {
533                 .width = 152,
534                 .height = 91,
535         },
536         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
537 };
538
539 static const struct display_timing santek_st0700i5y_rbslw_f_timing = {
540         .pixelclock = { 26400000, 33300000, 46800000 },
541         .hactive = { 800, 800, 800 },
542         .hfront_porch = { 16, 210, 354 },
543         .hback_porch = { 45, 36, 6 },
544         .hsync_len = { 1, 10, 40 },
545         .vactive = { 480, 480, 480 },
546         .vfront_porch = { 7, 22, 147 },
547         .vback_porch = { 22, 13, 3 },
548         .vsync_len = { 1, 10, 20 },
549         .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
550                 DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE
551 };
552
553 static const struct panel_desc armadeus_st0700_adapt = {
554         .timings = &santek_st0700i5y_rbslw_f_timing,
555         .num_timings = 1,
556         .bpc = 6,
557         .size = {
558                 .width = 154,
559                 .height = 86,
560         },
561         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
562         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE,
563 };
564
565 static const struct drm_display_mode auo_b101aw03_mode = {
566         .clock = 51450,
567         .hdisplay = 1024,
568         .hsync_start = 1024 + 156,
569         .hsync_end = 1024 + 156 + 8,
570         .htotal = 1024 + 156 + 8 + 156,
571         .vdisplay = 600,
572         .vsync_start = 600 + 16,
573         .vsync_end = 600 + 16 + 6,
574         .vtotal = 600 + 16 + 6 + 16,
575         .vrefresh = 60,
576 };
577
578 static const struct panel_desc auo_b101aw03 = {
579         .modes = &auo_b101aw03_mode,
580         .num_modes = 1,
581         .bpc = 6,
582         .size = {
583                 .width = 223,
584                 .height = 125,
585         },
586 };
587
588 static const struct display_timing auo_b101ean01_timing = {
589         .pixelclock = { 65300000, 72500000, 75000000 },
590         .hactive = { 1280, 1280, 1280 },
591         .hfront_porch = { 18, 119, 119 },
592         .hback_porch = { 21, 21, 21 },
593         .hsync_len = { 32, 32, 32 },
594         .vactive = { 800, 800, 800 },
595         .vfront_porch = { 4, 4, 4 },
596         .vback_porch = { 8, 8, 8 },
597         .vsync_len = { 18, 20, 20 },
598 };
599
600 static const struct panel_desc auo_b101ean01 = {
601         .timings = &auo_b101ean01_timing,
602         .num_timings = 1,
603         .bpc = 6,
604         .size = {
605                 .width = 217,
606                 .height = 136,
607         },
608 };
609
610 static const struct drm_display_mode auo_b101xtn01_mode = {
611         .clock = 72000,
612         .hdisplay = 1366,
613         .hsync_start = 1366 + 20,
614         .hsync_end = 1366 + 20 + 70,
615         .htotal = 1366 + 20 + 70,
616         .vdisplay = 768,
617         .vsync_start = 768 + 14,
618         .vsync_end = 768 + 14 + 42,
619         .vtotal = 768 + 14 + 42,
620         .vrefresh = 60,
621         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
622 };
623
624 static const struct panel_desc auo_b101xtn01 = {
625         .modes = &auo_b101xtn01_mode,
626         .num_modes = 1,
627         .bpc = 6,
628         .size = {
629                 .width = 223,
630                 .height = 125,
631         },
632 };
633
634 static const struct drm_display_mode auo_b116xw03_mode = {
635         .clock = 70589,
636         .hdisplay = 1366,
637         .hsync_start = 1366 + 40,
638         .hsync_end = 1366 + 40 + 40,
639         .htotal = 1366 + 40 + 40 + 32,
640         .vdisplay = 768,
641         .vsync_start = 768 + 10,
642         .vsync_end = 768 + 10 + 12,
643         .vtotal = 768 + 10 + 12 + 6,
644         .vrefresh = 60,
645 };
646
647 static const struct panel_desc auo_b116xw03 = {
648         .modes = &auo_b116xw03_mode,
649         .num_modes = 1,
650         .bpc = 6,
651         .size = {
652                 .width = 256,
653                 .height = 144,
654         },
655 };
656
657 static const struct drm_display_mode auo_b133xtn01_mode = {
658         .clock = 69500,
659         .hdisplay = 1366,
660         .hsync_start = 1366 + 48,
661         .hsync_end = 1366 + 48 + 32,
662         .htotal = 1366 + 48 + 32 + 20,
663         .vdisplay = 768,
664         .vsync_start = 768 + 3,
665         .vsync_end = 768 + 3 + 6,
666         .vtotal = 768 + 3 + 6 + 13,
667         .vrefresh = 60,
668 };
669
670 static const struct panel_desc auo_b133xtn01 = {
671         .modes = &auo_b133xtn01_mode,
672         .num_modes = 1,
673         .bpc = 6,
674         .size = {
675                 .width = 293,
676                 .height = 165,
677         },
678 };
679
680 static const struct drm_display_mode auo_b133htn01_mode = {
681         .clock = 150660,
682         .hdisplay = 1920,
683         .hsync_start = 1920 + 172,
684         .hsync_end = 1920 + 172 + 80,
685         .htotal = 1920 + 172 + 80 + 60,
686         .vdisplay = 1080,
687         .vsync_start = 1080 + 25,
688         .vsync_end = 1080 + 25 + 10,
689         .vtotal = 1080 + 25 + 10 + 10,
690         .vrefresh = 60,
691 };
692
693 static const struct panel_desc auo_b133htn01 = {
694         .modes = &auo_b133htn01_mode,
695         .num_modes = 1,
696         .bpc = 6,
697         .size = {
698                 .width = 293,
699                 .height = 165,
700         },
701         .delay = {
702                 .prepare = 105,
703                 .enable = 20,
704                 .unprepare = 50,
705         },
706 };
707
708 static const struct display_timing auo_g070vvn01_timings = {
709         .pixelclock = { 33300000, 34209000, 45000000 },
710         .hactive = { 800, 800, 800 },
711         .hfront_porch = { 20, 40, 200 },
712         .hback_porch = { 87, 40, 1 },
713         .hsync_len = { 1, 48, 87 },
714         .vactive = { 480, 480, 480 },
715         .vfront_porch = { 5, 13, 200 },
716         .vback_porch = { 31, 31, 29 },
717         .vsync_len = { 1, 1, 3 },
718 };
719
720 static const struct panel_desc auo_g070vvn01 = {
721         .timings = &auo_g070vvn01_timings,
722         .num_timings = 1,
723         .bpc = 8,
724         .size = {
725                 .width = 152,
726                 .height = 91,
727         },
728         .delay = {
729                 .prepare = 200,
730                 .enable = 50,
731                 .disable = 50,
732                 .unprepare = 1000,
733         },
734 };
735
736 static const struct drm_display_mode auo_g101evn010_mode = {
737         .clock = 68930,
738         .hdisplay = 1280,
739         .hsync_start = 1280 + 82,
740         .hsync_end = 1280 + 82 + 2,
741         .htotal = 1280 + 82 + 2 + 84,
742         .vdisplay = 800,
743         .vsync_start = 800 + 8,
744         .vsync_end = 800 + 8 + 2,
745         .vtotal = 800 + 8 + 2 + 6,
746         .vrefresh = 60,
747 };
748
749 static const struct panel_desc auo_g101evn010 = {
750         .modes = &auo_g101evn010_mode,
751         .num_modes = 1,
752         .bpc = 6,
753         .size = {
754                 .width = 216,
755                 .height = 135,
756         },
757         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
758 };
759
760 static const struct drm_display_mode auo_g104sn02_mode = {
761         .clock = 40000,
762         .hdisplay = 800,
763         .hsync_start = 800 + 40,
764         .hsync_end = 800 + 40 + 216,
765         .htotal = 800 + 40 + 216 + 128,
766         .vdisplay = 600,
767         .vsync_start = 600 + 10,
768         .vsync_end = 600 + 10 + 35,
769         .vtotal = 600 + 10 + 35 + 2,
770         .vrefresh = 60,
771 };
772
773 static const struct panel_desc auo_g104sn02 = {
774         .modes = &auo_g104sn02_mode,
775         .num_modes = 1,
776         .bpc = 8,
777         .size = {
778                 .width = 211,
779                 .height = 158,
780         },
781 };
782
783 static const struct display_timing auo_g133han01_timings = {
784         .pixelclock = { 134000000, 141200000, 149000000 },
785         .hactive = { 1920, 1920, 1920 },
786         .hfront_porch = { 39, 58, 77 },
787         .hback_porch = { 59, 88, 117 },
788         .hsync_len = { 28, 42, 56 },
789         .vactive = { 1080, 1080, 1080 },
790         .vfront_porch = { 3, 8, 11 },
791         .vback_porch = { 5, 14, 19 },
792         .vsync_len = { 4, 14, 19 },
793 };
794
795 static const struct panel_desc auo_g133han01 = {
796         .timings = &auo_g133han01_timings,
797         .num_timings = 1,
798         .bpc = 8,
799         .size = {
800                 .width = 293,
801                 .height = 165,
802         },
803         .delay = {
804                 .prepare = 200,
805                 .enable = 50,
806                 .disable = 50,
807                 .unprepare = 1000,
808         },
809         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
810         .connector_type = DRM_MODE_CONNECTOR_LVDS,
811 };
812
813 static const struct display_timing auo_g185han01_timings = {
814         .pixelclock = { 120000000, 144000000, 175000000 },
815         .hactive = { 1920, 1920, 1920 },
816         .hfront_porch = { 36, 120, 148 },
817         .hback_porch = { 24, 88, 108 },
818         .hsync_len = { 20, 48, 64 },
819         .vactive = { 1080, 1080, 1080 },
820         .vfront_porch = { 6, 10, 40 },
821         .vback_porch = { 2, 5, 20 },
822         .vsync_len = { 2, 5, 20 },
823 };
824
825 static const struct panel_desc auo_g185han01 = {
826         .timings = &auo_g185han01_timings,
827         .num_timings = 1,
828         .bpc = 8,
829         .size = {
830                 .width = 409,
831                 .height = 230,
832         },
833         .delay = {
834                 .prepare = 50,
835                 .enable = 200,
836                 .disable = 110,
837                 .unprepare = 1000,
838         },
839         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
840         .connector_type = DRM_MODE_CONNECTOR_LVDS,
841 };
842
843 static const struct display_timing auo_p320hvn03_timings = {
844         .pixelclock = { 106000000, 148500000, 164000000 },
845         .hactive = { 1920, 1920, 1920 },
846         .hfront_porch = { 25, 50, 130 },
847         .hback_porch = { 25, 50, 130 },
848         .hsync_len = { 20, 40, 105 },
849         .vactive = { 1080, 1080, 1080 },
850         .vfront_porch = { 8, 17, 150 },
851         .vback_porch = { 8, 17, 150 },
852         .vsync_len = { 4, 11, 100 },
853 };
854
855 static const struct panel_desc auo_p320hvn03 = {
856         .timings = &auo_p320hvn03_timings,
857         .num_timings = 1,
858         .bpc = 8,
859         .size = {
860                 .width = 698,
861                 .height = 393,
862         },
863         .delay = {
864                 .prepare = 1,
865                 .enable = 450,
866                 .unprepare = 500,
867         },
868         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
869         .connector_type = DRM_MODE_CONNECTOR_LVDS,
870 };
871
872 static const struct drm_display_mode auo_t215hvn01_mode = {
873         .clock = 148800,
874         .hdisplay = 1920,
875         .hsync_start = 1920 + 88,
876         .hsync_end = 1920 + 88 + 44,
877         .htotal = 1920 + 88 + 44 + 148,
878         .vdisplay = 1080,
879         .vsync_start = 1080 + 4,
880         .vsync_end = 1080 + 4 + 5,
881         .vtotal = 1080 + 4 + 5 + 36,
882         .vrefresh = 60,
883 };
884
885 static const struct panel_desc auo_t215hvn01 = {
886         .modes = &auo_t215hvn01_mode,
887         .num_modes = 1,
888         .bpc = 8,
889         .size = {
890                 .width = 430,
891                 .height = 270,
892         },
893         .delay = {
894                 .disable = 5,
895                 .unprepare = 1000,
896         }
897 };
898
899 static const struct drm_display_mode avic_tm070ddh03_mode = {
900         .clock = 51200,
901         .hdisplay = 1024,
902         .hsync_start = 1024 + 160,
903         .hsync_end = 1024 + 160 + 4,
904         .htotal = 1024 + 160 + 4 + 156,
905         .vdisplay = 600,
906         .vsync_start = 600 + 17,
907         .vsync_end = 600 + 17 + 1,
908         .vtotal = 600 + 17 + 1 + 17,
909         .vrefresh = 60,
910 };
911
912 static const struct panel_desc avic_tm070ddh03 = {
913         .modes = &avic_tm070ddh03_mode,
914         .num_modes = 1,
915         .bpc = 8,
916         .size = {
917                 .width = 154,
918                 .height = 90,
919         },
920         .delay = {
921                 .prepare = 20,
922                 .enable = 200,
923                 .disable = 200,
924         },
925 };
926
927 static const struct drm_display_mode bananapi_s070wv20_ct16_mode = {
928         .clock = 30000,
929         .hdisplay = 800,
930         .hsync_start = 800 + 40,
931         .hsync_end = 800 + 40 + 48,
932         .htotal = 800 + 40 + 48 + 40,
933         .vdisplay = 480,
934         .vsync_start = 480 + 13,
935         .vsync_end = 480 + 13 + 3,
936         .vtotal = 480 + 13 + 3 + 29,
937 };
938
939 static const struct panel_desc bananapi_s070wv20_ct16 = {
940         .modes = &bananapi_s070wv20_ct16_mode,
941         .num_modes = 1,
942         .bpc = 6,
943         .size = {
944                 .width = 154,
945                 .height = 86,
946         },
947 };
948
949 static const struct drm_display_mode boe_hv070wsa_mode = {
950         .clock = 42105,
951         .hdisplay = 1024,
952         .hsync_start = 1024 + 30,
953         .hsync_end = 1024 + 30 + 30,
954         .htotal = 1024 + 30 + 30 + 30,
955         .vdisplay = 600,
956         .vsync_start = 600 + 10,
957         .vsync_end = 600 + 10 + 10,
958         .vtotal = 600 + 10 + 10 + 10,
959         .vrefresh = 60,
960 };
961
962 static const struct panel_desc boe_hv070wsa = {
963         .modes = &boe_hv070wsa_mode,
964         .num_modes = 1,
965         .size = {
966                 .width = 154,
967                 .height = 90,
968         },
969 };
970
971 static const struct drm_display_mode boe_nv101wxmn51_modes[] = {
972         {
973                 .clock = 71900,
974                 .hdisplay = 1280,
975                 .hsync_start = 1280 + 48,
976                 .hsync_end = 1280 + 48 + 32,
977                 .htotal = 1280 + 48 + 32 + 80,
978                 .vdisplay = 800,
979                 .vsync_start = 800 + 3,
980                 .vsync_end = 800 + 3 + 5,
981                 .vtotal = 800 + 3 + 5 + 24,
982                 .vrefresh = 60,
983         },
984         {
985                 .clock = 57500,
986                 .hdisplay = 1280,
987                 .hsync_start = 1280 + 48,
988                 .hsync_end = 1280 + 48 + 32,
989                 .htotal = 1280 + 48 + 32 + 80,
990                 .vdisplay = 800,
991                 .vsync_start = 800 + 3,
992                 .vsync_end = 800 + 3 + 5,
993                 .vtotal = 800 + 3 + 5 + 24,
994                 .vrefresh = 48,
995         },
996 };
997
998 static const struct panel_desc boe_nv101wxmn51 = {
999         .modes = boe_nv101wxmn51_modes,
1000         .num_modes = ARRAY_SIZE(boe_nv101wxmn51_modes),
1001         .bpc = 8,
1002         .size = {
1003                 .width = 217,
1004                 .height = 136,
1005         },
1006         .delay = {
1007                 .prepare = 210,
1008                 .enable = 50,
1009                 .unprepare = 160,
1010         },
1011 };
1012
1013 static const struct drm_display_mode cdtech_s043wq26h_ct7_mode = {
1014         .clock = 9000,
1015         .hdisplay = 480,
1016         .hsync_start = 480 + 5,
1017         .hsync_end = 480 + 5 + 5,
1018         .htotal = 480 + 5 + 5 + 40,
1019         .vdisplay = 272,
1020         .vsync_start = 272 + 8,
1021         .vsync_end = 272 + 8 + 8,
1022         .vtotal = 272 + 8 + 8 + 8,
1023         .vrefresh = 60,
1024         .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
1025 };
1026
1027 static const struct panel_desc cdtech_s043wq26h_ct7 = {
1028         .modes = &cdtech_s043wq26h_ct7_mode,
1029         .num_modes = 1,
1030         .bpc = 8,
1031         .size = {
1032                 .width = 95,
1033                 .height = 54,
1034         },
1035         .bus_flags = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
1036 };
1037
1038 static const struct drm_display_mode cdtech_s070wv95_ct16_mode = {
1039         .clock = 35000,
1040         .hdisplay = 800,
1041         .hsync_start = 800 + 40,
1042         .hsync_end = 800 + 40 + 40,
1043         .htotal = 800 + 40 + 40 + 48,
1044         .vdisplay = 480,
1045         .vsync_start = 480 + 29,
1046         .vsync_end = 480 + 29 + 13,
1047         .vtotal = 480 + 29 + 13 + 3,
1048         .vrefresh = 60,
1049         .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
1050 };
1051
1052 static const struct panel_desc cdtech_s070wv95_ct16 = {
1053         .modes = &cdtech_s070wv95_ct16_mode,
1054         .num_modes = 1,
1055         .bpc = 8,
1056         .size = {
1057                 .width = 154,
1058                 .height = 85,
1059         },
1060 };
1061
1062 static const struct drm_display_mode chunghwa_claa070wp03xg_mode = {
1063         .clock = 66770,
1064         .hdisplay = 800,
1065         .hsync_start = 800 + 49,
1066         .hsync_end = 800 + 49 + 33,
1067         .htotal = 800 + 49 + 33 + 17,
1068         .vdisplay = 1280,
1069         .vsync_start = 1280 + 1,
1070         .vsync_end = 1280 + 1 + 7,
1071         .vtotal = 1280 + 1 + 7 + 15,
1072         .vrefresh = 60,
1073         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
1074 };
1075
1076 static const struct panel_desc chunghwa_claa070wp03xg = {
1077         .modes = &chunghwa_claa070wp03xg_mode,
1078         .num_modes = 1,
1079         .bpc = 6,
1080         .size = {
1081                 .width = 94,
1082                 .height = 150,
1083         },
1084 };
1085
1086 static const struct drm_display_mode chunghwa_claa101wa01a_mode = {
1087         .clock = 72070,
1088         .hdisplay = 1366,
1089         .hsync_start = 1366 + 58,
1090         .hsync_end = 1366 + 58 + 58,
1091         .htotal = 1366 + 58 + 58 + 58,
1092         .vdisplay = 768,
1093         .vsync_start = 768 + 4,
1094         .vsync_end = 768 + 4 + 4,
1095         .vtotal = 768 + 4 + 4 + 4,
1096         .vrefresh = 60,
1097 };
1098
1099 static const struct panel_desc chunghwa_claa101wa01a = {
1100         .modes = &chunghwa_claa101wa01a_mode,
1101         .num_modes = 1,
1102         .bpc = 6,
1103         .size = {
1104                 .width = 220,
1105                 .height = 120,
1106         },
1107 };
1108
1109 static const struct drm_display_mode chunghwa_claa101wb01_mode = {
1110         .clock = 69300,
1111         .hdisplay = 1366,
1112         .hsync_start = 1366 + 48,
1113         .hsync_end = 1366 + 48 + 32,
1114         .htotal = 1366 + 48 + 32 + 20,
1115         .vdisplay = 768,
1116         .vsync_start = 768 + 16,
1117         .vsync_end = 768 + 16 + 8,
1118         .vtotal = 768 + 16 + 8 + 16,
1119         .vrefresh = 60,
1120 };
1121
1122 static const struct panel_desc chunghwa_claa101wb01 = {
1123         .modes = &chunghwa_claa101wb01_mode,
1124         .num_modes = 1,
1125         .bpc = 6,
1126         .size = {
1127                 .width = 223,
1128                 .height = 125,
1129         },
1130 };
1131
1132 static const struct drm_display_mode dataimage_scf0700c48ggu18_mode = {
1133         .clock = 33260,
1134         .hdisplay = 800,
1135         .hsync_start = 800 + 40,
1136         .hsync_end = 800 + 40 + 128,
1137         .htotal = 800 + 40 + 128 + 88,
1138         .vdisplay = 480,
1139         .vsync_start = 480 + 10,
1140         .vsync_end = 480 + 10 + 2,
1141         .vtotal = 480 + 10 + 2 + 33,
1142         .vrefresh = 60,
1143         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
1144 };
1145
1146 static const struct panel_desc dataimage_scf0700c48ggu18 = {
1147         .modes = &dataimage_scf0700c48ggu18_mode,
1148         .num_modes = 1,
1149         .bpc = 8,
1150         .size = {
1151                 .width = 152,
1152                 .height = 91,
1153         },
1154         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
1155         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
1156 };
1157
1158 static const struct display_timing dlc_dlc0700yzg_1_timing = {
1159         .pixelclock = { 45000000, 51200000, 57000000 },
1160         .hactive = { 1024, 1024, 1024 },
1161         .hfront_porch = { 100, 106, 113 },
1162         .hback_porch = { 100, 106, 113 },
1163         .hsync_len = { 100, 108, 114 },
1164         .vactive = { 600, 600, 600 },
1165         .vfront_porch = { 8, 11, 15 },
1166         .vback_porch = { 8, 11, 15 },
1167         .vsync_len = { 9, 13, 15 },
1168         .flags = DISPLAY_FLAGS_DE_HIGH,
1169 };
1170
1171 static const struct panel_desc dlc_dlc0700yzg_1 = {
1172         .timings = &dlc_dlc0700yzg_1_timing,
1173         .num_timings = 1,
1174         .bpc = 6,
1175         .size = {
1176                 .width = 154,
1177                 .height = 86,
1178         },
1179         .delay = {
1180                 .prepare = 30,
1181                 .enable = 200,
1182                 .disable = 200,
1183         },
1184         .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
1185         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1186 };
1187
1188 static const struct display_timing dlc_dlc1010gig_timing = {
1189         .pixelclock = { 68900000, 71100000, 73400000 },
1190         .hactive = { 1280, 1280, 1280 },
1191         .hfront_porch = { 43, 53, 63 },
1192         .hback_porch = { 43, 53, 63 },
1193         .hsync_len = { 44, 54, 64 },
1194         .vactive = { 800, 800, 800 },
1195         .vfront_porch = { 5, 8, 11 },
1196         .vback_porch = { 5, 8, 11 },
1197         .vsync_len = { 5, 7, 11 },
1198         .flags = DISPLAY_FLAGS_DE_HIGH,
1199 };
1200
1201 static const struct panel_desc dlc_dlc1010gig = {
1202         .timings = &dlc_dlc1010gig_timing,
1203         .num_timings = 1,
1204         .bpc = 8,
1205         .size = {
1206                 .width = 216,
1207                 .height = 135,
1208         },
1209         .delay = {
1210                 .prepare = 60,
1211                 .enable = 150,
1212                 .disable = 100,
1213                 .unprepare = 60,
1214         },
1215         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
1216         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1217 };
1218
1219 static const struct drm_display_mode edt_et035012dm6_mode = {
1220         .clock = 6500,
1221         .hdisplay = 320,
1222         .hsync_start = 320 + 20,
1223         .hsync_end = 320 + 20 + 30,
1224         .htotal = 320 + 20 + 68,
1225         .vdisplay = 240,
1226         .vsync_start = 240 + 4,
1227         .vsync_end = 240 + 4 + 4,
1228         .vtotal = 240 + 4 + 4 + 14,
1229         .vrefresh = 60,
1230         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
1231 };
1232
1233 static const struct panel_desc edt_et035012dm6 = {
1234         .modes = &edt_et035012dm6_mode,
1235         .num_modes = 1,
1236         .bpc = 8,
1237         .size = {
1238                 .width = 70,
1239                 .height = 52,
1240         },
1241         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
1242         .bus_flags = DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_PIXDATA_NEGEDGE,
1243 };
1244
1245 static const struct drm_display_mode edt_etm0430g0dh6_mode = {
1246         .clock = 9000,
1247         .hdisplay = 480,
1248         .hsync_start = 480 + 2,
1249         .hsync_end = 480 + 2 + 41,
1250         .htotal = 480 + 2 + 41 + 2,
1251         .vdisplay = 272,
1252         .vsync_start = 272 + 2,
1253         .vsync_end = 272 + 2 + 10,
1254         .vtotal = 272 + 2 + 10 + 2,
1255         .vrefresh = 60,
1256         .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
1257 };
1258
1259 static const struct panel_desc edt_etm0430g0dh6 = {
1260         .modes = &edt_etm0430g0dh6_mode,
1261         .num_modes = 1,
1262         .bpc = 6,
1263         .size = {
1264                 .width = 95,
1265                 .height = 54,
1266         },
1267 };
1268
1269 static const struct drm_display_mode edt_et057090dhu_mode = {
1270         .clock = 25175,
1271         .hdisplay = 640,
1272         .hsync_start = 640 + 16,
1273         .hsync_end = 640 + 16 + 30,
1274         .htotal = 640 + 16 + 30 + 114,
1275         .vdisplay = 480,
1276         .vsync_start = 480 + 10,
1277         .vsync_end = 480 + 10 + 3,
1278         .vtotal = 480 + 10 + 3 + 32,
1279         .vrefresh = 60,
1280         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
1281 };
1282
1283 static const struct panel_desc edt_et057090dhu = {
1284         .modes = &edt_et057090dhu_mode,
1285         .num_modes = 1,
1286         .bpc = 6,
1287         .size = {
1288                 .width = 115,
1289                 .height = 86,
1290         },
1291         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
1292         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
1293 };
1294
1295 static const struct drm_display_mode edt_etm0700g0dh6_mode = {
1296         .clock = 33260,
1297         .hdisplay = 800,
1298         .hsync_start = 800 + 40,
1299         .hsync_end = 800 + 40 + 128,
1300         .htotal = 800 + 40 + 128 + 88,
1301         .vdisplay = 480,
1302         .vsync_start = 480 + 10,
1303         .vsync_end = 480 + 10 + 2,
1304         .vtotal = 480 + 10 + 2 + 33,
1305         .vrefresh = 60,
1306         .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
1307 };
1308
1309 static const struct panel_desc edt_etm0700g0dh6 = {
1310         .modes = &edt_etm0700g0dh6_mode,
1311         .num_modes = 1,
1312         .bpc = 6,
1313         .size = {
1314                 .width = 152,
1315                 .height = 91,
1316         },
1317         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
1318         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
1319 };
1320
1321 static const struct panel_desc edt_etm0700g0bdh6 = {
1322         .modes = &edt_etm0700g0dh6_mode,
1323         .num_modes = 1,
1324         .bpc = 6,
1325         .size = {
1326                 .width = 152,
1327                 .height = 91,
1328         },
1329         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
1330         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
1331 };
1332
1333 static const struct display_timing evervision_vgg804821_timing = {
1334         .pixelclock = { 27600000, 33300000, 50000000 },
1335         .hactive = { 800, 800, 800 },
1336         .hfront_porch = { 40, 66, 70 },
1337         .hback_porch = { 40, 67, 70 },
1338         .hsync_len = { 40, 67, 70 },
1339         .vactive = { 480, 480, 480 },
1340         .vfront_porch = { 6, 10, 10 },
1341         .vback_porch = { 7, 11, 11 },
1342         .vsync_len = { 7, 11, 11 },
1343         .flags = DISPLAY_FLAGS_HSYNC_HIGH | DISPLAY_FLAGS_VSYNC_HIGH |
1344                  DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_NEGEDGE |
1345                  DISPLAY_FLAGS_SYNC_NEGEDGE,
1346 };
1347
1348 static const struct panel_desc evervision_vgg804821 = {
1349         .timings = &evervision_vgg804821_timing,
1350         .num_timings = 1,
1351         .bpc = 8,
1352         .size = {
1353                 .width = 108,
1354                 .height = 64,
1355         },
1356         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
1357         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_NEGEDGE,
1358 };
1359
1360 static const struct drm_display_mode foxlink_fl500wvr00_a0t_mode = {
1361         .clock = 32260,
1362         .hdisplay = 800,
1363         .hsync_start = 800 + 168,
1364         .hsync_end = 800 + 168 + 64,
1365         .htotal = 800 + 168 + 64 + 88,
1366         .vdisplay = 480,
1367         .vsync_start = 480 + 37,
1368         .vsync_end = 480 + 37 + 2,
1369         .vtotal = 480 + 37 + 2 + 8,
1370         .vrefresh = 60,
1371 };
1372
1373 static const struct panel_desc foxlink_fl500wvr00_a0t = {
1374         .modes = &foxlink_fl500wvr00_a0t_mode,
1375         .num_modes = 1,
1376         .bpc = 8,
1377         .size = {
1378                 .width = 108,
1379                 .height = 65,
1380         },
1381         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
1382 };
1383
1384 static const struct drm_display_mode friendlyarm_hd702e_mode = {
1385         .clock          = 67185,
1386         .hdisplay       = 800,
1387         .hsync_start    = 800 + 20,
1388         .hsync_end      = 800 + 20 + 24,
1389         .htotal         = 800 + 20 + 24 + 20,
1390         .vdisplay       = 1280,
1391         .vsync_start    = 1280 + 4,
1392         .vsync_end      = 1280 + 4 + 8,
1393         .vtotal         = 1280 + 4 + 8 + 4,
1394         .vrefresh       = 60,
1395         .flags          = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
1396 };
1397
1398 static const struct panel_desc friendlyarm_hd702e = {
1399         .modes = &friendlyarm_hd702e_mode,
1400         .num_modes = 1,
1401         .size = {
1402                 .width  = 94,
1403                 .height = 151,
1404         },
1405 };
1406
1407 static const struct drm_display_mode giantplus_gpg482739qs5_mode = {
1408         .clock = 9000,
1409         .hdisplay = 480,
1410         .hsync_start = 480 + 5,
1411         .hsync_end = 480 + 5 + 1,
1412         .htotal = 480 + 5 + 1 + 40,
1413         .vdisplay = 272,
1414         .vsync_start = 272 + 8,
1415         .vsync_end = 272 + 8 + 1,
1416         .vtotal = 272 + 8 + 1 + 8,
1417         .vrefresh = 60,
1418 };
1419
1420 static const struct panel_desc giantplus_gpg482739qs5 = {
1421         .modes = &giantplus_gpg482739qs5_mode,
1422         .num_modes = 1,
1423         .bpc = 8,
1424         .size = {
1425                 .width = 95,
1426                 .height = 54,
1427         },
1428         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
1429 };
1430
1431 static const struct display_timing giantplus_gpm940b0_timing = {
1432         .pixelclock = { 13500000, 27000000, 27500000 },
1433         .hactive = { 320, 320, 320 },
1434         .hfront_porch = { 14, 686, 718 },
1435         .hback_porch = { 50, 70, 255 },
1436         .hsync_len = { 1, 1, 1 },
1437         .vactive = { 240, 240, 240 },
1438         .vfront_porch = { 1, 1, 179 },
1439         .vback_porch = { 1, 21, 31 },
1440         .vsync_len = { 1, 1, 6 },
1441         .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
1442 };
1443
1444 static const struct panel_desc giantplus_gpm940b0 = {
1445         .timings = &giantplus_gpm940b0_timing,
1446         .num_timings = 1,
1447         .bpc = 8,
1448         .size = {
1449                 .width = 60,
1450                 .height = 45,
1451         },
1452         .bus_format = MEDIA_BUS_FMT_RGB888_3X8,
1453         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_NEGEDGE,
1454 };
1455
1456 static const struct display_timing hannstar_hsd070pww1_timing = {
1457         .pixelclock = { 64300000, 71100000, 82000000 },
1458         .hactive = { 1280, 1280, 1280 },
1459         .hfront_porch = { 1, 1, 10 },
1460         .hback_porch = { 1, 1, 10 },
1461         /*
1462          * According to the data sheet, the minimum horizontal blanking interval
1463          * is 54 clocks (1 + 52 + 1), but tests with a Nitrogen6X have shown the
1464          * minimum working horizontal blanking interval to be 60 clocks.
1465          */
1466         .hsync_len = { 58, 158, 661 },
1467         .vactive = { 800, 800, 800 },
1468         .vfront_porch = { 1, 1, 10 },
1469         .vback_porch = { 1, 1, 10 },
1470         .vsync_len = { 1, 21, 203 },
1471         .flags = DISPLAY_FLAGS_DE_HIGH,
1472 };
1473
1474 static const struct panel_desc hannstar_hsd070pww1 = {
1475         .timings = &hannstar_hsd070pww1_timing,
1476         .num_timings = 1,
1477         .bpc = 6,
1478         .size = {
1479                 .width = 151,
1480                 .height = 94,
1481         },
1482         .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
1483         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1484 };
1485
1486 static const struct display_timing hannstar_hsd100pxn1_timing = {
1487         .pixelclock = { 55000000, 65000000, 75000000 },
1488         .hactive = { 1024, 1024, 1024 },
1489         .hfront_porch = { 40, 40, 40 },
1490         .hback_porch = { 220, 220, 220 },
1491         .hsync_len = { 20, 60, 100 },
1492         .vactive = { 768, 768, 768 },
1493         .vfront_porch = { 7, 7, 7 },
1494         .vback_porch = { 21, 21, 21 },
1495         .vsync_len = { 10, 10, 10 },
1496         .flags = DISPLAY_FLAGS_DE_HIGH,
1497 };
1498
1499 static const struct panel_desc hannstar_hsd100pxn1 = {
1500         .timings = &hannstar_hsd100pxn1_timing,
1501         .num_timings = 1,
1502         .bpc = 6,
1503         .size = {
1504                 .width = 203,
1505                 .height = 152,
1506         },
1507         .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
1508         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1509 };
1510
1511 static const struct drm_display_mode hitachi_tx23d38vm0caa_mode = {
1512         .clock = 33333,
1513         .hdisplay = 800,
1514         .hsync_start = 800 + 85,
1515         .hsync_end = 800 + 85 + 86,
1516         .htotal = 800 + 85 + 86 + 85,
1517         .vdisplay = 480,
1518         .vsync_start = 480 + 16,
1519         .vsync_end = 480 + 16 + 13,
1520         .vtotal = 480 + 16 + 13 + 16,
1521         .vrefresh = 60,
1522 };
1523
1524 static const struct panel_desc hitachi_tx23d38vm0caa = {
1525         .modes = &hitachi_tx23d38vm0caa_mode,
1526         .num_modes = 1,
1527         .bpc = 6,
1528         .size = {
1529                 .width = 195,
1530                 .height = 117,
1531         },
1532         .delay = {
1533                 .enable = 160,
1534                 .disable = 160,
1535         },
1536 };
1537
1538 static const struct drm_display_mode innolux_at043tn24_mode = {
1539         .clock = 9000,
1540         .hdisplay = 480,
1541         .hsync_start = 480 + 2,
1542         .hsync_end = 480 + 2 + 41,
1543         .htotal = 480 + 2 + 41 + 2,
1544         .vdisplay = 272,
1545         .vsync_start = 272 + 2,
1546         .vsync_end = 272 + 2 + 10,
1547         .vtotal = 272 + 2 + 10 + 2,
1548         .vrefresh = 60,
1549         .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
1550 };
1551
1552 static const struct panel_desc innolux_at043tn24 = {
1553         .modes = &innolux_at043tn24_mode,
1554         .num_modes = 1,
1555         .bpc = 8,
1556         .size = {
1557                 .width = 95,
1558                 .height = 54,
1559         },
1560         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
1561         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
1562 };
1563
1564 static const struct drm_display_mode innolux_at070tn92_mode = {
1565         .clock = 33333,
1566         .hdisplay = 800,
1567         .hsync_start = 800 + 210,
1568         .hsync_end = 800 + 210 + 20,
1569         .htotal = 800 + 210 + 20 + 46,
1570         .vdisplay = 480,
1571         .vsync_start = 480 + 22,
1572         .vsync_end = 480 + 22 + 10,
1573         .vtotal = 480 + 22 + 23 + 10,
1574         .vrefresh = 60,
1575 };
1576
1577 static const struct panel_desc innolux_at070tn92 = {
1578         .modes = &innolux_at070tn92_mode,
1579         .num_modes = 1,
1580         .size = {
1581                 .width = 154,
1582                 .height = 86,
1583         },
1584         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
1585 };
1586
1587 static const struct display_timing innolux_g070y2_l01_timing = {
1588         .pixelclock = { 28000000, 29500000, 32000000 },
1589         .hactive = { 800, 800, 800 },
1590         .hfront_porch = { 61, 91, 141 },
1591         .hback_porch = { 60, 90, 140 },
1592         .hsync_len = { 12, 12, 12 },
1593         .vactive = { 480, 480, 480 },
1594         .vfront_porch = { 4, 9, 30 },
1595         .vback_porch = { 4, 8, 28 },
1596         .vsync_len = { 2, 2, 2 },
1597         .flags = DISPLAY_FLAGS_DE_HIGH,
1598 };
1599
1600 static const struct panel_desc innolux_g070y2_l01 = {
1601         .timings = &innolux_g070y2_l01_timing,
1602         .num_timings = 1,
1603         .bpc = 6,
1604         .size = {
1605                 .width = 152,
1606                 .height = 91,
1607         },
1608         .delay = {
1609                 .prepare = 10,
1610                 .enable = 100,
1611                 .disable = 100,
1612                 .unprepare = 800,
1613         },
1614         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
1615         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1616 };
1617
1618 static const struct display_timing innolux_g101ice_l01_timing = {
1619         .pixelclock = { 60400000, 71100000, 74700000 },
1620         .hactive = { 1280, 1280, 1280 },
1621         .hfront_porch = { 41, 80, 100 },
1622         .hback_porch = { 40, 79, 99 },
1623         .hsync_len = { 1, 1, 1 },
1624         .vactive = { 800, 800, 800 },
1625         .vfront_porch = { 5, 11, 14 },
1626         .vback_porch = { 4, 11, 14 },
1627         .vsync_len = { 1, 1, 1 },
1628         .flags = DISPLAY_FLAGS_DE_HIGH,
1629 };
1630
1631 static const struct panel_desc innolux_g101ice_l01 = {
1632         .timings = &innolux_g101ice_l01_timing,
1633         .num_timings = 1,
1634         .bpc = 8,
1635         .size = {
1636                 .width = 217,
1637                 .height = 135,
1638         },
1639         .delay = {
1640                 .enable = 200,
1641                 .disable = 200,
1642         },
1643         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
1644         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1645 };
1646
1647 static const struct display_timing innolux_g121i1_l01_timing = {
1648         .pixelclock = { 67450000, 71000000, 74550000 },
1649         .hactive = { 1280, 1280, 1280 },
1650         .hfront_porch = { 40, 80, 160 },
1651         .hback_porch = { 39, 79, 159 },
1652         .hsync_len = { 1, 1, 1 },
1653         .vactive = { 800, 800, 800 },
1654         .vfront_porch = { 5, 11, 100 },
1655         .vback_porch = { 4, 11, 99 },
1656         .vsync_len = { 1, 1, 1 },
1657 };
1658
1659 static const struct panel_desc innolux_g121i1_l01 = {
1660         .timings = &innolux_g121i1_l01_timing,
1661         .num_timings = 1,
1662         .bpc = 6,
1663         .size = {
1664                 .width = 261,
1665                 .height = 163,
1666         },
1667         .delay = {
1668                 .enable = 200,
1669                 .disable = 20,
1670         },
1671         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
1672         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1673 };
1674
1675 static const struct drm_display_mode innolux_g121x1_l03_mode = {
1676         .clock = 65000,
1677         .hdisplay = 1024,
1678         .hsync_start = 1024 + 0,
1679         .hsync_end = 1024 + 1,
1680         .htotal = 1024 + 0 + 1 + 320,
1681         .vdisplay = 768,
1682         .vsync_start = 768 + 38,
1683         .vsync_end = 768 + 38 + 1,
1684         .vtotal = 768 + 38 + 1 + 0,
1685         .vrefresh = 60,
1686         .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
1687 };
1688
1689 static const struct panel_desc innolux_g121x1_l03 = {
1690         .modes = &innolux_g121x1_l03_mode,
1691         .num_modes = 1,
1692         .bpc = 6,
1693         .size = {
1694                 .width = 246,
1695                 .height = 185,
1696         },
1697         .delay = {
1698                 .enable = 200,
1699                 .unprepare = 200,
1700                 .disable = 400,
1701         },
1702 };
1703
1704 /*
1705  * Datasheet specifies that at 60 Hz refresh rate:
1706  * - total horizontal time: { 1506, 1592, 1716 }
1707  * - total vertical time: { 788, 800, 868 }
1708  *
1709  * ...but doesn't go into exactly how that should be split into a front
1710  * porch, back porch, or sync length.  For now we'll leave a single setting
1711  * here which allows a bit of tweaking of the pixel clock at the expense of
1712  * refresh rate.
1713  */
1714 static const struct display_timing innolux_n116bge_timing = {
1715         .pixelclock = { 72600000, 76420000, 80240000 },
1716         .hactive = { 1366, 1366, 1366 },
1717         .hfront_porch = { 136, 136, 136 },
1718         .hback_porch = { 60, 60, 60 },
1719         .hsync_len = { 30, 30, 30 },
1720         .vactive = { 768, 768, 768 },
1721         .vfront_porch = { 8, 8, 8 },
1722         .vback_porch = { 12, 12, 12 },
1723         .vsync_len = { 12, 12, 12 },
1724         .flags = DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_HSYNC_LOW,
1725 };
1726
1727 static const struct panel_desc innolux_n116bge = {
1728         .timings = &innolux_n116bge_timing,
1729         .num_timings = 1,
1730         .bpc = 6,
1731         .size = {
1732                 .width = 256,
1733                 .height = 144,
1734         },
1735 };
1736
1737 static const struct drm_display_mode innolux_n156bge_l21_mode = {
1738         .clock = 69300,
1739         .hdisplay = 1366,
1740         .hsync_start = 1366 + 16,
1741         .hsync_end = 1366 + 16 + 34,
1742         .htotal = 1366 + 16 + 34 + 50,
1743         .vdisplay = 768,
1744         .vsync_start = 768 + 2,
1745         .vsync_end = 768 + 2 + 6,
1746         .vtotal = 768 + 2 + 6 + 12,
1747         .vrefresh = 60,
1748 };
1749
1750 static const struct panel_desc innolux_n156bge_l21 = {
1751         .modes = &innolux_n156bge_l21_mode,
1752         .num_modes = 1,
1753         .bpc = 6,
1754         .size = {
1755                 .width = 344,
1756                 .height = 193,
1757         },
1758 };
1759
1760 static const struct drm_display_mode innolux_p120zdg_bf1_mode = {
1761         .clock = 206016,
1762         .hdisplay = 2160,
1763         .hsync_start = 2160 + 48,
1764         .hsync_end = 2160 + 48 + 32,
1765         .htotal = 2160 + 48 + 32 + 80,
1766         .vdisplay = 1440,
1767         .vsync_start = 1440 + 3,
1768         .vsync_end = 1440 + 3 + 10,
1769         .vtotal = 1440 + 3 + 10 + 27,
1770         .vrefresh = 60,
1771         .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
1772 };
1773
1774 static const struct panel_desc innolux_p120zdg_bf1 = {
1775         .modes = &innolux_p120zdg_bf1_mode,
1776         .num_modes = 1,
1777         .bpc = 8,
1778         .size = {
1779                 .width = 254,
1780                 .height = 169,
1781         },
1782         .delay = {
1783                 .hpd_absent_delay = 200,
1784                 .unprepare = 500,
1785         },
1786 };
1787
1788 static const struct drm_display_mode innolux_zj070na_01p_mode = {
1789         .clock = 51501,
1790         .hdisplay = 1024,
1791         .hsync_start = 1024 + 128,
1792         .hsync_end = 1024 + 128 + 64,
1793         .htotal = 1024 + 128 + 64 + 128,
1794         .vdisplay = 600,
1795         .vsync_start = 600 + 16,
1796         .vsync_end = 600 + 16 + 4,
1797         .vtotal = 600 + 16 + 4 + 16,
1798         .vrefresh = 60,
1799 };
1800
1801 static const struct panel_desc innolux_zj070na_01p = {
1802         .modes = &innolux_zj070na_01p_mode,
1803         .num_modes = 1,
1804         .bpc = 6,
1805         .size = {
1806                 .width = 154,
1807                 .height = 90,
1808         },
1809 };
1810
1811 static const struct display_timing koe_tx14d24vm1bpa_timing = {
1812         .pixelclock = { 5580000, 5850000, 6200000 },
1813         .hactive = { 320, 320, 320 },
1814         .hfront_porch = { 30, 30, 30 },
1815         .hback_porch = { 30, 30, 30 },
1816         .hsync_len = { 1, 5, 17 },
1817         .vactive = { 240, 240, 240 },
1818         .vfront_porch = { 6, 6, 6 },
1819         .vback_porch = { 5, 5, 5 },
1820         .vsync_len = { 1, 2, 11 },
1821         .flags = DISPLAY_FLAGS_DE_HIGH,
1822 };
1823
1824 static const struct panel_desc koe_tx14d24vm1bpa = {
1825         .timings = &koe_tx14d24vm1bpa_timing,
1826         .num_timings = 1,
1827         .bpc = 6,
1828         .size = {
1829                 .width = 115,
1830                 .height = 86,
1831         },
1832 };
1833
1834 static const struct display_timing koe_tx31d200vm0baa_timing = {
1835         .pixelclock = { 39600000, 43200000, 48000000 },
1836         .hactive = { 1280, 1280, 1280 },
1837         .hfront_porch = { 16, 36, 56 },
1838         .hback_porch = { 16, 36, 56 },
1839         .hsync_len = { 8, 8, 8 },
1840         .vactive = { 480, 480, 480 },
1841         .vfront_porch = { 6, 21, 33 },
1842         .vback_porch = { 6, 21, 33 },
1843         .vsync_len = { 8, 8, 8 },
1844         .flags = DISPLAY_FLAGS_DE_HIGH,
1845 };
1846
1847 static const struct panel_desc koe_tx31d200vm0baa = {
1848         .timings = &koe_tx31d200vm0baa_timing,
1849         .num_timings = 1,
1850         .bpc = 6,
1851         .size = {
1852                 .width = 292,
1853                 .height = 109,
1854         },
1855         .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
1856         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1857 };
1858
1859 static const struct display_timing kyo_tcg121xglp_timing = {
1860         .pixelclock = { 52000000, 65000000, 71000000 },
1861         .hactive = { 1024, 1024, 1024 },
1862         .hfront_porch = { 2, 2, 2 },
1863         .hback_porch = { 2, 2, 2 },
1864         .hsync_len = { 86, 124, 244 },
1865         .vactive = { 768, 768, 768 },
1866         .vfront_porch = { 2, 2, 2 },
1867         .vback_porch = { 2, 2, 2 },
1868         .vsync_len = { 6, 34, 73 },
1869         .flags = DISPLAY_FLAGS_DE_HIGH,
1870 };
1871
1872 static const struct panel_desc kyo_tcg121xglp = {
1873         .timings = &kyo_tcg121xglp_timing,
1874         .num_timings = 1,
1875         .bpc = 8,
1876         .size = {
1877                 .width = 246,
1878                 .height = 184,
1879         },
1880         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
1881         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1882 };
1883
1884 static const struct drm_display_mode lemaker_bl035_rgb_002_mode = {
1885         .clock = 7000,
1886         .hdisplay = 320,
1887         .hsync_start = 320 + 20,
1888         .hsync_end = 320 + 20 + 30,
1889         .htotal = 320 + 20 + 30 + 38,
1890         .vdisplay = 240,
1891         .vsync_start = 240 + 4,
1892         .vsync_end = 240 + 4 + 3,
1893         .vtotal = 240 + 4 + 3 + 15,
1894         .vrefresh = 60,
1895 };
1896
1897 static const struct panel_desc lemaker_bl035_rgb_002 = {
1898         .modes = &lemaker_bl035_rgb_002_mode,
1899         .num_modes = 1,
1900         .size = {
1901                 .width = 70,
1902                 .height = 52,
1903         },
1904         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
1905         .bus_flags = DRM_BUS_FLAG_DE_LOW,
1906 };
1907
1908 static const struct drm_display_mode lg_lb070wv8_mode = {
1909         .clock = 33246,
1910         .hdisplay = 800,
1911         .hsync_start = 800 + 88,
1912         .hsync_end = 800 + 88 + 80,
1913         .htotal = 800 + 88 + 80 + 88,
1914         .vdisplay = 480,
1915         .vsync_start = 480 + 10,
1916         .vsync_end = 480 + 10 + 25,
1917         .vtotal = 480 + 10 + 25 + 10,
1918         .vrefresh = 60,
1919 };
1920
1921 static const struct panel_desc lg_lb070wv8 = {
1922         .modes = &lg_lb070wv8_mode,
1923         .num_modes = 1,
1924         .bpc = 16,
1925         .size = {
1926                 .width = 151,
1927                 .height = 91,
1928         },
1929         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
1930         .connector_type = DRM_MODE_CONNECTOR_LVDS,
1931 };
1932
1933 static const struct drm_display_mode lg_lp079qx1_sp0v_mode = {
1934         .clock = 200000,
1935         .hdisplay = 1536,
1936         .hsync_start = 1536 + 12,
1937         .hsync_end = 1536 + 12 + 16,
1938         .htotal = 1536 + 12 + 16 + 48,
1939         .vdisplay = 2048,
1940         .vsync_start = 2048 + 8,
1941         .vsync_end = 2048 + 8 + 4,
1942         .vtotal = 2048 + 8 + 4 + 8,
1943         .vrefresh = 60,
1944         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
1945 };
1946
1947 static const struct panel_desc lg_lp079qx1_sp0v = {
1948         .modes = &lg_lp079qx1_sp0v_mode,
1949         .num_modes = 1,
1950         .size = {
1951                 .width = 129,
1952                 .height = 171,
1953         },
1954 };
1955
1956 static const struct drm_display_mode lg_lp097qx1_spa1_mode = {
1957         .clock = 205210,
1958         .hdisplay = 2048,
1959         .hsync_start = 2048 + 150,
1960         .hsync_end = 2048 + 150 + 5,
1961         .htotal = 2048 + 150 + 5 + 5,
1962         .vdisplay = 1536,
1963         .vsync_start = 1536 + 3,
1964         .vsync_end = 1536 + 3 + 1,
1965         .vtotal = 1536 + 3 + 1 + 9,
1966         .vrefresh = 60,
1967 };
1968
1969 static const struct panel_desc lg_lp097qx1_spa1 = {
1970         .modes = &lg_lp097qx1_spa1_mode,
1971         .num_modes = 1,
1972         .size = {
1973                 .width = 208,
1974                 .height = 147,
1975         },
1976 };
1977
1978 static const struct drm_display_mode lg_lp120up1_mode = {
1979         .clock = 162300,
1980         .hdisplay = 1920,
1981         .hsync_start = 1920 + 40,
1982         .hsync_end = 1920 + 40 + 40,
1983         .htotal = 1920 + 40 + 40+ 80,
1984         .vdisplay = 1280,
1985         .vsync_start = 1280 + 4,
1986         .vsync_end = 1280 + 4 + 4,
1987         .vtotal = 1280 + 4 + 4 + 12,
1988         .vrefresh = 60,
1989 };
1990
1991 static const struct panel_desc lg_lp120up1 = {
1992         .modes = &lg_lp120up1_mode,
1993         .num_modes = 1,
1994         .bpc = 8,
1995         .size = {
1996                 .width = 267,
1997                 .height = 183,
1998         },
1999 };
2000
2001 static const struct drm_display_mode lg_lp129qe_mode = {
2002         .clock = 285250,
2003         .hdisplay = 2560,
2004         .hsync_start = 2560 + 48,
2005         .hsync_end = 2560 + 48 + 32,
2006         .htotal = 2560 + 48 + 32 + 80,
2007         .vdisplay = 1700,
2008         .vsync_start = 1700 + 3,
2009         .vsync_end = 1700 + 3 + 10,
2010         .vtotal = 1700 + 3 + 10 + 36,
2011         .vrefresh = 60,
2012 };
2013
2014 static const struct panel_desc lg_lp129qe = {
2015         .modes = &lg_lp129qe_mode,
2016         .num_modes = 1,
2017         .bpc = 8,
2018         .size = {
2019                 .width = 272,
2020                 .height = 181,
2021         },
2022 };
2023
2024 static const struct drm_display_mode mitsubishi_aa070mc01_mode = {
2025         .clock = 30400,
2026         .hdisplay = 800,
2027         .hsync_start = 800 + 0,
2028         .hsync_end = 800 + 1,
2029         .htotal = 800 + 0 + 1 + 160,
2030         .vdisplay = 480,
2031         .vsync_start = 480 + 0,
2032         .vsync_end = 480 + 48 + 1,
2033         .vtotal = 480 + 48 + 1 + 0,
2034         .vrefresh = 60,
2035         .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
2036 };
2037
2038 static const struct drm_display_mode logicpd_type_28_mode = {
2039         .clock = 9000,
2040         .hdisplay = 480,
2041         .hsync_start = 480 + 3,
2042         .hsync_end = 480 + 3 + 42,
2043         .htotal = 480 + 3 + 42 + 2,
2044
2045         .vdisplay = 272,
2046         .vsync_start = 272 + 2,
2047         .vsync_end = 272 + 2 + 11,
2048         .vtotal = 272 + 2 + 11 + 3,
2049         .vrefresh = 60,
2050         .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
2051 };
2052
2053 static const struct panel_desc logicpd_type_28 = {
2054         .modes = &logicpd_type_28_mode,
2055         .num_modes = 1,
2056         .bpc = 8,
2057         .size = {
2058                 .width = 105,
2059                 .height = 67,
2060         },
2061         .delay = {
2062                 .prepare = 200,
2063                 .enable = 200,
2064                 .unprepare = 200,
2065                 .disable = 200,
2066         },
2067         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2068         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE |
2069                      DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE,
2070 };
2071
2072 static const struct panel_desc mitsubishi_aa070mc01 = {
2073         .modes = &mitsubishi_aa070mc01_mode,
2074         .num_modes = 1,
2075         .bpc = 8,
2076         .size = {
2077                 .width = 152,
2078                 .height = 91,
2079         },
2080
2081         .delay = {
2082                 .enable = 200,
2083                 .unprepare = 200,
2084                 .disable = 400,
2085         },
2086         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
2087         .connector_type = DRM_MODE_CONNECTOR_LVDS,
2088         .bus_flags = DRM_BUS_FLAG_DE_HIGH,
2089 };
2090
2091 static const struct display_timing nec_nl12880bc20_05_timing = {
2092         .pixelclock = { 67000000, 71000000, 75000000 },
2093         .hactive = { 1280, 1280, 1280 },
2094         .hfront_porch = { 2, 30, 30 },
2095         .hback_porch = { 6, 100, 100 },
2096         .hsync_len = { 2, 30, 30 },
2097         .vactive = { 800, 800, 800 },
2098         .vfront_porch = { 5, 5, 5 },
2099         .vback_porch = { 11, 11, 11 },
2100         .vsync_len = { 7, 7, 7 },
2101 };
2102
2103 static const struct panel_desc nec_nl12880bc20_05 = {
2104         .timings = &nec_nl12880bc20_05_timing,
2105         .num_timings = 1,
2106         .bpc = 8,
2107         .size = {
2108                 .width = 261,
2109                 .height = 163,
2110         },
2111         .delay = {
2112                 .enable = 50,
2113                 .disable = 50,
2114         },
2115         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
2116         .connector_type = DRM_MODE_CONNECTOR_LVDS,
2117 };
2118
2119 static const struct drm_display_mode nec_nl4827hc19_05b_mode = {
2120         .clock = 10870,
2121         .hdisplay = 480,
2122         .hsync_start = 480 + 2,
2123         .hsync_end = 480 + 2 + 41,
2124         .htotal = 480 + 2 + 41 + 2,
2125         .vdisplay = 272,
2126         .vsync_start = 272 + 2,
2127         .vsync_end = 272 + 2 + 4,
2128         .vtotal = 272 + 2 + 4 + 2,
2129         .vrefresh = 74,
2130         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
2131 };
2132
2133 static const struct panel_desc nec_nl4827hc19_05b = {
2134         .modes = &nec_nl4827hc19_05b_mode,
2135         .num_modes = 1,
2136         .bpc = 8,
2137         .size = {
2138                 .width = 95,
2139                 .height = 54,
2140         },
2141         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2142         .bus_flags = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
2143 };
2144
2145 static const struct drm_display_mode netron_dy_e231732_mode = {
2146         .clock = 66000,
2147         .hdisplay = 1024,
2148         .hsync_start = 1024 + 160,
2149         .hsync_end = 1024 + 160 + 70,
2150         .htotal = 1024 + 160 + 70 + 90,
2151         .vdisplay = 600,
2152         .vsync_start = 600 + 127,
2153         .vsync_end = 600 + 127 + 20,
2154         .vtotal = 600 + 127 + 20 + 3,
2155         .vrefresh = 60,
2156 };
2157
2158 static const struct panel_desc netron_dy_e231732 = {
2159         .modes = &netron_dy_e231732_mode,
2160         .num_modes = 1,
2161         .size = {
2162                 .width = 154,
2163                 .height = 87,
2164         },
2165         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
2166 };
2167
2168 static const struct drm_display_mode newhaven_nhd_43_480272ef_atxl_mode = {
2169         .clock = 9000,
2170         .hdisplay = 480,
2171         .hsync_start = 480 + 2,
2172         .hsync_end = 480 + 2 + 41,
2173         .htotal = 480 + 2 + 41 + 2,
2174         .vdisplay = 272,
2175         .vsync_start = 272 + 2,
2176         .vsync_end = 272 + 2 + 10,
2177         .vtotal = 272 + 2 + 10 + 2,
2178         .vrefresh = 60,
2179         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
2180 };
2181
2182 static const struct panel_desc newhaven_nhd_43_480272ef_atxl = {
2183         .modes = &newhaven_nhd_43_480272ef_atxl_mode,
2184         .num_modes = 1,
2185         .bpc = 8,
2186         .size = {
2187                 .width = 95,
2188                 .height = 54,
2189         },
2190         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2191         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE |
2192                      DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
2193 };
2194
2195 static const struct display_timing nlt_nl192108ac18_02d_timing = {
2196         .pixelclock = { 130000000, 148350000, 163000000 },
2197         .hactive = { 1920, 1920, 1920 },
2198         .hfront_porch = { 80, 100, 100 },
2199         .hback_porch = { 100, 120, 120 },
2200         .hsync_len = { 50, 60, 60 },
2201         .vactive = { 1080, 1080, 1080 },
2202         .vfront_porch = { 12, 30, 30 },
2203         .vback_porch = { 4, 10, 10 },
2204         .vsync_len = { 4, 5, 5 },
2205 };
2206
2207 static const struct panel_desc nlt_nl192108ac18_02d = {
2208         .timings = &nlt_nl192108ac18_02d_timing,
2209         .num_timings = 1,
2210         .bpc = 8,
2211         .size = {
2212                 .width = 344,
2213                 .height = 194,
2214         },
2215         .delay = {
2216                 .unprepare = 500,
2217         },
2218         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
2219         .connector_type = DRM_MODE_CONNECTOR_LVDS,
2220 };
2221
2222 static const struct drm_display_mode nvd_9128_mode = {
2223         .clock = 29500,
2224         .hdisplay = 800,
2225         .hsync_start = 800 + 130,
2226         .hsync_end = 800 + 130 + 98,
2227         .htotal = 800 + 0 + 130 + 98,
2228         .vdisplay = 480,
2229         .vsync_start = 480 + 10,
2230         .vsync_end = 480 + 10 + 50,
2231         .vtotal = 480 + 0 + 10 + 50,
2232 };
2233
2234 static const struct panel_desc nvd_9128 = {
2235         .modes = &nvd_9128_mode,
2236         .num_modes = 1,
2237         .bpc = 8,
2238         .size = {
2239                 .width = 156,
2240                 .height = 88,
2241         },
2242         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
2243         .connector_type = DRM_MODE_CONNECTOR_LVDS,
2244 };
2245
2246 static const struct display_timing okaya_rs800480t_7x0gp_timing = {
2247         .pixelclock = { 30000000, 30000000, 40000000 },
2248         .hactive = { 800, 800, 800 },
2249         .hfront_porch = { 40, 40, 40 },
2250         .hback_porch = { 40, 40, 40 },
2251         .hsync_len = { 1, 48, 48 },
2252         .vactive = { 480, 480, 480 },
2253         .vfront_porch = { 13, 13, 13 },
2254         .vback_porch = { 29, 29, 29 },
2255         .vsync_len = { 3, 3, 3 },
2256         .flags = DISPLAY_FLAGS_DE_HIGH,
2257 };
2258
2259 static const struct panel_desc okaya_rs800480t_7x0gp = {
2260         .timings = &okaya_rs800480t_7x0gp_timing,
2261         .num_timings = 1,
2262         .bpc = 6,
2263         .size = {
2264                 .width = 154,
2265                 .height = 87,
2266         },
2267         .delay = {
2268                 .prepare = 41,
2269                 .enable = 50,
2270                 .unprepare = 41,
2271                 .disable = 50,
2272         },
2273         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
2274 };
2275
2276 static const struct drm_display_mode olimex_lcd_olinuxino_43ts_mode = {
2277         .clock = 9000,
2278         .hdisplay = 480,
2279         .hsync_start = 480 + 5,
2280         .hsync_end = 480 + 5 + 30,
2281         .htotal = 480 + 5 + 30 + 10,
2282         .vdisplay = 272,
2283         .vsync_start = 272 + 8,
2284         .vsync_end = 272 + 8 + 5,
2285         .vtotal = 272 + 8 + 5 + 3,
2286         .vrefresh = 60,
2287 };
2288
2289 static const struct panel_desc olimex_lcd_olinuxino_43ts = {
2290         .modes = &olimex_lcd_olinuxino_43ts_mode,
2291         .num_modes = 1,
2292         .size = {
2293                 .width = 95,
2294                 .height = 54,
2295         },
2296         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2297 };
2298
2299 /*
2300  * 800x480 CVT. The panel appears to be quite accepting, at least as far as
2301  * pixel clocks, but this is the timing that was being used in the Adafruit
2302  * installation instructions.
2303  */
2304 static const struct drm_display_mode ontat_yx700wv03_mode = {
2305         .clock = 29500,
2306         .hdisplay = 800,
2307         .hsync_start = 824,
2308         .hsync_end = 896,
2309         .htotal = 992,
2310         .vdisplay = 480,
2311         .vsync_start = 483,
2312         .vsync_end = 493,
2313         .vtotal = 500,
2314         .vrefresh = 60,
2315         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
2316 };
2317
2318 /*
2319  * Specification at:
2320  * https://www.adafruit.com/images/product-files/2406/c3163.pdf
2321  */
2322 static const struct panel_desc ontat_yx700wv03 = {
2323         .modes = &ontat_yx700wv03_mode,
2324         .num_modes = 1,
2325         .bpc = 8,
2326         .size = {
2327                 .width = 154,
2328                 .height = 83,
2329         },
2330         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
2331 };
2332
2333 static const struct drm_display_mode ortustech_com37h3m_mode  = {
2334         .clock = 22153,
2335         .hdisplay = 480,
2336         .hsync_start = 480 + 8,
2337         .hsync_end = 480 + 8 + 10,
2338         .htotal = 480 + 8 + 10 + 10,
2339         .vdisplay = 640,
2340         .vsync_start = 640 + 4,
2341         .vsync_end = 640 + 4 + 3,
2342         .vtotal = 640 + 4 + 3 + 4,
2343         .vrefresh = 60,
2344         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
2345 };
2346
2347 static const struct panel_desc ortustech_com37h3m = {
2348         .modes = &ortustech_com37h3m_mode,
2349         .num_modes = 1,
2350         .bpc = 8,
2351         .size = {
2352                 .width = 56,    /* 56.16mm */
2353                 .height = 75,   /* 74.88mm */
2354         },
2355         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2356         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE |
2357                      DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
2358 };
2359
2360 static const struct drm_display_mode ortustech_com43h4m85ulc_mode  = {
2361         .clock = 25000,
2362         .hdisplay = 480,
2363         .hsync_start = 480 + 10,
2364         .hsync_end = 480 + 10 + 10,
2365         .htotal = 480 + 10 + 10 + 15,
2366         .vdisplay = 800,
2367         .vsync_start = 800 + 3,
2368         .vsync_end = 800 + 3 + 3,
2369         .vtotal = 800 + 3 + 3 + 3,
2370         .vrefresh = 60,
2371 };
2372
2373 static const struct panel_desc ortustech_com43h4m85ulc = {
2374         .modes = &ortustech_com43h4m85ulc_mode,
2375         .num_modes = 1,
2376         .bpc = 8,
2377         .size = {
2378                 .width = 56,
2379                 .height = 93,
2380         },
2381         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2382         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
2383 };
2384
2385 static const struct drm_display_mode osddisplays_osd070t1718_19ts_mode  = {
2386         .clock = 33000,
2387         .hdisplay = 800,
2388         .hsync_start = 800 + 210,
2389         .hsync_end = 800 + 210 + 30,
2390         .htotal = 800 + 210 + 30 + 16,
2391         .vdisplay = 480,
2392         .vsync_start = 480 + 22,
2393         .vsync_end = 480 + 22 + 13,
2394         .vtotal = 480 + 22 + 13 + 10,
2395         .vrefresh = 60,
2396         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
2397 };
2398
2399 static const struct panel_desc osddisplays_osd070t1718_19ts = {
2400         .modes = &osddisplays_osd070t1718_19ts_mode,
2401         .num_modes = 1,
2402         .bpc = 8,
2403         .size = {
2404                 .width = 152,
2405                 .height = 91,
2406         },
2407         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2408         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
2409         .connector_type = DRM_MODE_CONNECTOR_DPI,
2410 };
2411
2412 static const struct drm_display_mode pda_91_00156_a0_mode = {
2413         .clock = 33300,
2414         .hdisplay = 800,
2415         .hsync_start = 800 + 1,
2416         .hsync_end = 800 + 1 + 64,
2417         .htotal = 800 + 1 + 64 + 64,
2418         .vdisplay = 480,
2419         .vsync_start = 480 + 1,
2420         .vsync_end = 480 + 1 + 23,
2421         .vtotal = 480 + 1 + 23 + 22,
2422         .vrefresh = 60,
2423 };
2424
2425 static const struct panel_desc pda_91_00156_a0  = {
2426         .modes = &pda_91_00156_a0_mode,
2427         .num_modes = 1,
2428         .size = {
2429                 .width = 152,
2430                 .height = 91,
2431         },
2432         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2433 };
2434
2435
2436 static const struct drm_display_mode qd43003c0_40_mode = {
2437         .clock = 9000,
2438         .hdisplay = 480,
2439         .hsync_start = 480 + 8,
2440         .hsync_end = 480 + 8 + 4,
2441         .htotal = 480 + 8 + 4 + 39,
2442         .vdisplay = 272,
2443         .vsync_start = 272 + 4,
2444         .vsync_end = 272 + 4 + 10,
2445         .vtotal = 272 + 4 + 10 + 2,
2446         .vrefresh = 60,
2447 };
2448
2449 static const struct panel_desc qd43003c0_40 = {
2450         .modes = &qd43003c0_40_mode,
2451         .num_modes = 1,
2452         .bpc = 8,
2453         .size = {
2454                 .width = 95,
2455                 .height = 53,
2456         },
2457         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2458 };
2459
2460 static const struct display_timing rocktech_rk070er9427_timing = {
2461         .pixelclock = { 26400000, 33300000, 46800000 },
2462         .hactive = { 800, 800, 800 },
2463         .hfront_porch = { 16, 210, 354 },
2464         .hback_porch = { 46, 46, 46 },
2465         .hsync_len = { 1, 1, 1 },
2466         .vactive = { 480, 480, 480 },
2467         .vfront_porch = { 7, 22, 147 },
2468         .vback_porch = { 23, 23, 23 },
2469         .vsync_len = { 1, 1, 1 },
2470         .flags = DISPLAY_FLAGS_DE_HIGH,
2471 };
2472
2473 static const struct panel_desc rocktech_rk070er9427 = {
2474         .timings = &rocktech_rk070er9427_timing,
2475         .num_timings = 1,
2476         .bpc = 6,
2477         .size = {
2478                 .width = 154,
2479                 .height = 86,
2480         },
2481         .delay = {
2482                 .prepare = 41,
2483                 .enable = 50,
2484                 .unprepare = 41,
2485                 .disable = 50,
2486         },
2487         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
2488 };
2489
2490 static const struct drm_display_mode samsung_lsn122dl01_c01_mode = {
2491         .clock = 271560,
2492         .hdisplay = 2560,
2493         .hsync_start = 2560 + 48,
2494         .hsync_end = 2560 + 48 + 32,
2495         .htotal = 2560 + 48 + 32 + 80,
2496         .vdisplay = 1600,
2497         .vsync_start = 1600 + 2,
2498         .vsync_end = 1600 + 2 + 5,
2499         .vtotal = 1600 + 2 + 5 + 57,
2500         .vrefresh = 60,
2501 };
2502
2503 static const struct panel_desc samsung_lsn122dl01_c01 = {
2504         .modes = &samsung_lsn122dl01_c01_mode,
2505         .num_modes = 1,
2506         .size = {
2507                 .width = 263,
2508                 .height = 164,
2509         },
2510 };
2511
2512 static const struct drm_display_mode samsung_ltn101nt05_mode = {
2513         .clock = 54030,
2514         .hdisplay = 1024,
2515         .hsync_start = 1024 + 24,
2516         .hsync_end = 1024 + 24 + 136,
2517         .htotal = 1024 + 24 + 136 + 160,
2518         .vdisplay = 600,
2519         .vsync_start = 600 + 3,
2520         .vsync_end = 600 + 3 + 6,
2521         .vtotal = 600 + 3 + 6 + 61,
2522         .vrefresh = 60,
2523 };
2524
2525 static const struct panel_desc samsung_ltn101nt05 = {
2526         .modes = &samsung_ltn101nt05_mode,
2527         .num_modes = 1,
2528         .bpc = 6,
2529         .size = {
2530                 .width = 223,
2531                 .height = 125,
2532         },
2533 };
2534
2535 static const struct drm_display_mode samsung_ltn140at29_301_mode = {
2536         .clock = 76300,
2537         .hdisplay = 1366,
2538         .hsync_start = 1366 + 64,
2539         .hsync_end = 1366 + 64 + 48,
2540         .htotal = 1366 + 64 + 48 + 128,
2541         .vdisplay = 768,
2542         .vsync_start = 768 + 2,
2543         .vsync_end = 768 + 2 + 5,
2544         .vtotal = 768 + 2 + 5 + 17,
2545         .vrefresh = 60,
2546 };
2547
2548 static const struct panel_desc samsung_ltn140at29_301 = {
2549         .modes = &samsung_ltn140at29_301_mode,
2550         .num_modes = 1,
2551         .bpc = 6,
2552         .size = {
2553                 .width = 320,
2554                 .height = 187,
2555         },
2556 };
2557
2558 static const struct drm_display_mode sharp_ld_d5116z01b_mode = {
2559         .clock = 168480,
2560         .hdisplay = 1920,
2561         .hsync_start = 1920 + 48,
2562         .hsync_end = 1920 + 48 + 32,
2563         .htotal = 1920 + 48 + 32 + 80,
2564         .vdisplay = 1280,
2565         .vsync_start = 1280 + 3,
2566         .vsync_end = 1280 + 3 + 10,
2567         .vtotal = 1280 + 3 + 10 + 57,
2568         .vrefresh = 60,
2569         .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
2570 };
2571
2572 static const struct panel_desc sharp_ld_d5116z01b = {
2573         .modes = &sharp_ld_d5116z01b_mode,
2574         .num_modes = 1,
2575         .bpc = 8,
2576         .size = {
2577                 .width = 260,
2578                 .height = 120,
2579         },
2580         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2581         .bus_flags = DRM_BUS_FLAG_DATA_MSB_TO_LSB,
2582 };
2583
2584 static const struct drm_display_mode sharp_lq070y3dg3b_mode = {
2585         .clock = 33260,
2586         .hdisplay = 800,
2587         .hsync_start = 800 + 64,
2588         .hsync_end = 800 + 64 + 128,
2589         .htotal = 800 + 64 + 128 + 64,
2590         .vdisplay = 480,
2591         .vsync_start = 480 + 8,
2592         .vsync_end = 480 + 8 + 2,
2593         .vtotal = 480 + 8 + 2 + 35,
2594         .vrefresh = 60,
2595         .flags = DISPLAY_FLAGS_PIXDATA_POSEDGE,
2596 };
2597
2598 static const struct panel_desc sharp_lq070y3dg3b = {
2599         .modes = &sharp_lq070y3dg3b_mode,
2600         .num_modes = 1,
2601         .bpc = 8,
2602         .size = {
2603                 .width = 152,   /* 152.4mm */
2604                 .height = 91,   /* 91.4mm */
2605         },
2606         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2607         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE |
2608                      DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
2609 };
2610
2611 static const struct drm_display_mode sharp_lq035q7db03_mode = {
2612         .clock = 5500,
2613         .hdisplay = 240,
2614         .hsync_start = 240 + 16,
2615         .hsync_end = 240 + 16 + 7,
2616         .htotal = 240 + 16 + 7 + 5,
2617         .vdisplay = 320,
2618         .vsync_start = 320 + 9,
2619         .vsync_end = 320 + 9 + 1,
2620         .vtotal = 320 + 9 + 1 + 7,
2621         .vrefresh = 60,
2622 };
2623
2624 static const struct panel_desc sharp_lq035q7db03 = {
2625         .modes = &sharp_lq035q7db03_mode,
2626         .num_modes = 1,
2627         .bpc = 6,
2628         .size = {
2629                 .width = 54,
2630                 .height = 72,
2631         },
2632         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
2633 };
2634
2635 static const struct display_timing sharp_lq101k1ly04_timing = {
2636         .pixelclock = { 60000000, 65000000, 80000000 },
2637         .hactive = { 1280, 1280, 1280 },
2638         .hfront_porch = { 20, 20, 20 },
2639         .hback_porch = { 20, 20, 20 },
2640         .hsync_len = { 10, 10, 10 },
2641         .vactive = { 800, 800, 800 },
2642         .vfront_porch = { 4, 4, 4 },
2643         .vback_porch = { 4, 4, 4 },
2644         .vsync_len = { 4, 4, 4 },
2645         .flags = DISPLAY_FLAGS_PIXDATA_POSEDGE,
2646 };
2647
2648 static const struct panel_desc sharp_lq101k1ly04 = {
2649         .timings = &sharp_lq101k1ly04_timing,
2650         .num_timings = 1,
2651         .bpc = 8,
2652         .size = {
2653                 .width = 217,
2654                 .height = 136,
2655         },
2656         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
2657         .connector_type = DRM_MODE_CONNECTOR_LVDS,
2658 };
2659
2660 static const struct display_timing sharp_lq123p1jx31_timing = {
2661         .pixelclock = { 252750000, 252750000, 266604720 },
2662         .hactive = { 2400, 2400, 2400 },
2663         .hfront_porch = { 48, 48, 48 },
2664         .hback_porch = { 80, 80, 84 },
2665         .hsync_len = { 32, 32, 32 },
2666         .vactive = { 1600, 1600, 1600 },
2667         .vfront_porch = { 3, 3, 3 },
2668         .vback_porch = { 33, 33, 120 },
2669         .vsync_len = { 10, 10, 10 },
2670         .flags = DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_HSYNC_LOW,
2671 };
2672
2673 static const struct panel_desc sharp_lq123p1jx31 = {
2674         .timings = &sharp_lq123p1jx31_timing,
2675         .num_timings = 1,
2676         .bpc = 8,
2677         .size = {
2678                 .width = 259,
2679                 .height = 173,
2680         },
2681         .delay = {
2682                 .prepare = 110,
2683                 .enable = 50,
2684                 .unprepare = 550,
2685         },
2686 };
2687
2688 static const struct drm_display_mode sharp_lq150x1lg11_mode = {
2689         .clock = 71100,
2690         .hdisplay = 1024,
2691         .hsync_start = 1024 + 168,
2692         .hsync_end = 1024 + 168 + 64,
2693         .htotal = 1024 + 168 + 64 + 88,
2694         .vdisplay = 768,
2695         .vsync_start = 768 + 37,
2696         .vsync_end = 768 + 37 + 2,
2697         .vtotal = 768 + 37 + 2 + 8,
2698         .vrefresh = 60,
2699 };
2700
2701 static const struct panel_desc sharp_lq150x1lg11 = {
2702         .modes = &sharp_lq150x1lg11_mode,
2703         .num_modes = 1,
2704         .bpc = 6,
2705         .size = {
2706                 .width = 304,
2707                 .height = 228,
2708         },
2709         .bus_format = MEDIA_BUS_FMT_RGB565_1X16,
2710 };
2711
2712 static const struct display_timing sharp_ls020b1dd01d_timing = {
2713         .pixelclock = { 2000000, 4200000, 5000000 },
2714         .hactive = { 240, 240, 240 },
2715         .hfront_porch = { 66, 66, 66 },
2716         .hback_porch = { 1, 1, 1 },
2717         .hsync_len = { 1, 1, 1 },
2718         .vactive = { 160, 160, 160 },
2719         .vfront_porch = { 52, 52, 52 },
2720         .vback_porch = { 6, 6, 6 },
2721         .vsync_len = { 10, 10, 10 },
2722         .flags = DISPLAY_FLAGS_HSYNC_HIGH | DISPLAY_FLAGS_VSYNC_LOW,
2723 };
2724
2725 static const struct panel_desc sharp_ls020b1dd01d = {
2726         .timings = &sharp_ls020b1dd01d_timing,
2727         .num_timings = 1,
2728         .bpc = 6,
2729         .size = {
2730                 .width = 42,
2731                 .height = 28,
2732         },
2733         .bus_format = MEDIA_BUS_FMT_RGB565_1X16,
2734         .bus_flags = DRM_BUS_FLAG_DE_HIGH
2735                    | DRM_BUS_FLAG_PIXDATA_NEGEDGE
2736                    | DRM_BUS_FLAG_SHARP_SIGNALS,
2737 };
2738
2739 static const struct drm_display_mode shelly_sca07010_bfn_lnn_mode = {
2740         .clock = 33300,
2741         .hdisplay = 800,
2742         .hsync_start = 800 + 1,
2743         .hsync_end = 800 + 1 + 64,
2744         .htotal = 800 + 1 + 64 + 64,
2745         .vdisplay = 480,
2746         .vsync_start = 480 + 1,
2747         .vsync_end = 480 + 1 + 23,
2748         .vtotal = 480 + 1 + 23 + 22,
2749         .vrefresh = 60,
2750 };
2751
2752 static const struct panel_desc shelly_sca07010_bfn_lnn = {
2753         .modes = &shelly_sca07010_bfn_lnn_mode,
2754         .num_modes = 1,
2755         .size = {
2756                 .width = 152,
2757                 .height = 91,
2758         },
2759         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
2760 };
2761
2762 static const struct drm_display_mode starry_kr122ea0sra_mode = {
2763         .clock = 147000,
2764         .hdisplay = 1920,
2765         .hsync_start = 1920 + 16,
2766         .hsync_end = 1920 + 16 + 16,
2767         .htotal = 1920 + 16 + 16 + 32,
2768         .vdisplay = 1200,
2769         .vsync_start = 1200 + 15,
2770         .vsync_end = 1200 + 15 + 2,
2771         .vtotal = 1200 + 15 + 2 + 18,
2772         .vrefresh = 60,
2773         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
2774 };
2775
2776 static const struct panel_desc starry_kr122ea0sra = {
2777         .modes = &starry_kr122ea0sra_mode,
2778         .num_modes = 1,
2779         .size = {
2780                 .width = 263,
2781                 .height = 164,
2782         },
2783         .delay = {
2784                 .prepare = 10 + 200,
2785                 .enable = 50,
2786                 .unprepare = 10 + 500,
2787         },
2788 };
2789
2790 static const struct drm_display_mode tfc_s9700rtwv43tr_01b_mode = {
2791         .clock = 30000,
2792         .hdisplay = 800,
2793         .hsync_start = 800 + 39,
2794         .hsync_end = 800 + 39 + 47,
2795         .htotal = 800 + 39 + 47 + 39,
2796         .vdisplay = 480,
2797         .vsync_start = 480 + 13,
2798         .vsync_end = 480 + 13 + 2,
2799         .vtotal = 480 + 13 + 2 + 29,
2800         .vrefresh = 62,
2801 };
2802
2803 static const struct panel_desc tfc_s9700rtwv43tr_01b = {
2804         .modes = &tfc_s9700rtwv43tr_01b_mode,
2805         .num_modes = 1,
2806         .bpc = 8,
2807         .size = {
2808                 .width = 155,
2809                 .height = 90,
2810         },
2811         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2812         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE,
2813 };
2814
2815 static const struct display_timing tianma_tm070jdhg30_timing = {
2816         .pixelclock = { 62600000, 68200000, 78100000 },
2817         .hactive = { 1280, 1280, 1280 },
2818         .hfront_porch = { 15, 64, 159 },
2819         .hback_porch = { 5, 5, 5 },
2820         .hsync_len = { 1, 1, 256 },
2821         .vactive = { 800, 800, 800 },
2822         .vfront_porch = { 3, 40, 99 },
2823         .vback_porch = { 2, 2, 2 },
2824         .vsync_len = { 1, 1, 128 },
2825         .flags = DISPLAY_FLAGS_DE_HIGH,
2826 };
2827
2828 static const struct panel_desc tianma_tm070jdhg30 = {
2829         .timings = &tianma_tm070jdhg30_timing,
2830         .num_timings = 1,
2831         .bpc = 8,
2832         .size = {
2833                 .width = 151,
2834                 .height = 95,
2835         },
2836         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
2837         .connector_type = DRM_MODE_CONNECTOR_LVDS,
2838 };
2839
2840 static const struct display_timing tianma_tm070rvhg71_timing = {
2841         .pixelclock = { 27700000, 29200000, 39600000 },
2842         .hactive = { 800, 800, 800 },
2843         .hfront_porch = { 12, 40, 212 },
2844         .hback_porch = { 88, 88, 88 },
2845         .hsync_len = { 1, 1, 40 },
2846         .vactive = { 480, 480, 480 },
2847         .vfront_porch = { 1, 13, 88 },
2848         .vback_porch = { 32, 32, 32 },
2849         .vsync_len = { 1, 1, 3 },
2850         .flags = DISPLAY_FLAGS_DE_HIGH,
2851 };
2852
2853 static const struct panel_desc tianma_tm070rvhg71 = {
2854         .timings = &tianma_tm070rvhg71_timing,
2855         .num_timings = 1,
2856         .bpc = 8,
2857         .size = {
2858                 .width = 154,
2859                 .height = 86,
2860         },
2861         .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
2862         .connector_type = DRM_MODE_CONNECTOR_LVDS,
2863 };
2864
2865 static const struct drm_display_mode ti_nspire_cx_lcd_mode[] = {
2866         {
2867                 .clock = 10000,
2868                 .hdisplay = 320,
2869                 .hsync_start = 320 + 50,
2870                 .hsync_end = 320 + 50 + 6,
2871                 .htotal = 320 + 50 + 6 + 38,
2872                 .vdisplay = 240,
2873                 .vsync_start = 240 + 3,
2874                 .vsync_end = 240 + 3 + 1,
2875                 .vtotal = 240 + 3 + 1 + 17,
2876                 .vrefresh = 60,
2877                 .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
2878         },
2879 };
2880
2881 static const struct panel_desc ti_nspire_cx_lcd_panel = {
2882         .modes = ti_nspire_cx_lcd_mode,
2883         .num_modes = 1,
2884         .bpc = 8,
2885         .size = {
2886                 .width = 65,
2887                 .height = 49,
2888         },
2889         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2890         .bus_flags = DRM_BUS_FLAG_PIXDATA_NEGEDGE,
2891 };
2892
2893 static const struct drm_display_mode ti_nspire_classic_lcd_mode[] = {
2894         {
2895                 .clock = 10000,
2896                 .hdisplay = 320,
2897                 .hsync_start = 320 + 6,
2898                 .hsync_end = 320 + 6 + 6,
2899                 .htotal = 320 + 6 + 6 + 6,
2900                 .vdisplay = 240,
2901                 .vsync_start = 240 + 0,
2902                 .vsync_end = 240 + 0 + 1,
2903                 .vtotal = 240 + 0 + 1 + 0,
2904                 .vrefresh = 60,
2905                 .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
2906         },
2907 };
2908
2909 static const struct panel_desc ti_nspire_classic_lcd_panel = {
2910         .modes = ti_nspire_classic_lcd_mode,
2911         .num_modes = 1,
2912         /* The grayscale panel has 8 bit for the color .. Y (black) */
2913         .bpc = 8,
2914         .size = {
2915                 .width = 71,
2916                 .height = 53,
2917         },
2918         /* This is the grayscale bus format */
2919         .bus_format = MEDIA_BUS_FMT_Y8_1X8,
2920         .bus_flags = DRM_BUS_FLAG_PIXDATA_POSEDGE,
2921 };
2922
2923 static const struct drm_display_mode toshiba_lt089ac29000_mode = {
2924         .clock = 79500,
2925         .hdisplay = 1280,
2926         .hsync_start = 1280 + 192,
2927         .hsync_end = 1280 + 192 + 128,
2928         .htotal = 1280 + 192 + 128 + 64,
2929         .vdisplay = 768,
2930         .vsync_start = 768 + 20,
2931         .vsync_end = 768 + 20 + 7,
2932         .vtotal = 768 + 20 + 7 + 3,
2933         .vrefresh = 60,
2934 };
2935
2936 static const struct panel_desc toshiba_lt089ac29000 = {
2937         .modes = &toshiba_lt089ac29000_mode,
2938         .num_modes = 1,
2939         .size = {
2940                 .width = 194,
2941                 .height = 116,
2942         },
2943         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
2944         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
2945         .connector_type = DRM_MODE_CONNECTOR_LVDS,
2946 };
2947
2948 static const struct drm_display_mode tpk_f07a_0102_mode = {
2949         .clock = 33260,
2950         .hdisplay = 800,
2951         .hsync_start = 800 + 40,
2952         .hsync_end = 800 + 40 + 128,
2953         .htotal = 800 + 40 + 128 + 88,
2954         .vdisplay = 480,
2955         .vsync_start = 480 + 10,
2956         .vsync_end = 480 + 10 + 2,
2957         .vtotal = 480 + 10 + 2 + 33,
2958         .vrefresh = 60,
2959 };
2960
2961 static const struct panel_desc tpk_f07a_0102 = {
2962         .modes = &tpk_f07a_0102_mode,
2963         .num_modes = 1,
2964         .size = {
2965                 .width = 152,
2966                 .height = 91,
2967         },
2968         .bus_flags = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
2969 };
2970
2971 static const struct drm_display_mode tpk_f10a_0102_mode = {
2972         .clock = 45000,
2973         .hdisplay = 1024,
2974         .hsync_start = 1024 + 176,
2975         .hsync_end = 1024 + 176 + 5,
2976         .htotal = 1024 + 176 + 5 + 88,
2977         .vdisplay = 600,
2978         .vsync_start = 600 + 20,
2979         .vsync_end = 600 + 20 + 5,
2980         .vtotal = 600 + 20 + 5 + 25,
2981         .vrefresh = 60,
2982 };
2983
2984 static const struct panel_desc tpk_f10a_0102 = {
2985         .modes = &tpk_f10a_0102_mode,
2986         .num_modes = 1,
2987         .size = {
2988                 .width = 223,
2989                 .height = 125,
2990         },
2991 };
2992
2993 static const struct display_timing urt_umsh_8596md_timing = {
2994         .pixelclock = { 33260000, 33260000, 33260000 },
2995         .hactive = { 800, 800, 800 },
2996         .hfront_porch = { 41, 41, 41 },
2997         .hback_porch = { 216 - 128, 216 - 128, 216 - 128 },
2998         .hsync_len = { 71, 128, 128 },
2999         .vactive = { 480, 480, 480 },
3000         .vfront_porch = { 10, 10, 10 },
3001         .vback_porch = { 35 - 2, 35 - 2, 35 - 2 },
3002         .vsync_len = { 2, 2, 2 },
3003         .flags = DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_NEGEDGE |
3004                 DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
3005 };
3006
3007 static const struct panel_desc urt_umsh_8596md_lvds = {
3008         .timings = &urt_umsh_8596md_timing,
3009         .num_timings = 1,
3010         .bpc = 6,
3011         .size = {
3012                 .width = 152,
3013                 .height = 91,
3014         },
3015         .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
3016         .connector_type = DRM_MODE_CONNECTOR_LVDS,
3017 };
3018
3019 static const struct panel_desc urt_umsh_8596md_parallel = {
3020         .timings = &urt_umsh_8596md_timing,
3021         .num_timings = 1,
3022         .bpc = 6,
3023         .size = {
3024                 .width = 152,
3025                 .height = 91,
3026         },
3027         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
3028 };
3029
3030 static const struct drm_display_mode vl050_8048nt_c01_mode = {
3031         .clock = 33333,
3032         .hdisplay = 800,
3033         .hsync_start = 800 + 210,
3034         .hsync_end = 800 + 210 + 20,
3035         .htotal = 800 + 210 + 20 + 46,
3036         .vdisplay =  480,
3037         .vsync_start = 480 + 22,
3038         .vsync_end = 480 + 22 + 10,
3039         .vtotal = 480 + 22 + 10 + 23,
3040         .vrefresh = 60,
3041         .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
3042 };
3043
3044 static const struct panel_desc vl050_8048nt_c01 = {
3045         .modes = &vl050_8048nt_c01_mode,
3046         .num_modes = 1,
3047         .bpc = 8,
3048         .size = {
3049                 .width = 120,
3050                 .height = 76,
3051         },
3052         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
3053         .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE,
3054 };
3055
3056 static const struct drm_display_mode winstar_wf35ltiacd_mode = {
3057         .clock = 6410,
3058         .hdisplay = 320,
3059         .hsync_start = 320 + 20,
3060         .hsync_end = 320 + 20 + 30,
3061         .htotal = 320 + 20 + 30 + 38,
3062         .vdisplay = 240,
3063         .vsync_start = 240 + 4,
3064         .vsync_end = 240 + 4 + 3,
3065         .vtotal = 240 + 4 + 3 + 15,
3066         .vrefresh = 60,
3067         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
3068 };
3069
3070 static const struct panel_desc winstar_wf35ltiacd = {
3071         .modes = &winstar_wf35ltiacd_mode,
3072         .num_modes = 1,
3073         .bpc = 8,
3074         .size = {
3075                 .width = 70,
3076                 .height = 53,
3077         },
3078         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
3079 };
3080
3081 static const struct drm_display_mode arm_rtsm_mode[] = {
3082         {
3083                 .clock = 65000,
3084                 .hdisplay = 1024,
3085                 .hsync_start = 1024 + 24,
3086                 .hsync_end = 1024 + 24 + 136,
3087                 .htotal = 1024 + 24 + 136 + 160,
3088                 .vdisplay = 768,
3089                 .vsync_start = 768 + 3,
3090                 .vsync_end = 768 + 3 + 6,
3091                 .vtotal = 768 + 3 + 6 + 29,
3092                 .vrefresh = 60,
3093                 .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
3094         },
3095 };
3096
3097 static const struct panel_desc arm_rtsm = {
3098         .modes = arm_rtsm_mode,
3099         .num_modes = 1,
3100         .bpc = 8,
3101         .size = {
3102                 .width = 400,
3103                 .height = 300,
3104         },
3105         .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
3106 };
3107
3108 static const struct of_device_id platform_of_match[] = {
3109         {
3110                 .compatible = "ampire,am-480272h3tmqw-t01h",
3111                 .data = &ampire_am_480272h3tmqw_t01h,
3112         }, {
3113                 .compatible = "ampire,am800480r3tmqwa1h",
3114                 .data = &ampire_am800480r3tmqwa1h,
3115         }, {
3116                 .compatible = "arm,rtsm-display",
3117                 .data = &arm_rtsm,
3118         }, {
3119                 .compatible = "armadeus,st0700-adapt",
3120                 .data = &armadeus_st0700_adapt,
3121         }, {
3122                 .compatible = "auo,b101aw03",
3123                 .data = &auo_b101aw03,
3124         }, {
3125                 .compatible = "auo,b101ean01",
3126                 .data = &auo_b101ean01,
3127         }, {
3128                 .compatible = "auo,b101xtn01",
3129                 .data = &auo_b101xtn01,
3130         }, {
3131                 .compatible = "auo,b116xw03",
3132                 .data = &auo_b116xw03,
3133         }, {
3134                 .compatible = "auo,b133htn01",
3135                 .data = &auo_b133htn01,
3136         }, {
3137                 .compatible = "auo,b133xtn01",
3138                 .data = &auo_b133xtn01,
3139         }, {
3140                 .compatible = "auo,g070vvn01",
3141                 .data = &auo_g070vvn01,
3142         }, {
3143                 .compatible = "auo,g101evn010",
3144                 .data = &auo_g101evn010,
3145         }, {
3146                 .compatible = "auo,g104sn02",
3147                 .data = &auo_g104sn02,
3148         }, {
3149                 .compatible = "auo,g133han01",
3150                 .data = &auo_g133han01,
3151         }, {
3152                 .compatible = "auo,g185han01",
3153                 .data = &auo_g185han01,
3154         }, {
3155                 .compatible = "auo,p320hvn03",
3156                 .data = &auo_p320hvn03,
3157         }, {
3158                 .compatible = "auo,t215hvn01",
3159                 .data = &auo_t215hvn01,
3160         }, {
3161                 .compatible = "avic,tm070ddh03",
3162                 .data = &avic_tm070ddh03,
3163         }, {
3164                 .compatible = "bananapi,s070wv20-ct16",
3165                 .data = &bananapi_s070wv20_ct16,
3166         }, {
3167                 .compatible = "boe,hv070wsa-100",
3168                 .data = &boe_hv070wsa
3169         }, {
3170                 .compatible = "boe,nv101wxmn51",
3171                 .data = &boe_nv101wxmn51,
3172         }, {
3173                 .compatible = "cdtech,s043wq26h-ct7",
3174                 .data = &cdtech_s043wq26h_ct7,
3175         }, {
3176                 .compatible = "cdtech,s070wv95-ct16",
3177                 .data = &cdtech_s070wv95_ct16,
3178         }, {
3179                 .compatible = "chunghwa,claa070wp03xg",
3180                 .data = &chunghwa_claa070wp03xg,
3181         }, {
3182                 .compatible = "chunghwa,claa101wa01a",
3183                 .data = &chunghwa_claa101wa01a
3184         }, {
3185                 .compatible = "chunghwa,claa101wb01",
3186                 .data = &chunghwa_claa101wb01
3187         }, {
3188                 .compatible = "dataimage,scf0700c48ggu18",
3189                 .data = &dataimage_scf0700c48ggu18,
3190         }, {
3191                 .compatible = "dlc,dlc0700yzg-1",
3192                 .data = &dlc_dlc0700yzg_1,
3193         }, {
3194                 .compatible = "dlc,dlc1010gig",
3195                 .data = &dlc_dlc1010gig,
3196         }, {
3197                 .compatible = "edt,et035012dm6",
3198                 .data = &edt_et035012dm6,
3199         }, {
3200                 .compatible = "edt,etm0430g0dh6",
3201                 .data = &edt_etm0430g0dh6,
3202         }, {
3203                 .compatible = "edt,et057090dhu",
3204                 .data = &edt_et057090dhu,
3205         }, {
3206                 .compatible = "edt,et070080dh6",
3207                 .data = &edt_etm0700g0dh6,
3208         }, {
3209                 .compatible = "edt,etm0700g0dh6",
3210                 .data = &edt_etm0700g0dh6,
3211         }, {
3212                 .compatible = "edt,etm0700g0bdh6",
3213                 .data = &edt_etm0700g0bdh6,
3214         }, {
3215                 .compatible = "edt,etm0700g0edh6",
3216                 .data = &edt_etm0700g0bdh6,
3217         }, {
3218                 .compatible = "evervision,vgg804821",
3219                 .data = &evervision_vgg804821,
3220         }, {
3221                 .compatible = "foxlink,fl500wvr00-a0t",
3222                 .data = &foxlink_fl500wvr00_a0t,
3223         }, {
3224                 .compatible = "friendlyarm,hd702e",
3225                 .data = &friendlyarm_hd702e,
3226         }, {
3227                 .compatible = "giantplus,gpg482739qs5",
3228                 .data = &giantplus_gpg482739qs5
3229         }, {
3230                 .compatible = "giantplus,gpm940b0",
3231                 .data = &giantplus_gpm940b0,
3232         }, {
3233                 .compatible = "hannstar,hsd070pww1",
3234                 .data = &hannstar_hsd070pww1,
3235         }, {
3236                 .compatible = "hannstar,hsd100pxn1",
3237                 .data = &hannstar_hsd100pxn1,
3238         }, {
3239                 .compatible = "hit,tx23d38vm0caa",
3240                 .data = &hitachi_tx23d38vm0caa
3241         }, {
3242                 .compatible = "innolux,at043tn24",
3243                 .data = &innolux_at043tn24,
3244         }, {
3245                 .compatible = "innolux,at070tn92",
3246                 .data = &innolux_at070tn92,
3247         }, {
3248                 .compatible = "innolux,g070y2-l01",
3249                 .data = &innolux_g070y2_l01,
3250         }, {
3251                 .compatible = "innolux,g101ice-l01",
3252                 .data = &innolux_g101ice_l01
3253         }, {
3254                 .compatible = "innolux,g121i1-l01",
3255                 .data = &innolux_g121i1_l01
3256         }, {
3257                 .compatible = "innolux,g121x1-l03",
3258                 .data = &innolux_g121x1_l03,
3259         }, {
3260                 .compatible = "innolux,n116bge",
3261                 .data = &innolux_n116bge,
3262         }, {
3263                 .compatible = "innolux,n156bge-l21",
3264                 .data = &innolux_n156bge_l21,
3265         }, {
3266                 .compatible = "innolux,p120zdg-bf1",
3267                 .data = &innolux_p120zdg_bf1,
3268         }, {
3269                 .compatible = "innolux,zj070na-01p",
3270                 .data = &innolux_zj070na_01p,
3271         }, {
3272                 .compatible = "koe,tx14d24vm1bpa",
3273                 .data = &koe_tx14d24vm1bpa,
3274         }, {
3275                 .compatible = "koe,tx31d200vm0baa",
3276                 .data = &koe_tx31d200vm0baa,
3277         }, {
3278                 .compatible = "kyo,tcg121xglp",
3279                 .data = &kyo_tcg121xglp,
3280         }, {
3281                 .compatible = "lemaker,bl035-rgb-002",
3282                 .data = &lemaker_bl035_rgb_002,
3283         }, {
3284                 .compatible = "lg,lb070wv8",
3285                 .data = &lg_lb070wv8,
3286         }, {
3287                 .compatible = "lg,lp079qx1-sp0v",
3288                 .data = &lg_lp079qx1_sp0v,
3289         }, {
3290                 .compatible = "lg,lp097qx1-spa1",
3291                 .data = &lg_lp097qx1_spa1,
3292         }, {
3293                 .compatible = "lg,lp120up1",
3294                 .data = &lg_lp120up1,
3295         }, {
3296                 .compatible = "lg,lp129qe",
3297                 .data = &lg_lp129qe,
3298         }, {
3299                 .compatible = "logicpd,type28",
3300                 .data = &logicpd_type_28,
3301         }, {
3302                 .compatible = "mitsubishi,aa070mc01-ca1",
3303                 .data = &mitsubishi_aa070mc01,
3304         }, {
3305                 .compatible = "nec,nl12880bc20-05",
3306                 .data = &nec_nl12880bc20_05,
3307         }, {
3308                 .compatible = "nec,nl4827hc19-05b",
3309                 .data = &nec_nl4827hc19_05b,
3310         }, {
3311                 .compatible = "netron-dy,e231732",
3312                 .data = &netron_dy_e231732,
3313         }, {
3314                 .compatible = "newhaven,nhd-4.3-480272ef-atxl",
3315                 .data = &newhaven_nhd_43_480272ef_atxl,
3316         }, {
3317                 .compatible = "nlt,nl192108ac18-02d",
3318                 .data = &nlt_nl192108ac18_02d,
3319         }, {
3320                 .compatible = "nvd,9128",
3321                 .data = &nvd_9128,
3322         }, {
3323                 .compatible = "okaya,rs800480t-7x0gp",
3324                 .data = &okaya_rs800480t_7x0gp,
3325         }, {
3326                 .compatible = "olimex,lcd-olinuxino-43-ts",
3327                 .data = &olimex_lcd_olinuxino_43ts,
3328         }, {
3329                 .compatible = "ontat,yx700wv03",
3330                 .data = &ontat_yx700wv03,
3331         }, {
3332                 .compatible = "ortustech,com37h3m05dtc",
3333                 .data = &ortustech_com37h3m,
3334         }, {
3335                 .compatible = "ortustech,com37h3m99dtc",
3336                 .data = &ortustech_com37h3m,
3337         }, {
3338                 .compatible = "ortustech,com43h4m85ulc",
3339                 .data = &ortustech_com43h4m85ulc,
3340         }, {
3341                 .compatible = "osddisplays,osd070t1718-19ts",
3342                 .data = &osddisplays_osd070t1718_19ts,
3343         }, {
3344                 .compatible = "pda,91-00156-a0",
3345                 .data = &pda_91_00156_a0,
3346         }, {
3347                 .compatible = "qiaodian,qd43003c0-40",
3348                 .data = &qd43003c0_40,
3349         }, {
3350                 .compatible = "rocktech,rk070er9427",
3351                 .data = &rocktech_rk070er9427,
3352         }, {
3353                 .compatible = "samsung,lsn122dl01-c01",
3354                 .data = &samsung_lsn122dl01_c01,
3355         }, {
3356                 .compatible = "samsung,ltn101nt05",
3357                 .data = &samsung_ltn101nt05,
3358         }, {
3359                 .compatible = "samsung,ltn140at29-301",
3360                 .data = &samsung_ltn140at29_301,
3361         }, {
3362                 .compatible = "sharp,ld-d5116z01b",
3363                 .data = &sharp_ld_d5116z01b,
3364         }, {
3365                 .compatible = "sharp,lq035q7db03",
3366                 .data = &sharp_lq035q7db03,
3367         }, {
3368                 .compatible = "sharp,lq070y3dg3b",
3369                 .data = &sharp_lq070y3dg3b,
3370         }, {
3371                 .compatible = "sharp,lq101k1ly04",
3372                 .data = &sharp_lq101k1ly04,
3373         }, {
3374                 .compatible = "sharp,lq123p1jx31",
3375                 .data = &sharp_lq123p1jx31,
3376         }, {
3377                 .compatible = "sharp,lq150x1lg11",
3378                 .data = &sharp_lq150x1lg11,
3379         }, {
3380                 .compatible = "sharp,ls020b1dd01d",
3381                 .data = &sharp_ls020b1dd01d,
3382         }, {
3383                 .compatible = "shelly,sca07010-bfn-lnn",
3384                 .data = &shelly_sca07010_bfn_lnn,
3385         }, {
3386                 .compatible = "starry,kr122ea0sra",
3387                 .data = &starry_kr122ea0sra,
3388         }, {
3389                 .compatible = "tfc,s9700rtwv43tr-01b",
3390                 .data = &tfc_s9700rtwv43tr_01b,
3391         }, {
3392                 .compatible = "tianma,tm070jdhg30",
3393                 .data = &tianma_tm070jdhg30,
3394         }, {
3395                 .compatible = "tianma,tm070rvhg71",
3396                 .data = &tianma_tm070rvhg71,
3397         }, {
3398                 .compatible = "ti,nspire-cx-lcd-panel",
3399                 .data = &ti_nspire_cx_lcd_panel,
3400         }, {
3401                 .compatible = "ti,nspire-classic-lcd-panel",
3402                 .data = &ti_nspire_classic_lcd_panel,
3403         }, {
3404                 .compatible = "toshiba,lt089ac29000",
3405                 .data = &toshiba_lt089ac29000,
3406         }, {
3407                 .compatible = "tpk,f07a-0102",
3408                 .data = &tpk_f07a_0102,
3409         }, {
3410                 .compatible = "tpk,f10a-0102",
3411                 .data = &tpk_f10a_0102,
3412         }, {
3413                 .compatible = "urt,umsh-8596md-t",
3414                 .data = &urt_umsh_8596md_parallel,
3415         }, {
3416                 .compatible = "urt,umsh-8596md-1t",
3417                 .data = &urt_umsh_8596md_parallel,
3418         }, {
3419                 .compatible = "urt,umsh-8596md-7t",
3420                 .data = &urt_umsh_8596md_parallel,
3421         }, {
3422                 .compatible = "urt,umsh-8596md-11t",
3423                 .data = &urt_umsh_8596md_lvds,
3424         }, {
3425                 .compatible = "urt,umsh-8596md-19t",
3426                 .data = &urt_umsh_8596md_lvds,
3427         }, {
3428                 .compatible = "urt,umsh-8596md-20t",
3429                 .data = &urt_umsh_8596md_parallel,
3430         }, {
3431                 .compatible = "vxt,vl050-8048nt-c01",
3432                 .data = &vl050_8048nt_c01,
3433         }, {
3434                 .compatible = "winstar,wf35ltiacd",
3435                 .data = &winstar_wf35ltiacd,
3436         }, {
3437                 /* sentinel */
3438         }
3439 };
3440 MODULE_DEVICE_TABLE(of, platform_of_match);
3441
3442 static int panel_simple_platform_probe(struct platform_device *pdev)
3443 {
3444         const struct of_device_id *id;
3445
3446         id = of_match_node(platform_of_match, pdev->dev.of_node);
3447         if (!id)
3448                 return -ENODEV;
3449
3450         return panel_simple_probe(&pdev->dev, id->data);
3451 }
3452
3453 static int panel_simple_platform_remove(struct platform_device *pdev)
3454 {
3455         return panel_simple_remove(&pdev->dev);
3456 }
3457
3458 static void panel_simple_platform_shutdown(struct platform_device *pdev)
3459 {
3460         panel_simple_shutdown(&pdev->dev);
3461 }
3462
3463 static struct platform_driver panel_simple_platform_driver = {
3464         .driver = {
3465                 .name = "panel-simple",
3466                 .of_match_table = platform_of_match,
3467         },
3468         .probe = panel_simple_platform_probe,
3469         .remove = panel_simple_platform_remove,
3470         .shutdown = panel_simple_platform_shutdown,
3471 };
3472
3473 struct panel_desc_dsi {
3474         struct panel_desc desc;
3475
3476         unsigned long flags;
3477         enum mipi_dsi_pixel_format format;
3478         unsigned int lanes;
3479 };
3480
3481 static const struct drm_display_mode auo_b080uan01_mode = {
3482         .clock = 154500,
3483         .hdisplay = 1200,
3484         .hsync_start = 1200 + 62,
3485         .hsync_end = 1200 + 62 + 4,
3486         .htotal = 1200 + 62 + 4 + 62,
3487         .vdisplay = 1920,
3488         .vsync_start = 1920 + 9,
3489         .vsync_end = 1920 + 9 + 2,
3490         .vtotal = 1920 + 9 + 2 + 8,
3491         .vrefresh = 60,
3492 };
3493
3494 static const struct panel_desc_dsi auo_b080uan01 = {
3495         .desc = {
3496                 .modes = &auo_b080uan01_mode,
3497                 .num_modes = 1,
3498                 .bpc = 8,
3499                 .size = {
3500                         .width = 108,
3501                         .height = 272,
3502                 },
3503         },
3504         .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
3505         .format = MIPI_DSI_FMT_RGB888,
3506         .lanes = 4,
3507 };
3508
3509 static const struct drm_display_mode boe_tv080wum_nl0_mode = {
3510         .clock = 160000,
3511         .hdisplay = 1200,
3512         .hsync_start = 1200 + 120,
3513         .hsync_end = 1200 + 120 + 20,
3514         .htotal = 1200 + 120 + 20 + 21,
3515         .vdisplay = 1920,
3516         .vsync_start = 1920 + 21,
3517         .vsync_end = 1920 + 21 + 3,
3518         .vtotal = 1920 + 21 + 3 + 18,
3519         .vrefresh = 60,
3520         .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
3521 };
3522
3523 static const struct panel_desc_dsi boe_tv080wum_nl0 = {
3524         .desc = {
3525                 .modes = &boe_tv080wum_nl0_mode,
3526                 .num_modes = 1,
3527                 .size = {
3528                         .width = 107,
3529                         .height = 172,
3530                 },
3531         },
3532         .flags = MIPI_DSI_MODE_VIDEO |
3533                  MIPI_DSI_MODE_VIDEO_BURST |
3534                  MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
3535         .format = MIPI_DSI_FMT_RGB888,
3536         .lanes = 4,
3537 };
3538
3539 static const struct drm_display_mode lg_ld070wx3_sl01_mode = {
3540         .clock = 71000,
3541         .hdisplay = 800,
3542         .hsync_start = 800 + 32,
3543         .hsync_end = 800 + 32 + 1,
3544         .htotal = 800 + 32 + 1 + 57,
3545         .vdisplay = 1280,
3546         .vsync_start = 1280 + 28,
3547         .vsync_end = 1280 + 28 + 1,
3548         .vtotal = 1280 + 28 + 1 + 14,
3549         .vrefresh = 60,
3550 };
3551
3552 static const struct panel_desc_dsi lg_ld070wx3_sl01 = {
3553         .desc = {
3554                 .modes = &lg_ld070wx3_sl01_mode,
3555                 .num_modes = 1,
3556                 .bpc = 8,
3557                 .size = {
3558                         .width = 94,
3559                         .height = 151,
3560                 },
3561         },
3562         .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
3563         .format = MIPI_DSI_FMT_RGB888,
3564         .lanes = 4,
3565 };
3566
3567 static const struct drm_display_mode lg_lh500wx1_sd03_mode = {
3568         .clock = 67000,
3569         .hdisplay = 720,
3570         .hsync_start = 720 + 12,
3571         .hsync_end = 720 + 12 + 4,
3572         .htotal = 720 + 12 + 4 + 112,
3573         .vdisplay = 1280,
3574         .vsync_start = 1280 + 8,
3575         .vsync_end = 1280 + 8 + 4,
3576         .vtotal = 1280 + 8 + 4 + 12,
3577         .vrefresh = 60,
3578 };
3579
3580 static const struct panel_desc_dsi lg_lh500wx1_sd03 = {
3581         .desc = {
3582                 .modes = &lg_lh500wx1_sd03_mode,
3583                 .num_modes = 1,
3584                 .bpc = 8,
3585                 .size = {
3586                         .width = 62,
3587                         .height = 110,
3588                 },
3589         },
3590         .flags = MIPI_DSI_MODE_VIDEO,
3591         .format = MIPI_DSI_FMT_RGB888,
3592         .lanes = 4,
3593 };
3594
3595 static const struct drm_display_mode panasonic_vvx10f004b00_mode = {
3596         .clock = 157200,
3597         .hdisplay = 1920,
3598         .hsync_start = 1920 + 154,
3599         .hsync_end = 1920 + 154 + 16,
3600         .htotal = 1920 + 154 + 16 + 32,
3601         .vdisplay = 1200,
3602         .vsync_start = 1200 + 17,
3603         .vsync_end = 1200 + 17 + 2,
3604         .vtotal = 1200 + 17 + 2 + 16,
3605         .vrefresh = 60,
3606 };
3607
3608 static const struct panel_desc_dsi panasonic_vvx10f004b00 = {
3609         .desc = {
3610                 .modes = &panasonic_vvx10f004b00_mode,
3611                 .num_modes = 1,
3612                 .bpc = 8,
3613                 .size = {
3614                         .width = 217,
3615                         .height = 136,
3616                 },
3617         },
3618         .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
3619                  MIPI_DSI_CLOCK_NON_CONTINUOUS,
3620         .format = MIPI_DSI_FMT_RGB888,
3621         .lanes = 4,
3622 };
3623
3624 static const struct drm_display_mode lg_acx467akm_7_mode = {
3625         .clock = 150000,
3626         .hdisplay = 1080,
3627         .hsync_start = 1080 + 2,
3628         .hsync_end = 1080 + 2 + 2,
3629         .htotal = 1080 + 2 + 2 + 2,
3630         .vdisplay = 1920,
3631         .vsync_start = 1920 + 2,
3632         .vsync_end = 1920 + 2 + 2,
3633         .vtotal = 1920 + 2 + 2 + 2,
3634         .vrefresh = 60,
3635 };
3636
3637 static const struct panel_desc_dsi lg_acx467akm_7 = {
3638         .desc = {
3639                 .modes = &lg_acx467akm_7_mode,
3640                 .num_modes = 1,
3641                 .bpc = 8,
3642                 .size = {
3643                         .width = 62,
3644                         .height = 110,
3645                 },
3646         },
3647         .flags = 0,
3648         .format = MIPI_DSI_FMT_RGB888,
3649         .lanes = 4,
3650 };
3651
3652 static const struct drm_display_mode osd101t2045_53ts_mode = {
3653         .clock = 154500,
3654         .hdisplay = 1920,
3655         .hsync_start = 1920 + 112,
3656         .hsync_end = 1920 + 112 + 16,
3657         .htotal = 1920 + 112 + 16 + 32,
3658         .vdisplay = 1200,
3659         .vsync_start = 1200 + 16,
3660         .vsync_end = 1200 + 16 + 2,
3661         .vtotal = 1200 + 16 + 2 + 16,
3662         .vrefresh = 60,
3663         .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
3664 };
3665
3666 static const struct panel_desc_dsi osd101t2045_53ts = {
3667         .desc = {
3668                 .modes = &osd101t2045_53ts_mode,
3669                 .num_modes = 1,
3670                 .bpc = 8,
3671                 .size = {
3672                         .width = 217,
3673                         .height = 136,
3674                 },
3675         },
3676         .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
3677                  MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
3678                  MIPI_DSI_MODE_EOT_PACKET,
3679         .format = MIPI_DSI_FMT_RGB888,
3680         .lanes = 4,
3681 };
3682
3683 static const struct of_device_id dsi_of_match[] = {
3684         {
3685                 .compatible = "auo,b080uan01",
3686                 .data = &auo_b080uan01
3687         }, {
3688                 .compatible = "boe,tv080wum-nl0",
3689                 .data = &boe_tv080wum_nl0
3690         }, {
3691                 .compatible = "lg,ld070wx3-sl01",
3692                 .data = &lg_ld070wx3_sl01
3693         }, {
3694                 .compatible = "lg,lh500wx1-sd03",
3695                 .data = &lg_lh500wx1_sd03
3696         }, {
3697                 .compatible = "panasonic,vvx10f004b00",
3698                 .data = &panasonic_vvx10f004b00
3699         }, {
3700                 .compatible = "lg,acx467akm-7",
3701                 .data = &lg_acx467akm_7
3702         }, {
3703                 .compatible = "osddisplays,osd101t2045-53ts",
3704                 .data = &osd101t2045_53ts
3705         }, {
3706                 /* sentinel */
3707         }
3708 };
3709 MODULE_DEVICE_TABLE(of, dsi_of_match);
3710
3711 static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
3712 {
3713         const struct panel_desc_dsi *desc;
3714         const struct of_device_id *id;
3715         int err;
3716
3717         id = of_match_node(dsi_of_match, dsi->dev.of_node);
3718         if (!id)
3719                 return -ENODEV;
3720
3721         desc = id->data;
3722
3723         err = panel_simple_probe(&dsi->dev, &desc->desc);
3724         if (err < 0)
3725                 return err;
3726
3727         dsi->mode_flags = desc->flags;
3728         dsi->format = desc->format;
3729         dsi->lanes = desc->lanes;
3730
3731         err = mipi_dsi_attach(dsi);
3732         if (err) {
3733                 struct panel_simple *panel = dev_get_drvdata(&dsi->dev);
3734
3735                 drm_panel_remove(&panel->base);
3736         }
3737
3738         return err;
3739 }
3740
3741 static int panel_simple_dsi_remove(struct mipi_dsi_device *dsi)
3742 {
3743         int err;
3744
3745         err = mipi_dsi_detach(dsi);
3746         if (err < 0)
3747                 dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", err);
3748
3749         return panel_simple_remove(&dsi->dev);
3750 }
3751
3752 static void panel_simple_dsi_shutdown(struct mipi_dsi_device *dsi)
3753 {
3754         panel_simple_shutdown(&dsi->dev);
3755 }
3756
3757 static struct mipi_dsi_driver panel_simple_dsi_driver = {
3758         .driver = {
3759                 .name = "panel-simple-dsi",
3760                 .of_match_table = dsi_of_match,
3761         },
3762         .probe = panel_simple_dsi_probe,
3763         .remove = panel_simple_dsi_remove,
3764         .shutdown = panel_simple_dsi_shutdown,
3765 };
3766
3767 static int __init panel_simple_init(void)
3768 {
3769         int err;
3770
3771         err = platform_driver_register(&panel_simple_platform_driver);
3772         if (err < 0)
3773                 return err;
3774
3775         if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) {
3776                 err = mipi_dsi_driver_register(&panel_simple_dsi_driver);
3777                 if (err < 0)
3778                         return err;
3779         }
3780
3781         return 0;
3782 }
3783 module_init(panel_simple_init);
3784
3785 static void __exit panel_simple_exit(void)
3786 {
3787         if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
3788                 mipi_dsi_driver_unregister(&panel_simple_dsi_driver);
3789
3790         platform_driver_unregister(&panel_simple_platform_driver);
3791 }
3792 module_exit(panel_simple_exit);
3793
3794 MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
3795 MODULE_DESCRIPTION("DRM Driver for Simple Panels");
3796 MODULE_LICENSE("GPL and additional rights");