video: tegra: dc: set sor to sleep at vsync during dc shutdown
[linux-3.10.git] / drivers / video / tegra / dc / dc_priv_defs.h
1 /*
2  * drivers/video/tegra/dc/dc_priv.h
3  *
4  * Copyright (C) 2010 Google, Inc.
5  * Author: Erik Gilling <konkers@android.com>
6  *
7  * Copyright (c) 2010-2017, NVIDIA CORPORATION, All rights reserved.
8  *
9  * This software is licensed under the terms of the GNU General Public
10  * License version 2, as published by the Free Software Foundation, and
11  * may be copied, distributed, and modified under those terms.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  */
19
20 #ifndef __DRIVERS_VIDEO_TEGRA_DC_DC_PRIV_DEFS_H
21 #define __DRIVERS_VIDEO_TEGRA_DC_DC_PRIV_DEFS_H
22 #include <linux/io.h>
23 #include <linux/mutex.h>
24 #include <linux/wait.h>
25 #include <linux/fb.h>
26 #include <linux/clk.h>
27 #include <linux/completion.h>
28 #include <linux/switch.h>
29 #include <linux/nvhost.h>
30 #include <linux/types.h>
31 #include <linux/clk/tegra.h>
32 #include <linux/tegra-soc.h>
33
34 #include <mach/dc.h>
35
36 #include <mach/tegra_dc_ext.h>
37 #include <linux/platform/tegra/isomgr.h>
38
39 #include "dc_reg.h"
40
41 #define NEED_UPDATE_EMC_ON_EVERY_FRAME (windows_idle_detection_time == 0)
42
43 /* 28 bit offset for window clip number */
44 #define CURSOR_CLIP_SHIFT_BITS(win)     (win << 28)
45 #define CURSOR_CLIP_GET_WINDOW(reg)     ((reg >> 28) & 3)
46
47 #define BLANK_ALL       (~0)
48
49 static inline u32 ALL_UF_INT(void)
50 {
51         if (tegra_platform_is_fpga())
52                 return 0;
53 #if defined(CONFIG_ARCH_TEGRA_2x_SOC) || \
54         defined(CONFIG_ARCH_TEGRA_3x_SOC) || \
55         defined(CONFIG_ARCH_TEGRA_11x_SOC)
56         return WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT;
57 #elif defined(CONFIG_TEGRA_NVDISPLAY)
58         return NVDISP_UF_INT;
59 #else
60         return WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT | HC_UF_INT |
61                 WIN_D_UF_INT | WIN_T_UF_INT;
62 #endif
63 }
64
65 #if defined(CONFIG_TEGRA_EMC_TO_DDR_CLOCK)
66 #define EMC_BW_TO_FREQ(bw) (DDR_BW_TO_FREQ(bw) * CONFIG_TEGRA_EMC_TO_DDR_CLOCK)
67 #else
68 #define EMC_BW_TO_FREQ(bw) (DDR_BW_TO_FREQ(bw) * 2)
69 #endif
70
71 struct tegra_dc;
72
73 struct tegra_dc_blend {
74         unsigned z[DC_N_WINDOWS];
75         unsigned flags[DC_N_WINDOWS];
76         u8 alpha[DC_N_WINDOWS];
77 };
78
79 struct tegra_dc_out_ops {
80         /* initialize output.  dc clocks are not on at this point */
81         int (*init)(struct tegra_dc *dc);
82         /* destroy output.  dc clocks are not on at this point */
83         void (*destroy)(struct tegra_dc *dc);
84         /* shutdown output.  dc clocks are on at this point */
85         void (*shutdown)(struct tegra_dc *dc);
86         /* detect connected display.  can sleep.*/
87         bool (*detect)(struct tegra_dc *dc);
88         /* enable output.  dc clocks are on at this point */
89         void (*enable)(struct tegra_dc *dc);
90         /* enable dc client.  Panel is enable at this point */
91         void (*postpoweron)(struct tegra_dc *dc);
92         /* disable output.  dc clocks are on at this point */
93         void (*disable)(struct tegra_dc *dc);
94         /* dc client is disabled.  dc clocks are on at this point */
95         void (*postpoweroff) (struct tegra_dc *dc);
96         /* hold output.  keeps dc clocks on. */
97         void (*hold)(struct tegra_dc *dc);
98         /* release output.  dc clocks may turn off after this. */
99         void (*release)(struct tegra_dc *dc);
100         /* idle routine of output.  dc clocks may turn off after this. */
101         void (*idle)(struct tegra_dc *dc);
102         /* suspend output.  dc clocks are on at this point */
103         void (*suspend)(struct tegra_dc *dc);
104         /* resume output.  dc clocks are on at this point */
105         void (*resume)(struct tegra_dc *dc);
106         /* mode filter. to provide a list of supported modes*/
107         bool (*mode_filter)(const struct tegra_dc *dc,
108                         struct fb_videomode *mode);
109         /* setup pixel clock and parent clock programming */
110         long (*setup_clk)(struct tegra_dc *dc, struct clk *clk);
111         /*
112          * return true if display client is suspended during OSidle.
113          * If true, dc will not wait on any display client event
114          * during OSidle.
115          */
116         bool (*osidle)(struct tegra_dc *dc);
117         /* callback before new mode is programmed.
118          * dc clocks are on at this point */
119         void (*modeset_notifier)(struct tegra_dc *dc);
120         /* Set up interface and sink for partial frame update.
121          */
122         int (*partial_update) (struct tegra_dc *dc, unsigned int *xoff,
123                 unsigned int *yoff, unsigned int *width, unsigned int *height);
124         /* refcounted enable of pads and clocks before performing DDC/I2C. */
125         int (*ddc_enable)(struct tegra_dc *dc);
126         /* refcounted disable of pads and clocks after performing DDC/I2C. */
127         int (*ddc_disable)(struct tegra_dc *dc);
128         /* Enable/disable VRR */
129         void (*vrr_enable)(struct tegra_dc *dc, bool enable);
130         /* Mark VRR-compatible modes in fb_info->info->modelist */
131         void (*vrr_update_monspecs)(struct tegra_dc *dc,
132                 struct list_head *head);
133         /* return if hpd asserted or deasserted */
134         bool (*hpd_state) (struct tegra_dc *dc);
135         /* Configure controller to receive hotplug events */
136         int (*hotplug_init)(struct tegra_dc *dc);
137         int (*set_hdr)(struct tegra_dc *dc);
138         /* shutdown the serial interface */
139         void (*shutdown_interface)(struct tegra_dc *dc);
140 };
141
142 struct tegra_dc_shift_clk_div {
143         unsigned long mul; /* numerator */
144         unsigned long div; /* denominator */
145 };
146
147 struct tegra_dc_nvsr_data;
148
149 enum tegra_dc_cursor_size {
150         TEGRA_DC_CURSOR_SIZE_32X32 = 0,
151         TEGRA_DC_CURSOR_SIZE_64X64 = 1,
152         TEGRA_DC_CURSOR_SIZE_128X128 = 2,
153         TEGRA_DC_CURSOR_SIZE_256X256 = 3,
154 };
155
156 enum tegra_dc_cursor_format {
157         TEGRA_DC_CURSOR_FORMAT_2BIT_LEGACY = 0,
158         TEGRA_DC_CURSOR_FORMAT_RGBA_NON_PREMULT_ALPHA = 1,
159         TEGRA_DC_CURSOR_FORMAT_RGBA_PREMULT_ALPHA = 3,
160         TEGRA_DC_CURSOR_FORMAT_RGBA_XOR = 4,
161 };
162
163 struct tegra_dc {
164         struct platform_device          *ndev;
165         struct tegra_dc_platform_data   *pdata;
166
167         struct resource                 *base_res;
168         void __iomem                    *base;
169         int                             irq;
170
171         struct clk                      *clk;
172 #ifdef CONFIG_TEGRA_ISOMGR
173         tegra_isomgr_handle             isomgr_handle;
174 #else
175         struct clk                      *emc_clk;
176 #endif
177         struct clk                      *emc_la_clk;
178         long                            bw_kbps; /* bandwidth in KBps */
179         long                            new_bw_kbps;
180         struct tegra_dc_shift_clk_div   shift_clk_div;
181
182         u32                             powergate_id;
183         int                             sor_instance;
184
185         bool                            connected;
186         bool                            enabled;
187         bool                            suspended;
188         bool                            blanked;
189         bool                            shutdown;
190
191         /* Some of the setup code could reset display even if
192          * DC is already by bootloader.  This one-time mark is
193          * used to suppress such code blocks during system boot,
194          * a.k.a the call stack above tegra_dc_probe().
195          */
196         bool                            initialized;
197
198         struct tegra_dc_out             *out;
199         struct tegra_dc_out_ops         *out_ops;
200         void                            *out_data;
201
202         struct tegra_dc_mode            mode;
203         s64                             frametime_ns;
204
205 #ifndef CONFIG_TEGRA_NVDISPLAY
206         struct tegra_dc_win             windows[DC_N_WINDOWS];
207 #endif
208         struct tegra_dc_win             shadow_windows[DC_N_WINDOWS];
209
210         struct tegra_dc_blend           blend;
211         int                             n_windows;
212         struct tegra_dc_hdr             hdr;
213
214 #if defined(CONFIG_TEGRA_DC_CMU)
215         struct tegra_dc_cmu             cmu;
216 #elif defined(CONFIG_TEGRA_DC_CMU_V2)
217         struct tegra_dc_lut             cmu;
218 #endif
219
220 #if defined(CONFIG_TEGRA_DC_CMU) || defined(CONFIG_TEGRA_DC_CMU_V2)
221         struct tegra_dc_cmu             cmu_shadow;
222         bool                            cmu_dirty;
223         /* Is CMU set by bootloader */
224         bool                            is_cmu_set_bl;
225         bool                            cmu_shadow_dirty;
226         bool                            cmu_shadow_force_update;
227         bool                            cmu_enabled;
228 #endif
229         wait_queue_head_t               wq;
230         wait_queue_head_t               timestamp_wq;
231
232         struct mutex                    lp_lock;
233         struct mutex                    lock;
234         struct mutex                    one_shot_lock;
235
236         struct resource                 *fb_mem;
237         struct tegra_fb_info            *fb;
238 #ifdef CONFIG_ADF_TEGRA
239         struct tegra_adf_info           *adf;
240 #endif
241
242         u32                             vblank_syncpt;
243
244         unsigned long int               valid_windows;
245
246         unsigned long                   underflow_mask;
247         struct work_struct              reset_work;
248
249 #ifdef CONFIG_SWITCH
250         struct switch_dev               modeset_switch;
251 #endif
252
253         struct completion               frame_end_complete;
254         struct completion               crc_complete;
255         bool                            crc_pending;
256
257         struct work_struct              vblank_work;
258         long                            vblank_ref_count;
259         struct work_struct              frame_end_work;
260         struct work_struct              vpulse2_work;
261         long                            vpulse2_ref_count;
262
263         struct {
264                 u64                     underflows;
265                 u64                     underflows_a;
266                 u64                     underflows_b;
267                 u64                     underflows_c;
268                 u64                     underflows_d;
269                 u64                     underflows_h;
270                 u64                     underflows_t;
271                 u64                     underflow_frames;
272         } stats;
273
274 #ifdef CONFIG_TEGRA_DC_EXTENSIONS
275         struct tegra_dc_ext             *ext;
276 #endif
277
278         struct tegra_dc_feature         *feature;
279         int                             gen1_blend_num;
280
281 #ifdef CONFIG_DEBUG_FS
282         struct dentry                   *debugdir;
283 #endif
284         struct tegra_dc_lut             fb_lut;
285         struct delayed_work             underflow_work;
286         u32                             one_shot_delay_ms;
287         struct delayed_work             one_shot_work;
288         s64                             frame_end_timestamp;
289         atomic_t                        frame_end_ref;
290
291         bool                            mode_dirty;
292         bool                            yuv_bypass;
293         atomic_t                        holding;
294
295         u32                             reserved_bw;
296         u32                             available_bw;
297         struct tegra_dc_win             tmp_wins[DC_N_WINDOWS];
298
299         struct tegra_edid               *edid;
300
301         struct tegra_dc_nvsr_data *nvsr;
302
303         bool    disp_active_dirty;
304
305         struct tegra_dc_cursor {
306                 bool dirty;
307                 bool enabled;
308                 dma_addr_t phys_addr;
309                 u32 fg;
310                 u32 bg;
311                 unsigned clip_win;
312                 int x;
313                 int y;
314                 enum tegra_dc_cursor_size size;
315                 enum tegra_dc_cursor_format format;
316         } cursor;
317
318         int     ctrl_num;
319         bool    switchdev_registered;
320
321         struct notifier_block slgc_notifier;
322         bool    vedid;
323         u8      *vedid_data;
324         bool    hdr_cache_dirty;
325
326         u32 dbg_fe_count;
327 };
328 #endif