video: tegra: Added sysfs for dc/smartdimmer
[linux-2.6.git] / drivers / video / tegra / dc / dc_priv.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  * This software is licensed under the terms of the GNU General Public
8  * License version 2, as published by the Free Software Foundation, and
9  * may be copied, distributed, and modified under those terms.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17
18 #ifndef __DRIVERS_VIDEO_TEGRA_DC_DC_PRIV_H
19 #define __DRIVERS_VIDEO_TEGRA_DC_DC_PRIV_H
20
21 #include <linux/io.h>
22 #include <linux/list.h>
23 #include <linux/mutex.h>
24 #include <linux/wait.h>
25 #include <linux/completion.h>
26
27 #include "../host/dev.h"
28
29 struct tegra_dc;
30
31 struct tegra_dc_blend {
32         unsigned z[DC_N_WINDOWS];
33         unsigned flags[DC_N_WINDOWS];
34 };
35
36 struct tegra_dc_out_ops {
37         /* initialize output.  dc clocks are not on at this point */
38         int (*init)(struct tegra_dc *dc);
39         /* destroy output.  dc clocks are not on at this point */
40         void (*destroy)(struct tegra_dc *dc);
41         /* detect connected display.  can sleep.*/
42         bool (*detect)(struct tegra_dc *dc);
43         /* enable output.  dc clocks are on at this point */
44         void (*enable)(struct tegra_dc *dc);
45         /* disable output.  dc clocks are on at this point */
46         void (*disable)(struct tegra_dc *dc);
47
48         /* suspend output.  dc clocks are on at this point */
49         void (*suspend)(struct tegra_dc *dc);
50         /* resume output.  dc clocks are on at this point */
51         void (*resume)(struct tegra_dc *dc);
52 };
53
54 struct tegra_dc {
55         struct list_head                list;
56
57         struct nvhost_device            *ndev;
58         struct tegra_dc_platform_data   *pdata;
59
60         struct resource                 *base_res;
61         void __iomem                    *base;
62         int                             irq;
63
64         struct clk                      *clk;
65         struct clk                      *emc_clk;
66
67         bool                            enabled;
68         bool                            suspended;
69
70         struct tegra_dc_out             *out;
71         struct tegra_dc_out_ops         *out_ops;
72         void                            *out_data;
73
74         struct tegra_dc_mode            mode;
75
76         struct tegra_dc_win             windows[DC_N_WINDOWS];
77         struct tegra_dc_blend           blend;
78         int                             n_windows;
79
80         wait_queue_head_t               wq;
81
82         struct mutex                    lock;
83
84         struct resource                 *fb_mem;
85         struct tegra_fb_info            *fb;
86
87         struct tegra_overlay_info       *overlay;
88
89         u32                             syncpt_id;
90         u32                             syncpt_min;
91         u32                             syncpt_max;
92
93         unsigned long                   underflow_mask;
94         struct work_struct              reset_work;
95
96         struct completion               vblank_complete;
97
98         struct work_struct              vblank_work;
99 };
100
101 static inline void tegra_dc_io_start(struct tegra_dc *dc)
102 {
103         nvhost_module_busy(&dc->ndev->host->mod);
104 }
105
106 static inline void tegra_dc_io_end(struct tegra_dc *dc)
107 {
108         nvhost_module_idle(&dc->ndev->host->mod);
109 }
110
111 static inline unsigned long tegra_dc_readl(struct tegra_dc *dc,
112                                            unsigned long reg)
113 {
114         BUG_ON(!nvhost_module_powered(&dc->ndev->host->mod));
115         return readl(dc->base + reg * 4);
116 }
117
118 static inline void tegra_dc_writel(struct tegra_dc *dc, unsigned long val,
119                                    unsigned long reg)
120 {
121         BUG_ON(!nvhost_module_powered(&dc->ndev->host->mod));
122         writel(val, dc->base + reg * 4);
123 }
124
125 static inline void _tegra_dc_write_table(struct tegra_dc *dc, const u32 *table,
126                                          unsigned len)
127 {
128         int i;
129
130         for (i = 0; i < len; i++)
131                 tegra_dc_writel(dc, table[i * 2 + 1], table[i * 2]);
132 }
133
134 #define tegra_dc_write_table(dc, table)         \
135         _tegra_dc_write_table(dc, table, ARRAY_SIZE(table) / 2)
136
137 static inline void tegra_dc_set_outdata(struct tegra_dc *dc, void *data)
138 {
139         dc->out_data = data;
140 }
141
142 static inline void *tegra_dc_get_outdata(struct tegra_dc *dc)
143 {
144         return dc->out_data;
145 }
146
147 void tegra_dc_setup_clk(struct tegra_dc *dc, struct clk *clk);
148
149 extern struct tegra_dc_out_ops tegra_dc_rgb_ops;
150 extern struct tegra_dc_out_ops tegra_dc_hdmi_ops;
151 extern struct tegra_dc_out_ops tegra_dc_dsi_ops;
152
153 void __devexit tegra_dc_remove_sysfs(struct device *dev);
154 void tegra_dc_create_sysfs(struct device *dev);
155 #endif
156