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