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