]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/gpu/drm/tegra/drm.h
drm/tegra: dc: Add powergate support
[karo-tx-linux.git] / drivers / gpu / drm / tegra / drm.h
1 /*
2  * Copyright (C) 2012 Avionic Design GmbH
3  * Copyright (C) 2012-2013 NVIDIA CORPORATION.  All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9
10 #ifndef HOST1X_DRM_H
11 #define HOST1X_DRM_H 1
12
13 #include <uapi/drm/tegra_drm.h>
14 #include <linux/host1x.h>
15
16 #include <drm/drmP.h>
17 #include <drm/drm_crtc_helper.h>
18 #include <drm/drm_edid.h>
19 #include <drm/drm_fb_helper.h>
20 #include <drm/drm_fixed.h>
21
22 #include "gem.h"
23
24 struct reset_control;
25
26 struct tegra_fb {
27         struct drm_framebuffer base;
28         struct tegra_bo **planes;
29         unsigned int num_planes;
30 };
31
32 #ifdef CONFIG_DRM_TEGRA_FBDEV
33 struct tegra_fbdev {
34         struct drm_fb_helper base;
35         struct tegra_fb *fb;
36 };
37 #endif
38
39 struct tegra_drm {
40         struct drm_device *drm;
41
42         struct mutex clients_lock;
43         struct list_head clients;
44
45 #ifdef CONFIG_DRM_TEGRA_FBDEV
46         struct tegra_fbdev *fbdev;
47 #endif
48
49         unsigned int pitch_align;
50 };
51
52 struct tegra_drm_client;
53
54 struct tegra_drm_context {
55         struct tegra_drm_client *client;
56         struct host1x_channel *channel;
57         struct list_head list;
58 };
59
60 struct tegra_drm_client_ops {
61         int (*open_channel)(struct tegra_drm_client *client,
62                             struct tegra_drm_context *context);
63         void (*close_channel)(struct tegra_drm_context *context);
64         int (*is_addr_reg)(struct device *dev, u32 class, u32 offset);
65         int (*submit)(struct tegra_drm_context *context,
66                       struct drm_tegra_submit *args, struct drm_device *drm,
67                       struct drm_file *file);
68 };
69
70 int tegra_drm_submit(struct tegra_drm_context *context,
71                      struct drm_tegra_submit *args, struct drm_device *drm,
72                      struct drm_file *file);
73
74 struct tegra_drm_client {
75         struct host1x_client base;
76         struct list_head list;
77
78         const struct tegra_drm_client_ops *ops;
79 };
80
81 static inline struct tegra_drm_client *
82 host1x_to_drm_client(struct host1x_client *client)
83 {
84         return container_of(client, struct tegra_drm_client, base);
85 }
86
87 int tegra_drm_register_client(struct tegra_drm *tegra,
88                               struct tegra_drm_client *client);
89 int tegra_drm_unregister_client(struct tegra_drm *tegra,
90                                 struct tegra_drm_client *client);
91
92 int tegra_drm_init(struct tegra_drm *tegra, struct drm_device *drm);
93 int tegra_drm_exit(struct tegra_drm *tegra);
94
95 struct tegra_dc_soc_info;
96 struct tegra_output;
97
98 struct tegra_dc {
99         struct host1x_client client;
100         struct device *dev;
101         spinlock_t lock;
102
103         struct drm_crtc base;
104         int powergate;
105         int pipe;
106
107         struct clk *clk;
108         struct reset_control *rst;
109         void __iomem *regs;
110         int irq;
111
112         struct tegra_output *rgb;
113
114         struct list_head list;
115
116         struct drm_info_list *debugfs_files;
117         struct drm_minor *minor;
118         struct dentry *debugfs;
119
120         /* page-flip handling */
121         struct drm_pending_vblank_event *event;
122
123         const struct tegra_dc_soc_info *soc;
124 };
125
126 static inline struct tegra_dc *
127 host1x_client_to_dc(struct host1x_client *client)
128 {
129         return container_of(client, struct tegra_dc, client);
130 }
131
132 static inline struct tegra_dc *to_tegra_dc(struct drm_crtc *crtc)
133 {
134         return crtc ? container_of(crtc, struct tegra_dc, base) : NULL;
135 }
136
137 static inline void tegra_dc_writel(struct tegra_dc *dc, unsigned long value,
138                                    unsigned long reg)
139 {
140         writel(value, dc->regs + (reg << 2));
141 }
142
143 static inline unsigned long tegra_dc_readl(struct tegra_dc *dc,
144                                            unsigned long reg)
145 {
146         return readl(dc->regs + (reg << 2));
147 }
148
149 struct tegra_dc_window {
150         struct {
151                 unsigned int x;
152                 unsigned int y;
153                 unsigned int w;
154                 unsigned int h;
155         } src;
156         struct {
157                 unsigned int x;
158                 unsigned int y;
159                 unsigned int w;
160                 unsigned int h;
161         } dst;
162         unsigned int bits_per_pixel;
163         unsigned int format;
164         unsigned int swap;
165         unsigned int stride[2];
166         unsigned long base[3];
167         bool bottom_up;
168
169         struct tegra_bo_tiling tiling;
170 };
171
172 /* from dc.c */
173 void tegra_dc_enable_vblank(struct tegra_dc *dc);
174 void tegra_dc_disable_vblank(struct tegra_dc *dc);
175 void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file);
176
177 struct tegra_output_ops {
178         int (*enable)(struct tegra_output *output);
179         int (*disable)(struct tegra_output *output);
180         int (*setup_clock)(struct tegra_output *output, struct clk *clk,
181                            unsigned long pclk, unsigned int *div);
182         int (*check_mode)(struct tegra_output *output,
183                           struct drm_display_mode *mode,
184                           enum drm_mode_status *status);
185         enum drm_connector_status (*detect)(struct tegra_output *output);
186 };
187
188 enum tegra_output_type {
189         TEGRA_OUTPUT_RGB,
190         TEGRA_OUTPUT_HDMI,
191         TEGRA_OUTPUT_DSI,
192         TEGRA_OUTPUT_EDP,
193 };
194
195 struct tegra_output {
196         struct device_node *of_node;
197         struct device *dev;
198
199         const struct tegra_output_ops *ops;
200         enum tegra_output_type type;
201
202         struct drm_panel *panel;
203         struct i2c_adapter *ddc;
204         const struct edid *edid;
205         unsigned int hpd_irq;
206         int hpd_gpio;
207
208         struct drm_encoder encoder;
209         struct drm_connector connector;
210 };
211
212 static inline struct tegra_output *encoder_to_output(struct drm_encoder *e)
213 {
214         return container_of(e, struct tegra_output, encoder);
215 }
216
217 static inline struct tegra_output *connector_to_output(struct drm_connector *c)
218 {
219         return container_of(c, struct tegra_output, connector);
220 }
221
222 static inline int tegra_output_enable(struct tegra_output *output)
223 {
224         if (output && output->ops && output->ops->enable)
225                 return output->ops->enable(output);
226
227         return output ? -ENOSYS : -EINVAL;
228 }
229
230 static inline int tegra_output_disable(struct tegra_output *output)
231 {
232         if (output && output->ops && output->ops->disable)
233                 return output->ops->disable(output);
234
235         return output ? -ENOSYS : -EINVAL;
236 }
237
238 static inline int tegra_output_setup_clock(struct tegra_output *output,
239                                            struct clk *clk, unsigned long pclk,
240                                            unsigned int *div)
241 {
242         if (output && output->ops && output->ops->setup_clock)
243                 return output->ops->setup_clock(output, clk, pclk, div);
244
245         return output ? -ENOSYS : -EINVAL;
246 }
247
248 static inline int tegra_output_check_mode(struct tegra_output *output,
249                                           struct drm_display_mode *mode,
250                                           enum drm_mode_status *status)
251 {
252         if (output && output->ops && output->ops->check_mode)
253                 return output->ops->check_mode(output, mode, status);
254
255         return output ? -ENOSYS : -EINVAL;
256 }
257
258 /* from rgb.c */
259 int tegra_dc_rgb_probe(struct tegra_dc *dc);
260 int tegra_dc_rgb_remove(struct tegra_dc *dc);
261 int tegra_dc_rgb_init(struct drm_device *drm, struct tegra_dc *dc);
262 int tegra_dc_rgb_exit(struct tegra_dc *dc);
263
264 /* from output.c */
265 int tegra_output_probe(struct tegra_output *output);
266 int tegra_output_remove(struct tegra_output *output);
267 int tegra_output_init(struct drm_device *drm, struct tegra_output *output);
268 int tegra_output_exit(struct tegra_output *output);
269
270 /* from dpaux.c */
271 struct tegra_dpaux;
272 struct drm_dp_link;
273
274 struct tegra_dpaux *tegra_dpaux_find_by_of_node(struct device_node *np);
275 enum drm_connector_status tegra_dpaux_detect(struct tegra_dpaux *dpaux);
276 int tegra_dpaux_attach(struct tegra_dpaux *dpaux, struct tegra_output *output);
277 int tegra_dpaux_detach(struct tegra_dpaux *dpaux);
278 int tegra_dpaux_enable(struct tegra_dpaux *dpaux);
279 int tegra_dpaux_disable(struct tegra_dpaux *dpaux);
280 int tegra_dpaux_prepare(struct tegra_dpaux *dpaux, u8 encoding);
281 int tegra_dpaux_train(struct tegra_dpaux *dpaux, struct drm_dp_link *link,
282                       u8 pattern);
283
284 /* from fb.c */
285 struct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer *framebuffer,
286                                     unsigned int index);
287 bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer);
288 int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
289                         struct tegra_bo_tiling *tiling);
290 int tegra_drm_fb_prepare(struct drm_device *drm);
291 int tegra_drm_fb_init(struct drm_device *drm);
292 void tegra_drm_fb_exit(struct drm_device *drm);
293 #ifdef CONFIG_DRM_TEGRA_FBDEV
294 void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev);
295 #endif
296
297 extern struct platform_driver tegra_dc_driver;
298 extern struct platform_driver tegra_dsi_driver;
299 extern struct platform_driver tegra_sor_driver;
300 extern struct platform_driver tegra_hdmi_driver;
301 extern struct platform_driver tegra_dpaux_driver;
302 extern struct platform_driver tegra_gr2d_driver;
303 extern struct platform_driver tegra_gr3d_driver;
304
305 #endif /* HOST1X_DRM_H */