hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
 * Author:Mark Yao <mark.yao@rock-chips.com>
 *
 * based on exynos_drm_drv.h
 */
 
#ifndef _ROCKCHIP_DRM_DRV_H
#define _ROCKCHIP_DRM_DRV_H
 
#include <drm/drm_atomic_helper.h>
#include <drm/drm_dsc.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_gem.h>
#include <drm/rockchip_drm.h>
#include <linux/module.h>
#include <linux/component.h>
 
#include <soc/rockchip/rockchip_dmc.h>
 
#include "../panel/panel-simple.h"
 
#include "rockchip_drm_debugfs.h"
 
#define ROCKCHIP_MAX_FB_BUFFER    3
#define ROCKCHIP_MAX_CONNECTOR    2
#define ROCKCHIP_MAX_CRTC    4
#define ROCKCHIP_MAX_LAYER    16
 
 
struct drm_device;
struct drm_connector;
struct iommu_domain;
 
#define VOP_COLOR_KEY_NONE    (0 << 31)
#define VOP_COLOR_KEY_MASK    (1 << 31)
 
#define VOP_OUTPUT_IF_RGB    BIT(0)
#define VOP_OUTPUT_IF_BT1120    BIT(1)
#define VOP_OUTPUT_IF_BT656    BIT(2)
#define VOP_OUTPUT_IF_LVDS0    BIT(3)
#define VOP_OUTPUT_IF_LVDS1    BIT(4)
#define VOP_OUTPUT_IF_MIPI0    BIT(5)
#define VOP_OUTPUT_IF_MIPI1    BIT(6)
#define VOP_OUTPUT_IF_eDP0    BIT(7)
#define VOP_OUTPUT_IF_eDP1    BIT(8)
#define VOP_OUTPUT_IF_DP0    BIT(9)
#define VOP_OUTPUT_IF_DP1    BIT(10)
#define VOP_OUTPUT_IF_HDMI0    BIT(11)
#define VOP_OUTPUT_IF_HDMI1    BIT(12)
 
#ifndef DRM_FORMAT_NV20
#define DRM_FORMAT_NV20        fourcc_code('N', 'V', '2', '0') /* 2x1 subsampled Cr:Cb plane */
#endif
 
#ifndef DRM_FORMAT_NV30
#define DRM_FORMAT_NV30        fourcc_code('N', 'V', '3', '0') /* non-subsampled Cr:Cb plane */
#endif
 
#define RK_IF_PROP_COLOR_DEPTH        "color_depth"
#define RK_IF_PROP_COLOR_FORMAT        "color_format"
#define RK_IF_PROP_COLOR_DEPTH_CAPS    "color_depth_caps"
#define RK_IF_PROP_COLOR_FORMAT_CAPS    "color_format_caps"
#define RK_IF_PROP_ENCRYPTED        "hdcp_encrypted"
 
enum rockchip_drm_debug_category {
   VOP_DEBUG_PLANE        = BIT(0),
   VOP_DEBUG_OVERLAY    = BIT(1),
   VOP_DEBUG_WB        = BIT(2),
   VOP_DEBUG_CFG_DONE    = BIT(3),
   VOP_DEBUG_VSYNC        = BIT(7),
};
 
enum rk_if_color_depth {
   RK_IF_DEPTH_8,
   RK_IF_DEPTH_10,
   RK_IF_DEPTH_12,
   RK_IF_DEPTH_16,
   RK_IF_DEPTH_420_10,
   RK_IF_DEPTH_420_12,
   RK_IF_DEPTH_420_16,
   RK_IF_DEPTH_6,
   RK_IF_DEPTH_MAX,
};
 
enum rk_if_color_format {
   RK_IF_FORMAT_RGB, /* default RGB */
   RK_IF_FORMAT_YCBCR444, /* YCBCR 444 */
   RK_IF_FORMAT_YCBCR422, /* YCBCR 422 */
   RK_IF_FORMAT_YCBCR420, /* YCBCR 420 */
   RK_IF_FORMAT_YCBCR_HQ, /* Highest subsampled YUV */
   RK_IF_FORMAT_YCBCR_LQ, /* Lowest subsampled YUV */
   RK_IF_FORMAT_MAX,
};
 
enum rockchip_hdcp_encrypted {
   RK_IF_HDCP_ENCRYPTED_NONE = 0,
   RK_IF_HDCP_ENCRYPTED_LEVEL1,
   RK_IF_HDCP_ENCRYPTED_LEVEL2,
};
 
