summaryrefslogtreecommitdiff
path: root/drivers/staging/psb/intel_drv.h
blob: de46c6bc164b4fbe4c1d76874d3156f8f613143d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*
 * Copyright (c) 2006 Dave Airlie <airlied@linux.ie>
 * Copyright (c) 2007 Intel Corporation
 *   Jesse Barnes <jesse.barnes@intel.com>
 */
#ifndef __INTEL_DRV_H__
#define __INTEL_DRV_H__

#include <linux/i2c.h>
#include <linux/i2c-id.h>
#include <linux/i2c-algo-bit.h>
#include <drm/drm_crtc.h>

#include <drm/drm_crtc_helper.h>

/*
 * MOORESTOWN defines
 */
#define MRST_I2C 0

#define DUMP_REGISTER 0
#define MRST_24BIT_LVDS 1
#define MRST_24BIT_DOT_1 0
#define MRST_24BIT_WA 0

#define PRINT_JLIU7 0
#define DELAY_TIME1 80 /* 1000 = 1ms */

/*
 * Display related stuff
 */

/* store information about an Ixxx DVO */
/* The i830->i865 use multiple DVOs with multiple i2cs */
/* the i915, i945 have a single sDVO i2c bus - which is different */
#define MAX_OUTPUTS 6
/* maximum connectors per crtcs in the mode set */
#define INTELFB_CONN_LIMIT 4

#define INTEL_I2C_BUS_DVO 1
#define INTEL_I2C_BUS_SDVO 2

/* these are outputs from the chip - integrated only
 * external chips are via DVO or SDVO output */
#define INTEL_OUTPUT_UNUSED 0
#define INTEL_OUTPUT_ANALOG 1
#define INTEL_OUTPUT_DVO 2
#define INTEL_OUTPUT_SDVO 3
#define INTEL_OUTPUT_LVDS 4
#define INTEL_OUTPUT_TVOUT 5
#define INTEL_OUTPUT_MIPI 6

#define INTEL_DVO_CHIP_NONE 0
#define INTEL_DVO_CHIP_LVDS 1
#define INTEL_DVO_CHIP_TMDS 2
#define INTEL_DVO_CHIP_TVOUT 4

/**
 * Hold information useally put on the device driver privates here,
 * since it needs to be shared across multiple of devices drivers privates.
 */
struct intel_mode_device {

	/*
	 * Abstracted memory manager operations
	 */
	void *(*bo_from_handle) (struct drm_device *dev,
				 struct drm_file *file_priv,
				 unsigned int handle);
	 size_t(*bo_size) (struct drm_device *dev, void *bo);
	 size_t(*bo_offset) (struct drm_device *dev, void *bo);
	int (*bo_pin_for_scanout) (struct drm_device *dev, void *bo);
	int (*bo_unpin_for_scanout) (struct drm_device *dev, void *bo);

	/*
	 * Cursor
	 */
	int cursor_needs_physical;

	/*
	 * LVDS info
	 */
	int backlight_duty_cycle;	/* restore backlight to this value */
	bool panel_wants_dither;
	struct drm_display_mode *panel_fixed_mode;
	struct drm_display_mode *vbt_mode;	/* if any */

	uint32_t saveBLC_PWM_CTL;
};

struct intel_i2c_chan {
	/* for getting at dev. private (mmio etc.) */
	struct drm_device *drm_dev;
	u32 reg;		/* GPIO reg */
	struct i2c_adapter adapter;
	struct i2c_algo_bit_data algo;
	u8 slave_addr;
};

struct intel_output {
	struct drm_connector base;

	struct drm_encoder enc;
	int type;
	struct intel_i2c_chan *i2c_bus;	/* for control functions */
	struct intel_i2c_chan *ddc_bus;	/* for DDC only stuff */
	bool load_detect_temp;
	void *dev_priv;

	struct intel_mode_device *mode_dev;

};

struct intel_crtc {
	struct drm_crtc base;
	int pipe;
	int plane;
	uint32_t cursor_addr;
	u8 lut_r[256], lut_g[256], lut_b[256];
	int dpms_mode;
	struct intel_framebuffer *fbdev_fb;
	/* a mode_set for fbdev users on this crtc */
	struct drm_mode_set mode_set;

	/* current bo we scanout from */
	void *scanout_bo;

	/* current bo we cursor from */
	void *cursor_bo;

	struct intel_mode_device *mode_dev;
};

#define to_intel_crtc(x) container_of(x, struct intel_crtc, base)
#define to_intel_output(x) container_of(x, struct intel_output, base)
#define enc_to_intel_output(x) container_of(x, struct intel_output, enc)
#define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base)

struct intel_i2c_chan *intel_i2c_create(struct drm_device *dev,
					const u32 reg, const char *name);
void intel_i2c_destroy(struct intel_i2c_chan *chan);
int intel_ddc_get_modes(struct intel_output *intel_output);
extern bool intel_ddc_probe(struct intel_output *intel_output);

extern void intel_crtc_init(struct drm_device *dev, int pipe,
			    struct intel_mode_device *mode_dev);
extern void intel_crt_init(struct drm_device *dev);
extern void intel_sdvo_init(struct drm_device *dev, int output_device);
extern void intel_dvo_init(struct drm_device *dev);
extern void intel_tv_init(struct drm_device *dev);
extern void intel_lvds_init(struct drm_device *dev,
			    struct intel_mode_device *mode_dev);
extern void mrst_lvds_init(struct drm_device *dev,
			   struct intel_mode_device *mode_dev);
extern void mrst_dsi_init(struct drm_device *dev,
			   struct intel_mode_device *mode_dev);

extern void intel_crtc_load_lut(struct drm_crtc *crtc);
extern void intel_encoder_prepare(struct drm_encoder *encoder);
extern void intel_encoder_commit(struct drm_encoder *encoder);

extern struct drm_encoder *intel_best_encoder(struct drm_connector
					      *connector);

extern struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
						    struct drm_crtc *crtc);
extern void intel_wait_for_vblank(struct drm_device *dev);
extern struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev,
						 int pipe);
extern struct drm_crtc *intel_get_load_detect_pipe
			(struct intel_output *intel_output,
			 struct drm_display_mode *mode, int *dpms_mode);
extern void intel_release_load_detect_pipe(struct intel_output
					   *intel_output, int dpms_mode);

extern struct drm_connector *intel_sdvo_find(struct drm_device *dev,
					     int sdvoB);
extern int intel_sdvo_supports_hotplug(struct drm_connector *connector);
extern void intel_sdvo_set_hotplug(struct drm_connector *connector,
				   int enable);
extern int intelfb_probe(struct drm_device *dev);
extern int intelfb_remove(struct drm_device *dev,
			  struct drm_framebuffer *fb);
extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red,
				    u16 green, u16 blue, int regno);

extern struct drm_framebuffer *intel_framebuffer_create(struct drm_device
							*dev, struct
							drm_mode_fb_cmd
							*mode_cmd,
							void *mm_private);
#endif				/* __INTEL_DRV_H__ */