diff options
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 62d22ae4a1d1..e3b7a7ee39cb 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -1929,6 +1929,41 @@ static const struct drm_encoder_funcs intel_sdvo_enc_funcs = { | |||
| 1929 | .destroy = intel_sdvo_enc_destroy, | 1929 | .destroy = intel_sdvo_enc_destroy, |
| 1930 | }; | 1930 | }; |
| 1931 | 1931 | ||
| 1932 | static void | ||
| 1933 | intel_sdvo_guess_ddc_bus(struct intel_sdvo *sdvo) | ||
| 1934 | { | ||
| 1935 | uint16_t mask = 0; | ||
| 1936 | unsigned int num_bits; | ||
| 1937 | |||
| 1938 | /* Make a mask of outputs less than or equal to our own priority in the | ||
| 1939 | * list. | ||
| 1940 | */ | ||
| 1941 | switch (sdvo->controlled_output) { | ||
| 1942 | case SDVO_OUTPUT_LVDS1: | ||
| 1943 | mask |= SDVO_OUTPUT_LVDS1; | ||
| 1944 | case SDVO_OUTPUT_LVDS0: | ||
| 1945 | mask |= SDVO_OUTPUT_LVDS0; | ||
| 1946 | case SDVO_OUTPUT_TMDS1: | ||
| 1947 | mask |= SDVO_OUTPUT_TMDS1; | ||
| 1948 | case SDVO_OUTPUT_TMDS0: | ||
| 1949 | mask |= SDVO_OUTPUT_TMDS0; | ||
| 1950 | case SDVO_OUTPUT_RGB1: | ||
| 1951 | mask |= SDVO_OUTPUT_RGB1; | ||
| 1952 | case SDVO_OUTPUT_RGB0: | ||
| 1953 | mask |= SDVO_OUTPUT_RGB0; | ||
| 1954 | break; | ||
| 1955 | } | ||
| 1956 | |||
| 1957 | /* Count bits to find what number we are in the priority list. */ | ||
| 1958 | mask &= sdvo->caps.output_flags; | ||
| 1959 | num_bits = hweight16(mask); | ||
| 1960 | /* If more than 3 outputs, default to DDC bus 3 for now. */ | ||
| 1961 | if (num_bits > 3) | ||
| 1962 | num_bits = 3; | ||
| 1963 | |||
| 1964 | /* Corresponds to SDVO_CONTROL_BUS_DDCx */ | ||
| 1965 | sdvo->ddc_bus = 1 << num_bits; | ||
| 1966 | } | ||
| 1932 | 1967 | ||
| 1933 | /** | 1968 | /** |
| 1934 | * Choose the appropriate DDC bus for control bus switch command for this | 1969 | * Choose the appropriate DDC bus for control bus switch command for this |
| @@ -1948,7 +1983,10 @@ intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv, | |||
| 1948 | else | 1983 | else |
| 1949 | mapping = &(dev_priv->sdvo_mappings[1]); | 1984 | mapping = &(dev_priv->sdvo_mappings[1]); |
| 1950 | 1985 | ||
| 1951 | sdvo->ddc_bus = 1 << ((mapping->ddc_pin & 0xf0) >> 4); | 1986 | if (mapping->initialized) |
| 1987 | sdvo->ddc_bus = 1 << ((mapping->ddc_pin & 0xf0) >> 4); | ||
| 1988 | else | ||
| 1989 | intel_sdvo_guess_ddc_bus(sdvo); | ||
| 1952 | } | 1990 | } |
| 1953 | 1991 | ||
| 1954 | static bool | 1992 | static bool |