enum rockchip_color_bar_mode {
   ROCKCHIP_COLOR_BAR_OFF = 0,
   ROCKCHIP_COLOR_BAR_HORIZONTAL = 1,
   ROCKCHIP_COLOR_BAR_VERTICAL = 2,
};
 
enum rockchip_drm_split_area {
   ROCKCHIP_DRM_SPLIT_UNSET = 0,
   ROCKCHIP_DRM_SPLIT_LEFT_SIDE = 1,
   ROCKCHIP_DRM_SPLIT_RIGHT_SIDE = 2,
};
 
struct rockchip_drm_sub_dev {
   struct list_head list;
   struct drm_connector *connector;
   struct device_node *of_node;
   int (*loader_protect)(struct drm_encoder *encoder, bool on);
   void (*oob_hotplug_event)(struct drm_connector *connector);
   void (*update_vfp_for_vrr)(struct drm_connector *connector, struct drm_display_mode *mode,
                  int vfp);
};
 
struct rockchip_sdr2hdr_state {
   int sdr2hdr_func;
 
   bool bt1886eotf_pre_conv_en;
   bool rgb2rgb_pre_conv_en;
   bool rgb2rgb_pre_conv_mode;
   bool st2084oetf_pre_conv_en;
 
   bool bt1886eotf_post_conv_en;
   bool rgb2rgb_post_conv_en;
   bool rgb2rgb_post_conv_mode;
   bool st2084oetf_post_conv_en;
};
 
struct rockchip_hdr_state {
   bool pre_overlay;
   bool hdr2sdr_en;
   struct rockchip_sdr2hdr_state sdr2hdr_state;
};
 
struct rockchip_bcsh_state {
   int brightness;
   int contrast;
   int saturation;
   int sin_hue;
   int cos_hue;
};
 
struct rockchip_crtc {
   struct drm_crtc crtc;
#if defined(CONFIG_ROCKCHIP_DRM_DEBUG)
   /**
    * @vop_dump_status the status of vop dump control
    * @vop_dump_list_head the list head of vop dump list
    * @vop_dump_list_init_flag init once
    * @vop_dump_times control the dump times
    * @frme_count the frame of dump buf
    */
   enum vop_dump_status vop_dump_status;
   struct list_head vop_dump_list_head;
   bool vop_dump_list_init_flag;
   int vop_dump_times;
   int frame_count;
#endif
};
 
struct rockchip_dsc_sink_cap {
   /**
    * @slice_width: the number of pixel columns that comprise the slice width
    * @slice_height: the number of pixel rows that comprise the slice height
    * @block_pred: Does block prediction
    * @native_420: Does sink support DSC with 4:2:0 compression
    * @bpc_supported: compressed bpc supported by sink : 10, 12 or 16 bpc
    * @version_major: DSC major version
    * @version_minor: DSC minor version
    * @target_bits_per_pixel_x16: bits num after compress and multiply 16
    */
   u16 slice_width;
   u16 slice_height;
   bool block_pred;
   bool native_420;
   u8 bpc_supported;
   u8 version_major;
   u8 version_minor;
   u16 target_bits_per_pixel_x16;
};
 
#define ACM_GAIN_LUT_HY_LENGTH        (9*17)
#define ACM_GAIN_LUT_HY_TOTAL_LENGTH    (ACM_GAIN_LUT_HY_LENGTH * 3)
#define ACM_GAIN_LUT_HS_LENGTH        (13*17)
#define ACM_GAIN_LUT_HS_TOTAL_LENGTH    (ACM_GAIN_LUT_HS_LENGTH * 3)
#define ACM_DELTA_LUT_H_LENGTH        65
#define ACM_DELTA_LUT_H_TOTAL_LENGTH    (ACM_DELTA_LUT_H_LENGTH * 3)
 
struct post_acm {
   s16 delta_lut_h[ACM_DELTA_LUT_H_TOTAL_LENGTH];
   s16 gain_lut_hy[ACM_GAIN_LUT_HY_TOTAL_LENGTH];
   s16 gain_lut_hs[ACM_GAIN_LUT_HS_TOTAL_LENGTH];
   u16 y_gain;
   u16 h_gain;
   u16 s_gain;
   u16 acm_enable;
};
 
struct post_csc {
   u16 hue;
   u16 saturation;
   u16 contrast;
   u16 brightness;
   u16 r_gain;
   u16 g_gain;
   u16 b_gain;
   u16 r_offset;
   u16 g_offset;
   u16 b_offset;
   u16 csc_enable;
};
 
