diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_bios.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 41 |
3 files changed, 11 insertions, 32 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index bf11ad9998db..001e2f32be3f 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -135,6 +135,7 @@ struct sdvo_device_mapping { | |||
| 135 | u8 slave_addr; | 135 | u8 slave_addr; |
| 136 | u8 dvo_wiring; | 136 | u8 dvo_wiring; |
| 137 | u8 initialized; | 137 | u8 initialized; |
| 138 | u8 ddc_pin; | ||
| 138 | }; | 139 | }; |
| 139 | 140 | ||
| 140 | struct drm_i915_error_state { | 141 | struct drm_i915_error_state { |
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index f9ba452f0cbf..4c748d8f73d6 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
| @@ -366,6 +366,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | |||
| 366 | p_mapping->dvo_port = p_child->dvo_port; | 366 | p_mapping->dvo_port = p_child->dvo_port; |
| 367 | p_mapping->slave_addr = p_child->slave_addr; | 367 | p_mapping->slave_addr = p_child->slave_addr; |
| 368 | p_mapping->dvo_wiring = p_child->dvo_wiring; | 368 | p_mapping->dvo_wiring = p_child->dvo_wiring; |
| 369 | p_mapping->ddc_pin = p_child->ddc_pin; | ||
| 369 | p_mapping->initialized = 1; | 370 | p_mapping->initialized = 1; |
| 370 | } else { | 371 | } else { |
| 371 | DRM_DEBUG_KMS("Maybe one SDVO port is shared by " | 372 | DRM_DEBUG_KMS("Maybe one SDVO port is shared by " |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 42ceb15da689..5192723637b5 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -2054,40 +2054,17 @@ static const struct drm_encoder_funcs intel_sdvo_enc_funcs = { | |||
| 2054 | * outputs, then LVDS outputs. | 2054 | * outputs, then LVDS outputs. |
| 2055 | */ | 2055 | */ |
| 2056 | static void | 2056 | static void |
| 2057 | intel_sdvo_select_ddc_bus(struct intel_sdvo_priv *dev_priv) | 2057 | intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv, |
| 2058 | struct intel_sdvo_priv *sdvo, u32 reg) | ||
| 2058 | { | 2059 | { |
| 2059 | uint16_t mask = 0; | 2060 | struct sdvo_device_mapping *mapping; |
| 2060 | unsigned int num_bits; | ||
| 2061 | 2061 | ||
| 2062 | /* Make a mask of outputs less than or equal to our own priority in the | 2062 | if (IS_SDVOB(reg)) |
| 2063 | * list. | 2063 | mapping = &(dev_priv->sdvo_mappings[0]); |
| 2064 | */ | 2064 | else |
| 2065 | switch (dev_priv->controlled_output) { | 2065 | mapping = &(dev_priv->sdvo_mappings[1]); |
| 2066 | case SDVO_OUTPUT_LVDS1: | ||
| 2067 | mask |= SDVO_OUTPUT_LVDS1; | ||
| 2068 | case SDVO_OUTPUT_LVDS0: | ||
| 2069 | mask |= SDVO_OUTPUT_LVDS0; | ||
| 2070 | case SDVO_OUTPUT_TMDS1: | ||
| 2071 | mask |= SDVO_OUTPUT_TMDS1; | ||
| 2072 | case SDVO_OUTPUT_TMDS0: | ||
| 2073 | mask |= SDVO_OUTPUT_TMDS0; | ||
| 2074 | case SDVO_OUTPUT_RGB1: | ||
| 2075 | mask |= SDVO_OUTPUT_RGB1; | ||
| 2076 | case SDVO_OUTPUT_RGB0: | ||
| 2077 | mask |= SDVO_OUTPUT_RGB0; | ||
| 2078 | break; | ||
| 2079 | } | ||
| 2080 | |||
| 2081 | /* Count bits to find what number we are in the priority list. */ | ||
| 2082 | mask &= dev_priv->caps.output_flags; | ||
| 2083 | num_bits = hweight16(mask); | ||
| 2084 | if (num_bits > 3) { | ||
| 2085 | /* if more than 3 outputs, default to DDC bus 3 for now */ | ||
| 2086 | num_bits = 3; | ||
| 2087 | } | ||
| 2088 | 2066 | ||
| 2089 | /* Corresponds to SDVO_CONTROL_BUS_DDCx */ | 2067 | sdvo->ddc_bus = 1 << ((mapping->ddc_pin & 0xf0) >> 4); |
| 2090 | dev_priv->ddc_bus = 1 << num_bits; | ||
| 2091 | } | 2068 | } |
| 2092 | 2069 | ||
| 2093 | static bool | 2070 | static bool |
| @@ -2864,7 +2841,7 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) | |||
| 2864 | goto err_i2c; | 2841 | goto err_i2c; |
| 2865 | } | 2842 | } |
| 2866 | 2843 | ||
| 2867 | intel_sdvo_select_ddc_bus(sdvo_priv); | 2844 | intel_sdvo_select_ddc_bus(dev_priv, sdvo_priv, sdvo_reg); |
| 2868 | 2845 | ||
| 2869 | /* Set the input timing to the screen. Assume always input 0. */ | 2846 | /* Set the input timing to the screen. Assume always input 0. */ |
| 2870 | intel_sdvo_set_target_input(intel_encoder, true, false); | 2847 | intel_sdvo_set_target_input(intel_encoder, true, false); |
