diff options
| author | Paul Mundt <lethal@linux-sh.org> | 2009-08-14 16:58:45 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2009-08-14 16:58:45 -0400 |
| commit | d2dcd9101b1a940ce8496601ba871e47f84881ec (patch) | |
| tree | 3de9cb11379d51eb01b568a20c8d7c585c89d10e /drivers/gpu/drm/i915/intel_sdvo.c | |
| parent | 8010fbe7a67c2f993cbb11b9d8b7e98528256dd1 (diff) | |
| parent | 606b4c992f3b28f906100f1b6eb49059909d8da7 (diff) | |
Merge branch 'master' into sh/cachetlb
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sdvo.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 254 |
1 files changed, 172 insertions, 82 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 4f0c30948bc4..5371d9332554 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include "drm.h" | 31 | #include "drm.h" |
| 32 | #include "drm_crtc.h" | 32 | #include "drm_crtc.h" |
| 33 | #include "intel_drv.h" | 33 | #include "intel_drv.h" |
| 34 | #include "drm_edid.h" | ||
| 34 | #include "i915_drm.h" | 35 | #include "i915_drm.h" |
| 35 | #include "i915_drv.h" | 36 | #include "i915_drv.h" |
| 36 | #include "intel_sdvo_regs.h" | 37 | #include "intel_sdvo_regs.h" |
| @@ -55,6 +56,12 @@ struct intel_sdvo_priv { | |||
| 55 | /* Pixel clock limitations reported by the SDVO device, in kHz */ | 56 | /* Pixel clock limitations reported by the SDVO device, in kHz */ |
| 56 | int pixel_clock_min, pixel_clock_max; | 57 | int pixel_clock_min, pixel_clock_max; |
| 57 | 58 | ||
| 59 | /* | ||
| 60 | * For multiple function SDVO device, | ||
| 61 | * this is for current attached outputs. | ||
| 62 | */ | ||
| 63 | uint16_t attached_output; | ||
| 64 | |||
| 58 | /** | 65 | /** |
| 59 | * This is set if we're going to treat the device as TV-out. | 66 | * This is set if we're going to treat the device as TV-out. |
| 60 | * | 67 | * |
| @@ -114,6 +121,9 @@ struct intel_sdvo_priv { | |||
| 114 | u32 save_SDVOX; | 121 | u32 save_SDVOX; |
| 115 | }; | 122 | }; |
| 116 | 123 | ||
| 124 | static bool | ||
| 125 | intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags); | ||
| 126 | |||
| 117 | /** | 127 | /** |
| 118 | * Writes the SDVOB or SDVOC with the given value, but always writes both | 128 | * Writes the SDVOB or SDVOC with the given value, but always writes both |
| 119 | * SDVOB and SDVOC to work around apparent hardware issues (according to | 129 | * SDVOB and SDVOC to work around apparent hardware issues (according to |
| @@ -1435,41 +1445,96 @@ void intel_sdvo_set_hotplug(struct drm_connector *connector, int on) | |||
| 1435 | intel_sdvo_read_response(intel_output, &response, 2); | 1445 | intel_sdvo_read_response(intel_output, &response, 2); |
| 1436 | } | 1446 | } |
| 1437 | 1447 | ||
| 1438 | static void | 1448 | static bool |
| 1439 | intel_sdvo_hdmi_sink_detect(struct drm_connector *connector) | 1449 | intel_sdvo_multifunc_encoder(struct intel_output *intel_output) |
| 1450 | { | ||
| 1451 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | ||
| 1452 | int caps = 0; | ||
| 1453 | |||
| 1454 | if (sdvo_priv->caps.output_flags & | ||
| 1455 | (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) | ||
| 1456 | caps++; | ||
| 1457 | if (sdvo_priv->caps.output_flags & | ||
| 1458 | (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1)) | ||
| 1459 | caps++; | ||
| 1460 | if (sdvo_priv->caps.output_flags & | ||
| 1461 | (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID0)) | ||
| 1462 | caps++; | ||
| 1463 | if (sdvo_priv->caps.output_flags & | ||
| 1464 | (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1)) | ||
| 1465 | caps++; | ||
| 1466 | if (sdvo_priv->caps.output_flags & | ||
| 1467 | (SDVO_OUTPUT_YPRPB0 | SDVO_OUTPUT_YPRPB1)) | ||
| 1468 | caps++; | ||
| 1469 | |||
| 1470 | if (sdvo_priv->caps.output_flags & | ||
| 1471 | (SDVO_OUTPUT_SCART0 | SDVO_OUTPUT_SCART1)) | ||
| 1472 | caps++; | ||
| 1473 | |||
| 1474 | if (sdvo_priv->caps.output_flags & | ||
| 1475 | (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1)) | ||
| 1476 | caps++; | ||
| 1477 | |||
| 1478 | return (caps > 1); | ||
| 1479 | } | ||
| 1480 | |||
| 1481 | enum drm_connector_status | ||
| 1482 | intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response) | ||
| 1440 | { | 1483 | { |
| 1441 | struct intel_output *intel_output = to_intel_output(connector); | 1484 | struct intel_output *intel_output = to_intel_output(connector); |
| 1442 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | 1485 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; |
| 1486 | enum drm_connector_status status = connector_status_connected; | ||
| 1443 | struct edid *edid = NULL; | 1487 | struct edid *edid = NULL; |
| 1444 | 1488 | ||
| 1445 | edid = drm_get_edid(&intel_output->base, | 1489 | edid = drm_get_edid(&intel_output->base, |
| 1446 | intel_output->ddc_bus); | 1490 | intel_output->ddc_bus); |
| 1447 | if (edid != NULL) { | 1491 | if (edid != NULL) { |
| 1448 | sdvo_priv->is_hdmi = drm_detect_hdmi_monitor(edid); | 1492 | /* Don't report the output as connected if it's a DVI-I |
| 1493 | * connector with a non-digital EDID coming out. | ||
| 1494 | */ | ||
| 1495 | if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { | ||
| 1496 | if (edid->input & DRM_EDID_INPUT_DIGITAL) | ||
| 1497 | sdvo_priv->is_hdmi = | ||
| 1498 | drm_detect_hdmi_monitor(edid); | ||
| 1499 | else | ||
| 1500 | status = connector_status_disconnected; | ||
| 1501 | } | ||
| 1502 | |||
| 1449 | kfree(edid); | 1503 | kfree(edid); |
| 1450 | intel_output->base.display_info.raw_edid = NULL; | 1504 | intel_output->base.display_info.raw_edid = NULL; |
| 1451 | } | 1505 | |
| 1506 | } else if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) | ||
| 1507 | status = connector_status_disconnected; | ||
| 1508 | |||
| 1509 | return status; | ||
| 1452 | } | 1510 | } |
| 1453 | 1511 | ||
| 1454 | static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector) | 1512 | static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector) |
| 1455 | { | 1513 | { |
| 1456 | u8 response[2]; | 1514 | uint16_t response; |
| 1457 | u8 status; | 1515 | u8 status; |
| 1458 | struct intel_output *intel_output = to_intel_output(connector); | 1516 | struct intel_output *intel_output = to_intel_output(connector); |
| 1517 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | ||
| 1459 | 1518 | ||
| 1460 | intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0); | 1519 | intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0); |
| 1461 | status = intel_sdvo_read_response(intel_output, &response, 2); | 1520 | status = intel_sdvo_read_response(intel_output, &response, 2); |
| 1462 | 1521 | ||
| 1463 | DRM_DEBUG("SDVO response %d %d\n", response[0], response[1]); | 1522 | DRM_DEBUG("SDVO response %d %d\n", response & 0xff, response >> 8); |
| 1464 | 1523 | ||
| 1465 | if (status != SDVO_CMD_STATUS_SUCCESS) | 1524 | if (status != SDVO_CMD_STATUS_SUCCESS) |
| 1466 | return connector_status_unknown; | 1525 | return connector_status_unknown; |
| 1467 | 1526 | ||
| 1468 | if ((response[0] != 0) || (response[1] != 0)) { | 1527 | if (response == 0) |
| 1469 | intel_sdvo_hdmi_sink_detect(connector); | ||
| 1470 | return connector_status_connected; | ||
| 1471 | } else | ||
| 1472 | return connector_status_disconnected; | 1528 | return connector_status_disconnected; |
| 1529 | |||
| 1530 | if (intel_sdvo_multifunc_encoder(intel_output) && | ||
| 1531 | sdvo_priv->attached_output != response) { | ||
| 1532 | if (sdvo_priv->controlled_output != response && | ||
| 1533 | intel_sdvo_output_setup(intel_output, response) != true) | ||
| 1534 | return connector_status_unknown; | ||
| 1535 | sdvo_priv->attached_output = response; | ||
| 1536 | } | ||
| 1537 | return intel_sdvo_hdmi_sink_detect(connector, response); | ||
| 1473 | } | 1538 | } |
| 1474 | 1539 | ||
| 1475 | static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) | 1540 | static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) |
| @@ -1866,16 +1931,101 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, int output_device) | |||
| 1866 | return 0x72; | 1931 | return 0x72; |
| 1867 | } | 1932 | } |
| 1868 | 1933 | ||
| 1934 | static bool | ||
| 1935 | intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | ||
| 1936 | { | ||
| 1937 | struct drm_connector *connector = &intel_output->base; | ||
| 1938 | struct drm_encoder *encoder = &intel_output->enc; | ||
| 1939 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | ||
| 1940 | bool ret = true, registered = false; | ||
| 1941 | |||
| 1942 | sdvo_priv->is_tv = false; | ||
| 1943 | intel_output->needs_tv_clock = false; | ||
| 1944 | sdvo_priv->is_lvds = false; | ||
| 1945 | |||
| 1946 | if (device_is_registered(&connector->kdev)) { | ||
| 1947 | drm_sysfs_connector_remove(connector); | ||
| 1948 | registered = true; | ||
| 1949 | } | ||
| 1950 | |||
| 1951 | if (flags & | ||
| 1952 | (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { | ||
| 1953 | if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0) | ||
| 1954 | sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0; | ||
| 1955 | else | ||
| 1956 | sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1; | ||
| 1957 | |||
| 1958 | encoder->encoder_type = DRM_MODE_ENCODER_TMDS; | ||
| 1959 | connector->connector_type = DRM_MODE_CONNECTOR_DVID; | ||
| 1960 | |||
| 1961 | if (intel_sdvo_get_supp_encode(intel_output, | ||
| 1962 | &sdvo_priv->encode) && | ||
| 1963 | intel_sdvo_get_digital_encoding_mode(intel_output) && | ||
| 1964 | sdvo_priv->is_hdmi) { | ||
| 1965 | /* enable hdmi encoding mode if supported */ | ||
| 1966 | intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI); | ||
| 1967 | intel_sdvo_set_colorimetry(intel_output, | ||
| 1968 | SDVO_COLORIMETRY_RGB256); | ||
| 1969 | connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; | ||
| 1970 | } | ||
| 1971 | } else if (flags & SDVO_OUTPUT_SVID0) { | ||
| 1972 | |||
| 1973 | sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0; | ||
| 1974 | encoder->encoder_type = DRM_MODE_ENCODER_TVDAC; | ||
| 1975 | connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; | ||
| 1976 | sdvo_priv->is_tv = true; | ||
| 1977 | intel_output->needs_tv_clock = true; | ||
| 1978 | } else if (flags & SDVO_OUTPUT_RGB0) { | ||
| 1979 | |||
| 1980 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; | ||
| 1981 | encoder->encoder_type = DRM_MODE_ENCODER_DAC; | ||
| 1982 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; | ||
| 1983 | } else if (flags & SDVO_OUTPUT_RGB1) { | ||
| 1984 | |||
| 1985 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; | ||
| 1986 | encoder->encoder_type = DRM_MODE_ENCODER_DAC; | ||
| 1987 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; | ||
| 1988 | } else if (flags & SDVO_OUTPUT_LVDS0) { | ||
| 1989 | |||
| 1990 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; | ||
| 1991 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; | ||
| 1992 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; | ||
| 1993 | sdvo_priv->is_lvds = true; | ||
| 1994 | } else if (flags & SDVO_OUTPUT_LVDS1) { | ||
| 1995 | |||
| 1996 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; | ||
| 1997 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; | ||
| 1998 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; | ||
| 1999 | sdvo_priv->is_lvds = true; | ||
| 2000 | } else { | ||
| 2001 | |||
| 2002 | unsigned char bytes[2]; | ||
| 2003 | |||
| 2004 | sdvo_priv->controlled_output = 0; | ||
| 2005 | memcpy(bytes, &sdvo_priv->caps.output_flags, 2); | ||
| 2006 | DRM_DEBUG_KMS(I915_SDVO, | ||
| 2007 | "%s: Unknown SDVO output type (0x%02x%02x)\n", | ||
| 2008 | SDVO_NAME(sdvo_priv), | ||
| 2009 | bytes[0], bytes[1]); | ||
| 2010 | ret = false; | ||
| 2011 | } | ||
| 2012 | |||
| 2013 | if (ret && registered) | ||
| 2014 | ret = drm_sysfs_connector_add(connector) == 0 ? true : false; | ||
| 2015 | |||
| 2016 | |||
| 2017 | return ret; | ||
| 2018 | |||
| 2019 | } | ||
| 2020 | |||
| 1869 | bool intel_sdvo_init(struct drm_device *dev, int output_device) | 2021 | bool intel_sdvo_init(struct drm_device *dev, int output_device) |
| 1870 | { | 2022 | { |
| 1871 | struct drm_connector *connector; | 2023 | struct drm_connector *connector; |
| 1872 | struct intel_output *intel_output; | 2024 | struct intel_output *intel_output; |
| 1873 | struct intel_sdvo_priv *sdvo_priv; | 2025 | struct intel_sdvo_priv *sdvo_priv; |
| 1874 | 2026 | ||
| 1875 | int connector_type; | ||
| 1876 | u8 ch[0x40]; | 2027 | u8 ch[0x40]; |
| 1877 | int i; | 2028 | int i; |
| 1878 | int encoder_type; | ||
| 1879 | 2029 | ||
| 1880 | intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL); | 2030 | intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL); |
| 1881 | if (!intel_output) { | 2031 | if (!intel_output) { |
| @@ -1925,88 +2075,28 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device) | |||
| 1925 | intel_output->ddc_bus->algo = &intel_sdvo_i2c_bit_algo; | 2075 | intel_output->ddc_bus->algo = &intel_sdvo_i2c_bit_algo; |
| 1926 | 2076 | ||
| 1927 | /* In defaut case sdvo lvds is false */ | 2077 | /* In defaut case sdvo lvds is false */ |
| 1928 | sdvo_priv->is_lvds = false; | ||
| 1929 | intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps); | 2078 | intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps); |
| 1930 | 2079 | ||
| 1931 | if (sdvo_priv->caps.output_flags & | 2080 | if (intel_sdvo_output_setup(intel_output, |
| 1932 | (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { | 2081 | sdvo_priv->caps.output_flags) != true) { |
| 1933 | if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0) | 2082 | DRM_DEBUG("SDVO output failed to setup on SDVO%c\n", |
| 1934 | sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0; | 2083 | output_device == SDVOB ? 'B' : 'C'); |
| 1935 | else | ||
| 1936 | sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1; | ||
| 1937 | |||
| 1938 | encoder_type = DRM_MODE_ENCODER_TMDS; | ||
| 1939 | connector_type = DRM_MODE_CONNECTOR_DVID; | ||
| 1940 | |||
| 1941 | if (intel_sdvo_get_supp_encode(intel_output, | ||
| 1942 | &sdvo_priv->encode) && | ||
| 1943 | intel_sdvo_get_digital_encoding_mode(intel_output) && | ||
| 1944 | sdvo_priv->is_hdmi) { | ||
| 1945 | /* enable hdmi encoding mode if supported */ | ||
| 1946 | intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI); | ||
| 1947 | intel_sdvo_set_colorimetry(intel_output, | ||
| 1948 | SDVO_COLORIMETRY_RGB256); | ||
| 1949 | connector_type = DRM_MODE_CONNECTOR_HDMIA; | ||
| 1950 | } | ||
| 1951 | } | ||
| 1952 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_SVID0) | ||
| 1953 | { | ||
| 1954 | sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0; | ||
| 1955 | encoder_type = DRM_MODE_ENCODER_TVDAC; | ||
| 1956 | connector_type = DRM_MODE_CONNECTOR_SVIDEO; | ||
| 1957 | sdvo_priv->is_tv = true; | ||
| 1958 | intel_output->needs_tv_clock = true; | ||
| 1959 | } | ||
| 1960 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0) | ||
| 1961 | { | ||
| 1962 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; | ||
| 1963 | encoder_type = DRM_MODE_ENCODER_DAC; | ||
| 1964 | connector_type = DRM_MODE_CONNECTOR_VGA; | ||
| 1965 | } | ||
| 1966 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB1) | ||
| 1967 | { | ||
| 1968 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; | ||
| 1969 | encoder_type = DRM_MODE_ENCODER_DAC; | ||
| 1970 | connector_type = DRM_MODE_CONNECTOR_VGA; | ||
| 1971 | } | ||
| 1972 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS0) | ||
| 1973 | { | ||
| 1974 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; | ||
| 1975 | encoder_type = DRM_MODE_ENCODER_LVDS; | ||
| 1976 | connector_type = DRM_MODE_CONNECTOR_LVDS; | ||
| 1977 | sdvo_priv->is_lvds = true; | ||
| 1978 | } | ||
| 1979 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS1) | ||
| 1980 | { | ||
| 1981 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; | ||
| 1982 | encoder_type = DRM_MODE_ENCODER_LVDS; | ||
| 1983 | connector_type = DRM_MODE_CONNECTOR_LVDS; | ||
| 1984 | sdvo_priv->is_lvds = true; | ||
| 1985 | } | ||
| 1986 | else | ||
| 1987 | { | ||
| 1988 | unsigned char bytes[2]; | ||
| 1989 | |||
| 1990 | sdvo_priv->controlled_output = 0; | ||
| 1991 | memcpy (bytes, &sdvo_priv->caps.output_flags, 2); | ||
| 1992 | DRM_DEBUG_KMS(I915_SDVO, | ||
| 1993 | "%s: Unknown SDVO output type (0x%02x%02x)\n", | ||
| 1994 | SDVO_NAME(sdvo_priv), | ||
| 1995 | bytes[0], bytes[1]); | ||
| 1996 | encoder_type = DRM_MODE_ENCODER_NONE; | ||
| 1997 | connector_type = DRM_MODE_CONNECTOR_Unknown; | ||
| 1998 | goto err_i2c; | 2084 | goto err_i2c; |
| 1999 | } | 2085 | } |
| 2000 | 2086 | ||
| 2087 | |||
| 2001 | connector = &intel_output->base; | 2088 | connector = &intel_output->base; |
| 2002 | drm_connector_init(dev, connector, &intel_sdvo_connector_funcs, | 2089 | drm_connector_init(dev, connector, &intel_sdvo_connector_funcs, |
| 2003 | connector_type); | 2090 | connector->connector_type); |
| 2091 | |||
| 2004 | drm_connector_helper_add(connector, &intel_sdvo_connector_helper_funcs); | 2092 | drm_connector_helper_add(connector, &intel_sdvo_connector_helper_funcs); |
| 2005 | connector->interlace_allowed = 0; | 2093 | connector->interlace_allowed = 0; |
| 2006 | connector->doublescan_allowed = 0; | 2094 | connector->doublescan_allowed = 0; |
| 2007 | connector->display_info.subpixel_order = SubPixelHorizontalRGB; | 2095 | connector->display_info.subpixel_order = SubPixelHorizontalRGB; |
| 2008 | 2096 | ||
| 2009 | drm_encoder_init(dev, &intel_output->enc, &intel_sdvo_enc_funcs, encoder_type); | 2097 | drm_encoder_init(dev, &intel_output->enc, |
| 2098 | &intel_sdvo_enc_funcs, intel_output->enc.encoder_type); | ||
| 2099 | |||
| 2010 | drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs); | 2100 | drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs); |
| 2011 | 2101 | ||
| 2012 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); | 2102 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); |