struct rockchip_crtc_state {
   struct drm_crtc_state base;
   int vp_id;
   int output_type;
   int output_mode;
   int output_bpc;
   int output_flags;
   bool enable_afbc;
   /**
    * @splice_mode: enabled when display a hdisplay > 4096 on rk3588
    */
   bool splice_mode;
 
   /**
    * @hold_mode: enabled when it's:
    * (1) mcu hold mode
    * (2) mipi dsi cmd mode
    * (3) edp psr mode
    */
   bool hold_mode;
   /**
    * when enable soft_te, use gpio irq to triggle new fs,
    * otherwise use hardware te
    */
   bool soft_te;
 
   struct drm_tv_connector_state *tv_state;
   int left_margin;
   int right_margin;
   int top_margin;
   int bottom_margin;
   int vdisplay;
   int afbdc_win_format;
   int afbdc_win_width;
   int afbdc_win_height;
   int afbdc_win_ptr;
   int afbdc_win_id;
   int afbdc_en;
   int afbdc_win_vir_width;
   int afbdc_win_xoffset;
   int afbdc_win_yoffset;
   int dsp_layer_sel;
   u32 output_if;
   u32 output_if_left_panel;
   u32 bus_format;
   u32 bus_flags;
   int yuv_overlay;
   int post_r2y_en;
   int post_y2r_en;
   int post_csc_mode;
   int bcsh_en;
   int color_space;
   int eotf;
   u32 background;
   u32 line_flag;
   u8 mode_update;
   u8 dsc_id;
   u8 dsc_enable;
 
   u8 dsc_slice_num;
   u8 dsc_pixel_num;
 
   u64 dsc_txp_clk_rate;
   u64 dsc_pxl_clk_rate;
   u64 dsc_cds_clk_rate;
 
   struct drm_dsc_picture_parameter_set pps;
   struct rockchip_dsc_sink_cap dsc_sink_cap;
   struct rockchip_hdr_state hdr;
   struct drm_property_blob *hdr_ext_data;
   struct drm_property_blob *acm_lut_data;
   struct drm_property_blob *post_csc_data;
   struct drm_property_blob *cubic_lut_data;
 
   int request_refresh_rate;
   int max_refresh_rate;
   int min_refresh_rate;
};
 
#define to_rockchip_crtc_state(s) \
       container_of(s, struct rockchip_crtc_state, base)
 
struct rockchip_drm_vcnt {
   struct drm_pending_vblank_event *event;
   __u32 sequence;
   int pipe;
};
 
struct rockchip_logo {
   dma_addr_t dma_addr;
   struct drm_mm_node logo_reserved_node;
   void *kvaddr;
   phys_addr_t start;
   phys_addr_t size;
   int count;
};
 
struct rockchip_mcu_timing {
   int mcu_pix_total;
   int mcu_cs_pst;
   int mcu_cs_pend;
   int mcu_rw_pst;
   int mcu_rw_pend;
   int mcu_hold_mode;
};
 
struct loader_cubic_lut {
   bool enable;
   u32 offset;
};
 
struct rockchip_drm_dsc_cap {
   bool v_1p2;
   bool native_420;
   bool all_bpp;
   u8 bpc_supported;
   u8 max_slices;
   u8 max_lanes;
   u8 max_frl_rate_per_lane;
   u8 total_chunk_kbytes;
   int clk_per_slice;
};
 
struct ver_26_v0 {
   u8 yuv422_12bit;
   u8 support_2160p_60;
   u8 global_dimming;
   u8 dm_major_ver;
   u8 dm_minor_ver;
   u16 t_min_pq;
   u16 t_max_pq;
   u16 rx;
   u16 ry;
   u16 gx;
   u16 gy;
   u16 bx;
   u16 by;
   u16 wx;
   u16 wy;
} __packed;
 
struct ver_15_v1 {
   u8 yuv422_12bit;
   u8 support_2160p_60;
   u8 global_dimming;
   u8 dm_version;
   u8 colorimetry;
   u8 t_max_lum;
   u8 t_min_lum;
   u8 rx;
   u8 ry;
   u8 gx;
   u8 gy;
   u8 bx;
   u8 by;
} __packed;
 
struct ver_12_v1 {
   u8 yuv422_12bit;
   u8 support_2160p_60;
   u8 global_dimming;
   u8 dm_version;
   u8 colorimetry;
   u8 low_latency;
   u8 t_max_lum;
   u8 t_min_lum;
   u8 unique_rx;
   u8 unique_ry;
   u8 unique_gx;
   u8 unique_gy;
   u8 unique_bx;
   u8 unique_by;
} __packed;
 
