2 * Copyright © 2010 Intel Corporation
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:
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
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.
24 * Li Peng <peng.li@intel.com>
27 #include <linux/delay.h>
30 #include <drm/drm_edid.h>
31 #include <drm/drm_simple_kms_helper.h>
34 #include "psb_intel_drv.h"
35 #include "psb_intel_reg.h"
37 #define HDMI_READ(reg) readl(hdmi_dev->regs + (reg))
38 #define HDMI_WRITE(reg, val) writel(val, hdmi_dev->regs + (reg))
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)
46 #define HDMI_HICR 0x1004
47 #define HDMI_HSR 0x1008
48 #define HDMI_HISR 0x100C
49 #define HDMI_DETECT_HDP (1 << 0)
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
56 #define HDMI_AUDIO_CTRL 0x4000
57 #define HDMI_ENABLE_AUDIO (1 << 0)
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
67 #define PCH_PIPEB_DSL 0x3800
68 #define PCH_PIPEB_SLC 0x3804
69 #define PCH_PIPEBCONF 0x3808
70 #define PCH_PIPEBSTAT 0x3824
72 #define CDVO_DFT 0x5000
73 #define CDVO_SLEWRATE 0x5004
74 #define CDVO_STRENGTH 0x5008
75 #define CDVO_RCOMP 0x500C
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)
86 #define DPLL_DIV_CTRL 0x6004
87 #define DPLL_CLKF_MASK 0xffffffc0
88 #define DPLL_CLKR_MASK (0x3f)
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)
96 #define DPLL_ADJUST 0x600C
97 #define DPLL_STATUS 0x6010
98 #define DPLL_UPDATE 0x6014
99 #define DPLL_DFT 0x6020
105 struct oaktrail_hdmi_limit {
106 struct intel_range vco, np, nr, nf;
109 struct oaktrail_hdmi_clock {
116 #define VCO_MIN 320000
117 #define VCO_MAX 1650000
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 },
132 static void oaktrail_hdmi_audio_enable(struct drm_device *dev)
134 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
135 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
137 HDMI_WRITE(HDMI_HCR, 0x67);
140 HDMI_WRITE(0x51a8, 0x10);
143 HDMI_WRITE(HDMI_AUDIO_CTRL, 0x1);
144 HDMI_READ(HDMI_AUDIO_CTRL);
147 static void oaktrail_hdmi_audio_disable(struct drm_device *dev)
149 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
150 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv;
152 HDMI_WRITE(0x51a8, 0x0);
155 HDMI_WRITE(HDMI_AUDIO_CTRL, 0x0);
156 HDMI_READ(HDMI_AUDIO_CTRL);
158 HDMI_WRITE(HDMI_HCR, 0x47);
162 static unsigned int htotal_calculate(struct drm_display_mode *mode)
167 * 1024 x 768 new_crtc_htotal = 0x1024;
168 * 1280 x 1024 new_crtc_htotal = 0x0c34;
170 new_crtc_htotal = (mode->crtc_htotal - 1) * 200 * 1000 / mode->clock;
172 DRM_DEBUG_KMS("new crtc htotal 0x%4x\n", new_crtc_htotal);
173 return (mode->crtc_hdisplay - 1) | (new_crtc_htotal << 16);
176 static void oaktrail_hdmi_find_dpll(struct drm_crtc *crtc, int target,
177 int refclk, struct oaktrail_hdmi_clock *best_clock)
179 int np_min, np_max, nr_min, nr_max;
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;
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;
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);
202 * 1024 x 768 np = 1; nr = 0x26; nf = 0x0fd8000;
203 * 1280 x 1024 np = 1; nr = 0x17; nf = 0x1034000;
206 best_clock->nr = nr - 1;
207 best_clock->nf = (nf << 14);
210 static void scu_busy_loop(void __iomem *scu_base)
215 status = readl(scu_base + 0x04);
217 udelay(1); /* scu processing time is in few u secods */
218 status = readl(scu_base + 0x04);
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");
229 * You don't want to know, you really really don't want to know....
231 * This is magic. However it's safe magic because of the way the platform
232 * works and it is necessary magic.
234 static void oaktrail_hdmi_reset(struct drm_device *dev)
237 unsigned long scu_ipc_mmio = 0xff11c000UL;
240 base = ioremap((resource_size_t)scu_ipc_mmio, scu_len);
242 DRM_ERROR("failed to map scu mmio\n");
246 /* scu ipc: assert hdmi controller reset */
247 writel(0xff11d118, base + 0x0c);
248 writel(0x7fffffdf, base + 0x80);
249 writel(0x42005, base + 0x0);
252 /* scu ipc: de-assert hdmi controller reset */
253 writel(0xff11d118, base + 0x0c);
254 writel(0x7fffffff, base + 0x80);
255 writel(0x42005, base + 0x0);
261 int oaktrail_crtc_hdmi_mode_set(struct drm_crtc *crtc,
262 struct drm_display_mode *mode,
263 struct drm_display_mode *adjusted_mode,
265 struct drm_framebuffer *old_fb)
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;
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;
282 struct oaktrail_hdmi_clock clock;
283 u32 dspcntr, pipeconf, dpll, temp;
284 int dspcntr_reg = DSPBCNTR;
286 if (!gma_power_begin(dev, true))
289 /* Disable the VGA plane that we never use */
290 REG_WRITE(VGACNTRL, VGA_DISP_DISABLE);
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);
301 /* Reset controller */
302 oaktrail_hdmi_reset(dev);
304 /* program and enable dpll */
306 oaktrail_hdmi_find_dpll(crtc, adjusted_mode->clock, refclk, &clock);
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);
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);
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));
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));
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);
347 REG_WRITE(dspsize_reg, ((mode->vdisplay - 1) << 16) | (mode->hdisplay - 1));
348 REG_WRITE(dsppos_reg, 0);
350 /* Flush the plane changes */
352 const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
353 crtc_funcs->mode_set_base(crtc, x, y, old_fb);
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;
363 pipeconf = REG_READ(pipeconf_reg);
364 pipeconf |= PIPEACONF_ENABLE;
366 REG_WRITE(pipeconf_reg, pipeconf);
367 REG_READ(pipeconf_reg);
369 REG_WRITE(PCH_PIPEBCONF, pipeconf);
370 REG_READ(PCH_PIPEBCONF);
371 gma_wait_for_vblank(dev);
373 REG_WRITE(dspcntr_reg, dspcntr);
374 gma_wait_for_vblank(dev);
381 void oaktrail_crtc_hdmi_dpms(struct drm_crtc *crtc, int mode)
383 struct drm_device *dev = crtc->dev;
386 DRM_DEBUG_KMS("%s %d\n", __func__, mode);
389 case DRM_MODE_DPMS_OFF:
390 REG_WRITE(VGACNTRL, 0x80000000);
393 temp = REG_READ(DSPBCNTR);
394 if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
395 REG_WRITE(DSPBCNTR, temp & ~DISPLAY_PLANE_ENABLE);
397 /* Flush the plane changes */
398 REG_WRITE(DSPBSURF, REG_READ(DSPBSURF));
403 temp = REG_READ(PIPEBCONF);
404 if ((temp & PIPEACONF_ENABLE) != 0) {
405 REG_WRITE(PIPEBCONF, temp & ~PIPEACONF_ENABLE);
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);
416 /* wait for pipe off */
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);
426 /* wait for dpll off */
430 case DRM_MODE_DPMS_ON:
431 case DRM_MODE_DPMS_STANDBY:
432 case DRM_MODE_DPMS_SUSPEND:
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);
441 /* wait for dpll warm up */
445 temp = REG_READ(PIPEBCONF);
446 if ((temp & PIPEACONF_ENABLE) == 0) {
447 REG_WRITE(PIPEBCONF, temp | PIPEACONF_ENABLE);
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);
458 gma_wait_for_vblank(dev);
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));
469 gma_crtc_load_lut(crtc);
473 REG_WRITE(DSPARB, 0x00003fbf);
476 REG_WRITE(0x70034, 0x3f880a0a);
479 REG_WRITE(0x70038, 0x0b060808);
482 REG_WRITE(0x70050, 0x08030404);
485 REG_WRITE(0x70054, 0x04040404);
487 /* LNC Chicken Bits - Squawk! */
488 REG_WRITE(0x70400, 0x4000);
493 static void oaktrail_hdmi_dpms(struct drm_encoder *encoder, int mode)
495 static int dpms_mode = -1;
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;
502 if (dpms_mode == mode)
505 if (mode != DRM_MODE_DPMS_ON)
511 HDMI_WRITE(HDMI_VIDEO_REG, temp);
514 static enum drm_mode_status oaktrail_hdmi_mode_valid(struct drm_connector *connector,
515 struct drm_display_mode *mode)
517 if (mode->clock > 165000)
518 return MODE_CLOCK_HIGH;
519 if (mode->clock < 20000)
520 return MODE_CLOCK_LOW;
522 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
523 return MODE_NO_DBLESCAN;
528 static enum drm_connector_status
529 oaktrail_hdmi_detect(struct drm_connector *connector, bool force)
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;
537 temp = HDMI_READ(HDMI_HSR);
538 DRM_DEBUG_KMS("HDMI_HSR %x\n", temp);
540 if ((temp & HDMI_DETECT_HDP) != 0)
541 status = connector_status_connected;
543 status = connector_status_disconnected;
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
562 static int oaktrail_hdmi_get_modes(struct drm_connector *connector)
564 struct i2c_adapter *i2c_adap;
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
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;
578 edid = (struct edid *)raw_edid;
579 /* FIXME ? edid = drm_get_edid(connector, i2c_adap); */
583 drm_connector_update_edid_property(connector, edid);
584 ret = drm_add_edid_modes(connector, edid);
589 static void oaktrail_hdmi_mode_set(struct drm_encoder *encoder,
590 struct drm_display_mode *mode,
591 struct drm_display_mode *adjusted_mode)
593 struct drm_device *dev = encoder->dev;
595 oaktrail_hdmi_audio_enable(dev);
599 static void oaktrail_hdmi_destroy(struct drm_connector *connector)
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,
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,
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,
625 void oaktrail_hdmi_init(struct drm_device *dev,
626 struct psb_intel_mode_device *mode_dev)
628 struct gma_encoder *gma_encoder;
629 struct gma_connector *gma_connector;
630 struct drm_connector *connector;
631 struct drm_encoder *encoder;
633 gma_encoder = kzalloc(sizeof(struct gma_encoder), GFP_KERNEL);
637 gma_connector = kzalloc(sizeof(struct gma_connector), GFP_KERNEL);
639 goto failed_connector;
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);
647 drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_TMDS);
649 gma_connector_attach_encoder(gma_connector, gma_encoder);
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);
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");
666 void oaktrail_hdmi_setup(struct drm_device *dev)
668 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
669 struct pci_dev *pdev;
670 struct oaktrail_hdmi_dev *hdmi_dev;
673 pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x080d, NULL);
677 hdmi_dev = kzalloc(sizeof(struct oaktrail_hdmi_dev), GFP_KERNEL);
679 dev_err(dev->dev, "failed to allocate memory\n");
684 ret = pci_enable_device(pdev);
686 dev_err(dev->dev, "failed to enable hdmi controller\n");
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");
698 hdmi_dev->dev = pdev;
699 pci_set_drvdata(pdev, hdmi_dev);
701 /* Initialize i2c controller */
702 ret = oaktrail_hdmi_i2c_init(hdmi_dev->dev);
704 dev_err(dev->dev, "HDMI I2C initialization failed\n");
706 dev_priv->hdmi_priv = hdmi_dev;
707 oaktrail_hdmi_audio_disable(dev);
709 dev_info(dev->dev, "HDMI hardware present.\n");
719 void oaktrail_hdmi_teardown(struct drm_device *dev)
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;
726 pdev = hdmi_dev->dev;
727 pci_set_drvdata(pdev, NULL);
728 oaktrail_hdmi_i2c_exit(pdev);
729 iounmap(hdmi_dev->regs);
735 /* save HDMI register state */
736 void oaktrail_hdmi_save(struct drm_device *dev)
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];
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);
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);
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);
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);
779 regs->saveDSPBCURSOR_CTRL = PSB_RVDC32(CURBCNTR);
780 regs->saveDSPBCURSOR_BASE = PSB_RVDC32(CURBBASE);
781 regs->saveDSPBCURSOR_POS = PSB_RVDC32(CURBPOS);
784 for (i = 0; i < 256; i++)
785 pipeb->palette[i] = PSB_RVDC32(PALETTE_B + (i << 2));
788 /* restore HDMI register state */
789 void oaktrail_hdmi_restore(struct drm_device *dev)
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];
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);
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);
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);
822 PSB_WVDC32(pipeb->conf, PIPEBCONF);
823 PSB_WVDC32(hdmi_dev->savePCH_PIPEBCONF, PCH_PIPEBCONF);
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);
833 PSB_WVDC32(regs->saveDSPBCURSOR_CTRL, CURBCNTR);
834 PSB_WVDC32(regs->saveDSPBCURSOR_POS, CURBPOS);
835 PSB_WVDC32(regs->saveDSPBCURSOR_BASE, CURBBASE);
837 /* restore palette */
838 for (i = 0; i < 256; i++)
839 PSB_WVDC32(pipeb->palette[i], PALETTE_B + (i << 2));