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