struct ver_12_v2 {
   u8 yuv422_12bit;
   u8 backlt_ctrl;
   u8 global_dimming;
   u8 dm_version;
   u8 backlt_min_luma;
   u8 interface;
   u8 yuv444_10b_12b;
   u8 t_min_pq_v2;
   u8 t_max_pq_v2;
   u8 unique_rx;
   u8 unique_ry;
   u8 unique_gx;
   u8 unique_gy;
   u8 unique_bx;
   u8 unique_by;
} __packed;
 
struct next_hdr_sink_data {
   u8 version;
   struct ver_26_v0 ver_26_v0;
   struct ver_15_v1 ver_15_v1;
   struct ver_12_v1 ver_12_v1;
   struct ver_12_v2 ver_12_v2;
} __packed;
 
/*
 * Rockchip drm private crtc funcs.
 * @loader_protect: protect loader logo crtc's power
 * @enable_vblank: enable crtc vblank irq.
 * @disable_vblank: disable crtc vblank irq.
 * @bandwidth: report present crtc bandwidth consume.
 * @cancel_pending_vblank: cancel pending vblank.
 * @debugfs_init: init crtc debugfs.
 * @debugfs_dump: debugfs to dump crtc and plane state.
 * @regs_dump: dump vop current register config.
 * @mode_valid: verify that the current mode is supported.
 * @crtc_close: close vop.
 * @crtc_send_mcu_cmd: send mcu panel init cmd.
 * @te_handler: soft te hand for cmd mode panel.
 * @wait_vact_end: wait the last active line.
 */
struct rockchip_crtc_funcs {
   int (*loader_protect)(struct drm_crtc *crtc, bool on, void *data);
   int (*enable_vblank)(struct drm_crtc *crtc);
   void (*disable_vblank)(struct drm_crtc *crtc);
   size_t (*bandwidth)(struct drm_crtc *crtc,
               struct drm_crtc_state *crtc_state,
               struct dmcfreq_vop_info *vop_bw_info);
   void (*cancel_pending_vblank)(struct drm_crtc *crtc,
                     struct drm_file *file_priv);
   int (*debugfs_init)(struct drm_minor *minor, struct drm_crtc *crtc);
   int (*debugfs_dump)(struct drm_crtc *crtc, struct seq_file *s);
   void (*regs_dump)(struct drm_crtc *crtc, struct seq_file *s);
   void (*active_regs_dump)(struct drm_crtc *crtc, struct seq_file *s);
   enum drm_mode_status (*mode_valid)(struct drm_crtc *crtc,
                      const struct drm_display_mode *mode,
                      int output_type);
   void (*crtc_close)(struct drm_crtc *crtc);
   void (*crtc_send_mcu_cmd)(struct drm_crtc *crtc, u32 type, u32 value);
   void (*te_handler)(struct drm_crtc *crtc);
   int (*wait_vact_end)(struct drm_crtc *crtc, unsigned int mstimeout);
   void (*crtc_standby)(struct drm_crtc *crtc, bool standby);
   int (*crtc_set_color_bar)(struct drm_crtc *crtc, enum rockchip_color_bar_mode mode);
};
 
struct rockchip_dclk_pll {
   struct clk *pll;
   unsigned int use_count;
};
 
/*
 * Rockchip drm private structure.
 *
 * @crtc: array of enabled CRTCs, used to map from "pipe" to drm_crtc.
 * @num_pipe: number of pipes for this device.
 * @mm_lock: protect drm_mm on multi-threads.
 */
struct rockchip_drm_private {
   struct rockchip_logo *logo;
   struct drm_fb_helper *fbdev_helper;
   struct drm_gem_object *fbdev_bo;
   struct iommu_domain *domain;
   struct gen_pool *secure_buffer_pool;
   struct mutex mm_lock;
   struct drm_mm mm;
   struct list_head psr_list;
   struct mutex psr_list_lock;
   struct mutex commit_lock;
 
   /* private crtc prop */
   struct drm_property *soc_id_prop;
   struct drm_property *port_id_prop;
   struct drm_property *aclk_prop;
   struct drm_property *bg_prop;
   struct drm_property *line_flag_prop;
   struct drm_property *cubic_lut_prop;
   struct drm_property *cubic_lut_size_prop;
 
   /* private plane prop */
   struct drm_property *eotf_prop;
   struct drm_property *color_space_prop;
   struct drm_property *async_commit_prop;
   struct drm_property *share_id_prop;
 
   /* private connector prop */
   struct drm_property *connector_id_prop;
   struct drm_property *split_area_prop;
 
