video: tegra: dc: add support to window d & h.
[linux-3.10.git] / arch / arm / mach-tegra / include / mach / dc.h
1 /*
2  * arch/arm/mach-tegra/include/mach/dc.h
3  *
4  * Copyright (C) 2010 Google, Inc.
5  *
6  * Author:
7  *      Erik Gilling <konkers@google.com>
8  *
9  * Copyright (C) 2010-2011 NVIDIA Corporation
10  *
11  * This software is licensed under the terms of the GNU General Public
12  * License version 2, as published by the Free Software Foundation, and
13  * may be copied, distributed, and modified under those terms.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  */
21
22 #ifndef __MACH_TEGRA_DC_H
23 #define __MACH_TEGRA_DC_H
24
25 #include <linux/pm.h>
26 #include <linux/types.h>
27 #include <linux/fb.h>
28 #include <drm/drm_fixed.h>
29
30 #define TEGRA_MAX_DC            2
31
32 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
33 #define DC_N_WINDOWS            5
34 #else
35 #define DC_N_WINDOWS            3
36 #endif
37
38 #define DEFAULT_FPGA_FREQ_KHZ   160000
39
40
41 /* DSI pixel data format */
42 enum {
43         TEGRA_DSI_PIXEL_FORMAT_16BIT_P,
44         TEGRA_DSI_PIXEL_FORMAT_18BIT_P,
45         TEGRA_DSI_PIXEL_FORMAT_18BIT_NP,
46         TEGRA_DSI_PIXEL_FORMAT_24BIT_P,
47 };
48
49 /* DSI virtual channel number */
50 enum {
51         TEGRA_DSI_VIRTUAL_CHANNEL_0,
52         TEGRA_DSI_VIRTUAL_CHANNEL_1,
53         TEGRA_DSI_VIRTUAL_CHANNEL_2,
54         TEGRA_DSI_VIRTUAL_CHANNEL_3,
55 };
56
57 /* DSI transmit method for video data */
58 enum {
59         TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE,
60         TEGRA_DSI_VIDEO_TYPE_COMMAND_MODE,
61 };
62
63 /* DSI HS clock mode */
64 enum {
65         TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS,
66         TEGRA_DSI_VIDEO_CLOCK_TX_ONLY,
67 };
68
69 /* DSI burst mode setting in video mode. Each mode is assigned with a
70  * fixed value. The rationale behind this is to avoid change of these
71  * values, since the calculation of dsi clock depends on them. */
72 enum {
73         TEGRA_DSI_VIDEO_NONE_BURST_MODE = 0,
74         TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END = 1,
75         TEGRA_DSI_VIDEO_BURST_MODE_LOWEST_SPEED = 2,
76         TEGRA_DSI_VIDEO_BURST_MODE_LOW_SPEED = 3,
77         TEGRA_DSI_VIDEO_BURST_MODE_MEDIUM_SPEED = 4,
78         TEGRA_DSI_VIDEO_BURST_MODE_FAST_SPEED = 5,
79         TEGRA_DSI_VIDEO_BURST_MODE_FASTEST_SPEED = 6,
80 };
81
82 enum {
83         TEGRA_DSI_GANGED_SYMMETRIC_LEFT_RIGHT = 1,
84         TEGRA_DSI_GANGED_SYMMETRIC_EVEN_ODD = 2,
85 };
86
87 enum {
88         TEGRA_DSI_PACKET_CMD,
89         TEGRA_DSI_DELAY_MS,
90         TEGRA_DSI_GPIO_SET,
91         TEGRA_DSI_SEND_FRAME,
92 };
93
94 struct tegra_dsi_cmd {
95         u8      cmd_type;
96         u8      data_id;
97         union {
98                 u16 data_len;
99                 u16 delay_ms;
100                 unsigned gpio;
101                 u16 frame_cnt;
102                 struct {
103                         u8 data0;
104                         u8 data1;
105                 } sp;
106         } sp_len_dly;
107         u8      *pdata;
108 };
109
110 #define DSI_GENERIC_LONG_WRITE                  0x29
111 #define DSI_GENERIC_SHORT_WRITE_1_PARAMS        0x13
112 #define DSI_GENERIC_SHORT_WRITE_2_PARAMS        0x23
113 #define DSI_DCS_WRITE_0_PARAM                   0x05
114 #define DSI_DCS_WRITE_1_PARAM                   0x15
115
116 #define DSI_DCS_SET_ADDR_MODE                   0x36
117 #define DSI_DCS_EXIT_SLEEP_MODE                 0x11
118 #define DSI_DCS_SET_DISPLAY_ON                  0x29
119 #define DSI_DCS_SET_TEARING_EFFECT_OFF          0x34
120 #define DSI_DCS_SET_TEARING_EFFECT_ON           0x35
121 #define DSI_DCS_NO_OP                           0x0
122
123 #define DSI_CMD_SHORT(di, p0, p1)       { \
124                                         .cmd_type = TEGRA_DSI_PACKET_CMD, \
125                                         .data_id = di, \
126                                         .sp_len_dly.sp.data0 = p0, \
127                                         .sp_len_dly.sp.data1 = p1, \
128                                         }
129 #define DSI_DLY_MS(ms)  { \
130                         .cmd_type = TEGRA_DSI_DELAY_MS, \
131                         .sp_len_dly.delay_ms = ms, \
132                         }
133
134 #define DSI_GPIO_SET(rst_gpio, on)      { \
135                                         .cmd_type = TEGRA_DSI_GPIO_SET, \
136                                         .data_id = on, \
137                                         .sp_len_dly.gpio = rst_gpio, \
138                                         }
139
140 #define DSI_CMD_LONG(di, ptr)   { \
141                                 .cmd_type = TEGRA_DSI_PACKET_CMD, \
142                                 .data_id = di, \
143                                 .sp_len_dly.data_len = ARRAY_SIZE(ptr), \
144                                 .pdata = ptr, \
145                                 }
146
147 #define DSI_SEND_FRAME(cnt)     { \
148                         .cmd_type = TEGRA_DSI_SEND_FRAME, \
149                         .sp_len_dly.frame_cnt = cnt, \
150                         }
151
152 struct dsi_phy_timing_ns {
153         u16             t_hsdexit_ns;
154         u16             t_hstrail_ns;
155         u16             t_datzero_ns;
156         u16             t_hsprepare_ns;
157
158         u16             t_clktrail_ns;
159         u16             t_clkpost_ns;
160         u16             t_clkzero_ns;
161         u16             t_tlpx_ns;
162
163         u16             t_clkprepare_ns;
164         u16             t_clkpre_ns;
165         u16             t_wakeup_ns;
166
167         u16             t_taget_ns;
168         u16             t_tasure_ns;
169         u16             t_tago_ns;
170 };
171
172 enum {
173         CMD_VS          = 0x01,
174         CMD_VE          = 0x11,
175
176         CMD_HS          = 0x21,
177         CMD_HE          = 0x31,
178
179         CMD_EOT         = 0x08,
180         CMD_NULL        = 0x09,
181         CMD_SHORTW      = 0x15,
182         CMD_BLNK        = 0x19,
183         CMD_LONGW       = 0x39,
184
185         CMD_RGB         = 0x00,
186         CMD_RGB_16BPP   = 0x0E,
187         CMD_RGB_18BPP   = 0x1E,
188         CMD_RGB_18BPPNP = 0x2E,
189         CMD_RGB_24BPP   = 0x3E,
190 };
191
192 enum {
193         TEGRA_DSI_DISABLE,
194         TEGRA_DSI_ENABLE,
195 };
196
197 #define PKT_ID0(id)     ((((id) & 0x3f) << 3) | \
198                         (((TEGRA_DSI_ENABLE) & 0x1) << 9))
199 #define PKT_LEN0(len)   (((len) & 0x7) << 0)
200 #define PKT_ID1(id)     ((((id) & 0x3f) << 13) | \
201                         (((TEGRA_DSI_ENABLE) & 0x1) << 19))
202 #define PKT_LEN1(len)   (((len) & 0x7) << 10)
203 #define PKT_ID2(id)     ((((id) & 0x3f) << 23) | \
204                         (((TEGRA_DSI_ENABLE) & 0x1) << 29))
205 #define PKT_LEN2(len)   (((len) & 0x7) << 20)
206 #define PKT_ID3(id)     ((((id) & 0x3f) << 3) | \
207                         (((TEGRA_DSI_ENABLE) & 0x1) << 9))
208 #define PKT_LEN3(len)   (((len) & 0x7) << 0)
209 #define PKT_ID4(id)     ((((id) & 0x3f) << 13) | \
210                         (((TEGRA_DSI_ENABLE) & 0x1) << 19))
211 #define PKT_LEN4(len)   (((len) & 0x7) << 10)
212 #define PKT_ID5(id)     ((((id) & 0x3f) << 23) | \
213                         (((TEGRA_DSI_ENABLE) & 0x1) << 29))
214 #define PKT_LEN5(len)   (((len) & 0x7) << 20)
215 #define PKT_LP          (((TEGRA_DSI_ENABLE) & 0x1) << 30)
216 #define NUMOF_PKT_SEQ   12
217
218 enum {
219         DSI_VS_0 = 0x0,
220         DSI_VS_1 = 0x1,
221 };
222
223 enum {
224         DSI_INSTANCE_0,
225         DSI_INSTANCE_1,
226 };
227
228 /* Aggressiveness level of DSI suspend. The higher, the more aggressive. */
229 #define DSI_NO_SUSPEND                  0
230 #define DSI_HOST_SUSPEND_LV0            1
231 #define DSI_HOST_SUSPEND_LV1            2
232 #define DSI_HOST_SUSPEND_LV2            3
233
234 struct tegra_dsi_out {
235         u8              n_data_lanes;                   /* required */
236         u8              pixel_format;                   /* required */
237         u8              refresh_rate;                   /* required */
238         u8              rated_refresh_rate;
239         u8              panel_reset;                    /* required */
240         u8              virtual_channel;                /* required */
241         u8              dsi_instance;
242         u8              chip_id;
243         u8              chip_rev;
244         u8              controller_vs;
245
246         bool            panel_has_frame_buffer; /* required*/
247         bool            panel_send_dc_frames;
248
249         struct tegra_dsi_cmd    *dsi_init_cmd;          /* required */
250         u16             n_init_cmd;                     /* required */
251
252         struct tegra_dsi_cmd    *dsi_early_suspend_cmd;
253         u16             n_early_suspend_cmd;
254
255         struct tegra_dsi_cmd    *dsi_late_resume_cmd;
256         u16             n_late_resume_cmd;
257
258         struct tegra_dsi_cmd    *dsi_suspend_cmd;       /* required */
259         u16             n_suspend_cmd;                  /* required */
260
261         u8              video_data_type;                /* required */
262         u8              video_clock_mode;
263         u8              video_burst_mode;
264         u8              ganged_type;
265
266         u8              suspend_aggr;
267
268         u16             panel_buffer_size_byte;
269         u16             panel_reset_timeout_msec;
270
271         bool            hs_cmd_mode_supported;
272         bool            hs_cmd_mode_on_blank_supported;
273         bool            enable_hs_clock_on_lp_cmd_mode;
274         bool            no_pkt_seq_eot; /* 1st generation panel may not
275                                          * support eot. Don't set it for
276                                          * most panels. */
277         bool            te_polarity_low;
278         bool            power_saving_suspend;
279         bool            dsi2lvds_bridge_enable;
280         bool            dsi2edp_bridge_enable;
281
282         u32             max_panel_freq_khz;
283         u32             lp_cmd_mode_freq_khz;
284         u32             lp_read_cmd_mode_freq_khz;
285         u32             hs_clk_in_lp_cmd_mode_freq_khz;
286         u32             burst_mode_freq_khz;
287         u32             fpga_freq_khz;
288
289         const u32               *pkt_seq;
290
291         struct dsi_phy_timing_ns phy_timing;
292 };
293
294 enum {
295         TEGRA_DC_STEREO_MODE_2D,
296         TEGRA_DC_STEREO_MODE_3D
297 };
298
299 enum {
300         TEGRA_DC_STEREO_LANDSCAPE,
301         TEGRA_DC_STEREO_PORTRAIT
302 };
303
304 struct tegra_stereo_out {
305         int  mode_2d_3d;
306         int  orientation;
307
308         void (*set_mode)(int mode);
309         void (*set_orientation)(int orientation);
310 };
311
312 struct tegra_dc_mode {
313         int     pclk;
314         int     rated_pclk;
315         int     h_ref_to_sync;
316         int     v_ref_to_sync;
317         int     h_sync_width;
318         int     v_sync_width;
319         int     h_back_porch;
320         int     v_back_porch;
321         int     h_active;
322         int     v_active;
323         int     h_front_porch;
324         int     v_front_porch;
325         int     stereo_mode;
326         u32     flags;
327         u8      avi_m;
328 };
329
330 #define TEGRA_DC_MODE_FLAG_NEG_V_SYNC   (1 << 0)
331 #define TEGRA_DC_MODE_FLAG_NEG_H_SYNC   (1 << 1)
332
333 /* aspect ratio. 0 means unspecified or default. */
334 #define TEGRA_DC_MODE_AVI_M_4_3         0x1
335 #define TEGRA_DC_MODE_AVI_M_16_9        0x2
336
337 enum {
338         TEGRA_DC_OUT_RGB,
339         TEGRA_DC_OUT_HDMI,
340         TEGRA_DC_OUT_DSI,
341 };
342
343 struct tegra_dc_out_pin {
344         int     name;
345         int     pol;
346 };
347
348 enum {
349         TEGRA_DC_OUT_PIN_DATA_ENABLE,
350         TEGRA_DC_OUT_PIN_H_SYNC,
351         TEGRA_DC_OUT_PIN_V_SYNC,
352         TEGRA_DC_OUT_PIN_PIXEL_CLOCK,
353 };
354
355 enum {
356         TEGRA_DC_OUT_PIN_POL_LOW,
357         TEGRA_DC_OUT_PIN_POL_HIGH,
358 };
359
360 enum {
361         TEGRA_DC_DISABLE_DITHER = 1,
362         TEGRA_DC_ORDERED_DITHER,
363         TEGRA_DC_ERRDIFF_DITHER,
364 };
365
366 typedef u8 tegra_dc_bl_output[256];
367 typedef u8 *p_tegra_dc_bl_output;
368
369 struct tegra_dc_sd_blp {
370         u16 time_constant;
371         u8 step;
372 };
373
374 struct tegra_dc_sd_fc {
375         u8 time_limit;
376         u8 threshold;
377 };
378
379 struct tegra_dc_sd_rgb {
380         u8 r;
381         u8 g;
382         u8 b;
383 };
384
385 struct tegra_dc_sd_agg_priorities {
386         u8 pri_lvl;
387         u8 agg[4];
388 };
389
390 struct tegra_dc_sd_window {
391         u16 h_position;
392         u16 v_position;
393         u16 h_size;
394         u16 v_size;
395 };
396
397 struct tegra_dc_sd_settings {
398         unsigned enable;
399         bool use_auto_pwm;
400         u8 hw_update_delay;
401         u8 aggressiveness;
402         short bin_width;
403         u8 phase_in_settings;
404         u8 phase_in_adjustments;
405         u8 cmd;
406         u8 final_agg;
407         u16 cur_agg_step;
408         u16 phase_settings_step;
409         u16 phase_adj_step;
410         u16 num_phase_in_steps;
411
412         struct tegra_dc_sd_agg_priorities agg_priorities;
413
414         bool use_vid_luma;
415         struct tegra_dc_sd_rgb coeff;
416
417         bool k_limit_enable;
418         u16 k_limit;
419
420         bool sd_window_enable;
421         struct tegra_dc_sd_window sd_window;
422
423         bool soft_clipping_enable;
424         u8 soft_clipping_threshold;
425
426         bool smooth_k_enable;
427         u16 smooth_k_incr;
428
429         bool sd_proc_control;
430         bool soft_clipping_correction;
431         bool use_vpulse2;
432
433         struct tegra_dc_sd_fc fc;
434         struct tegra_dc_sd_blp blp;
435         u8 bltf[4][4][4];
436         struct tegra_dc_sd_rgb lut[4][9];
437
438         atomic_t *sd_brightness;
439         char *bl_device_name;
440         struct backlight_device *bl_device;
441 };
442
443 enum {
444         NO_CMD = 0x0,
445         ENABLE = 0x1,
446         DISABLE = 0x2,
447         PHASE_IN = 0x4,
448         AGG_CHG = 0x8,
449 };
450
451 enum {
452         TEGRA_PIN_OUT_CONFIG_SEL_LHP0_LD21,
453         TEGRA_PIN_OUT_CONFIG_SEL_LHP1_LD18,
454         TEGRA_PIN_OUT_CONFIG_SEL_LHP2_LD19,
455         TEGRA_PIN_OUT_CONFIG_SEL_LVP0_LVP0_Out,
456         TEGRA_PIN_OUT_CONFIG_SEL_LVP1_LD20,
457
458         TEGRA_PIN_OUT_CONFIG_SEL_LM1_M1,
459         TEGRA_PIN_OUT_CONFIG_SEL_LM1_LD21,
460         TEGRA_PIN_OUT_CONFIG_SEL_LM1_PM1,
461
462         TEGRA_PIN_OUT_CONFIG_SEL_LDI_LD22,
463         TEGRA_PIN_OUT_CONFIG_SEL_LPP_LD23,
464         TEGRA_PIN_OUT_CONFIG_SEL_LDC_SDC,
465         TEGRA_PIN_OUT_CONFIG_SEL_LSPI_DE,
466 };
467
468 struct tegra_dc_out {
469         int                             type;
470         unsigned                        flags;
471
472         /* size in mm */
473         unsigned                        h_size;
474         unsigned                        v_size;
475
476         int                             dcc_bus;
477         int                             hotplug_gpio;
478         const char                      *parent_clk;
479         const char                      *parent_clk_backup;
480
481         unsigned                        max_pixclock;
482         unsigned                        order;
483         unsigned                        align;
484         unsigned                        depth;
485         unsigned                        dither;
486
487         struct tegra_dc_mode            *modes;
488         int                             n_modes;
489
490         struct tegra_dsi_out            *dsi;
491         struct tegra_hdmi_out           *hdmi_out;
492         struct tegra_stereo_out         *stereo;
493
494         unsigned                        height; /* mm */
495         unsigned                        width; /* mm */
496
497         struct tegra_dc_out_pin         *out_pins;
498         unsigned                        n_out_pins;
499
500         struct tegra_dc_sd_settings     *sd_settings;
501
502         u8                      *out_sel_configs;
503         unsigned                n_out_sel_configs;
504         bool                    user_needs_vblank;
505         struct completion       user_vblank_comp;
506
507         int     (*enable)(struct device *);
508         int     (*postpoweron)(void);
509         int     (*prepoweroff)(void);
510         int     (*disable)(void);
511
512         int     (*hotplug_init)(struct device *);
513         int     (*postsuspend)(void);
514 };
515
516 /* bits for tegra_dc_out.flags */
517 #define TEGRA_DC_OUT_HOTPLUG_HIGH               (0 << 1)
518 #define TEGRA_DC_OUT_HOTPLUG_LOW                (1 << 1)
519 #define TEGRA_DC_OUT_HOTPLUG_MASK               (1 << 1)
520 #define TEGRA_DC_OUT_NVHDCP_POLICY_ALWAYS_ON    (0 << 2)
521 #define TEGRA_DC_OUT_NVHDCP_POLICY_ON_DEMAND    (1 << 2)
522 #define TEGRA_DC_OUT_NVHDCP_POLICY_MASK         (1 << 2)
523 #define TEGRA_DC_OUT_CONTINUOUS_MODE            (0 << 3)
524 #define TEGRA_DC_OUT_ONE_SHOT_MODE              (1 << 3)
525 #define TEGRA_DC_OUT_N_SHOT_MODE                (1 << 4)
526 #define TEGRA_DC_OUT_ONE_SHOT_LP_MODE           (1 << 5)
527
528 #define TEGRA_DC_ALIGN_MSB              0
529 #define TEGRA_DC_ALIGN_LSB              1
530
531 #define TEGRA_DC_ORDER_RED_BLUE         0
532 #define TEGRA_DC_ORDER_BLUE_RED         1
533
534 /* Errands use the interrupts */
535 #define V_BLANK_FLIP            0
536 #define V_BLANK_NVSD            1
537
538 #define V_PULSE2_FLIP           0
539 #define V_PULSE2_NVSD           1
540
541 struct tegra_dc;
542 struct nvmap_handle_ref;
543
544 struct tegra_dc_csc {
545         unsigned short yof;
546         unsigned short kyrgb;
547         unsigned short kur;
548         unsigned short kvr;
549         unsigned short kug;
550         unsigned short kvg;
551         unsigned short kub;
552         unsigned short kvb;
553 };
554
555 /* palette lookup table */
556 struct tegra_dc_lut {
557         u8 r[256];
558         u8 g[256];
559         u8 b[256];
560 };
561
562 struct tegra_dc_cmu_csc {
563         u16 krr;
564         u16 kgr;
565         u16 kbr;
566         u16 krg;
567         u16 kgg;
568         u16 kbg;
569         u16 krb;
570         u16 kgb;
571         u16 kbb;
572 };
573
574 struct tegra_dc_cmu {
575         u16 lut1[256];
576         struct tegra_dc_cmu_csc csc;
577         u8 lut2[960];
578 };
579
580 struct tegra_dc_win {
581         u8                      idx;
582         u8                      fmt;
583         u8                      ppflags; /* see TEGRA_WIN_PPFLAG* */
584         u32                     flags;
585
586         void                    *virt_addr;
587         dma_addr_t              phys_addr;
588         dma_addr_t              phys_addr_u;
589         dma_addr_t              phys_addr_v;
590         unsigned                stride;
591         unsigned                stride_uv;
592         fixed20_12              x;
593         fixed20_12              y;
594         fixed20_12              w;
595         fixed20_12              h;
596         unsigned                out_x;
597         unsigned                out_y;
598         unsigned                out_w;
599         unsigned                out_h;
600         unsigned                z;
601         u8                      global_alpha;
602
603         struct tegra_dc_csc     csc;
604
605         int                     dirty;
606         int                     underflows;
607         struct tegra_dc         *dc;
608
609         struct nvmap_handle_ref *cur_handle;
610         unsigned                bandwidth;
611         unsigned                new_bandwidth;
612         struct tegra_dc_lut     lut;
613 };
614
615 #define TEGRA_WIN_PPFLAG_CP_ENABLE      (1 << 0) /* enable RGB color lut */
616 #define TEGRA_WIN_PPFLAG_CP_FBOVERRIDE  (1 << 1) /* override fbdev color lut */
617
618 #define TEGRA_WIN_FLAG_ENABLED          (1 << 0)
619 #define TEGRA_WIN_FLAG_BLEND_PREMULT    (1 << 1)
620 #define TEGRA_WIN_FLAG_BLEND_COVERAGE   (1 << 2)
621 #define TEGRA_WIN_FLAG_INVERT_H         (1 << 3)
622 #define TEGRA_WIN_FLAG_INVERT_V         (1 << 4)
623 #define TEGRA_WIN_FLAG_TILED            (1 << 5)
624 #define TEGRA_WIN_FLAG_H_FILTER         (1 << 6)
625 #define TEGRA_WIN_FLAG_V_FILTER         (1 << 7)
626 #define TEGRA_WIN_FLAG_SCAN_COLUMN      (1 << 9)
627
628
629 #define TEGRA_WIN_BLEND_FLAGS_MASK \
630         (TEGRA_WIN_FLAG_BLEND_PREMULT | TEGRA_WIN_FLAG_BLEND_COVERAGE)
631
632 /* Note: These are the actual values written to the DC_WIN_COLOR_DEPTH register
633  * and may change in new tegra architectures.
634  */
635 #define TEGRA_WIN_FMT_P1                0
636 #define TEGRA_WIN_FMT_P2                1
637 #define TEGRA_WIN_FMT_P4                2
638 #define TEGRA_WIN_FMT_P8                3
639 #define TEGRA_WIN_FMT_B4G4R4A4          4
640 #define TEGRA_WIN_FMT_B5G5R5A           5
641 #define TEGRA_WIN_FMT_B5G6R5            6
642 #define TEGRA_WIN_FMT_AB5G5R5           7
643 #define TEGRA_WIN_FMT_B8G8R8A8          12
644 #define TEGRA_WIN_FMT_R8G8B8A8          13
645 #define TEGRA_WIN_FMT_B6x2G6x2R6x2A8    14
646 #define TEGRA_WIN_FMT_R6x2G6x2B6x2A8    15
647 #define TEGRA_WIN_FMT_YCbCr422          16
648 #define TEGRA_WIN_FMT_YUV422            17
649 #define TEGRA_WIN_FMT_YCbCr420P         18
650 #define TEGRA_WIN_FMT_YUV420P           19
651 #define TEGRA_WIN_FMT_YCbCr422P         20
652 #define TEGRA_WIN_FMT_YUV422P           21
653 #define TEGRA_WIN_FMT_YCbCr422R         22
654 #define TEGRA_WIN_FMT_YUV422R           23
655 #define TEGRA_WIN_FMT_YCbCr422RA        24
656 #define TEGRA_WIN_FMT_YUV422RA          25
657
658 struct tegra_fb_data {
659         int             win;
660
661         int             xres;
662         int             yres;
663         int             bits_per_pixel; /* -1 means autodetect */
664
665         unsigned long   flags;
666 };
667
668 #define TEGRA_FB_FLIP_ON_PROBE          (1 << 0)
669
670 struct tegra_dc_platform_data {
671         unsigned long           flags;
672         unsigned long           emc_clk_rate;
673         struct tegra_dc_out     *default_out;
674         struct tegra_fb_data    *fb;
675
676 #ifdef CONFIG_TEGRA_DC_CMU
677         bool                    cmu_enable;
678         struct tegra_dc_cmu     *cmu;
679 #endif
680 };
681
682 #define TEGRA_DC_FLAG_ENABLED           (1 << 0)
683 #define TEGRA_DC_FLAG_CMU_DISABLE       (0 << 1)
684 #define TEGRA_DC_FLAG_CMU_ENABLE        (1 << 1)
685
686 int tegra_dc_get_stride(struct tegra_dc *dc, unsigned win);
687 struct tegra_dc *tegra_dc_get_dc(unsigned idx);
688 struct tegra_dc_win *tegra_dc_get_window(struct tegra_dc *dc, unsigned win);
689 bool tegra_dc_get_connected(struct tegra_dc *);
690 bool tegra_dc_hpd(struct tegra_dc *dc);
691
692
693 void tegra_dc_get_fbvblank(struct tegra_dc *dc, struct fb_vblank *vblank);
694 int tegra_dc_wait_for_vsync(struct tegra_dc *dc);
695 void tegra_dc_blank(struct tegra_dc *dc);
696
697 void tegra_dc_enable(struct tegra_dc *dc);
698 void tegra_dc_disable(struct tegra_dc *dc);
699 int tegra_dc_set_default_videomode(struct tegra_dc *dc);
700
701
702 u32 tegra_dc_get_syncpt_id(const struct tegra_dc *dc, int i);
703 u32 tegra_dc_incr_syncpt_max(struct tegra_dc *dc, int i);
704 void tegra_dc_incr_syncpt_min(struct tegra_dc *dc, int i, u32 val);
705
706 /* tegra_dc_update_windows and tegra_dc_sync_windows do not support windows
707  * with differenct dcs in one call
708  */
709 int tegra_dc_update_windows(struct tegra_dc_win *windows[], int n);
710 int tegra_dc_sync_windows(struct tegra_dc_win *windows[], int n);
711 int tegra_dc_config_frame_end_intr(struct tegra_dc *dc, bool enable);
712 bool tegra_dc_is_within_n_vsync(struct tegra_dc *dc, s64 ts);
713 bool tegra_dc_does_vsync_separate(struct tegra_dc *dc, s64 new_ts, s64 old_ts);
714
715 int tegra_dc_set_mode(struct tegra_dc *dc, const struct tegra_dc_mode *mode);
716 struct fb_videomode;
717 int tegra_dc_to_fb_videomode(struct fb_videomode *fbmode,
718         const struct tegra_dc_mode *mode);
719 int tegra_dc_set_fb_mode(struct tegra_dc *dc, const struct fb_videomode *fbmode,
720         bool stereo_mode);
721
722 unsigned tegra_dc_get_out_height(const struct tegra_dc *dc);
723 unsigned tegra_dc_get_out_width(const struct tegra_dc *dc);
724 unsigned tegra_dc_get_out_max_pixclock(const struct tegra_dc *dc);
725
726 /* PM0 and PM1 signal control */
727 #define TEGRA_PWM_PM0 0
728 #define TEGRA_PWM_PM1 1
729
730 struct tegra_dc_pwm_params {
731         int which_pwm;
732         int gpio_conf_to_sfio;
733         unsigned int period;
734         unsigned int clk_div;
735         unsigned int clk_select;
736         unsigned int duty_cycle;
737 };
738
739 void tegra_dc_config_pwm(struct tegra_dc *dc, struct tegra_dc_pwm_params *cfg);
740
741 int tegra_dsi_send_panel_short_cmd(struct tegra_dc *dc, u8 *pdata, u8 data_len);
742
743 int tegra_dc_update_csc(struct tegra_dc *dc, int win_index);
744
745 int tegra_dc_update_lut(struct tegra_dc *dc, int win_index, int fboveride);
746
747 /*
748  * In order to get a dc's current EDID, first call tegra_dc_get_edid() from an
749  * interruptible context.  The returned value (if non-NULL) points to a
750  * snapshot of the current state; after copying data from it, call
751  * tegra_dc_put_edid() on that pointer.  Do not dereference anything through
752  * that pointer after calling tegra_dc_put_edid().
753  */
754 struct tegra_dc_edid {
755         size_t          len;
756         u8              buf[0];
757 };
758 struct tegra_dc_edid *tegra_dc_get_edid(struct tegra_dc *dc);
759 void tegra_dc_put_edid(struct tegra_dc_edid *edid);
760
761 int tegra_dc_set_flip_callback(void (*callback)(void));
762 int tegra_dc_unset_flip_callback(void);
763 int tegra_dc_get_panel_sync_rate(void);
764
765 int tegra_dc_get_out(const struct tegra_dc *dc);
766
767 /* table of electrical settings, must be in acending order. */
768 struct tdms_config {
769         int pclk;
770         u32 pll0;
771         u32 pll1;
772         u32 pe_current; /* pre-emphasis */
773         u32 drive_current;
774         u32 peak_current; /* for TEGRA_11x_SOC */
775 };
776
777 struct tegra_hdmi_out {
778         struct tdms_config *tdms_config;
779         int n_tdms_config;
780 };
781 #endif