Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
intel_sdvo.c
Go to the documentation of this file.
1 /*
2  * Copyright 2006 Dave Airlie <[email protected]>
3  * Copyright © 2006-2007 Intel Corporation
4  * Jesse Barnes <[email protected]>
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the next
14  * paragraph) shall be included in all copies or substantial portions of the
15  * Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23  * DEALINGS IN THE SOFTWARE.
24  *
25  * Authors:
26  * Eric Anholt <[email protected]>
27  */
28 #include <linux/i2c.h>
29 #include <linux/slab.h>
30 #include <linux/delay.h>
31 #include <linux/export.h>
32 #include <drm/drmP.h>
33 #include <drm/drm_crtc.h>
34 #include <drm/drm_edid.h>
35 #include "intel_drv.h"
36 #include <drm/i915_drm.h>
37 #include "i915_drv.h"
38 #include "intel_sdvo_regs.h"
39 
40 #define SDVO_TMDS_MASK (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)
41 #define SDVO_RGB_MASK (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1)
42 #define SDVO_LVDS_MASK (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1)
43 #define SDVO_TV_MASK (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_YPRPB0)
44 
45 #define SDVO_OUTPUT_MASK (SDVO_TMDS_MASK | SDVO_RGB_MASK | SDVO_LVDS_MASK |\
46  SDVO_TV_MASK)
47 
48 #define IS_TV(c) (c->output_flag & SDVO_TV_MASK)
49 #define IS_TMDS(c) (c->output_flag & SDVO_TMDS_MASK)
50 #define IS_LVDS(c) (c->output_flag & SDVO_LVDS_MASK)
51 #define IS_TV_OR_LVDS(c) (c->output_flag & (SDVO_TV_MASK | SDVO_LVDS_MASK))
52 #define IS_DIGITAL(c) (c->output_flag & (SDVO_TMDS_MASK | SDVO_LVDS_MASK))
53 
54 
55 static const char *tv_format_names[] = {
56  "NTSC_M" , "NTSC_J" , "NTSC_443",
57  "PAL_B" , "PAL_D" , "PAL_G" ,
58  "PAL_H" , "PAL_I" , "PAL_M" ,
59  "PAL_N" , "PAL_NC" , "PAL_60" ,
60  "SECAM_B" , "SECAM_D" , "SECAM_G" ,
61  "SECAM_K" , "SECAM_K1", "SECAM_L" ,
62  "SECAM_60"
63 };
64 
65 #define TV_FORMAT_NUM (sizeof(tv_format_names) / sizeof(*tv_format_names))
66 
67 struct intel_sdvo {
69 
70  struct i2c_adapter *i2c;
72 
73  struct i2c_adapter ddc;
74 
75  /* Register for the SDVO device: SDVOB or SDVOC */
77 
78  /* Active outputs controlled by this SDVO output */
80 
81  /*
82  * Capabilities of the SDVO device returned by
83  * i830_sdvo_get_capabilities()
84  */
86 
87  /* Pixel clock limitations reported by the SDVO device, in kHz */
89 
90  /*
91  * For multiple function SDVO device,
92  * this is for current attached outputs.
93  */
95 
96  /*
97  * Hotplug activation bits for this device
98  */
100 
106 
114  bool is_tv;
115 
116  /* On different gens SDVOB is at different places. */
117  bool is_sdvob;
118 
119  /* This is for current tv format name */
121 
125  bool is_hdmi;
128 
133  bool is_lvds;
134 
139 
140  /* DDC bus used by this SDVO encoder */
142 
143  /*
144  * the sdvo flag gets lost in round trip: dtd->adjusted_mode->dtd
145  */
147 };
148 
151 
152  /* Mark the type of connector */
154 
156 
157  /* This contains all current supported TV format */
161 
162  /* add the property for the SDVO-TV */
165  struct drm_property *top;
171  struct drm_property *hue;
179 
180  /* add the property for the SDVO-TV/LVDS */
182 
183  /* Add variable to record current setting for the above property */
185 
186  /* this is to get the range of margin.*/
201 };
202 
203 static struct intel_sdvo *to_intel_sdvo(struct drm_encoder *encoder)
204 {
205  return container_of(encoder, struct intel_sdvo, base.base);
206 }
207 
208 static struct intel_sdvo *intel_attached_sdvo(struct drm_connector *connector)
209 {
210  return container_of(intel_attached_encoder(connector),
211  struct intel_sdvo, base);
212 }
213 
214 static struct intel_sdvo_connector *to_intel_sdvo_connector(struct drm_connector *connector)
215 {
216  return container_of(to_intel_connector(connector), struct intel_sdvo_connector, base);
217 }
218 
219 static bool
220 intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, uint16_t flags);
221 static bool
222 intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo,
224  int type);
225 static bool
226 intel_sdvo_create_enhance_property(struct intel_sdvo *intel_sdvo,
228 
234 static void intel_sdvo_write_sdvox(struct intel_sdvo *intel_sdvo, u32 val)
235 {
236  struct drm_device *dev = intel_sdvo->base.base.dev;
237  struct drm_i915_private *dev_priv = dev->dev_private;
238  u32 bval = val, cval = val;
239  int i;
240 
241  if (intel_sdvo->sdvo_reg == PCH_SDVOB) {
242  I915_WRITE(intel_sdvo->sdvo_reg, val);
243  I915_READ(intel_sdvo->sdvo_reg);
244  return;
245  }
246 
247  if (intel_sdvo->sdvo_reg == SDVOB) {
248  cval = I915_READ(SDVOC);
249  } else {
250  bval = I915_READ(SDVOB);
251  }
252  /*
253  * Write the registers twice for luck. Sometimes,
254  * writing them only once doesn't appear to 'stick'.
255  * The BIOS does this too. Yay, magic
256  */
257  for (i = 0; i < 2; i++)
258  {
259  I915_WRITE(SDVOB, bval);
260  I915_READ(SDVOB);
261  I915_WRITE(SDVOC, cval);
262  I915_READ(SDVOC);
263  }
264 }
265 
266 static bool intel_sdvo_read_byte(struct intel_sdvo *intel_sdvo, u8 addr, u8 *ch)
267 {
268  struct i2c_msg msgs[] = {
269  {
270  .addr = intel_sdvo->slave_addr,
271  .flags = 0,
272  .len = 1,
273  .buf = &addr,
274  },
275  {
276  .addr = intel_sdvo->slave_addr,
277  .flags = I2C_M_RD,
278  .len = 1,
279  .buf = ch,
280  }
281  };
282  int ret;
283 
284  if ((ret = i2c_transfer(intel_sdvo->i2c, msgs, 2)) == 2)
285  return true;
286 
287  DRM_DEBUG_KMS("i2c transfer returned %d\n", ret);
288  return false;
289 }
290 
291 #define SDVO_CMD_NAME_ENTRY(cmd) {cmd, #cmd}
292 
293 static const struct _sdvo_cmd_name {
294  u8 cmd;
295  const char *name;
296 } sdvo_cmd_names[] = {
340 
341  /* Add the op code for SDVO enhancements */
386 
387  /* HDMI op code */
408 };
409 
410 #define SDVO_NAME(svdo) ((svdo)->is_sdvob ? "SDVOB" : "SDVOC")
411 
412 static void intel_sdvo_debug_write(struct intel_sdvo *intel_sdvo, u8 cmd,
413  const void *args, int args_len)
414 {
415  int i;
416 
417  DRM_DEBUG_KMS("%s: W: %02X ",
418  SDVO_NAME(intel_sdvo), cmd);
419  for (i = 0; i < args_len; i++)
420  DRM_LOG_KMS("%02X ", ((u8 *)args)[i]);
421  for (; i < 8; i++)
422  DRM_LOG_KMS(" ");
423  for (i = 0; i < ARRAY_SIZE(sdvo_cmd_names); i++) {
424  if (cmd == sdvo_cmd_names[i].cmd) {
425  DRM_LOG_KMS("(%s)", sdvo_cmd_names[i].name);
426  break;
427  }
428  }
429  if (i == ARRAY_SIZE(sdvo_cmd_names))
430  DRM_LOG_KMS("(%02X)", cmd);
431  DRM_LOG_KMS("\n");
432 }
433 
434 static const char *cmd_status_names[] = {
435  "Power on",
436  "Success",
437  "Not supported",
438  "Invalid arg",
439  "Pending",
440  "Target not specified",
441  "Scaling not supported"
442 };
443 
444 static bool intel_sdvo_write_cmd(struct intel_sdvo *intel_sdvo, u8 cmd,
445  const void *args, int args_len)
446 {
447  u8 *buf, status;
448  struct i2c_msg *msgs;
449  int i, ret = true;
450 
451  /* Would be simpler to allocate both in one go ? */
452  buf = (u8 *)kzalloc(args_len * 2 + 2, GFP_KERNEL);
453  if (!buf)
454  return false;
455 
456  msgs = kcalloc(args_len + 3, sizeof(*msgs), GFP_KERNEL);
457  if (!msgs) {
458  kfree(buf);
459  return false;
460  }
461 
462  intel_sdvo_debug_write(intel_sdvo, cmd, args, args_len);
463 
464  for (i = 0; i < args_len; i++) {
465  msgs[i].addr = intel_sdvo->slave_addr;
466  msgs[i].flags = 0;
467  msgs[i].len = 2;
468  msgs[i].buf = buf + 2 *i;
469  buf[2*i + 0] = SDVO_I2C_ARG_0 - i;
470  buf[2*i + 1] = ((u8*)args)[i];
471  }
472  msgs[i].addr = intel_sdvo->slave_addr;
473  msgs[i].flags = 0;
474  msgs[i].len = 2;
475  msgs[i].buf = buf + 2*i;
476  buf[2*i + 0] = SDVO_I2C_OPCODE;
477  buf[2*i + 1] = cmd;
478 
479  /* the following two are to read the response */
480  status = SDVO_I2C_CMD_STATUS;
481  msgs[i+1].addr = intel_sdvo->slave_addr;
482  msgs[i+1].flags = 0;
483  msgs[i+1].len = 1;
484  msgs[i+1].buf = &status;
485 
486  msgs[i+2].addr = intel_sdvo->slave_addr;
487  msgs[i+2].flags = I2C_M_RD;
488  msgs[i+2].len = 1;
489  msgs[i+2].buf = &status;
490 
491  ret = i2c_transfer(intel_sdvo->i2c, msgs, i+3);
492  if (ret < 0) {
493  DRM_DEBUG_KMS("I2c transfer returned %d\n", ret);
494  ret = false;
495  goto out;
496  }
497  if (ret != i+3) {
498  /* failure in I2C transfer */
499  DRM_DEBUG_KMS("I2c transfer returned %d/%d\n", ret, i+3);
500  ret = false;
501  }
502 
503 out:
504  kfree(msgs);
505  kfree(buf);
506  return ret;
507 }
508 
509 static bool intel_sdvo_read_response(struct intel_sdvo *intel_sdvo,
510  void *response, int response_len)
511 {
512  u8 retry = 5;
513  u8 status;
514  int i;
515 
516  DRM_DEBUG_KMS("%s: R: ", SDVO_NAME(intel_sdvo));
517 
518  /*
519  * The documentation states that all commands will be
520  * processed within 15µs, and that we need only poll
521  * the status byte a maximum of 3 times in order for the
522  * command to be complete.
523  *
524  * Check 5 times in case the hardware failed to read the docs.
525  */
526  if (!intel_sdvo_read_byte(intel_sdvo,
528  &status))
529  goto log_fail;
530 
531  while (status == SDVO_CMD_STATUS_PENDING && retry--) {
532  udelay(15);
533  if (!intel_sdvo_read_byte(intel_sdvo,
535  &status))
536  goto log_fail;
537  }
538 
539  if (status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP)
540  DRM_LOG_KMS("(%s)", cmd_status_names[status]);
541  else
542  DRM_LOG_KMS("(??? %d)", status);
543 
544  if (status != SDVO_CMD_STATUS_SUCCESS)
545  goto log_fail;
546 
547  /* Read the command response */
548  for (i = 0; i < response_len; i++) {
549  if (!intel_sdvo_read_byte(intel_sdvo,
550  SDVO_I2C_RETURN_0 + i,
551  &((u8 *)response)[i]))
552  goto log_fail;
553  DRM_LOG_KMS(" %02X", ((u8 *)response)[i]);
554  }
555  DRM_LOG_KMS("\n");
556  return true;
557 
558 log_fail:
559  DRM_LOG_KMS("... failed\n");
560  return false;
561 }
562 
563 static int intel_sdvo_get_pixel_multiplier(struct drm_display_mode *mode)
564 {
565  if (mode->clock >= 100000)
566  return 1;
567  else if (mode->clock >= 50000)
568  return 2;
569  else
570  return 4;
571 }
572 
573 static bool intel_sdvo_set_control_bus_switch(struct intel_sdvo *intel_sdvo,
574  u8 ddc_bus)
575 {
576  /* This must be the immediately preceding write before the i2c xfer */
577  return intel_sdvo_write_cmd(intel_sdvo,
579  &ddc_bus, 1);
580 }
581 
582 static bool intel_sdvo_set_value(struct intel_sdvo *intel_sdvo, u8 cmd, const void *data, int len)
583 {
584  if (!intel_sdvo_write_cmd(intel_sdvo, cmd, data, len))
585  return false;
586 
587  return intel_sdvo_read_response(intel_sdvo, NULL, 0);
588 }
589 
590 static bool
591 intel_sdvo_get_value(struct intel_sdvo *intel_sdvo, u8 cmd, void *value, int len)
592 {
593  if (!intel_sdvo_write_cmd(intel_sdvo, cmd, NULL, 0))
594  return false;
595 
596  return intel_sdvo_read_response(intel_sdvo, value, len);
597 }
598 
599 static bool intel_sdvo_set_target_input(struct intel_sdvo *intel_sdvo)
600 {
601  struct intel_sdvo_set_target_input_args targets = {0};
602  return intel_sdvo_set_value(intel_sdvo,
604  &targets, sizeof(targets));
605 }
606 
613 static bool intel_sdvo_get_trained_inputs(struct intel_sdvo *intel_sdvo, bool *input_1, bool *input_2)
614 {
616 
617  BUILD_BUG_ON(sizeof(response) != 1);
618  if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_TRAINED_INPUTS,
619  &response, sizeof(response)))
620  return false;
621 
622  *input_1 = response.input0_trained;
623  *input_2 = response.input1_trained;
624  return true;
625 }
626 
627 static bool intel_sdvo_set_active_outputs(struct intel_sdvo *intel_sdvo,
628  u16 outputs)
629 {
630  return intel_sdvo_set_value(intel_sdvo,
632  &outputs, sizeof(outputs));
633 }
634 
635 static bool intel_sdvo_get_active_outputs(struct intel_sdvo *intel_sdvo,
636  u16 *outputs)
637 {
638  return intel_sdvo_get_value(intel_sdvo,
640  outputs, sizeof(*outputs));
641 }
642 
643 static bool intel_sdvo_set_encoder_power_state(struct intel_sdvo *intel_sdvo,
644  int mode)
645 {
647 
648  switch (mode) {
649  case DRM_MODE_DPMS_ON:
650  state = SDVO_ENCODER_STATE_ON;
651  break;
654  break;
657  break;
658  case DRM_MODE_DPMS_OFF:
659  state = SDVO_ENCODER_STATE_OFF;
660  break;
661  }
662 
663  return intel_sdvo_set_value(intel_sdvo,
664  SDVO_CMD_SET_ENCODER_POWER_STATE, &state, sizeof(state));
665 }
666 
667 static bool intel_sdvo_get_input_pixel_clock_range(struct intel_sdvo *intel_sdvo,
668  int *clock_min,
669  int *clock_max)
670 {
671  struct intel_sdvo_pixel_clock_range clocks;
672 
673  BUILD_BUG_ON(sizeof(clocks) != 4);
674  if (!intel_sdvo_get_value(intel_sdvo,
676  &clocks, sizeof(clocks)))
677  return false;
678 
679  /* Convert the values from units of 10 kHz to kHz. */
680  *clock_min = clocks.min * 10;
681  *clock_max = clocks.max * 10;
682  return true;
683 }
684 
685 static bool intel_sdvo_set_target_output(struct intel_sdvo *intel_sdvo,
686  u16 outputs)
687 {
688  return intel_sdvo_set_value(intel_sdvo,
690  &outputs, sizeof(outputs));
691 }
692 
693 static bool intel_sdvo_set_timing(struct intel_sdvo *intel_sdvo, u8 cmd,
694  struct intel_sdvo_dtd *dtd)
695 {
696  return intel_sdvo_set_value(intel_sdvo, cmd, &dtd->part1, sizeof(dtd->part1)) &&
697  intel_sdvo_set_value(intel_sdvo, cmd + 1, &dtd->part2, sizeof(dtd->part2));
698 }
699 
700 static bool intel_sdvo_set_input_timing(struct intel_sdvo *intel_sdvo,
701  struct intel_sdvo_dtd *dtd)
702 {
703  return intel_sdvo_set_timing(intel_sdvo,
705 }
706 
707 static bool intel_sdvo_set_output_timing(struct intel_sdvo *intel_sdvo,
708  struct intel_sdvo_dtd *dtd)
709 {
710  return intel_sdvo_set_timing(intel_sdvo,
712 }
713 
714 static bool
715 intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo,
716  uint16_t clock,
717  uint16_t width,
719 {
721 
722  memset(&args, 0, sizeof(args));
723  args.clock = clock;
724  args.width = width;
725  args.height = height;
726  args.interlace = 0;
727 
728  if (intel_sdvo->is_lvds &&
729  (intel_sdvo->sdvo_lvds_fixed_mode->hdisplay != width ||
730  intel_sdvo->sdvo_lvds_fixed_mode->vdisplay != height))
731  args.scaled = 1;
732 
733  return intel_sdvo_set_value(intel_sdvo,
735  &args, sizeof(args));
736 }
737 
738 static bool intel_sdvo_get_preferred_input_timing(struct intel_sdvo *intel_sdvo,
739  struct intel_sdvo_dtd *dtd)
740 {
741  BUILD_BUG_ON(sizeof(dtd->part1) != 8);
742  BUILD_BUG_ON(sizeof(dtd->part2) != 8);
743  return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1,
744  &dtd->part1, sizeof(dtd->part1)) &&
745  intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2,
746  &dtd->part2, sizeof(dtd->part2));
747 }
748 
749 static bool intel_sdvo_set_clock_rate_mult(struct intel_sdvo *intel_sdvo, u8 val)
750 {
751  return intel_sdvo_set_value(intel_sdvo, SDVO_CMD_SET_CLOCK_RATE_MULT, &val, 1);
752 }
753 
754 static void intel_sdvo_get_dtd_from_mode(struct intel_sdvo_dtd *dtd,
755  const struct drm_display_mode *mode)
756 {
758  uint16_t h_blank_len, h_sync_len, v_blank_len, v_sync_len;
759  uint16_t h_sync_offset, v_sync_offset;
760  int mode_clock;
761 
762  width = mode->hdisplay;
763  height = mode->vdisplay;
764 
765  /* do some mode translations */
766  h_blank_len = mode->htotal - mode->hdisplay;
767  h_sync_len = mode->hsync_end - mode->hsync_start;
768 
769  v_blank_len = mode->vtotal - mode->vdisplay;
770  v_sync_len = mode->vsync_end - mode->vsync_start;
771 
772  h_sync_offset = mode->hsync_start - mode->hdisplay;
773  v_sync_offset = mode->vsync_start - mode->vdisplay;
774 
775  mode_clock = mode->clock;
776  mode_clock /= intel_mode_get_pixel_multiplier(mode) ?: 1;
777  mode_clock /= 10;
778  dtd->part1.clock = mode_clock;
779 
780  dtd->part1.h_active = width & 0xff;
781  dtd->part1.h_blank = h_blank_len & 0xff;
782  dtd->part1.h_high = (((width >> 8) & 0xf) << 4) |
783  ((h_blank_len >> 8) & 0xf);
784  dtd->part1.v_active = height & 0xff;
785  dtd->part1.v_blank = v_blank_len & 0xff;
786  dtd->part1.v_high = (((height >> 8) & 0xf) << 4) |
787  ((v_blank_len >> 8) & 0xf);
788 
789  dtd->part2.h_sync_off = h_sync_offset & 0xff;
790  dtd->part2.h_sync_width = h_sync_len & 0xff;
791  dtd->part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 |
792  (v_sync_len & 0xf);
793  dtd->part2.sync_off_width_high = ((h_sync_offset & 0x300) >> 2) |
794  ((h_sync_len & 0x300) >> 4) | ((v_sync_offset & 0x30) >> 2) |
795  ((v_sync_len & 0x30) >> 4);
796 
797  dtd->part2.dtd_flags = 0x18;
798  if (mode->flags & DRM_MODE_FLAG_INTERLACE)
799  dtd->part2.dtd_flags |= DTD_FLAG_INTERLACE;
800  if (mode->flags & DRM_MODE_FLAG_PHSYNC)
801  dtd->part2.dtd_flags |= DTD_FLAG_HSYNC_POSITIVE;
802  if (mode->flags & DRM_MODE_FLAG_PVSYNC)
803  dtd->part2.dtd_flags |= DTD_FLAG_VSYNC_POSITIVE;
804 
805  dtd->part2.sdvo_flags = 0;
806  dtd->part2.v_sync_off_high = v_sync_offset & 0xc0;
807  dtd->part2.reserved = 0;
808 }
809 
810 static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode,
811  const struct intel_sdvo_dtd *dtd)
812 {
813  mode->hdisplay = dtd->part1.h_active;
814  mode->hdisplay += ((dtd->part1.h_high >> 4) & 0x0f) << 8;
815  mode->hsync_start = mode->hdisplay + dtd->part2.h_sync_off;
816  mode->hsync_start += (dtd->part2.sync_off_width_high & 0xc0) << 2;
817  mode->hsync_end = mode->hsync_start + dtd->part2.h_sync_width;
818  mode->hsync_end += (dtd->part2.sync_off_width_high & 0x30) << 4;
819  mode->htotal = mode->hdisplay + dtd->part1.h_blank;
820  mode->htotal += (dtd->part1.h_high & 0xf) << 8;
821 
822  mode->vdisplay = dtd->part1.v_active;
823  mode->vdisplay += ((dtd->part1.v_high >> 4) & 0x0f) << 8;
824  mode->vsync_start = mode->vdisplay;
825  mode->vsync_start += (dtd->part2.v_sync_off_width >> 4) & 0xf;
826  mode->vsync_start += (dtd->part2.sync_off_width_high & 0x0c) << 2;
827  mode->vsync_start += dtd->part2.v_sync_off_high & 0xc0;
828  mode->vsync_end = mode->vsync_start +
829  (dtd->part2.v_sync_off_width & 0xf);
830  mode->vsync_end += (dtd->part2.sync_off_width_high & 0x3) << 4;
831  mode->vtotal = mode->vdisplay + dtd->part1.v_blank;
832  mode->vtotal += (dtd->part1.v_high & 0xf) << 8;
833 
834  mode->clock = dtd->part1.clock * 10;
835 
837  if (dtd->part2.dtd_flags & DTD_FLAG_INTERLACE)
839  if (dtd->part2.dtd_flags & DTD_FLAG_HSYNC_POSITIVE)
840  mode->flags |= DRM_MODE_FLAG_PHSYNC;
841  if (dtd->part2.dtd_flags & DTD_FLAG_VSYNC_POSITIVE)
842  mode->flags |= DRM_MODE_FLAG_PVSYNC;
843 }
844 
845 static bool intel_sdvo_check_supp_encode(struct intel_sdvo *intel_sdvo)
846 {
847  struct intel_sdvo_encode encode;
848 
849  BUILD_BUG_ON(sizeof(encode) != 2);
850  return intel_sdvo_get_value(intel_sdvo,
852  &encode, sizeof(encode));
853 }
854 
855 static bool intel_sdvo_set_encode(struct intel_sdvo *intel_sdvo,
856  uint8_t mode)
857 {
858  return intel_sdvo_set_value(intel_sdvo, SDVO_CMD_SET_ENCODE, &mode, 1);
859 }
860 
861 static bool intel_sdvo_set_colorimetry(struct intel_sdvo *intel_sdvo,
862  uint8_t mode)
863 {
864  return intel_sdvo_set_value(intel_sdvo, SDVO_CMD_SET_COLORIMETRY, &mode, 1);
865 }
866 
867 #if 0
868 static void intel_sdvo_dump_hdmi_buf(struct intel_sdvo *intel_sdvo)
869 {
870  int i, j;
871  uint8_t set_buf_index[2];
872  uint8_t av_split;
874  uint8_t buf[48];
875  uint8_t *pos;
876 
877  intel_sdvo_get_value(encoder, SDVO_CMD_GET_HBUF_AV_SPLIT, &av_split, 1);
878 
879  for (i = 0; i <= av_split; i++) {
880  set_buf_index[0] = i; set_buf_index[1] = 0;
881  intel_sdvo_write_cmd(encoder, SDVO_CMD_SET_HBUF_INDEX,
882  set_buf_index, 2);
883  intel_sdvo_write_cmd(encoder, SDVO_CMD_GET_HBUF_INFO, NULL, 0);
884  intel_sdvo_read_response(encoder, &buf_size, 1);
885 
886  pos = buf;
887  for (j = 0; j <= buf_size; j += 8) {
888  intel_sdvo_write_cmd(encoder, SDVO_CMD_GET_HBUF_DATA,
889  NULL, 0);
890  intel_sdvo_read_response(encoder, pos, 8);
891  pos += 8;
892  }
893  }
894 }
895 #endif
896 
897 static bool intel_sdvo_write_infoframe(struct intel_sdvo *intel_sdvo,
898  unsigned if_index, uint8_t tx_rate,
899  uint8_t *data, unsigned length)
900 {
901  uint8_t set_buf_index[2] = { if_index, 0 };
902  uint8_t hbuf_size, tmp[8];
903  int i;
904 
905  if (!intel_sdvo_set_value(intel_sdvo,
907  set_buf_index, 2))
908  return false;
909 
910  if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_HBUF_INFO,
911  &hbuf_size, 1))
912  return false;
913 
914  /* Buffer size is 0 based, hooray! */
915  hbuf_size++;
916 
917  DRM_DEBUG_KMS("writing sdvo hbuf: %i, hbuf_size %i, hbuf_size: %i\n",
918  if_index, length, hbuf_size);
919 
920  for (i = 0; i < hbuf_size; i += 8) {
921  memset(tmp, 0, 8);
922  if (i < length)
923  memcpy(tmp, data + i, min_t(unsigned, 8, length - i));
924 
925  if (!intel_sdvo_set_value(intel_sdvo,
927  tmp, 8))
928  return false;
929  }
930 
931  return intel_sdvo_set_value(intel_sdvo,
933  &tx_rate, 1);
934 }
935 
936 static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
937 {
938  struct dip_infoframe avi_if = {
939  .type = DIP_TYPE_AVI,
940  .ver = DIP_VERSION_AVI,
941  .len = DIP_LEN_AVI,
942  };
943  uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)];
944 
945  intel_dip_infoframe_csum(&avi_if);
946 
947  /* sdvo spec says that the ecc is handled by the hw, and it looks like
948  * we must not send the ecc field, either. */
949  memcpy(sdvo_data, &avi_if, 3);
950  sdvo_data[3] = avi_if.checksum;
951  memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi));
952 
953  return intel_sdvo_write_infoframe(intel_sdvo, SDVO_HBUF_INDEX_AVI_IF,
955  sdvo_data, sizeof(sdvo_data));
956 }
957 
958 static bool intel_sdvo_set_tv_format(struct intel_sdvo *intel_sdvo)
959 {
961  uint32_t format_map;
962 
963  format_map = 1 << intel_sdvo->tv_format_index;
964  memset(&format, 0, sizeof(format));
965  memcpy(&format, &format_map, min(sizeof(format), sizeof(format_map)));
966 
967  BUILD_BUG_ON(sizeof(format) != 6);
968  return intel_sdvo_set_value(intel_sdvo,
970  &format, sizeof(format));
971 }
972 
973 static bool
974 intel_sdvo_set_output_timings_from_mode(struct intel_sdvo *intel_sdvo,
975  const struct drm_display_mode *mode)
976 {
977  struct intel_sdvo_dtd output_dtd;
978 
979  if (!intel_sdvo_set_target_output(intel_sdvo,
980  intel_sdvo->attached_output))
981  return false;
982 
983  intel_sdvo_get_dtd_from_mode(&output_dtd, mode);
984  if (!intel_sdvo_set_output_timing(intel_sdvo, &output_dtd))
985  return false;
986 
987  return true;
988 }
989 
990 /* Asks the sdvo controller for the preferred input mode given the output mode.
991  * Unfortunately we have to set up the full output mode to do that. */
992 static bool
993 intel_sdvo_get_preferred_input_mode(struct intel_sdvo *intel_sdvo,
994  const struct drm_display_mode *mode,
995  struct drm_display_mode *adjusted_mode)
996 {
997  struct intel_sdvo_dtd input_dtd;
998 
999  /* Reset the input timing to the screen. Assume always input 0. */
1000  if (!intel_sdvo_set_target_input(intel_sdvo))
1001  return false;
1002 
1003  if (!intel_sdvo_create_preferred_input_timing(intel_sdvo,
1004  mode->clock / 10,
1005  mode->hdisplay,
1006  mode->vdisplay))
1007  return false;
1008 
1009  if (!intel_sdvo_get_preferred_input_timing(intel_sdvo,
1010  &input_dtd))
1011  return false;
1012 
1013  intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd);
1014  intel_sdvo->dtd_sdvo_flags = input_dtd.part2.sdvo_flags;
1015 
1016  return true;
1017 }
1018 
1019 static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
1020  const struct drm_display_mode *mode,
1021  struct drm_display_mode *adjusted_mode)
1022 {
1023  struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder);
1024  int multiplier;
1025 
1026  /* We need to construct preferred input timings based on our
1027  * output timings. To do that, we have to set the output
1028  * timings, even though this isn't really the right place in
1029  * the sequence to do it. Oh well.
1030  */
1031  if (intel_sdvo->is_tv) {
1032  if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo, mode))
1033  return false;
1034 
1035  (void) intel_sdvo_get_preferred_input_mode(intel_sdvo,
1036  mode,
1037  adjusted_mode);
1038  } else if (intel_sdvo->is_lvds) {
1039  if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo,
1040  intel_sdvo->sdvo_lvds_fixed_mode))
1041  return false;
1042 
1043  (void) intel_sdvo_get_preferred_input_mode(intel_sdvo,
1044  mode,
1045  adjusted_mode);
1046  }
1047 
1048  /* Make the CRTC code factor in the SDVO pixel multiplier. The
1049  * SDVO device will factor out the multiplier during mode_set.
1050  */
1051  multiplier = intel_sdvo_get_pixel_multiplier(adjusted_mode);
1052  intel_mode_set_pixel_multiplier(adjusted_mode, multiplier);
1053 
1054  return true;
1055 }
1056 
1057 static void intel_sdvo_mode_set(struct drm_encoder *encoder,
1058  struct drm_display_mode *mode,
1059  struct drm_display_mode *adjusted_mode)
1060 {
1061  struct drm_device *dev = encoder->dev;
1062  struct drm_i915_private *dev_priv = dev->dev_private;
1063  struct drm_crtc *crtc = encoder->crtc;
1064  struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1065  struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder);
1066  u32 sdvox;
1067  struct intel_sdvo_in_out_map in_out;
1068  struct intel_sdvo_dtd input_dtd, output_dtd;
1069  int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode);
1070  int rate;
1071 
1072  if (!mode)
1073  return;
1074 
1075  /* First, set the input mapping for the first input to our controlled
1076  * output. This is only correct if we're a single-input device, in
1077  * which case the first input is the output from the appropriate SDVO
1078  * channel on the motherboard. In a two-input device, the first input
1079  * will be SDVOB and the second SDVOC.
1080  */
1081  in_out.in0 = intel_sdvo->attached_output;
1082  in_out.in1 = 0;
1083 
1084  intel_sdvo_set_value(intel_sdvo,
1086  &in_out, sizeof(in_out));
1087 
1088  /* Set the output timings to the screen */
1089  if (!intel_sdvo_set_target_output(intel_sdvo,
1090  intel_sdvo->attached_output))
1091  return;
1092 
1093  /* lvds has a special fixed output timing. */
1094  if (intel_sdvo->is_lvds)
1095  intel_sdvo_get_dtd_from_mode(&output_dtd,
1096  intel_sdvo->sdvo_lvds_fixed_mode);
1097  else
1098  intel_sdvo_get_dtd_from_mode(&output_dtd, mode);
1099  if (!intel_sdvo_set_output_timing(intel_sdvo, &output_dtd))
1100  DRM_INFO("Setting output timings on %s failed\n",
1101  SDVO_NAME(intel_sdvo));
1102 
1103  /* Set the input timing to the screen. Assume always input 0. */
1104  if (!intel_sdvo_set_target_input(intel_sdvo))
1105  return;
1106 
1107  if (intel_sdvo->has_hdmi_monitor) {
1108  intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_HDMI);
1109  intel_sdvo_set_colorimetry(intel_sdvo,
1111  intel_sdvo_set_avi_infoframe(intel_sdvo);
1112  } else
1113  intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_DVI);
1114 
1115  if (intel_sdvo->is_tv &&
1116  !intel_sdvo_set_tv_format(intel_sdvo))
1117  return;
1118 
1119  /* We have tried to get input timing in mode_fixup, and filled into
1120  * adjusted_mode.
1121  */
1122  intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode);
1123  if (intel_sdvo->is_tv || intel_sdvo->is_lvds)
1124  input_dtd.part2.sdvo_flags = intel_sdvo->dtd_sdvo_flags;
1125  if (!intel_sdvo_set_input_timing(intel_sdvo, &input_dtd))
1126  DRM_INFO("Setting input timings on %s failed\n",
1127  SDVO_NAME(intel_sdvo));
1128 
1129  switch (pixel_multiplier) {
1130  default:
1131  case 1: rate = SDVO_CLOCK_RATE_MULT_1X; break;
1132  case 2: rate = SDVO_CLOCK_RATE_MULT_2X; break;
1133  case 4: rate = SDVO_CLOCK_RATE_MULT_4X; break;
1134  }
1135  if (!intel_sdvo_set_clock_rate_mult(intel_sdvo, rate))
1136  return;
1137 
1138  /* Set the SDVO control regs. */
1139  if (INTEL_INFO(dev)->gen >= 4) {
1140  /* The real mode polarity is set by the SDVO commands, using
1141  * struct intel_sdvo_dtd. */
1143  if (intel_sdvo->is_hdmi)
1144  sdvox |= intel_sdvo->color_range;
1145  if (INTEL_INFO(dev)->gen < 5)
1146  sdvox |= SDVO_BORDER_ENABLE;
1147  } else {
1148  sdvox = I915_READ(intel_sdvo->sdvo_reg);
1149  switch (intel_sdvo->sdvo_reg) {
1150  case SDVOB:
1151  sdvox &= SDVOB_PRESERVE_MASK;
1152  break;
1153  case SDVOC:
1154  sdvox &= SDVOC_PRESERVE_MASK;
1155  break;
1156  }
1157  sdvox |= (9 << 19) | SDVO_BORDER_ENABLE;
1158  }
1159 
1160  if (INTEL_PCH_TYPE(dev) >= PCH_CPT)
1161  sdvox |= TRANSCODER_CPT(intel_crtc->pipe);
1162  else
1163  sdvox |= TRANSCODER(intel_crtc->pipe);
1164 
1165  if (intel_sdvo->has_hdmi_audio)
1166  sdvox |= SDVO_AUDIO_ENABLE;
1167 
1168  if (INTEL_INFO(dev)->gen >= 4) {
1169  /* done in crtc_mode_set as the dpll_md reg must be written early */
1170  } else if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) {
1171  /* done in crtc_mode_set as it lives inside the dpll register */
1172  } else {
1173  sdvox |= (pixel_multiplier - 1) << SDVO_PORT_MULTIPLY_SHIFT;
1174  }
1175 
1176  if (input_dtd.part2.sdvo_flags & SDVO_NEED_TO_STALL &&
1177  INTEL_INFO(dev)->gen < 5)
1178  sdvox |= SDVO_STALL_SELECT;
1179  intel_sdvo_write_sdvox(intel_sdvo, sdvox);
1180 }
1181 
1182 static bool intel_sdvo_connector_get_hw_state(struct intel_connector *connector)
1183 {
1185  to_intel_sdvo_connector(&connector->base);
1186  struct intel_sdvo *intel_sdvo = intel_attached_sdvo(&connector->base);
1187  u16 active_outputs;
1188 
1189  intel_sdvo_get_active_outputs(intel_sdvo, &active_outputs);
1190 
1191  if (active_outputs & intel_sdvo_connector->output_flag)
1192  return true;
1193  else
1194  return false;
1195 }
1196 
1197 static bool intel_sdvo_get_hw_state(struct intel_encoder *encoder,
1198  enum pipe *pipe)
1199 {
1200  struct drm_device *dev = encoder->base.dev;
1201  struct drm_i915_private *dev_priv = dev->dev_private;
1202  struct intel_sdvo *intel_sdvo = to_intel_sdvo(&encoder->base);
1203  u32 tmp;
1204 
1205  tmp = I915_READ(intel_sdvo->sdvo_reg);
1206 
1207  if (!(tmp & SDVO_ENABLE))
1208  return false;
1209 
1210  if (HAS_PCH_CPT(dev))
1211  *pipe = PORT_TO_PIPE_CPT(tmp);
1212  else
1213  *pipe = PORT_TO_PIPE(tmp);
1214 
1215  return true;
1216 }
1217 
1218 static void intel_disable_sdvo(struct intel_encoder *encoder)
1219 {
1220  struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1221  struct intel_sdvo *intel_sdvo = to_intel_sdvo(&encoder->base);
1222  u32 temp;
1223 
1224  intel_sdvo_set_active_outputs(intel_sdvo, 0);
1225  if (0)
1226  intel_sdvo_set_encoder_power_state(intel_sdvo,
1228 
1229  temp = I915_READ(intel_sdvo->sdvo_reg);
1230  if ((temp & SDVO_ENABLE) != 0) {
1231  intel_sdvo_write_sdvox(intel_sdvo, temp & ~SDVO_ENABLE);
1232  }
1233 }
1234 
1235 static void intel_enable_sdvo(struct intel_encoder *encoder)
1236 {
1237  struct drm_device *dev = encoder->base.dev;
1238  struct drm_i915_private *dev_priv = dev->dev_private;
1239  struct intel_sdvo *intel_sdvo = to_intel_sdvo(&encoder->base);
1240  struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
1241  u32 temp;
1242  bool input1, input2;
1243  int i;
1244  u8 status;
1245 
1246  temp = I915_READ(intel_sdvo->sdvo_reg);
1247  if ((temp & SDVO_ENABLE) == 0)
1248  intel_sdvo_write_sdvox(intel_sdvo, temp | SDVO_ENABLE);
1249  for (i = 0; i < 2; i++)
1250  intel_wait_for_vblank(dev, intel_crtc->pipe);
1251 
1252  status = intel_sdvo_get_trained_inputs(intel_sdvo, &input1, &input2);
1253  /* Warn if the device reported failure to sync.
1254  * A lot of SDVO devices fail to notify of sync, but it's
1255  * a given it the status is a success, we succeeded.
1256  */
1257  if (status == SDVO_CMD_STATUS_SUCCESS && !input1) {
1258  DRM_DEBUG_KMS("First %s output reported failure to "
1259  "sync\n", SDVO_NAME(intel_sdvo));
1260  }
1261 
1262  if (0)
1263  intel_sdvo_set_encoder_power_state(intel_sdvo,
1265  intel_sdvo_set_active_outputs(intel_sdvo, intel_sdvo->attached_output);
1266 }
1267 
1268 static void intel_sdvo_dpms(struct drm_connector *connector, int mode)
1269 {
1270  struct drm_crtc *crtc;
1271  struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1272 
1273  /* dvo supports only 2 dpms states. */
1274  if (mode != DRM_MODE_DPMS_ON)
1275  mode = DRM_MODE_DPMS_OFF;
1276 
1277  if (mode == connector->dpms)
1278  return;
1279 
1280  connector->dpms = mode;
1281 
1282  /* Only need to change hw state when actually enabled */
1283  crtc = intel_sdvo->base.base.crtc;
1284  if (!crtc) {
1285  intel_sdvo->base.connectors_active = false;
1286  return;
1287  }
1288 
1289  if (mode != DRM_MODE_DPMS_ON) {
1290  intel_sdvo_set_active_outputs(intel_sdvo, 0);
1291  if (0)
1292  intel_sdvo_set_encoder_power_state(intel_sdvo, mode);
1293 
1294  intel_sdvo->base.connectors_active = false;
1295 
1296  intel_crtc_update_dpms(crtc);
1297  } else {
1298  intel_sdvo->base.connectors_active = true;
1299 
1300  intel_crtc_update_dpms(crtc);
1301 
1302  if (0)
1303  intel_sdvo_set_encoder_power_state(intel_sdvo, mode);
1304  intel_sdvo_set_active_outputs(intel_sdvo, intel_sdvo->attached_output);
1305  }
1306 
1307  intel_modeset_check_state(connector->dev);
1308 }
1309 
1310 static int intel_sdvo_mode_valid(struct drm_connector *connector,
1311  struct drm_display_mode *mode)
1312 {
1313  struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1314 
1315  if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
1316  return MODE_NO_DBLESCAN;
1317 
1318  if (intel_sdvo->pixel_clock_min > mode->clock)
1319  return MODE_CLOCK_LOW;
1320 
1321  if (intel_sdvo->pixel_clock_max < mode->clock)
1322  return MODE_CLOCK_HIGH;
1323 
1324  if (intel_sdvo->is_lvds) {
1325  if (mode->hdisplay > intel_sdvo->sdvo_lvds_fixed_mode->hdisplay)
1326  return MODE_PANEL;
1327 
1328  if (mode->vdisplay > intel_sdvo->sdvo_lvds_fixed_mode->vdisplay)
1329  return MODE_PANEL;
1330  }
1331 
1332  return MODE_OK;
1333 }
1334 
1335 static bool intel_sdvo_get_capabilities(struct intel_sdvo *intel_sdvo, struct intel_sdvo_caps *caps)
1336 {
1337  BUILD_BUG_ON(sizeof(*caps) != 8);
1338  if (!intel_sdvo_get_value(intel_sdvo,
1340  caps, sizeof(*caps)))
1341  return false;
1342 
1343  DRM_DEBUG_KMS("SDVO capabilities:\n"
1344  " vendor_id: %d\n"
1345  " device_id: %d\n"
1346  " device_rev_id: %d\n"
1347  " sdvo_version_major: %d\n"
1348  " sdvo_version_minor: %d\n"
1349  " sdvo_inputs_mask: %d\n"
1350  " smooth_scaling: %d\n"
1351  " sharp_scaling: %d\n"
1352  " up_scaling: %d\n"
1353  " down_scaling: %d\n"
1354  " stall_support: %d\n"
1355  " output_flags: %d\n",
1356  caps->vendor_id,
1357  caps->device_id,
1358  caps->device_rev_id,
1359  caps->sdvo_version_major,
1360  caps->sdvo_version_minor,
1361  caps->sdvo_inputs_mask,
1362  caps->smooth_scaling,
1363  caps->sharp_scaling,
1364  caps->up_scaling,
1365  caps->down_scaling,
1366  caps->stall_support,
1367  caps->output_flags);
1368 
1369  return true;
1370 }
1371 
1372 static uint16_t intel_sdvo_get_hotplug_support(struct intel_sdvo *intel_sdvo)
1373 {
1374  struct drm_device *dev = intel_sdvo->base.base.dev;
1375  uint16_t hotplug;
1376 
1377  /* HW Erratum: SDVO Hotplug is broken on all i945G chips, there's noise
1378  * on the line. */
1379  if (IS_I945G(dev) || IS_I945GM(dev))
1380  return 0;
1381 
1382  if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_HOT_PLUG_SUPPORT,
1383  &hotplug, sizeof(hotplug)))
1384  return 0;
1385 
1386  return hotplug;
1387 }
1388 
1389 static void intel_sdvo_enable_hotplug(struct intel_encoder *encoder)
1390 {
1391  struct intel_sdvo *intel_sdvo = to_intel_sdvo(&encoder->base);
1392 
1393  intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_SET_ACTIVE_HOT_PLUG,
1394  &intel_sdvo->hotplug_active, 2);
1395 }
1396 
1397 static bool
1398 intel_sdvo_multifunc_encoder(struct intel_sdvo *intel_sdvo)
1399 {
1400  /* Is there more than one type of output? */
1401  return hweight16(intel_sdvo->caps.output_flags) > 1;
1402 }
1403 
1404 static struct edid *
1405 intel_sdvo_get_edid(struct drm_connector *connector)
1406 {
1407  struct intel_sdvo *sdvo = intel_attached_sdvo(connector);
1408  return drm_get_edid(connector, &sdvo->ddc);
1409 }
1410 
1411 /* Mac mini hack -- use the same DDC as the analog connector */
1412 static struct edid *
1413 intel_sdvo_get_analog_edid(struct drm_connector *connector)
1414 {
1415  struct drm_i915_private *dev_priv = connector->dev->dev_private;
1416 
1417  return drm_get_edid(connector,
1418  intel_gmbus_get_adapter(dev_priv,
1419  dev_priv->crt_ddc_pin));
1420 }
1421 
1422 static enum drm_connector_status
1423 intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
1424 {
1425  struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1427  struct edid *edid;
1428 
1429  edid = intel_sdvo_get_edid(connector);
1430 
1431  if (edid == NULL && intel_sdvo_multifunc_encoder(intel_sdvo)) {
1432  u8 ddc, saved_ddc = intel_sdvo->ddc_bus;
1433 
1434  /*
1435  * Don't use the 1 as the argument of DDC bus switch to get
1436  * the EDID. It is used for SDVO SPD ROM.
1437  */
1438  for (ddc = intel_sdvo->ddc_bus >> 1; ddc > 1; ddc >>= 1) {
1439  intel_sdvo->ddc_bus = ddc;
1440  edid = intel_sdvo_get_edid(connector);
1441  if (edid)
1442  break;
1443  }
1444  /*
1445  * If we found the EDID on the other bus,
1446  * assume that is the correct DDC bus.
1447  */
1448  if (edid == NULL)
1449  intel_sdvo->ddc_bus = saved_ddc;
1450  }
1451 
1452  /*
1453  * When there is no edid and no monitor is connected with VGA
1454  * port, try to use the CRT ddc to read the EDID for DVI-connector.
1455  */
1456  if (edid == NULL)
1457  edid = intel_sdvo_get_analog_edid(connector);
1458 
1459  status = connector_status_unknown;
1460  if (edid != NULL) {
1461  /* DDC bus is shared, match EDID to connector type */
1462  if (edid->input & DRM_EDID_INPUT_DIGITAL) {
1463  status = connector_status_connected;
1464  if (intel_sdvo->is_hdmi) {
1465  intel_sdvo->has_hdmi_monitor = drm_detect_hdmi_monitor(edid);
1466  intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid);
1467  }
1468  } else
1470  kfree(edid);
1471  }
1472 
1473  if (status == connector_status_connected) {
1474  struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1475  if (intel_sdvo_connector->force_audio != HDMI_AUDIO_AUTO)
1476  intel_sdvo->has_hdmi_audio = (intel_sdvo_connector->force_audio == HDMI_AUDIO_ON);
1477  }
1478 
1479  return status;
1480 }
1481 
1482 static bool
1483 intel_sdvo_connector_matches_edid(struct intel_sdvo_connector *sdvo,
1484  struct edid *edid)
1485 {
1486  bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL);
1487  bool connector_is_digital = !!IS_DIGITAL(sdvo);
1488 
1489  DRM_DEBUG_KMS("connector_is_digital? %d, monitor_is_digital? %d\n",
1490  connector_is_digital, monitor_is_digital);
1491  return connector_is_digital == monitor_is_digital;
1492 }
1493 
1494 static enum drm_connector_status
1495 intel_sdvo_detect(struct drm_connector *connector, bool force)
1496 {
1498  struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1499  struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1501 
1502  if (!intel_sdvo_write_cmd(intel_sdvo,
1504  return connector_status_unknown;
1505 
1506  /* add 30ms delay when the output type might be TV */
1507  if (intel_sdvo->caps.output_flags & SDVO_TV_MASK)
1508  msleep(30);
1509 
1510  if (!intel_sdvo_read_response(intel_sdvo, &response, 2))
1511  return connector_status_unknown;
1512 
1513  DRM_DEBUG_KMS("SDVO response %d %d [%x]\n",
1514  response & 0xff, response >> 8,
1515  intel_sdvo_connector->output_flag);
1516 
1517  if (response == 0)
1519 
1520  intel_sdvo->attached_output = response;
1521 
1522  intel_sdvo->has_hdmi_monitor = false;
1523  intel_sdvo->has_hdmi_audio = false;
1524 
1525  if ((intel_sdvo_connector->output_flag & response) == 0)
1527  else if (IS_TMDS(intel_sdvo_connector))
1528  ret = intel_sdvo_tmds_sink_detect(connector);
1529  else {
1530  struct edid *edid;
1531 
1532  /* if we have an edid check it matches the connection */
1533  edid = intel_sdvo_get_edid(connector);
1534  if (edid == NULL)
1535  edid = intel_sdvo_get_analog_edid(connector);
1536  if (edid != NULL) {
1537  if (intel_sdvo_connector_matches_edid(intel_sdvo_connector,
1538  edid))
1540  else
1542 
1543  kfree(edid);
1544  } else
1546  }
1547 
1548  /* May update encoder flag for like clock for SDVO TV, etc.*/
1549  if (ret == connector_status_connected) {
1550  intel_sdvo->is_tv = false;
1551  intel_sdvo->is_lvds = false;
1552  intel_sdvo->base.needs_tv_clock = false;
1553 
1554  if (response & SDVO_TV_MASK) {
1555  intel_sdvo->is_tv = true;
1556  intel_sdvo->base.needs_tv_clock = true;
1557  }
1558  if (response & SDVO_LVDS_MASK)
1559  intel_sdvo->is_lvds = intel_sdvo->sdvo_lvds_fixed_mode != NULL;
1560  }
1561 
1562  return ret;
1563 }
1564 
1565 static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
1566 {
1567  struct edid *edid;
1568 
1569  /* set the bus switch and get the modes */
1570  edid = intel_sdvo_get_edid(connector);
1571 
1572  /*
1573  * Mac mini hack. On this device, the DVI-I connector shares one DDC
1574  * link between analog and digital outputs. So, if the regular SDVO
1575  * DDC fails, check to see if the analog output is disconnected, in
1576  * which case we'll look there for the digital DDC data.
1577  */
1578  if (edid == NULL)
1579  edid = intel_sdvo_get_analog_edid(connector);
1580 
1581  if (edid != NULL) {
1582  if (intel_sdvo_connector_matches_edid(to_intel_sdvo_connector(connector),
1583  edid)) {
1584  drm_mode_connector_update_edid_property(connector, edid);
1585  drm_add_edid_modes(connector, edid);
1586  }
1587 
1588  kfree(edid);
1589  }
1590 }
1591 
1592 /*
1593  * Set of SDVO TV modes.
1594  * Note! This is in reply order (see loop in get_tv_modes).
1595  * XXX: all 60Hz refresh?
1596  */
1597 static const struct drm_display_mode sdvo_tv_modes[] = {
1598  { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 5815, 320, 321, 384,
1599  416, 0, 200, 201, 232, 233, 0,
1601  { DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 6814, 320, 321, 384,
1602  416, 0, 240, 241, 272, 273, 0,
1604  { DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 9910, 400, 401, 464,
1605  496, 0, 300, 301, 332, 333, 0,
1607  { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 16913, 640, 641, 704,
1608  736, 0, 350, 351, 382, 383, 0,
1610  { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 19121, 640, 641, 704,
1611  736, 0, 400, 401, 432, 433, 0,
1613  { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 22654, 640, 641, 704,
1614  736, 0, 480, 481, 512, 513, 0,
1616  { DRM_MODE("704x480", DRM_MODE_TYPE_DRIVER, 24624, 704, 705, 768,
1617  800, 0, 480, 481, 512, 513, 0,
1619  { DRM_MODE("704x576", DRM_MODE_TYPE_DRIVER, 29232, 704, 705, 768,
1620  800, 0, 576, 577, 608, 609, 0,
1622  { DRM_MODE("720x350", DRM_MODE_TYPE_DRIVER, 18751, 720, 721, 784,
1623  816, 0, 350, 351, 382, 383, 0,
1625  { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 21199, 720, 721, 784,
1626  816, 0, 400, 401, 432, 433, 0,
1628  { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 25116, 720, 721, 784,
1629  816, 0, 480, 481, 512, 513, 0,
1631  { DRM_MODE("720x540", DRM_MODE_TYPE_DRIVER, 28054, 720, 721, 784,
1632  816, 0, 540, 541, 572, 573, 0,
1634  { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 29816, 720, 721, 784,
1635  816, 0, 576, 577, 608, 609, 0,
1637  { DRM_MODE("768x576", DRM_MODE_TYPE_DRIVER, 31570, 768, 769, 832,
1638  864, 0, 576, 577, 608, 609, 0,
1640  { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 34030, 800, 801, 864,
1641  896, 0, 600, 601, 632, 633, 0,
1643  { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 36581, 832, 833, 896,
1644  928, 0, 624, 625, 656, 657, 0,
1646  { DRM_MODE("920x766", DRM_MODE_TYPE_DRIVER, 48707, 920, 921, 984,
1647  1016, 0, 766, 767, 798, 799, 0,
1649  { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 53827, 1024, 1025, 1088,
1650  1120, 0, 768, 769, 800, 801, 0,
1652  { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 87265, 1280, 1281, 1344,
1653  1376, 0, 1024, 1025, 1056, 1057, 0,
1655 };
1656 
1657 static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
1658 {
1659  struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1660  struct intel_sdvo_sdtv_resolution_request tv_res;
1661  uint32_t reply = 0, format_map = 0;
1662  int i;
1663 
1664  /* Read the list of supported input resolutions for the selected TV
1665  * format.
1666  */
1667  format_map = 1 << intel_sdvo->tv_format_index;
1668  memcpy(&tv_res, &format_map,
1669  min(sizeof(format_map), sizeof(struct intel_sdvo_sdtv_resolution_request)));
1670 
1671  if (!intel_sdvo_set_target_output(intel_sdvo, intel_sdvo->attached_output))
1672  return;
1673 
1674  BUILD_BUG_ON(sizeof(tv_res) != 3);
1675  if (!intel_sdvo_write_cmd(intel_sdvo,
1677  &tv_res, sizeof(tv_res)))
1678  return;
1679  if (!intel_sdvo_read_response(intel_sdvo, &reply, 3))
1680  return;
1681 
1682  for (i = 0; i < ARRAY_SIZE(sdvo_tv_modes); i++)
1683  if (reply & (1 << i)) {
1684  struct drm_display_mode *nmode;
1685  nmode = drm_mode_duplicate(connector->dev,
1686  &sdvo_tv_modes[i]);
1687  if (nmode)
1688  drm_mode_probed_add(connector, nmode);
1689  }
1690 }
1691 
1692 static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
1693 {
1694  struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1695  struct drm_i915_private *dev_priv = connector->dev->dev_private;
1696  struct drm_display_mode *newmode;
1697 
1698  /*
1699  * Attempt to get the mode list from DDC.
1700  * Assume that the preferred modes are
1701  * arranged in priority order.
1702  */
1703  intel_ddc_get_modes(connector, intel_sdvo->i2c);
1704  if (list_empty(&connector->probed_modes) == false)
1705  goto end;
1706 
1707  /* Fetch modes from VBT */
1708  if (dev_priv->sdvo_lvds_vbt_mode != NULL) {
1709  newmode = drm_mode_duplicate(connector->dev,
1710  dev_priv->sdvo_lvds_vbt_mode);
1711  if (newmode != NULL) {
1712  /* Guarantee the mode is preferred */
1713  newmode->type = (DRM_MODE_TYPE_PREFERRED |
1715  drm_mode_probed_add(connector, newmode);
1716  }
1717  }
1718 
1719 end:
1720  list_for_each_entry(newmode, &connector->probed_modes, head) {
1721  if (newmode->type & DRM_MODE_TYPE_PREFERRED) {
1722  intel_sdvo->sdvo_lvds_fixed_mode =
1723  drm_mode_duplicate(connector->dev, newmode);
1724 
1725  intel_sdvo->is_lvds = true;
1726  break;
1727  }
1728  }
1729 
1730 }
1731 
1732 static int intel_sdvo_get_modes(struct drm_connector *connector)
1733 {
1734  struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1735 
1736  if (IS_TV(intel_sdvo_connector))
1737  intel_sdvo_get_tv_modes(connector);
1738  else if (IS_LVDS(intel_sdvo_connector))
1739  intel_sdvo_get_lvds_modes(connector);
1740  else
1741  intel_sdvo_get_ddc_modes(connector);
1742 
1743  return !list_empty(&connector->probed_modes);
1744 }
1745 
1746 static void
1747 intel_sdvo_destroy_enhance_property(struct drm_connector *connector)
1748 {
1749  struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1750  struct drm_device *dev = connector->dev;
1751 
1752  if (intel_sdvo_connector->left)
1753  drm_property_destroy(dev, intel_sdvo_connector->left);
1754  if (intel_sdvo_connector->right)
1755  drm_property_destroy(dev, intel_sdvo_connector->right);
1756  if (intel_sdvo_connector->top)
1757  drm_property_destroy(dev, intel_sdvo_connector->top);
1758  if (intel_sdvo_connector->bottom)
1759  drm_property_destroy(dev, intel_sdvo_connector->bottom);
1760  if (intel_sdvo_connector->hpos)
1761  drm_property_destroy(dev, intel_sdvo_connector->hpos);
1762  if (intel_sdvo_connector->vpos)
1763  drm_property_destroy(dev, intel_sdvo_connector->vpos);
1764  if (intel_sdvo_connector->saturation)
1765  drm_property_destroy(dev, intel_sdvo_connector->saturation);
1766  if (intel_sdvo_connector->contrast)
1767  drm_property_destroy(dev, intel_sdvo_connector->contrast);
1768  if (intel_sdvo_connector->hue)
1769  drm_property_destroy(dev, intel_sdvo_connector->hue);
1770  if (intel_sdvo_connector->sharpness)
1771  drm_property_destroy(dev, intel_sdvo_connector->sharpness);
1772  if (intel_sdvo_connector->flicker_filter)
1773  drm_property_destroy(dev, intel_sdvo_connector->flicker_filter);
1774  if (intel_sdvo_connector->flicker_filter_2d)
1775  drm_property_destroy(dev, intel_sdvo_connector->flicker_filter_2d);
1776  if (intel_sdvo_connector->flicker_filter_adaptive)
1777  drm_property_destroy(dev, intel_sdvo_connector->flicker_filter_adaptive);
1778  if (intel_sdvo_connector->tv_luma_filter)
1779  drm_property_destroy(dev, intel_sdvo_connector->tv_luma_filter);
1780  if (intel_sdvo_connector->tv_chroma_filter)
1781  drm_property_destroy(dev, intel_sdvo_connector->tv_chroma_filter);
1782  if (intel_sdvo_connector->dot_crawl)
1783  drm_property_destroy(dev, intel_sdvo_connector->dot_crawl);
1784  if (intel_sdvo_connector->brightness)
1785  drm_property_destroy(dev, intel_sdvo_connector->brightness);
1786 }
1787 
1788 static void intel_sdvo_destroy(struct drm_connector *connector)
1789 {
1790  struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1791 
1792  if (intel_sdvo_connector->tv_format)
1793  drm_property_destroy(connector->dev,
1794  intel_sdvo_connector->tv_format);
1795 
1796  intel_sdvo_destroy_enhance_property(connector);
1797  drm_sysfs_connector_remove(connector);
1798  drm_connector_cleanup(connector);
1799  kfree(connector);
1800 }
1801 
1802 static bool intel_sdvo_detect_hdmi_audio(struct drm_connector *connector)
1803 {
1804  struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1805  struct edid *edid;
1806  bool has_audio = false;
1807 
1808  if (!intel_sdvo->is_hdmi)
1809  return false;
1810 
1811  edid = intel_sdvo_get_edid(connector);
1812  if (edid != NULL && edid->input & DRM_EDID_INPUT_DIGITAL)
1813  has_audio = drm_detect_monitor_audio(edid);
1814  kfree(edid);
1815 
1816  return has_audio;
1817 }
1818 
1819 static int
1820 intel_sdvo_set_property(struct drm_connector *connector,
1821  struct drm_property *property,
1822  uint64_t val)
1823 {
1824  struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1825  struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1826  struct drm_i915_private *dev_priv = connector->dev->dev_private;
1827  uint16_t temp_value;
1828  uint8_t cmd;
1829  int ret;
1830 
1831  ret = drm_connector_property_set_value(connector, property, val);
1832  if (ret)
1833  return ret;
1834 
1835  if (property == dev_priv->force_audio_property) {
1836  int i = val;
1837  bool has_audio;
1838 
1839  if (i == intel_sdvo_connector->force_audio)
1840  return 0;
1841 
1842  intel_sdvo_connector->force_audio = i;
1843 
1844  if (i == HDMI_AUDIO_AUTO)
1845  has_audio = intel_sdvo_detect_hdmi_audio(connector);
1846  else
1847  has_audio = (i == HDMI_AUDIO_ON);
1848 
1849  if (has_audio == intel_sdvo->has_hdmi_audio)
1850  return 0;
1851 
1852  intel_sdvo->has_hdmi_audio = has_audio;
1853  goto done;
1854  }
1855 
1856  if (property == dev_priv->broadcast_rgb_property) {
1857  if (val == !!intel_sdvo->color_range)
1858  return 0;
1859 
1860  intel_sdvo->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0;
1861  goto done;
1862  }
1863 
1864 #define CHECK_PROPERTY(name, NAME) \
1865  if (intel_sdvo_connector->name == property) { \
1866  if (intel_sdvo_connector->cur_##name == temp_value) return 0; \
1867  if (intel_sdvo_connector->max_##name < temp_value) return -EINVAL; \
1868  cmd = SDVO_CMD_SET_##NAME; \
1869  intel_sdvo_connector->cur_##name = temp_value; \
1870  goto set_value; \
1871  }
1872 
1873  if (property == intel_sdvo_connector->tv_format) {
1874  if (val >= TV_FORMAT_NUM)
1875  return -EINVAL;
1876 
1877  if (intel_sdvo->tv_format_index ==
1878  intel_sdvo_connector->tv_format_supported[val])
1879  return 0;
1880 
1881  intel_sdvo->tv_format_index = intel_sdvo_connector->tv_format_supported[val];
1882  goto done;
1883  } else if (IS_TV_OR_LVDS(intel_sdvo_connector)) {
1884  temp_value = val;
1885  if (intel_sdvo_connector->left == property) {
1887  intel_sdvo_connector->right, val);
1888  if (intel_sdvo_connector->left_margin == temp_value)
1889  return 0;
1890 
1891  intel_sdvo_connector->left_margin = temp_value;
1892  intel_sdvo_connector->right_margin = temp_value;
1893  temp_value = intel_sdvo_connector->max_hscan -
1894  intel_sdvo_connector->left_margin;
1896  goto set_value;
1897  } else if (intel_sdvo_connector->right == property) {
1899  intel_sdvo_connector->left, val);
1900  if (intel_sdvo_connector->right_margin == temp_value)
1901  return 0;
1902 
1903  intel_sdvo_connector->left_margin = temp_value;
1904  intel_sdvo_connector->right_margin = temp_value;
1905  temp_value = intel_sdvo_connector->max_hscan -
1906  intel_sdvo_connector->left_margin;
1908  goto set_value;
1909  } else if (intel_sdvo_connector->top == property) {
1911  intel_sdvo_connector->bottom, val);
1912  if (intel_sdvo_connector->top_margin == temp_value)
1913  return 0;
1914 
1915  intel_sdvo_connector->top_margin = temp_value;
1916  intel_sdvo_connector->bottom_margin = temp_value;
1917  temp_value = intel_sdvo_connector->max_vscan -
1918  intel_sdvo_connector->top_margin;
1920  goto set_value;
1921  } else if (intel_sdvo_connector->bottom == property) {
1923  intel_sdvo_connector->top, val);
1924  if (intel_sdvo_connector->bottom_margin == temp_value)
1925  return 0;
1926 
1927  intel_sdvo_connector->top_margin = temp_value;
1928  intel_sdvo_connector->bottom_margin = temp_value;
1929  temp_value = intel_sdvo_connector->max_vscan -
1930  intel_sdvo_connector->top_margin;
1932  goto set_value;
1933  }
1934  CHECK_PROPERTY(hpos, HPOS)
1935  CHECK_PROPERTY(vpos, VPOS)
1936  CHECK_PROPERTY(saturation, SATURATION)
1937  CHECK_PROPERTY(contrast, CONTRAST)
1938  CHECK_PROPERTY(hue, HUE)
1939  CHECK_PROPERTY(brightness, BRIGHTNESS)
1940  CHECK_PROPERTY(sharpness, SHARPNESS)
1941  CHECK_PROPERTY(flicker_filter, FLICKER_FILTER)
1942  CHECK_PROPERTY(flicker_filter_2d, FLICKER_FILTER_2D)
1943  CHECK_PROPERTY(flicker_filter_adaptive, FLICKER_FILTER_ADAPTIVE)
1944  CHECK_PROPERTY(tv_chroma_filter, TV_CHROMA_FILTER)
1945  CHECK_PROPERTY(tv_luma_filter, TV_LUMA_FILTER)
1946  CHECK_PROPERTY(dot_crawl, DOT_CRAWL)
1947  }
1948 
1949  return -EINVAL; /* unknown property */
1950 
1951 set_value:
1952  if (!intel_sdvo_set_value(intel_sdvo, cmd, &temp_value, 2))
1953  return -EIO;
1954 
1955 
1956 done:
1957  if (intel_sdvo->base.base.crtc) {
1958  struct drm_crtc *crtc = intel_sdvo->base.base.crtc;
1959  intel_set_mode(crtc, &crtc->mode,
1960  crtc->x, crtc->y, crtc->fb);
1961  }
1962 
1963  return 0;
1964 #undef CHECK_PROPERTY
1965 }
1966 
1967 static const struct drm_encoder_helper_funcs intel_sdvo_helper_funcs = {
1968  .mode_fixup = intel_sdvo_mode_fixup,
1969  .mode_set = intel_sdvo_mode_set,
1970  .disable = intel_encoder_noop,
1971 };
1972 
1973 static const struct drm_connector_funcs intel_sdvo_connector_funcs = {
1974  .dpms = intel_sdvo_dpms,
1975  .detect = intel_sdvo_detect,
1977  .set_property = intel_sdvo_set_property,
1978  .destroy = intel_sdvo_destroy,
1979 };
1980 
1981 static const struct drm_connector_helper_funcs intel_sdvo_connector_helper_funcs = {
1982  .get_modes = intel_sdvo_get_modes,
1983  .mode_valid = intel_sdvo_mode_valid,
1984  .best_encoder = intel_best_encoder,
1985 };
1986 
1987 static void intel_sdvo_enc_destroy(struct drm_encoder *encoder)
1988 {
1989  struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder);
1990 
1991  if (intel_sdvo->sdvo_lvds_fixed_mode != NULL)
1992  drm_mode_destroy(encoder->dev,
1993  intel_sdvo->sdvo_lvds_fixed_mode);
1994 
1995  i2c_del_adapter(&intel_sdvo->ddc);
1996  intel_encoder_destroy(encoder);
1997 }
1998 
1999 static const struct drm_encoder_funcs intel_sdvo_enc_funcs = {
2000  .destroy = intel_sdvo_enc_destroy,
2001 };
2002 
2003 static void
2004 intel_sdvo_guess_ddc_bus(struct intel_sdvo *sdvo)
2005 {
2006  uint16_t mask = 0;
2007  unsigned int num_bits;
2008 
2009  /* Make a mask of outputs less than or equal to our own priority in the
2010  * list.
2011  */
2012  switch (sdvo->controlled_output) {
2013  case SDVO_OUTPUT_LVDS1:
2014  mask |= SDVO_OUTPUT_LVDS1;
2015  case SDVO_OUTPUT_LVDS0:
2016  mask |= SDVO_OUTPUT_LVDS0;
2017  case SDVO_OUTPUT_TMDS1:
2018  mask |= SDVO_OUTPUT_TMDS1;
2019  case SDVO_OUTPUT_TMDS0:
2020  mask |= SDVO_OUTPUT_TMDS0;
2021  case SDVO_OUTPUT_RGB1:
2022  mask |= SDVO_OUTPUT_RGB1;
2023  case SDVO_OUTPUT_RGB0:
2024  mask |= SDVO_OUTPUT_RGB0;
2025  break;
2026  }
2027 
2028  /* Count bits to find what number we are in the priority list. */
2029  mask &= sdvo->caps.output_flags;
2030  num_bits = hweight16(mask);
2031  /* If more than 3 outputs, default to DDC bus 3 for now. */
2032  if (num_bits > 3)
2033  num_bits = 3;
2034 
2035  /* Corresponds to SDVO_CONTROL_BUS_DDCx */
2036  sdvo->ddc_bus = 1 << num_bits;
2037 }
2038 
2046 static void
2047 intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv,
2048  struct intel_sdvo *sdvo, u32 reg)
2049 {
2050  struct sdvo_device_mapping *mapping;
2051 
2052  if (sdvo->is_sdvob)
2053  mapping = &(dev_priv->sdvo_mappings[0]);
2054  else
2055  mapping = &(dev_priv->sdvo_mappings[1]);
2056 
2057  if (mapping->initialized)
2058  sdvo->ddc_bus = 1 << ((mapping->ddc_pin & 0xf0) >> 4);
2059  else
2060  intel_sdvo_guess_ddc_bus(sdvo);
2061 }
2062 
2063 static void
2064 intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv,
2065  struct intel_sdvo *sdvo, u32 reg)
2066 {
2067  struct sdvo_device_mapping *mapping;
2068  u8 pin;
2069 
2070  if (sdvo->is_sdvob)
2071  mapping = &dev_priv->sdvo_mappings[0];
2072  else
2073  mapping = &dev_priv->sdvo_mappings[1];
2074 
2075  pin = GMBUS_PORT_DPB;
2076  if (mapping->initialized)
2077  pin = mapping->i2c_pin;
2078 
2079  if (intel_gmbus_is_port_valid(pin)) {
2080  sdvo->i2c = intel_gmbus_get_adapter(dev_priv, pin);
2082  intel_gmbus_force_bit(sdvo->i2c, true);
2083  } else {
2084  sdvo->i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB);
2085  }
2086 }
2087 
2088 static bool
2089 intel_sdvo_is_hdmi_connector(struct intel_sdvo *intel_sdvo, int device)
2090 {
2091  return intel_sdvo_check_supp_encode(intel_sdvo);
2092 }
2093 
2094 static u8
2095 intel_sdvo_get_slave_addr(struct drm_device *dev, struct intel_sdvo *sdvo)
2096 {
2097  struct drm_i915_private *dev_priv = dev->dev_private;
2098  struct sdvo_device_mapping *my_mapping, *other_mapping;
2099 
2100  if (sdvo->is_sdvob) {
2101  my_mapping = &dev_priv->sdvo_mappings[0];
2102  other_mapping = &dev_priv->sdvo_mappings[1];
2103  } else {
2104  my_mapping = &dev_priv->sdvo_mappings[1];
2105  other_mapping = &dev_priv->sdvo_mappings[0];
2106  }
2107 
2108  /* If the BIOS described our SDVO device, take advantage of it. */
2109  if (my_mapping->slave_addr)
2110  return my_mapping->slave_addr;
2111 
2112  /* If the BIOS only described a different SDVO device, use the
2113  * address that it isn't using.
2114  */
2115  if (other_mapping->slave_addr) {
2116  if (other_mapping->slave_addr == 0x70)
2117  return 0x72;
2118  else
2119  return 0x70;
2120  }
2121 
2122  /* No SDVO device info is found for another DVO port,
2123  * so use mapping assumption we had before BIOS parsing.
2124  */
2125  if (sdvo->is_sdvob)
2126  return 0x70;
2127  else
2128  return 0x72;
2129 }
2130 
2131 static void
2132 intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
2133  struct intel_sdvo *encoder)
2134 {
2135  drm_connector_init(encoder->base.base.dev,
2136  &connector->base.base,
2137  &intel_sdvo_connector_funcs,
2138  connector->base.base.connector_type);
2139 
2140  drm_connector_helper_add(&connector->base.base,
2141  &intel_sdvo_connector_helper_funcs);
2142 
2143  connector->base.base.interlace_allowed = 1;
2144  connector->base.base.doublescan_allowed = 0;
2145  connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB;
2146  connector->base.get_hw_state = intel_sdvo_connector_get_hw_state;
2147 
2148  intel_connector_attach_encoder(&connector->base, &encoder->base);
2149  drm_sysfs_connector_add(&connector->base.base);
2150 }
2151 
2152 static void
2153 intel_sdvo_add_hdmi_properties(struct intel_sdvo_connector *connector)
2154 {
2155  struct drm_device *dev = connector->base.base.dev;
2156 
2157  intel_attach_force_audio_property(&connector->base.base);
2158  if (INTEL_INFO(dev)->gen >= 4 && IS_MOBILE(dev))
2159  intel_attach_broadcast_rgb_property(&connector->base.base);
2160 }
2161 
2162 static bool
2163 intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
2164 {
2165  struct drm_encoder *encoder = &intel_sdvo->base.base;
2166  struct drm_connector *connector;
2167  struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
2169  struct intel_sdvo_connector *intel_sdvo_connector;
2170 
2171  intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL);
2172  if (!intel_sdvo_connector)
2173  return false;
2174 
2175  if (device == 0) {
2176  intel_sdvo->controlled_output |= SDVO_OUTPUT_TMDS0;
2177  intel_sdvo_connector->output_flag = SDVO_OUTPUT_TMDS0;
2178  } else if (device == 1) {
2179  intel_sdvo->controlled_output |= SDVO_OUTPUT_TMDS1;
2180  intel_sdvo_connector->output_flag = SDVO_OUTPUT_TMDS1;
2181  }
2182 
2183  intel_connector = &intel_sdvo_connector->base;
2184  connector = &intel_connector->base;
2185  if (intel_sdvo_get_hotplug_support(intel_sdvo) &
2186  intel_sdvo_connector->output_flag) {
2187  connector->polled = DRM_CONNECTOR_POLL_HPD;
2188  intel_sdvo->hotplug_active |= intel_sdvo_connector->output_flag;
2189  /* Some SDVO devices have one-shot hotplug interrupts.
2190  * Ensure that they get re-enabled when an interrupt happens.
2191  */
2192  intel_encoder->hot_plug = intel_sdvo_enable_hotplug;
2193  intel_sdvo_enable_hotplug(intel_encoder);
2194  } else {
2196  }
2199 
2200  if (intel_sdvo_is_hdmi_connector(intel_sdvo, device)) {
2202  intel_sdvo->is_hdmi = true;
2203  }
2204 
2205  intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
2206  if (intel_sdvo->is_hdmi)
2207  intel_sdvo_add_hdmi_properties(intel_sdvo_connector);
2208 
2209  return true;
2210 }
2211 
2212 static bool
2213 intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
2214 {
2215  struct drm_encoder *encoder = &intel_sdvo->base.base;
2216  struct drm_connector *connector;
2217  struct intel_connector *intel_connector;
2218  struct intel_sdvo_connector *intel_sdvo_connector;
2219 
2220  intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL);
2221  if (!intel_sdvo_connector)
2222  return false;
2223 
2224  intel_connector = &intel_sdvo_connector->base;
2225  connector = &intel_connector->base;
2228 
2229  intel_sdvo->controlled_output |= type;
2230  intel_sdvo_connector->output_flag = type;
2231 
2232  intel_sdvo->is_tv = true;
2233  intel_sdvo->base.needs_tv_clock = true;
2234 
2235  intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
2236 
2237  if (!intel_sdvo_tv_create_property(intel_sdvo, intel_sdvo_connector, type))
2238  goto err;
2239 
2240  if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector))
2241  goto err;
2242 
2243  return true;
2244 
2245 err:
2246  intel_sdvo_destroy(connector);
2247  return false;
2248 }
2249 
2250 static bool
2251 intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device)
2252 {
2253  struct drm_encoder *encoder = &intel_sdvo->base.base;
2254  struct drm_connector *connector;
2255  struct intel_connector *intel_connector;
2256  struct intel_sdvo_connector *intel_sdvo_connector;
2257 
2258  intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL);
2259  if (!intel_sdvo_connector)
2260  return false;
2261 
2262  intel_connector = &intel_sdvo_connector->base;
2263  connector = &intel_connector->base;
2264  connector->polled = DRM_CONNECTOR_POLL_CONNECT;
2267 
2268  if (device == 0) {
2269  intel_sdvo->controlled_output |= SDVO_OUTPUT_RGB0;
2270  intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB0;
2271  } else if (device == 1) {
2272  intel_sdvo->controlled_output |= SDVO_OUTPUT_RGB1;
2273  intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB1;
2274  }
2275 
2276  intel_sdvo_connector_init(intel_sdvo_connector,
2277  intel_sdvo);
2278  return true;
2279 }
2280 
2281 static bool
2282 intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
2283 {
2284  struct drm_encoder *encoder = &intel_sdvo->base.base;
2285  struct drm_connector *connector;
2286  struct intel_connector *intel_connector;
2287  struct intel_sdvo_connector *intel_sdvo_connector;
2288 
2289  intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL);
2290  if (!intel_sdvo_connector)
2291  return false;
2292 
2293  intel_connector = &intel_sdvo_connector->base;
2294  connector = &intel_connector->base;
2297 
2298  if (device == 0) {
2299  intel_sdvo->controlled_output |= SDVO_OUTPUT_LVDS0;
2300  intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS0;
2301  } else if (device == 1) {
2302  intel_sdvo->controlled_output |= SDVO_OUTPUT_LVDS1;
2303  intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1;
2304  }
2305 
2306  intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
2307  if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector))
2308  goto err;
2309 
2310  return true;
2311 
2312 err:
2313  intel_sdvo_destroy(connector);
2314  return false;
2315 }
2316 
2317 static bool
2318 intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, uint16_t flags)
2319 {
2320  intel_sdvo->is_tv = false;
2321  intel_sdvo->base.needs_tv_clock = false;
2322  intel_sdvo->is_lvds = false;
2323 
2324  /* SDVO requires XXX1 function may not exist unless it has XXX0 function.*/
2325 
2326  if (flags & SDVO_OUTPUT_TMDS0)
2327  if (!intel_sdvo_dvi_init(intel_sdvo, 0))
2328  return false;
2329 
2330  if ((flags & SDVO_TMDS_MASK) == SDVO_TMDS_MASK)
2331  if (!intel_sdvo_dvi_init(intel_sdvo, 1))
2332  return false;
2333 
2334  /* TV has no XXX1 function block */
2335  if (flags & SDVO_OUTPUT_SVID0)
2336  if (!intel_sdvo_tv_init(intel_sdvo, SDVO_OUTPUT_SVID0))
2337  return false;
2338 
2339  if (flags & SDVO_OUTPUT_CVBS0)
2340  if (!intel_sdvo_tv_init(intel_sdvo, SDVO_OUTPUT_CVBS0))
2341  return false;
2342 
2343  if (flags & SDVO_OUTPUT_YPRPB0)
2344  if (!intel_sdvo_tv_init(intel_sdvo, SDVO_OUTPUT_YPRPB0))
2345  return false;
2346 
2347  if (flags & SDVO_OUTPUT_RGB0)
2348  if (!intel_sdvo_analog_init(intel_sdvo, 0))
2349  return false;
2350 
2351  if ((flags & SDVO_RGB_MASK) == SDVO_RGB_MASK)
2352  if (!intel_sdvo_analog_init(intel_sdvo, 1))
2353  return false;
2354 
2355  if (flags & SDVO_OUTPUT_LVDS0)
2356  if (!intel_sdvo_lvds_init(intel_sdvo, 0))
2357  return false;
2358 
2359  if ((flags & SDVO_LVDS_MASK) == SDVO_LVDS_MASK)
2360  if (!intel_sdvo_lvds_init(intel_sdvo, 1))
2361  return false;
2362 
2363  if ((flags & SDVO_OUTPUT_MASK) == 0) {
2364  unsigned char bytes[2];
2365 
2366  intel_sdvo->controlled_output = 0;
2367  memcpy(bytes, &intel_sdvo->caps.output_flags, 2);
2368  DRM_DEBUG_KMS("%s: Unknown SDVO output type (0x%02x%02x)\n",
2369  SDVO_NAME(intel_sdvo),
2370  bytes[0], bytes[1]);
2371  return false;
2372  }
2373  intel_sdvo->base.crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
2374 
2375  return true;
2376 }
2377 
2378 static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo)
2379 {
2380  struct drm_device *dev = intel_sdvo->base.base.dev;
2381  struct drm_connector *connector, *tmp;
2382 
2383  list_for_each_entry_safe(connector, tmp,
2384  &dev->mode_config.connector_list, head) {
2385  if (intel_attached_encoder(connector) == &intel_sdvo->base)
2386  intel_sdvo_destroy(connector);
2387  }
2388 }
2389 
2390 static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo,
2391  struct intel_sdvo_connector *intel_sdvo_connector,
2392  int type)
2393 {
2394  struct drm_device *dev = intel_sdvo->base.base.dev;
2396  uint32_t format_map, i;
2397 
2398  if (!intel_sdvo_set_target_output(intel_sdvo, type))
2399  return false;
2400 
2401  BUILD_BUG_ON(sizeof(format) != 6);
2402  if (!intel_sdvo_get_value(intel_sdvo,
2404  &format, sizeof(format)))
2405  return false;
2406 
2407  memcpy(&format_map, &format, min(sizeof(format_map), sizeof(format)));
2408 
2409  if (format_map == 0)
2410  return false;
2411 
2412  intel_sdvo_connector->format_supported_num = 0;
2413  for (i = 0 ; i < TV_FORMAT_NUM; i++)
2414  if (format_map & (1 << i))
2415  intel_sdvo_connector->tv_format_supported[intel_sdvo_connector->format_supported_num++] = i;
2416 
2417 
2418  intel_sdvo_connector->tv_format =
2420  "mode", intel_sdvo_connector->format_supported_num);
2421  if (!intel_sdvo_connector->tv_format)
2422  return false;
2423 
2424  for (i = 0; i < intel_sdvo_connector->format_supported_num; i++)
2426  intel_sdvo_connector->tv_format, i,
2427  i, tv_format_names[intel_sdvo_connector->tv_format_supported[i]]);
2428 
2429  intel_sdvo->tv_format_index = intel_sdvo_connector->tv_format_supported[0];
2430  drm_connector_attach_property(&intel_sdvo_connector->base.base,
2431  intel_sdvo_connector->tv_format, 0);
2432  return true;
2433 
2434 }
2435 
2436 #define ENHANCEMENT(name, NAME) do { \
2437  if (enhancements.name) { \
2438  if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_MAX_##NAME, &data_value, 4) || \
2439  !intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_##NAME, &response, 2)) \
2440  return false; \
2441  intel_sdvo_connector->max_##name = data_value[0]; \
2442  intel_sdvo_connector->cur_##name = response; \
2443  intel_sdvo_connector->name = \
2444  drm_property_create_range(dev, 0, #name, 0, data_value[0]); \
2445  if (!intel_sdvo_connector->name) return false; \
2446  drm_connector_attach_property(connector, \
2447  intel_sdvo_connector->name, \
2448  intel_sdvo_connector->cur_##name); \
2449  DRM_DEBUG_KMS(#name ": max %d, default %d, current %d\n", \
2450  data_value[0], data_value[1], response); \
2451  } \
2452 } while (0)
2453 
2454 static bool
2455 intel_sdvo_create_enhance_property_tv(struct intel_sdvo *intel_sdvo,
2456  struct intel_sdvo_connector *intel_sdvo_connector,
2457  struct intel_sdvo_enhancements_reply enhancements)
2458 {
2459  struct drm_device *dev = intel_sdvo->base.base.dev;
2460  struct drm_connector *connector = &intel_sdvo_connector->base.base;
2461  uint16_t response, data_value[2];
2462 
2463  /* when horizontal overscan is supported, Add the left/right property */
2464  if (enhancements.overscan_h) {
2465  if (!intel_sdvo_get_value(intel_sdvo,
2467  &data_value, 4))
2468  return false;
2469 
2470  if (!intel_sdvo_get_value(intel_sdvo,
2472  &response, 2))
2473  return false;
2474 
2475  intel_sdvo_connector->max_hscan = data_value[0];
2476  intel_sdvo_connector->left_margin = data_value[0] - response;
2477  intel_sdvo_connector->right_margin = intel_sdvo_connector->left_margin;
2478  intel_sdvo_connector->left =
2479  drm_property_create_range(dev, 0, "left_margin", 0, data_value[0]);
2480  if (!intel_sdvo_connector->left)
2481  return false;
2482 
2484  intel_sdvo_connector->left,
2485  intel_sdvo_connector->left_margin);
2486 
2487  intel_sdvo_connector->right =
2488  drm_property_create_range(dev, 0, "right_margin", 0, data_value[0]);
2489  if (!intel_sdvo_connector->right)
2490  return false;
2491 
2493  intel_sdvo_connector->right,
2494  intel_sdvo_connector->right_margin);
2495  DRM_DEBUG_KMS("h_overscan: max %d, "
2496  "default %d, current %d\n",
2497  data_value[0], data_value[1], response);
2498  }
2499 
2500  if (enhancements.overscan_v) {
2501  if (!intel_sdvo_get_value(intel_sdvo,
2503  &data_value, 4))
2504  return false;
2505 
2506  if (!intel_sdvo_get_value(intel_sdvo,
2508  &response, 2))
2509  return false;
2510 
2511  intel_sdvo_connector->max_vscan = data_value[0];
2512  intel_sdvo_connector->top_margin = data_value[0] - response;
2513  intel_sdvo_connector->bottom_margin = intel_sdvo_connector->top_margin;
2514  intel_sdvo_connector->top =
2516  "top_margin", 0, data_value[0]);
2517  if (!intel_sdvo_connector->top)
2518  return false;
2519 
2521  intel_sdvo_connector->top,
2522  intel_sdvo_connector->top_margin);
2523 
2524  intel_sdvo_connector->bottom =
2526  "bottom_margin", 0, data_value[0]);
2527  if (!intel_sdvo_connector->bottom)
2528  return false;
2529 
2531  intel_sdvo_connector->bottom,
2532  intel_sdvo_connector->bottom_margin);
2533  DRM_DEBUG_KMS("v_overscan: max %d, "
2534  "default %d, current %d\n",
2535  data_value[0], data_value[1], response);
2536  }
2537 
2538  ENHANCEMENT(hpos, HPOS);
2539  ENHANCEMENT(vpos, VPOS);
2540  ENHANCEMENT(saturation, SATURATION);
2542  ENHANCEMENT(hue, HUE);
2545  ENHANCEMENT(flicker_filter, FLICKER_FILTER);
2546  ENHANCEMENT(flicker_filter_adaptive, FLICKER_FILTER_ADAPTIVE);
2547  ENHANCEMENT(flicker_filter_2d, FLICKER_FILTER_2D);
2548  ENHANCEMENT(tv_chroma_filter, TV_CHROMA_FILTER);
2549  ENHANCEMENT(tv_luma_filter, TV_LUMA_FILTER);
2550 
2551  if (enhancements.dot_crawl) {
2552  if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_DOT_CRAWL, &response, 2))
2553  return false;
2554 
2555  intel_sdvo_connector->max_dot_crawl = 1;
2556  intel_sdvo_connector->cur_dot_crawl = response & 0x1;
2557  intel_sdvo_connector->dot_crawl =
2558  drm_property_create_range(dev, 0, "dot_crawl", 0, 1);
2559  if (!intel_sdvo_connector->dot_crawl)
2560  return false;
2561 
2563  intel_sdvo_connector->dot_crawl,
2564  intel_sdvo_connector->cur_dot_crawl);
2565  DRM_DEBUG_KMS("dot crawl: current %d\n", response);
2566  }
2567 
2568  return true;
2569 }
2570 
2571 static bool
2572 intel_sdvo_create_enhance_property_lvds(struct intel_sdvo *intel_sdvo,
2573  struct intel_sdvo_connector *intel_sdvo_connector,
2574  struct intel_sdvo_enhancements_reply enhancements)
2575 {
2576  struct drm_device *dev = intel_sdvo->base.base.dev;
2577  struct drm_connector *connector = &intel_sdvo_connector->base.base;
2578  uint16_t response, data_value[2];
2579 
2581 
2582  return true;
2583 }
2584 #undef ENHANCEMENT
2585 
2586 static bool intel_sdvo_create_enhance_property(struct intel_sdvo *intel_sdvo,
2587  struct intel_sdvo_connector *intel_sdvo_connector)
2588 {
2589  union {
2590  struct intel_sdvo_enhancements_reply reply;
2592  } enhancements;
2593 
2594  BUILD_BUG_ON(sizeof(enhancements) != 2);
2595 
2596  enhancements.response = 0;
2597  intel_sdvo_get_value(intel_sdvo,
2599  &enhancements, sizeof(enhancements));
2600  if (enhancements.response == 0) {
2601  DRM_DEBUG_KMS("No enhancement is supported\n");
2602  return true;
2603  }
2604 
2605  if (IS_TV(intel_sdvo_connector))
2606  return intel_sdvo_create_enhance_property_tv(intel_sdvo, intel_sdvo_connector, enhancements.reply);
2607  else if (IS_LVDS(intel_sdvo_connector))
2608  return intel_sdvo_create_enhance_property_lvds(intel_sdvo, intel_sdvo_connector, enhancements.reply);
2609  else
2610  return true;
2611 }
2612 
2613 static int intel_sdvo_ddc_proxy_xfer(struct i2c_adapter *adapter,
2614  struct i2c_msg *msgs,
2615  int num)
2616 {
2617  struct intel_sdvo *sdvo = adapter->algo_data;
2618 
2619  if (!intel_sdvo_set_control_bus_switch(sdvo, sdvo->ddc_bus))
2620  return -EIO;
2621 
2622  return sdvo->i2c->algo->master_xfer(sdvo->i2c, msgs, num);
2623 }
2624 
2625 static u32 intel_sdvo_ddc_proxy_func(struct i2c_adapter *adapter)
2626 {
2627  struct intel_sdvo *sdvo = adapter->algo_data;
2628  return sdvo->i2c->algo->functionality(sdvo->i2c);
2629 }
2630 
2631 static const struct i2c_algorithm intel_sdvo_ddc_proxy = {
2632  .master_xfer = intel_sdvo_ddc_proxy_xfer,
2633  .functionality = intel_sdvo_ddc_proxy_func
2634 };
2635 
2636 static bool
2637 intel_sdvo_init_ddc_proxy(struct intel_sdvo *sdvo,
2638  struct drm_device *dev)
2639 {
2640  sdvo->ddc.owner = THIS_MODULE;
2641  sdvo->ddc.class = I2C_CLASS_DDC;
2642  snprintf(sdvo->ddc.name, I2C_NAME_SIZE, "SDVO DDC proxy");
2643  sdvo->ddc.dev.parent = &dev->pdev->dev;
2644  sdvo->ddc.algo_data = sdvo;
2645  sdvo->ddc.algo = &intel_sdvo_ddc_proxy;
2646 
2647  return i2c_add_adapter(&sdvo->ddc) == 0;
2648 }
2649 
2650 bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
2651 {
2652  struct drm_i915_private *dev_priv = dev->dev_private;
2653  struct intel_encoder *intel_encoder;
2654  struct intel_sdvo *intel_sdvo;
2655  u32 hotplug_mask;
2656  int i;
2657 
2658  intel_sdvo = kzalloc(sizeof(struct intel_sdvo), GFP_KERNEL);
2659  if (!intel_sdvo)
2660  return false;
2661 
2662  intel_sdvo->sdvo_reg = sdvo_reg;
2663  intel_sdvo->is_sdvob = is_sdvob;
2664  intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, intel_sdvo) >> 1;
2665  intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo, sdvo_reg);
2666  if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev)) {
2667  kfree(intel_sdvo);
2668  return false;
2669  }
2670 
2671  /* encoder type will be decided later */
2672  intel_encoder = &intel_sdvo->base;
2673  intel_encoder->type = INTEL_OUTPUT_SDVO;
2674  drm_encoder_init(dev, &intel_encoder->base, &intel_sdvo_enc_funcs, 0);
2675 
2676  /* Read the regs to test if we can talk to the device */
2677  for (i = 0; i < 0x40; i++) {
2678  u8 byte;
2679 
2680  if (!intel_sdvo_read_byte(intel_sdvo, i, &byte)) {
2681  DRM_DEBUG_KMS("No SDVO device found on %s\n",
2682  SDVO_NAME(intel_sdvo));
2683  goto err;
2684  }
2685  }
2686 
2687  hotplug_mask = 0;
2688  if (IS_G4X(dev)) {
2689  hotplug_mask = intel_sdvo->is_sdvob ?
2691  } else if (IS_GEN4(dev)) {
2692  hotplug_mask = intel_sdvo->is_sdvob ?
2694  } else {
2695  hotplug_mask = intel_sdvo->is_sdvob ?
2697  }
2698 
2699  drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs);
2700 
2701  intel_encoder->disable = intel_disable_sdvo;
2702  intel_encoder->enable = intel_enable_sdvo;
2703  intel_encoder->get_hw_state = intel_sdvo_get_hw_state;
2704 
2705  /* In default case sdvo lvds is false */
2706  if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps))
2707  goto err;
2708 
2709  if (intel_sdvo_output_setup(intel_sdvo,
2710  intel_sdvo->caps.output_flags) != true) {
2711  DRM_DEBUG_KMS("SDVO output failed to setup on %s\n",
2712  SDVO_NAME(intel_sdvo));
2713  /* Output_setup can leave behind connectors! */
2714  goto err_output;
2715  }
2716 
2717  /*
2718  * Cloning SDVO with anything is often impossible, since the SDVO
2719  * encoder can request a special input timing mode. And even if that's
2720  * not the case we have evidence that cloning a plain unscaled mode with
2721  * VGA doesn't really work. Furthermore the cloning flags are way too
2722  * simplistic anyway to express such constraints, so just give up on
2723  * cloning for SDVO encoders.
2724  */
2725  intel_sdvo->base.cloneable = false;
2726 
2727  /* Only enable the hotplug irq if we need it, to work around noisy
2728  * hotplug lines.
2729  */
2730  if (intel_sdvo->hotplug_active)
2731  dev_priv->hotplug_supported_mask |= hotplug_mask;
2732 
2733  intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg);
2734 
2735  /* Set the input timing to the screen. Assume always input 0. */
2736  if (!intel_sdvo_set_target_input(intel_sdvo))
2737  goto err_output;
2738 
2739  if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo,
2740  &intel_sdvo->pixel_clock_min,
2741  &intel_sdvo->pixel_clock_max))
2742  goto err_output;
2743 
2744  DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, "
2745  "clock range %dMHz - %dMHz, "
2746  "input 1: %c, input 2: %c, "
2747  "output 1: %c, output 2: %c\n",
2748  SDVO_NAME(intel_sdvo),
2749  intel_sdvo->caps.vendor_id, intel_sdvo->caps.device_id,
2750  intel_sdvo->caps.device_rev_id,
2751  intel_sdvo->pixel_clock_min / 1000,
2752  intel_sdvo->pixel_clock_max / 1000,
2753  (intel_sdvo->caps.sdvo_inputs_mask & 0x1) ? 'Y' : 'N',
2754  (intel_sdvo->caps.sdvo_inputs_mask & 0x2) ? 'Y' : 'N',
2755  /* check currently supported outputs */
2756  intel_sdvo->caps.output_flags &
2757  (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_RGB0) ? 'Y' : 'N',
2758  intel_sdvo->caps.output_flags &
2759  (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N');
2760  return true;
2761 
2762 err_output:
2763  intel_sdvo_output_cleanup(intel_sdvo);
2764 
2765 err:
2766  drm_encoder_cleanup(&intel_encoder->base);
2767  i2c_del_adapter(&intel_sdvo->ddc);
2768  kfree(intel_sdvo);
2769 
2770  return false;
2771 }