   const struct rockchip_crtc_funcs *crtc_funcs[ROCKCHIP_MAX_CRTC];
 
   struct rockchip_dclk_pll default_pll;
   struct rockchip_dclk_pll hdmi_pll;
 
   /*
    * protect some shared overlay resource
    * OVL_LAYER_SEL/OVL_PORT_SEL
    */
   struct mutex ovl_lock;
 
   struct rockchip_drm_vcnt vcnt[ROCKCHIP_MAX_CRTC];
   /**
    * @loader_protect
    * ignore restore_fbdev_mode_atomic when in logo on state
    */
   bool loader_protect;
 
   dma_addr_t cubic_lut_dma_addr;
   void *cubic_lut_kvaddr;
   struct drm_mm_node *clut_reserved_node;
   struct loader_cubic_lut cubic_lut[ROCKCHIP_MAX_CRTC];
};
 
void rockchip_connector_update_vfp_for_vrr(struct drm_crtc *crtc, struct drm_display_mode *mode,
                      int vfp);
int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
                  struct device *dev);
void rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
                   struct device *dev);
int rockchip_drm_wait_vact_end(struct drm_crtc *crtc, unsigned int mstimeout);
int rockchip_register_crtc_funcs(struct drm_crtc *crtc,
                const struct rockchip_crtc_funcs *crtc_funcs);
void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc);
void rockchip_drm_crtc_standby(struct drm_crtc *crtc, bool standby);
 
void rockchip_drm_register_sub_dev(struct rockchip_drm_sub_dev *sub_dev);
void rockchip_drm_unregister_sub_dev(struct rockchip_drm_sub_dev *sub_dev);
struct rockchip_drm_sub_dev *rockchip_drm_get_sub_dev(struct device_node *node);
int rockchip_drm_add_modes_noedid(struct drm_connector *connector);
void rockchip_drm_te_handle(struct drm_crtc *crtc);
void drm_mode_convert_to_split_mode(struct drm_display_mode *mode);
void drm_mode_convert_to_origin_mode(struct drm_display_mode *mode);
u32 rockchip_drm_get_dclk_by_width(int width);
#if IS_REACHABLE(CONFIG_DRM_ROCKCHIP)
int rockchip_drm_get_sub_dev_type(void);
u32 rockchip_drm_get_scan_line_time_ns(void);
#else
static inline int rockchip_drm_get_sub_dev_type(void)
{
   return DRM_MODE_CONNECTOR_Unknown;
}
 
static inline u32 rockchip_drm_get_scan_line_time_ns(void)
{
   return 0;
}
#endif
 
int rockchip_drm_endpoint_is_subdriver(struct device_node *ep);
uint32_t rockchip_drm_of_find_possible_crtcs(struct drm_device *dev,
                        struct device_node *port);
uint32_t rockchip_drm_get_bpp(const struct drm_format_info *info);
uint32_t rockchip_drm_get_cycles_per_pixel(uint32_t bus_format);
int rockchip_drm_get_yuv422_format(struct drm_connector *connector,
                  struct edid *edid);
int rockchip_drm_parse_cea_ext(struct rockchip_drm_dsc_cap *dsc_cap,
                  u8 *max_frl_rate_per_lane, u8 *max_lanes, u8 *add_func,
                  const struct edid *edid);
int rockchip_drm_parse_next_hdr(struct next_hdr_sink_data *sink_data,
               const struct edid *edid);
int rockchip_drm_parse_colorimetry_data_block(u8 *colorimetry, const struct edid *edid);
 
__printf(3, 4)
void rockchip_drm_dbg(const struct device *dev, enum rockchip_drm_debug_category category,
             const char *format, ...);
 
extern struct platform_driver cdn_dp_driver;
extern struct platform_driver dw_hdmi_rockchip_pltfm_driver;
extern struct platform_driver dw_mipi_dsi_rockchip_driver;
extern struct platform_driver dw_mipi_dsi2_rockchip_driver;
extern struct platform_driver inno_hdmi_driver;
extern struct platform_driver rockchip_dp_driver;
extern struct platform_driver rockchip_lvds_driver;
extern struct platform_driver vop_platform_driver;
extern struct platform_driver vop2_platform_driver;
extern struct platform_driver rk3066_hdmi_driver;
extern struct platform_driver rockchip_rgb_driver;
extern struct platform_driver rockchip_tve_driver;
extern struct platform_driver dw_dp_driver;
extern struct platform_driver vconn_platform_driver;
extern struct platform_driver vvop_platform_driver;
#endif /* _ROCKCHIP_DRM_DRV_H_ */