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