xref: /linux/drivers/gpu/drm/gma500/oaktrail_hdmi.c (revision 6c8c1406)
1 /*
2  * Copyright © 2010 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  *
23  * Authors:
24  *	Li Peng <peng.li@intel.com>
25  */
26 
27 #include <linux/delay.h>
28 
29 #include <drm/drm.h>
30 #include <drm/drm_edid.h>
31 #include <drm/drm_simple_kms_helper.h>
32 
33 #include "psb_drv.h"
34 #include "psb_intel_drv.h"
35 #include "psb_intel_reg.h"
36 
37 #define HDMI_READ(reg)		readl(hdmi_dev->regs + (reg))
38 #define HDMI_WRITE(reg, val)	writel(val, hdmi_dev->regs + (reg))
39 
40 #define HDMI_HCR	0x1000
41 #define HCR_ENABLE_HDCP		(1 << 5)
42 #define HCR_ENABLE_AUDIO	(1 << 2)
43 #define HCR_ENABLE_PIXEL	(1 << 1)
44 #define HCR_ENABLE_TMDS		(1 << 0)
45 
46 #define HDMI_HICR	0x1004
47 #define HDMI_HSR	0x1008
48 #define HDMI_HISR	0x100C
49 #define HDMI_DETECT_HDP		(1 << 0)
50 
51 #define HDMI_VIDEO_REG	0x3000
52 #define HDMI_UNIT_EN		(1 << 7)
53 #define HDMI_MODE_OUTPUT	(1 << 0)
54 #define HDMI_HBLANK_A	0x3100
55 
56 #define HDMI_AUDIO_CTRL	0x4000
57 #define HDMI_ENABLE_AUDIO	(1 << 0)
58 
59 #define PCH_HTOTAL_B	0x3100
60 #define PCH_HBLANK_B	0x3104
61 #define PCH_HSYNC_B	0x3108
62 #define PCH_VTOTAL_B	0x310C
63 #define PCH_VBLANK_B	0x3110
64 #define PCH_VSYNC_B	0x3114
65 #define PCH_PIPEBSRC	0x311C
66 
67 #define PCH_PIPEB_DSL	0x3800
68 #define PCH_PIPEB_SLC	0x3804
69 #define PCH_PIPEBCONF	0x3808
70 #define PCH_PIPEBSTAT	0x3824
71 
72 #define CDVO_DFT	0x5000
73 #define CDVO_SLEWRATE	0x5004
74 #define CDVO_STRENGTH	0x5008
75 #define CDVO_RCOMP	0x500C
76 
77 #define DPLL_CTRL       0x6000
78 #define DPLL_PDIV_SHIFT		16
79 #define DPLL_PDIV_MASK		(0xf << 16)
80 #define DPLL_PWRDN		(1 << 4)
81 #define DPLL_RESET		(1 << 3)
82 #define DPLL_FASTEN		(1 << 2)
83 #define DPLL_ENSTAT		(1 << 1)
84 #define DPLL_DITHEN		(1 << 0)
85 
86 #define DPLL_DIV_CTRL   0x6004
87 #define DPLL_CLKF_MASK		0xffffffc0
88 #define DPLL_CLKR_MASK		(0x3f)
89 
90 #define DPLL_CLK_ENABLE 0x6008
91 #define DPLL_EN_DISP		(1 << 31)
92 #define DPLL_SEL_HDMI		(1 << 8)
93 #define DPLL_EN_HDMI		(1 << 1)
94 #define DPLL_EN_VGA		(1 << 0)
95 
96 #define DPLL_ADJUST     0x600C
97 #define DPLL_STATUS     0x6010
98 #define DPLL_UPDATE     0x6014
99 #define DPLL_DFT        0x6020
100 
101 struct intel_range {
102 	int	min, max;
103 };
104 
105 struct oaktrail_hdmi_limit {
106 	struct intel_range vco, np, nr, nf;
107 };
108 
109 struct oaktrail_hdmi_clock {
110 	int np;
111 	int nr;
112 	int nf;
113 	int dot;
114 };
115 
116 #define VCO_MIN		320000
117 #define VCO_MAX		1650000
118 #define	NP_MIN		1
119 #define	NP_MAX		15
120 #define	NR_MIN		1
121 #define	NR_MAX		64
122 #define NF_MIN		2
123 #define NF_MAX		4095
124 
125 static const struct oaktrail_hdmi_limit oaktrail_hdmi_limit = {
126 	.vco = { .min = VCO_MIN,		.max = VCO_MAX },
127 	.np  = { .min = NP_MIN,			.max = NP_MAX  },
128 	.nr  = { .min = NR_MIN,			.max = NR_MAX  },
129 	.nf  = { .min = NF_MIN,			.max = NF_MAX  },
130 };
131 
132 static void oaktrail_hdmi_audio_enable(struct drm_device *dev)
133 {
134 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
135 	struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
136 
137 	HDMI_WRITE(HDMI_HCR, 0x67);
138 	HDMI_READ(HDMI_HCR);
139 
140 	HDMI_WRITE(0x51a8, 0x10);
141 	HDMI_READ(0x51a8);
142 
143 	HDMI_WRITE(HDMI_AUDIO_CTRL, 0x1);
144 	HDMI_READ(HDMI_AUDIO_CTRL);
145 }
146 
147 static void oaktrail_hdmi_audio_disable(struct drm_device *dev)
148 {
149 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
150 	struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
151 
152 	HDMI_WRITE(0x51a8, 0x0);
153 	HDMI_READ(0x51a8);
154 
155 	HDMI_WRITE(HDMI_AUDIO_CTRL, 0x0);
156 	HDMI_READ(HDMI_AUDIO_CTRL);
157 
158 	HDMI_WRITE(HDMI_HCR, 0x47);
159 	HDMI_READ(HDMI_HCR);
160 }
161 
162 static unsigned int htotal_calculate(struct drm_display_mode *mode)
163 {
164 	u32 new_crtc_htotal;
165 
166 	/*
167 	 * 1024 x 768  new_crtc_htotal = 0x1024;
168 	 * 1280 x 1024 new_crtc_htotal = 0x0c34;
169 	 */
170 	new_crtc_htotal = (mode->crtc_htotal - 1) * 200 * 1000 / mode->clock;
171 
172 	DRM_DEBUG_KMS("new crtc htotal 0x%4x\n", new_crtc_htotal);
173 	return (mode->crtc_hdisplay - 1) | (new_crtc_htotal << 16);
174 }
175 
176 static void oaktrail_hdmi_find_dpll(struct drm_crtc *crtc, int target,
177 				int refclk, struct oaktrail_hdmi_clock *best_clock)
178 {
179 	int np_min, np_max, nr_min, nr_max;
180 	int np, nr, nf;
181 
182 	np_min = DIV_ROUND_UP(oaktrail_hdmi_limit.vco.min, target * 10);
183 	np_max = oaktrail_hdmi_limit.vco.max / (target * 10);
184 	if (np_min < oaktrail_hdmi_limit.np.min)
185 		np_min = oaktrail_hdmi_limit.np.min;
186 	if (np_max > oaktrail_hdmi_limit.np.max)
187 		np_max = oaktrail_hdmi_limit.np.max;
188 
189 	nr_min = DIV_ROUND_UP((refclk * 1000), (target * 10 * np_max));
190 	nr_max = DIV_ROUND_UP((refclk * 1000), (target * 10 * np_min));
191 	if (nr_min < oaktrail_hdmi_limit.nr.min)
192 		nr_min = oaktrail_hdmi_limit.nr.min;
193 	if (nr_max > oaktrail_hdmi_limit.nr.max)
194 		nr_max = oaktrail_hdmi_limit.nr.max;
195 
196 	np = DIV_ROUND_UP((refclk * 1000), (target * 10 * nr_max));
197 	nr = DIV_ROUND_UP((refclk * 1000), (target * 10 * np));
198 	nf = DIV_ROUND_CLOSEST((target * 10 * np * nr), refclk);
199 	DRM_DEBUG_KMS("np, nr, nf %d %d %d\n", np, nr, nf);
200 
201 	/*
202 	 * 1024 x 768  np = 1; nr = 0x26; nf = 0x0fd8000;
203 	 * 1280 x 1024 np = 1; nr = 0x17; nf = 0x1034000;
204 	 */
205 	best_clock->np = np;
206 	best_clock->nr = nr - 1;
207 	best_clock->nf = (nf << 14);
208 }
209 
210 static void scu_busy_loop(void __iomem *scu_base)
211 {
212 	u32 status = 0;
213 	u32 loop_count = 0;
214 
215 	status = readl(scu_base + 0x04);
216 	while (status & 1) {
217 		udelay(1); /* scu processing time is in few u secods */
218 		status = readl(scu_base + 0x04);
219 		loop_count++;
220 		/* break if scu doesn't reset busy bit after huge retry */
221 		if (loop_count > 1000) {
222 			DRM_DEBUG_KMS("SCU IPC timed out");
223 			return;
224 		}
225 	}
226 }
227 
228 /*
229  *	You don't want to know, you really really don't want to know....
230  *
231  *	This is magic. However it's safe magic because of the way the platform
232  *	works and it is necessary magic.
233  */
234 static void oaktrail_hdmi_reset(struct drm_device *dev)
235 {
236 	void __iomem *base;
237 	unsigned long scu_ipc_mmio = 0xff11c000UL;
238 	int scu_len = 1024;
239 
240 	base = ioremap((resource_size_t)scu_ipc_mmio, scu_len);
241 	if (base == NULL) {
242 		DRM_ERROR("failed to map scu mmio\n");
243 		return;
244 	}
245 
246 	/* scu ipc: assert hdmi controller reset */
247 	writel(0xff11d118, base + 0x0c);
248 	writel(0x7fffffdf, base + 0x80);
249 	writel(0x42005, base + 0x0);
250 	scu_busy_loop(base);
251 
252 	/* scu ipc: de-assert hdmi controller reset */
253 	writel(0xff11d118, base + 0x0c);
254 	writel(0x7fffffff, base + 0x80);
255 	writel(0x42005, base + 0x0);
256 	scu_busy_loop(base);
257 
258 	iounmap(base);
259 }
260 
261 int oaktrail_crtc_hdmi_mode_set(struct drm_crtc *crtc,
262 			    struct drm_display_mode *mode,
263 			    struct drm_display_mode *adjusted_mode,
264 			    int x, int y,
265 			    struct drm_framebuffer *old_fb)
266 {
267 	struct drm_device *dev = crtc->dev;
268 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
269 	struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
270 	int pipe = 1;
271 	int htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B;
272 	int hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B;
273 	int hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B;
274 	int vtot_reg = (pipe == 0) ? VTOTAL_A : VTOTAL_B;
275 	int vblank_reg = (pipe == 0) ? VBLANK_A : VBLANK_B;
276 	int vsync_reg = (pipe == 0) ? VSYNC_A : VSYNC_B;
277 	int dspsize_reg = (pipe == 0) ? DSPASIZE : DSPBSIZE;
278 	int dsppos_reg = (pipe == 0) ? DSPAPOS : DSPBPOS;
279 	int pipesrc_reg = (pipe == 0) ? PIPEASRC : PIPEBSRC;
280 	int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF;
281 	int refclk;
282 	struct oaktrail_hdmi_clock clock;
283 	u32 dspcntr, pipeconf, dpll, temp;
284 	int dspcntr_reg = DSPBCNTR;
285 
286 	if (!gma_power_begin(dev, true))
287 		return 0;
288 
289 	/* Disable the VGA plane that we never use */
290 	REG_WRITE(VGACNTRL, VGA_DISP_DISABLE);
291 
292 	/* Disable dpll if necessary */
293 	dpll = REG_READ(DPLL_CTRL);
294 	if ((dpll & DPLL_PWRDN) == 0) {
295 		REG_WRITE(DPLL_CTRL, dpll | (DPLL_PWRDN | DPLL_RESET));
296 		REG_WRITE(DPLL_DIV_CTRL, 0x00000000);
297 		REG_WRITE(DPLL_STATUS, 0x1);
298 	}
299 	udelay(150);
300 
301 	/* Reset controller */
302 	oaktrail_hdmi_reset(dev);
303 
304 	/* program and enable dpll */
305 	refclk = 25000;
306 	oaktrail_hdmi_find_dpll(crtc, adjusted_mode->clock, refclk, &clock);
307 
308 	/* Set the DPLL */
309 	dpll = REG_READ(DPLL_CTRL);
310 	dpll &= ~DPLL_PDIV_MASK;
311 	dpll &= ~(DPLL_PWRDN | DPLL_RESET);
312 	REG_WRITE(DPLL_CTRL, 0x00000008);
313 	REG_WRITE(DPLL_DIV_CTRL, ((clock.nf << 6) | clock.nr));
314 	REG_WRITE(DPLL_ADJUST, ((clock.nf >> 14) - 1));
315 	REG_WRITE(DPLL_CTRL, (dpll | (clock.np << DPLL_PDIV_SHIFT) | DPLL_ENSTAT | DPLL_DITHEN));
316 	REG_WRITE(DPLL_UPDATE, 0x80000000);
317 	REG_WRITE(DPLL_CLK_ENABLE, 0x80050102);
318 	udelay(150);
319 
320 	/* configure HDMI */
321 	HDMI_WRITE(0x1004, 0x1fd);
322 	HDMI_WRITE(0x2000, 0x1);
323 	HDMI_WRITE(0x2008, 0x0);
324 	HDMI_WRITE(0x3130, 0x8);
325 	HDMI_WRITE(0x101c, 0x1800810);
326 
327 	temp = htotal_calculate(adjusted_mode);
328 	REG_WRITE(htot_reg, temp);
329 	REG_WRITE(hblank_reg, (adjusted_mode->crtc_hblank_start - 1) | ((adjusted_mode->crtc_hblank_end - 1) << 16));
330 	REG_WRITE(hsync_reg, (adjusted_mode->crtc_hsync_start - 1) | ((adjusted_mode->crtc_hsync_end - 1) << 16));
331 	REG_WRITE(vtot_reg, (adjusted_mode->crtc_vdisplay - 1) | ((adjusted_mode->crtc_vtotal - 1) << 16));
332 	REG_WRITE(vblank_reg, (adjusted_mode->crtc_vblank_start - 1) | ((adjusted_mode->crtc_vblank_end - 1) << 16));
333 	REG_WRITE(vsync_reg, (adjusted_mode->crtc_vsync_start - 1) | ((adjusted_mode->crtc_vsync_end - 1) << 16));
334 	REG_WRITE(pipesrc_reg, ((mode->crtc_hdisplay - 1) << 16) |  (mode->crtc_vdisplay - 1));
335 
336 	REG_WRITE(PCH_HTOTAL_B, (adjusted_mode->crtc_hdisplay - 1) | ((adjusted_mode->crtc_htotal - 1) << 16));
337 	REG_WRITE(PCH_HBLANK_B, (adjusted_mode->crtc_hblank_start - 1) | ((adjusted_mode->crtc_hblank_end - 1) << 16));
338 	REG_WRITE(PCH_HSYNC_B, (adjusted_mode->crtc_hsync_start - 1) | ((adjusted_mode->crtc_hsync_end - 1) << 16));
339 	REG_WRITE(PCH_VTOTAL_B, (adjusted_mode->crtc_vdisplay - 1) | ((adjusted_mode->crtc_vtotal - 1) << 16));
340 	REG_WRITE(PCH_VBLANK_B, (adjusted_mode->crtc_vblank_start - 1) | ((adjusted_mode->crtc_vblank_end - 1) << 16));
341 	REG_WRITE(PCH_VSYNC_B, (adjusted_mode->crtc_vsync_start - 1) | ((adjusted_mode->crtc_vsync_end - 1) << 16));
342 	REG_WRITE(PCH_PIPEBSRC, ((mode->crtc_hdisplay - 1) << 16) |  (mode->crtc_vdisplay - 1));
343 
344 	temp = adjusted_mode->crtc_hblank_end - adjusted_mode->crtc_hblank_start;
345 	HDMI_WRITE(HDMI_HBLANK_A, ((adjusted_mode->crtc_hdisplay - 1) << 16) |  temp);
346 
347 	REG_WRITE(dspsize_reg, ((mode->vdisplay - 1) << 16) | (mode->hdisplay - 1));
348 	REG_WRITE(dsppos_reg, 0);
349 
350 	/* Flush the plane changes */
351 	{
352 		const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
353 		crtc_funcs->mode_set_base(crtc, x, y, old_fb);
354 	}
355 
356 	/* Set up the display plane register */
357 	dspcntr = REG_READ(dspcntr_reg);
358 	dspcntr |= DISPPLANE_GAMMA_ENABLE;
359 	dspcntr |= DISPPLANE_SEL_PIPE_B;
360 	dspcntr |= DISPLAY_PLANE_ENABLE;
361 
362 	/* setup pipeconf */
363 	pipeconf = REG_READ(pipeconf_reg);
364 	pipeconf |= PIPEACONF_ENABLE;
365 
366 	REG_WRITE(pipeconf_reg, pipeconf);
367 	REG_READ(pipeconf_reg);
368 
369 	REG_WRITE(PCH_PIPEBCONF, pipeconf);
370 	REG_READ(PCH_PIPEBCONF);
371 	gma_wait_for_vblank(dev);
372 
373 	REG_WRITE(dspcntr_reg, dspcntr);
374 	gma_wait_for_vblank(dev);
375 
376 	gma_power_end(dev);
377 
378 	return 0;
379 }
380 
381 void oaktrail_crtc_hdmi_dpms(struct drm_crtc *crtc, int mode)
382 {
383 	struct drm_device *dev = crtc->dev;
384 	u32 temp;
385 
386 	DRM_DEBUG_KMS("%s %d\n", __func__, mode);
387 
388 	switch (mode) {
389 	case DRM_MODE_DPMS_OFF:
390 		REG_WRITE(VGACNTRL, 0x80000000);
391 
392 		/* Disable plane */
393 		temp = REG_READ(DSPBCNTR);
394 		if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
395 			REG_WRITE(DSPBCNTR, temp & ~DISPLAY_PLANE_ENABLE);
396 			REG_READ(DSPBCNTR);
397 			/* Flush the plane changes */
398 			REG_WRITE(DSPBSURF, REG_READ(DSPBSURF));
399 			REG_READ(DSPBSURF);
400 		}
401 
402 		/* Disable pipe B */
403 		temp = REG_READ(PIPEBCONF);
404 		if ((temp & PIPEACONF_ENABLE) != 0) {
405 			REG_WRITE(PIPEBCONF, temp & ~PIPEACONF_ENABLE);
406 			REG_READ(PIPEBCONF);
407 		}
408 
409 		/* Disable LNW Pipes, etc */
410 		temp = REG_READ(PCH_PIPEBCONF);
411 		if ((temp & PIPEACONF_ENABLE) != 0) {
412 			REG_WRITE(PCH_PIPEBCONF, temp & ~PIPEACONF_ENABLE);
413 			REG_READ(PCH_PIPEBCONF);
414 		}
415 
416 		/* wait for pipe off */
417 		udelay(150);
418 
419 		/* Disable dpll */
420 		temp = REG_READ(DPLL_CTRL);
421 		if ((temp & DPLL_PWRDN) == 0) {
422 			REG_WRITE(DPLL_CTRL, temp | (DPLL_PWRDN | DPLL_RESET));
423 			REG_WRITE(DPLL_STATUS, 0x1);
424 		}
425 
426 		/* wait for dpll off */
427 		udelay(150);
428 
429 		break;
430 	case DRM_MODE_DPMS_ON:
431 	case DRM_MODE_DPMS_STANDBY:
432 	case DRM_MODE_DPMS_SUSPEND:
433 		/* Enable dpll */
434 		temp = REG_READ(DPLL_CTRL);
435 		if ((temp & DPLL_PWRDN) != 0) {
436 			REG_WRITE(DPLL_CTRL, temp & ~(DPLL_PWRDN | DPLL_RESET));
437 			temp = REG_READ(DPLL_CLK_ENABLE);
438 			REG_WRITE(DPLL_CLK_ENABLE, temp | DPLL_EN_DISP | DPLL_SEL_HDMI | DPLL_EN_HDMI);
439 			REG_READ(DPLL_CLK_ENABLE);
440 		}
441 		/* wait for dpll warm up */
442 		udelay(150);
443 
444 		/* Enable pipe B */
445 		temp = REG_READ(PIPEBCONF);
446 		if ((temp & PIPEACONF_ENABLE) == 0) {
447 			REG_WRITE(PIPEBCONF, temp | PIPEACONF_ENABLE);
448 			REG_READ(PIPEBCONF);
449 		}
450 
451 		/* Enable LNW Pipe B */
452 		temp = REG_READ(PCH_PIPEBCONF);
453 		if ((temp & PIPEACONF_ENABLE) == 0) {
454 			REG_WRITE(PCH_PIPEBCONF, temp | PIPEACONF_ENABLE);
455 			REG_READ(PCH_PIPEBCONF);
456 		}
457 
458 		gma_wait_for_vblank(dev);
459 
460 		/* Enable plane */
461 		temp = REG_READ(DSPBCNTR);
462 		if ((temp & DISPLAY_PLANE_ENABLE) == 0) {
463 			REG_WRITE(DSPBCNTR, temp | DISPLAY_PLANE_ENABLE);
464 			/* Flush the plane changes */
465 			REG_WRITE(DSPBSURF, REG_READ(DSPBSURF));
466 			REG_READ(DSPBSURF);
467 		}
468 
469 		gma_crtc_load_lut(crtc);
470 	}
471 
472 	/* DSPARB */
473 	REG_WRITE(DSPARB, 0x00003fbf);
474 
475 	/* FW1 */
476 	REG_WRITE(0x70034, 0x3f880a0a);
477 
478 	/* FW2 */
479 	REG_WRITE(0x70038, 0x0b060808);
480 
481 	/* FW4 */
482 	REG_WRITE(0x70050, 0x08030404);
483 
484 	/* FW5 */
485 	REG_WRITE(0x70054, 0x04040404);
486 
487 	/* LNC Chicken Bits - Squawk! */
488 	REG_WRITE(0x70400, 0x4000);
489 
490 	return;
491 }
492 
493 static void oaktrail_hdmi_dpms(struct drm_encoder *encoder, int mode)
494 {
495 	static int dpms_mode = -1;
496 
497 	struct drm_device *dev = encoder->dev;
498 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
499 	struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
500 	u32 temp;
501 
502 	if (dpms_mode == mode)
503 		return;
504 
505 	if (mode != DRM_MODE_DPMS_ON)
506 		temp = 0x0;
507 	else
508 		temp = 0x99;
509 
510 	dpms_mode = mode;
511 	HDMI_WRITE(HDMI_VIDEO_REG, temp);
512 }
513 
514 static enum drm_mode_status oaktrail_hdmi_mode_valid(struct drm_connector *connector,
515 				struct drm_display_mode *mode)
516 {
517 	if (mode->clock > 165000)
518 		return MODE_CLOCK_HIGH;
519 	if (mode->clock < 20000)
520 		return MODE_CLOCK_LOW;
521 
522 	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
523 		return MODE_NO_DBLESCAN;
524 
525 	return MODE_OK;
526 }
527 
528 static enum drm_connector_status
529 oaktrail_hdmi_detect(struct drm_connector *connector, bool force)
530 {
531 	enum drm_connector_status status;
532 	struct drm_device *dev = connector->dev;
533 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
534 	struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
535 	u32 temp;
536 
537 	temp = HDMI_READ(HDMI_HSR);
538 	DRM_DEBUG_KMS("HDMI_HSR %x\n", temp);
539 
540 	if ((temp & HDMI_DETECT_HDP) != 0)
541 		status = connector_status_connected;
542 	else
543 		status = connector_status_disconnected;
544 
545 	return status;
546 }
547 
548 static const unsigned char raw_edid[] = {
549 	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x10, 0xac, 0x2f, 0xa0,
550 	0x53, 0x55, 0x33, 0x30, 0x16, 0x13, 0x01, 0x03, 0x0e, 0x3a, 0x24, 0x78,
551 	0xea, 0xe9, 0xf5, 0xac, 0x51, 0x30, 0xb4, 0x25, 0x11, 0x50, 0x54, 0xa5,
552 	0x4b, 0x00, 0x81, 0x80, 0xa9, 0x40, 0x71, 0x4f, 0xb3, 0x00, 0x01, 0x01,
553 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x28, 0x3c, 0x80, 0xa0, 0x70, 0xb0,
554 	0x23, 0x40, 0x30, 0x20, 0x36, 0x00, 0x46, 0x6c, 0x21, 0x00, 0x00, 0x1a,
555 	0x00, 0x00, 0x00, 0xff, 0x00, 0x47, 0x4e, 0x37, 0x32, 0x31, 0x39, 0x35,
556 	0x52, 0x30, 0x33, 0x55, 0x53, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x44,
557 	0x45, 0x4c, 0x4c, 0x20, 0x32, 0x37, 0x30, 0x39, 0x57, 0x0a, 0x20, 0x20,
558 	0x00, 0x00, 0x00, 0xfd, 0x00, 0x38, 0x4c, 0x1e, 0x53, 0x11, 0x00, 0x0a,
559 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x8d
560 };
561 
562 static int oaktrail_hdmi_get_modes(struct drm_connector *connector)
563 {
564 	struct i2c_adapter *i2c_adap;
565 	struct edid *edid;
566 	int ret = 0;
567 
568 	/*
569 	 *	FIXME: We need to figure this lot out. In theory we can
570 	 *	read the EDID somehow but I've yet to find working reference
571 	 *	code.
572 	 */
573 	i2c_adap = i2c_get_adapter(3);
574 	if (i2c_adap == NULL) {
575 		DRM_ERROR("No ddc adapter available!\n");
576 		edid = (struct edid *)raw_edid;
577 	} else {
578 		edid = (struct edid *)raw_edid;
579 		/* FIXME ? edid = drm_get_edid(connector, i2c_adap); */
580 	}
581 
582 	if (edid) {
583 		drm_connector_update_edid_property(connector, edid);
584 		ret = drm_add_edid_modes(connector, edid);
585 	}
586 	return ret;
587 }
588 
589 static void oaktrail_hdmi_mode_set(struct drm_encoder *encoder,
590 			       struct drm_display_mode *mode,
591 			       struct drm_display_mode *adjusted_mode)
592 {
593 	struct drm_device *dev = encoder->dev;
594 
595 	oaktrail_hdmi_audio_enable(dev);
596 	return;
597 }
598 
599 static void oaktrail_hdmi_destroy(struct drm_connector *connector)
600 {
601 	return;
602 }
603 
604 static const struct drm_encoder_helper_funcs oaktrail_hdmi_helper_funcs = {
605 	.dpms = oaktrail_hdmi_dpms,
606 	.prepare = gma_encoder_prepare,
607 	.mode_set = oaktrail_hdmi_mode_set,
608 	.commit = gma_encoder_commit,
609 };
610 
611 static const struct drm_connector_helper_funcs
612 					oaktrail_hdmi_connector_helper_funcs = {
613 	.get_modes = oaktrail_hdmi_get_modes,
614 	.mode_valid = oaktrail_hdmi_mode_valid,
615 	.best_encoder = gma_best_encoder,
616 };
617 
618 static const struct drm_connector_funcs oaktrail_hdmi_connector_funcs = {
619 	.dpms = drm_helper_connector_dpms,
620 	.detect = oaktrail_hdmi_detect,
621 	.fill_modes = drm_helper_probe_single_connector_modes,
622 	.destroy = oaktrail_hdmi_destroy,
623 };
624 
625 void oaktrail_hdmi_init(struct drm_device *dev,
626 					struct psb_intel_mode_device *mode_dev)
627 {
628 	struct gma_encoder *gma_encoder;
629 	struct gma_connector *gma_connector;
630 	struct drm_connector *connector;
631 	struct drm_encoder *encoder;
632 
633 	gma_encoder = kzalloc(sizeof(struct gma_encoder), GFP_KERNEL);
634 	if (!gma_encoder)
635 		return;
636 
637 	gma_connector = kzalloc(sizeof(struct gma_connector), GFP_KERNEL);
638 	if (!gma_connector)
639 		goto failed_connector;
640 
641 	connector = &gma_connector->base;
642 	encoder = &gma_encoder->base;
643 	drm_connector_init(dev, connector,
644 			   &oaktrail_hdmi_connector_funcs,
645 			   DRM_MODE_CONNECTOR_DVID);
646 
647 	drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_TMDS);
648 
649 	gma_connector_attach_encoder(gma_connector, gma_encoder);
650 
651 	gma_encoder->type = INTEL_OUTPUT_HDMI;
652 	drm_encoder_helper_add(encoder, &oaktrail_hdmi_helper_funcs);
653 	drm_connector_helper_add(connector, &oaktrail_hdmi_connector_helper_funcs);
654 
655 	connector->display_info.subpixel_order = SubPixelHorizontalRGB;
656 	connector->interlace_allowed = false;
657 	connector->doublescan_allowed = false;
658 	dev_info(dev->dev, "HDMI initialised.\n");
659 
660 	return;
661 
662 failed_connector:
663 	kfree(gma_encoder);
664 }
665 
666 void oaktrail_hdmi_setup(struct drm_device *dev)
667 {
668 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
669 	struct pci_dev *pdev;
670 	struct oaktrail_hdmi_dev *hdmi_dev;
671 	int ret;
672 
673 	pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x080d, NULL);
674 	if (!pdev)
675 		return;
676 
677 	hdmi_dev = kzalloc(sizeof(struct oaktrail_hdmi_dev), GFP_KERNEL);
678 	if (!hdmi_dev) {
679 		dev_err(dev->dev, "failed to allocate memory\n");
680 		goto out;
681 	}
682 
683 
684 	ret = pci_enable_device(pdev);
685 	if (ret) {
686 		dev_err(dev->dev, "failed to enable hdmi controller\n");
687 		goto free;
688 	}
689 
690 	hdmi_dev->mmio = pci_resource_start(pdev, 0);
691 	hdmi_dev->mmio_len = pci_resource_len(pdev, 0);
692 	hdmi_dev->regs = ioremap(hdmi_dev->mmio, hdmi_dev->mmio_len);
693 	if (!hdmi_dev->regs) {
694 		dev_err(dev->dev, "failed to map hdmi mmio\n");
695 		goto free;
696 	}
697 
698 	hdmi_dev->dev = pdev;
699 	pci_set_drvdata(pdev, hdmi_dev);
700 
701 	/* Initialize i2c controller */
702 	ret = oaktrail_hdmi_i2c_init(hdmi_dev->dev);
703 	if (ret)
704 		dev_err(dev->dev, "HDMI I2C initialization failed\n");
705 
706 	dev_priv->hdmi_priv = hdmi_dev;
707 	oaktrail_hdmi_audio_disable(dev);
708 
709 	dev_info(dev->dev, "HDMI hardware present.\n");
710 
711 	return;
712 
713 free:
714 	kfree(hdmi_dev);
715 out:
716 	return;
717 }
718 
719 void oaktrail_hdmi_teardown(struct drm_device *dev)
720 {
721 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
722 	struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
723 	struct pci_dev *pdev;
724 
725 	if (hdmi_dev) {
726 		pdev = hdmi_dev->dev;
727 		pci_set_drvdata(pdev, NULL);
728 		oaktrail_hdmi_i2c_exit(pdev);
729 		iounmap(hdmi_dev->regs);
730 		kfree(hdmi_dev);
731 		pci_dev_put(pdev);
732 	}
733 }
734 
735 /* save HDMI register state */
736 void oaktrail_hdmi_save(struct drm_device *dev)
737 {
738 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
739 	struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
740 	struct psb_state *regs = &dev_priv->regs.psb;
741 	struct psb_pipe *pipeb = &dev_priv->regs.pipe[1];
742 	int i;
743 
744 	/* dpll */
745 	hdmi_dev->saveDPLL_CTRL = PSB_RVDC32(DPLL_CTRL);
746 	hdmi_dev->saveDPLL_DIV_CTRL = PSB_RVDC32(DPLL_DIV_CTRL);
747 	hdmi_dev->saveDPLL_ADJUST = PSB_RVDC32(DPLL_ADJUST);
748 	hdmi_dev->saveDPLL_UPDATE = PSB_RVDC32(DPLL_UPDATE);
749 	hdmi_dev->saveDPLL_CLK_ENABLE = PSB_RVDC32(DPLL_CLK_ENABLE);
750 
751 	/* pipe B */
752 	pipeb->conf = PSB_RVDC32(PIPEBCONF);
753 	pipeb->src = PSB_RVDC32(PIPEBSRC);
754 	pipeb->htotal = PSB_RVDC32(HTOTAL_B);
755 	pipeb->hblank = PSB_RVDC32(HBLANK_B);
756 	pipeb->hsync = PSB_RVDC32(HSYNC_B);
757 	pipeb->vtotal = PSB_RVDC32(VTOTAL_B);
758 	pipeb->vblank = PSB_RVDC32(VBLANK_B);
759 	pipeb->vsync = PSB_RVDC32(VSYNC_B);
760 
761 	hdmi_dev->savePCH_PIPEBCONF = PSB_RVDC32(PCH_PIPEBCONF);
762 	hdmi_dev->savePCH_PIPEBSRC = PSB_RVDC32(PCH_PIPEBSRC);
763 	hdmi_dev->savePCH_HTOTAL_B = PSB_RVDC32(PCH_HTOTAL_B);
764 	hdmi_dev->savePCH_HBLANK_B = PSB_RVDC32(PCH_HBLANK_B);
765 	hdmi_dev->savePCH_HSYNC_B  = PSB_RVDC32(PCH_HSYNC_B);
766 	hdmi_dev->savePCH_VTOTAL_B = PSB_RVDC32(PCH_VTOTAL_B);
767 	hdmi_dev->savePCH_VBLANK_B = PSB_RVDC32(PCH_VBLANK_B);
768 	hdmi_dev->savePCH_VSYNC_B  = PSB_RVDC32(PCH_VSYNC_B);
769 
770 	/* plane */
771 	pipeb->cntr = PSB_RVDC32(DSPBCNTR);
772 	pipeb->stride = PSB_RVDC32(DSPBSTRIDE);
773 	pipeb->addr = PSB_RVDC32(DSPBBASE);
774 	pipeb->surf = PSB_RVDC32(DSPBSURF);
775 	pipeb->linoff = PSB_RVDC32(DSPBLINOFF);
776 	pipeb->tileoff = PSB_RVDC32(DSPBTILEOFF);
777 
778 	/* cursor B */
779 	regs->saveDSPBCURSOR_CTRL = PSB_RVDC32(CURBCNTR);
780 	regs->saveDSPBCURSOR_BASE = PSB_RVDC32(CURBBASE);
781 	regs->saveDSPBCURSOR_POS = PSB_RVDC32(CURBPOS);
782 
783 	/* save palette */
784 	for (i = 0; i < 256; i++)
785 		pipeb->palette[i] = PSB_RVDC32(PALETTE_B + (i << 2));
786 }
787 
788 /* restore HDMI register state */
789 void oaktrail_hdmi_restore(struct drm_device *dev)
790 {
791 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
792 	struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
793 	struct psb_state *regs = &dev_priv->regs.psb;
794 	struct psb_pipe *pipeb = &dev_priv->regs.pipe[1];
795 	int i;
796 
797 	/* dpll */
798 	PSB_WVDC32(hdmi_dev->saveDPLL_CTRL, DPLL_CTRL);
799 	PSB_WVDC32(hdmi_dev->saveDPLL_DIV_CTRL, DPLL_DIV_CTRL);
800 	PSB_WVDC32(hdmi_dev->saveDPLL_ADJUST, DPLL_ADJUST);
801 	PSB_WVDC32(hdmi_dev->saveDPLL_UPDATE, DPLL_UPDATE);
802 	PSB_WVDC32(hdmi_dev->saveDPLL_CLK_ENABLE, DPLL_CLK_ENABLE);
803 	udelay(150);
804 
805 	/* pipe */
806 	PSB_WVDC32(pipeb->src, PIPEBSRC);
807 	PSB_WVDC32(pipeb->htotal, HTOTAL_B);
808 	PSB_WVDC32(pipeb->hblank, HBLANK_B);
809 	PSB_WVDC32(pipeb->hsync,  HSYNC_B);
810 	PSB_WVDC32(pipeb->vtotal, VTOTAL_B);
811 	PSB_WVDC32(pipeb->vblank, VBLANK_B);
812 	PSB_WVDC32(pipeb->vsync,  VSYNC_B);
813 
814 	PSB_WVDC32(hdmi_dev->savePCH_PIPEBSRC, PCH_PIPEBSRC);
815 	PSB_WVDC32(hdmi_dev->savePCH_HTOTAL_B, PCH_HTOTAL_B);
816 	PSB_WVDC32(hdmi_dev->savePCH_HBLANK_B, PCH_HBLANK_B);
817 	PSB_WVDC32(hdmi_dev->savePCH_HSYNC_B,  PCH_HSYNC_B);
818 	PSB_WVDC32(hdmi_dev->savePCH_VTOTAL_B, PCH_VTOTAL_B);
819 	PSB_WVDC32(hdmi_dev->savePCH_VBLANK_B, PCH_VBLANK_B);
820 	PSB_WVDC32(hdmi_dev->savePCH_VSYNC_B,  PCH_VSYNC_B);
821 
822 	PSB_WVDC32(pipeb->conf, PIPEBCONF);
823 	PSB_WVDC32(hdmi_dev->savePCH_PIPEBCONF, PCH_PIPEBCONF);
824 
825 	/* plane */
826 	PSB_WVDC32(pipeb->linoff, DSPBLINOFF);
827 	PSB_WVDC32(pipeb->stride, DSPBSTRIDE);
828 	PSB_WVDC32(pipeb->tileoff, DSPBTILEOFF);
829 	PSB_WVDC32(pipeb->cntr, DSPBCNTR);
830 	PSB_WVDC32(pipeb->surf, DSPBSURF);
831 
832 	/* cursor B */
833 	PSB_WVDC32(regs->saveDSPBCURSOR_CTRL, CURBCNTR);
834 	PSB_WVDC32(regs->saveDSPBCURSOR_POS, CURBPOS);
835 	PSB_WVDC32(regs->saveDSPBCURSOR_BASE, CURBBASE);
836 
837 	/* restore palette */
838 	for (i = 0; i < 256; i++)
839 		PSB_WVDC32(pipeb->palette[i], PALETTE_B + (i << 2));
840 }
841