6c022a4a8218b98d19c82b6c60e8a035c5904c8d
[linux-3.10.git] / drivers / video / tegra / dc / dc_priv_defs.h
1
2 /*
3  * drivers/video/tegra/dc/dc_priv.h
4  *
5  * Copyright (C) 2010 Google, Inc.
6  * Author: Erik Gilling <konkers@android.com>
7  *
8  * Copyright (c) 2010-2012, NVIDIA CORPORATION, All rights reserved.
9  *
10  * This software is licensed under the terms of the GNU General Public
11  * License version 2, as published by the Free Software Foundation, and
12  * may be copied, distributed, and modified under those terms.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  */
20
21 #ifndef __DRIVERS_VIDEO_TEGRA_DC_DC_PRIV_DEFS_H
22 #define __DRIVERS_VIDEO_TEGRA_DC_DC_PRIV_DEFS_H
23 #include <linux/io.h>
24 #include <linux/mutex.h>
25 #include <linux/wait.h>
26 #include <linux/fb.h>
27 #include <linux/clk.h>
28 #include <linux/completion.h>
29 #include <linux/switch.h>
30 #include <linux/nvhost.h>
31 #include <linux/types.h>
32
33 #include <mach/dc.h>
34
35 #include <mach/tegra_dc_ext.h>
36 #include <mach/clk.h>
37
38 #include "dc_reg.h"
39
40 #define WIN_IS_TILED(win)       ((win)->flags & TEGRA_WIN_FLAG_TILED)
41 #define WIN_IS_ENABLED(win)     ((win)->flags & TEGRA_WIN_FLAG_ENABLED)
42
43 #define NEED_UPDATE_EMC_ON_EVERY_FRAME (windows_idle_detection_time == 0)
44
45 /* DDR: 8 bytes transfer per clock */
46 #define DDR_BW_TO_FREQ(bw) ((bw) / 8)
47
48 /* 29 bit offset for window clip number */
49 #define CURSOR_CLIP_SHIFT_BITS(win)     (win << 29)
50 #define CURSOR_CLIP_GET_WINDOW(reg)     ((reg >> 29) & 3)
51
52 #if defined(CONFIG_TEGRA_EMC_TO_DDR_CLOCK)
53 #define EMC_BW_TO_FREQ(bw) (DDR_BW_TO_FREQ(bw) * CONFIG_TEGRA_EMC_TO_DDR_CLOCK)
54 #else
55 #define EMC_BW_TO_FREQ(bw) (DDR_BW_TO_FREQ(bw) * 2)
56 #endif
57
58 #ifndef CONFIG_TEGRA_FPGA_PLATFORM
59 #define ALL_UF_INT (WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT)
60 #else
61 /* ignore underflows when on simulation and fpga platform */
62 #define ALL_UF_INT (0)
63 #endif
64
65 struct tegra_dc;
66
67 struct tegra_dc_blend {
68         unsigned z[DC_N_WINDOWS];
69         unsigned flags[DC_N_WINDOWS];
70 };
71
72 struct tegra_dc_out_ops {
73         /* initialize output.  dc clocks are not on at this point */
74         int (*init)(struct tegra_dc *dc);
75         /* destroy output.  dc clocks are not on at this point */
76         void (*destroy)(struct tegra_dc *dc);
77         /* detect connected display.  can sleep.*/
78         bool (*detect)(struct tegra_dc *dc);
79         /* enable output.  dc clocks are on at this point */
80         void (*enable)(struct tegra_dc *dc);
81         /* disable output.  dc clocks are on at this point */
82         void (*disable)(struct tegra_dc *dc);
83         /* hold output.  keeps dc clocks on. */
84         void (*hold)(struct tegra_dc *dc);
85         /* release output.  dc clocks may turn off after this. */
86         void (*release)(struct tegra_dc *dc);
87         /* idle routine of output.  dc clocks may turn off after this. */
88         void (*idle)(struct tegra_dc *dc);
89         /* suspend output.  dc clocks are on at this point */
90         void (*suspend)(struct tegra_dc *dc);
91         /* resume output.  dc clocks are on at this point */
92         void (*resume)(struct tegra_dc *dc);
93         /* mode filter. to provide a list of supported modes*/
94         bool (*mode_filter)(const struct tegra_dc *dc,
95                         struct fb_videomode *mode);
96 };
97
98 struct tegra_dc {
99         struct nvhost_device            *ndev;
100         struct tegra_dc_platform_data   *pdata;
101
102         struct resource                 *base_res;
103         void __iomem                    *base;
104         int                             irq;
105
106         struct clk                      *clk;
107         struct clk                      *emc_clk;
108         int                             emc_clk_rate;
109         int                             new_emc_clk_rate;
110         u32                             shift_clk_div;
111
112         bool                            connected;
113         bool                            enabled;
114         bool                            suspended;
115
116         struct tegra_dc_out             *out;
117         struct tegra_dc_out_ops         *out_ops;
118         void                            *out_data;
119
120         struct tegra_dc_mode            mode;
121         s64                             frametime_ns;
122
123         struct tegra_dc_win             windows[DC_N_WINDOWS];
124         struct tegra_dc_blend           blend;
125         int                             n_windows;
126 #ifdef CONFIG_TEGRA_DC_CMU
127         struct tegra_dc_cmu             cmu;
128 #endif
129         wait_queue_head_t               wq;
130         wait_queue_head_t               timestamp_wq;
131
132         struct mutex                    lock;
133         struct mutex                    one_shot_lock;
134
135         struct resource                 *fb_mem;
136         struct tegra_fb_info            *fb;
137
138         struct {
139                 u32                     id;
140                 u32                     min;
141                 u32                     max;
142         } syncpt[DC_N_WINDOWS];
143         u32                             vblank_syncpt;
144
145         unsigned long                   underflow_mask;
146         struct work_struct              reset_work;
147
148 #ifdef CONFIG_SWITCH
149         struct switch_dev               modeset_switch;
150 #endif
151
152         struct completion               frame_end_complete;
153
154         struct work_struct              vblank_work;
155         long                            vblank_ref_count;
156
157         struct {
158                 u64                     underflows;
159                 u64                     underflows_a;
160                 u64                     underflows_b;
161                 u64                     underflows_c;
162         } stats;
163
164         struct tegra_dc_ext             *ext;
165
166         struct tegra_dc_feature         *feature;
167         int                             gen1_blend_num;
168
169 #ifdef CONFIG_DEBUG_FS
170         struct dentry                   *debugdir;
171 #endif
172         struct tegra_dc_lut             fb_lut;
173         struct delayed_work             underflow_work;
174         u32                             one_shot_delay_ms;
175         struct delayed_work             one_shot_work;
176         s64                             frame_end_timestamp;
177 };
178
179 #endif