diff options
author | Zhao Yakui <yakui.zhao@intel.com> | 2009-09-10 03:45:46 -0400 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-09-10 14:28:57 -0400 |
commit | b9219c5e8be99ddd697e3f9b61069d7ea477ddec (patch) | |
tree | 7e6f6d5d5831350780eeca27901fd77abcb86809 | |
parent | 5323fd042f89164927ee8c311f0a975e8c846412 (diff) |
drm/i915: Add the enhancement property for SDVO-TV
When the sdvo device is detected as SDVO-TV, we will check whether the
sepecific picture enhancement is supported. If it is supported, we will
add the corresponnding property for SDVO-TV. We will add the following
property for the SDVO-TV enhancements if they are supported:
* Contrast/Brightness/Saturation/Hue.
* left/right/top/bottom margin: This is implemented by using the
horizontal/vertical overscan enhancements. When the overscan
enhancements are supported, the above properties will be added. This is
to be compatible with what we have done in integrated-TV.
* horizontal pos/vertical pos.
http://bugs.freedesktop.org/show_bug.cgi?id=22891
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 500 |
1 files changed, 495 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 0bf28efcf2c1..ce8c5622d653 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -135,6 +135,30 @@ struct intel_sdvo_priv { | |||
135 | struct intel_sdvo_dtd save_input_dtd_1, save_input_dtd_2; | 135 | struct intel_sdvo_dtd save_input_dtd_1, save_input_dtd_2; |
136 | struct intel_sdvo_dtd save_output_dtd[16]; | 136 | struct intel_sdvo_dtd save_output_dtd[16]; |
137 | u32 save_SDVOX; | 137 | u32 save_SDVOX; |
138 | /* add the property for the SDVO-TV */ | ||
139 | struct drm_property *left_property; | ||
140 | struct drm_property *right_property; | ||
141 | struct drm_property *top_property; | ||
142 | struct drm_property *bottom_property; | ||
143 | struct drm_property *hpos_property; | ||
144 | struct drm_property *vpos_property; | ||
145 | |||
146 | /* add the property for the SDVO-TV/LVDS */ | ||
147 | struct drm_property *brightness_property; | ||
148 | struct drm_property *contrast_property; | ||
149 | struct drm_property *saturation_property; | ||
150 | struct drm_property *hue_property; | ||
151 | |||
152 | /* Add variable to record current setting for the above property */ | ||
153 | u32 left_margin, right_margin, top_margin, bottom_margin; | ||
154 | /* this is to get the range of margin.*/ | ||
155 | u32 max_hscan, max_vscan; | ||
156 | u32 max_hpos, cur_hpos; | ||
157 | u32 max_vpos, cur_vpos; | ||
158 | u32 cur_brightness, max_brightness; | ||
159 | u32 cur_contrast, max_contrast; | ||
160 | u32 cur_saturation, max_saturation; | ||
161 | u32 cur_hue, max_hue; | ||
138 | }; | 162 | }; |
139 | 163 | ||
140 | static bool | 164 | static bool |
@@ -281,6 +305,31 @@ static const struct _sdvo_cmd_name { | |||
281 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT), | 305 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT), |
282 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SCALED_HDTV_RESOLUTION_SUPPORT), | 306 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SCALED_HDTV_RESOLUTION_SUPPORT), |
283 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS), | 307 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS), |
308 | /* Add the op code for SDVO enhancements */ | ||
309 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_POSITION_H), | ||
310 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_POSITION_H), | ||
311 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_POSITION_H), | ||
312 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_POSITION_V), | ||
313 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_POSITION_V), | ||
314 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_POSITION_V), | ||
315 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_SATURATION), | ||
316 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SATURATION), | ||
317 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_SATURATION), | ||
318 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_HUE), | ||
319 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HUE), | ||
320 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HUE), | ||
321 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_CONTRAST), | ||
322 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_CONTRAST), | ||
323 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_CONTRAST), | ||
324 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_BRIGHTNESS), | ||
325 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_BRIGHTNESS), | ||
326 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_BRIGHTNESS), | ||
327 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_OVERSCAN_H), | ||
328 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OVERSCAN_H), | ||
329 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_OVERSCAN_H), | ||
330 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_OVERSCAN_V), | ||
331 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OVERSCAN_V), | ||
332 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_OVERSCAN_V), | ||
284 | /* HDMI op code */ | 333 | /* HDMI op code */ |
285 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPP_ENCODE), | 334 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPP_ENCODE), |
286 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ENCODE), | 335 | SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ENCODE), |
@@ -981,7 +1030,7 @@ static void intel_sdvo_set_tv_format(struct intel_output *output) | |||
981 | 1030 | ||
982 | status = intel_sdvo_read_response(output, NULL, 0); | 1031 | status = intel_sdvo_read_response(output, NULL, 0); |
983 | if (status != SDVO_CMD_STATUS_SUCCESS) | 1032 | if (status != SDVO_CMD_STATUS_SUCCESS) |
984 | DRM_DEBUG("%s: Failed to set TV format\n", | 1033 | DRM_DEBUG_KMS("%s: Failed to set TV format\n", |
985 | SDVO_NAME(sdvo_priv)); | 1034 | SDVO_NAME(sdvo_priv)); |
986 | } | 1035 | } |
987 | 1036 | ||
@@ -1792,6 +1841,45 @@ static int intel_sdvo_get_modes(struct drm_connector *connector) | |||
1792 | return 1; | 1841 | return 1; |
1793 | } | 1842 | } |
1794 | 1843 | ||
1844 | static | ||
1845 | void intel_sdvo_destroy_enhance_property(struct drm_connector *connector) | ||
1846 | { | ||
1847 | struct intel_output *intel_output = to_intel_output(connector); | ||
1848 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | ||
1849 | struct drm_device *dev = connector->dev; | ||
1850 | |||
1851 | if (sdvo_priv->is_tv) { | ||
1852 | if (sdvo_priv->left_property) | ||
1853 | drm_property_destroy(dev, sdvo_priv->left_property); | ||
1854 | if (sdvo_priv->right_property) | ||
1855 | drm_property_destroy(dev, sdvo_priv->right_property); | ||
1856 | if (sdvo_priv->top_property) | ||
1857 | drm_property_destroy(dev, sdvo_priv->top_property); | ||
1858 | if (sdvo_priv->bottom_property) | ||
1859 | drm_property_destroy(dev, sdvo_priv->bottom_property); | ||
1860 | if (sdvo_priv->hpos_property) | ||
1861 | drm_property_destroy(dev, sdvo_priv->hpos_property); | ||
1862 | if (sdvo_priv->vpos_property) | ||
1863 | drm_property_destroy(dev, sdvo_priv->vpos_property); | ||
1864 | } | ||
1865 | if (sdvo_priv->is_tv) { | ||
1866 | if (sdvo_priv->saturation_property) | ||
1867 | drm_property_destroy(dev, | ||
1868 | sdvo_priv->saturation_property); | ||
1869 | if (sdvo_priv->contrast_property) | ||
1870 | drm_property_destroy(dev, | ||
1871 | sdvo_priv->contrast_property); | ||
1872 | if (sdvo_priv->hue_property) | ||
1873 | drm_property_destroy(dev, sdvo_priv->hue_property); | ||
1874 | } | ||
1875 | if (sdvo_priv->is_tv) { | ||
1876 | if (sdvo_priv->brightness_property) | ||
1877 | drm_property_destroy(dev, | ||
1878 | sdvo_priv->brightness_property); | ||
1879 | } | ||
1880 | return; | ||
1881 | } | ||
1882 | |||
1795 | static void intel_sdvo_destroy(struct drm_connector *connector) | 1883 | static void intel_sdvo_destroy(struct drm_connector *connector) |
1796 | { | 1884 | { |
1797 | struct intel_output *intel_output = to_intel_output(connector); | 1885 | struct intel_output *intel_output = to_intel_output(connector); |
@@ -1812,6 +1900,9 @@ static void intel_sdvo_destroy(struct drm_connector *connector) | |||
1812 | drm_property_destroy(connector->dev, | 1900 | drm_property_destroy(connector->dev, |
1813 | sdvo_priv->tv_format_property); | 1901 | sdvo_priv->tv_format_property); |
1814 | 1902 | ||
1903 | if (sdvo_priv->is_tv) | ||
1904 | intel_sdvo_destroy_enhance_property(connector); | ||
1905 | |||
1815 | drm_sysfs_connector_remove(connector); | 1906 | drm_sysfs_connector_remove(connector); |
1816 | drm_connector_cleanup(connector); | 1907 | drm_connector_cleanup(connector); |
1817 | 1908 | ||
@@ -1829,6 +1920,8 @@ intel_sdvo_set_property(struct drm_connector *connector, | |||
1829 | struct drm_crtc *crtc = encoder->crtc; | 1920 | struct drm_crtc *crtc = encoder->crtc; |
1830 | int ret = 0; | 1921 | int ret = 0; |
1831 | bool changed = false; | 1922 | bool changed = false; |
1923 | uint8_t cmd, status; | ||
1924 | uint16_t temp_value; | ||
1832 | 1925 | ||
1833 | ret = drm_connector_property_set_value(connector, property, val); | 1926 | ret = drm_connector_property_set_value(connector, property, val); |
1834 | if (ret < 0) | 1927 | if (ret < 0) |
@@ -1845,11 +1938,102 @@ intel_sdvo_set_property(struct drm_connector *connector, | |||
1845 | 1938 | ||
1846 | sdvo_priv->tv_format_name = sdvo_priv->tv_format_supported[val]; | 1939 | sdvo_priv->tv_format_name = sdvo_priv->tv_format_supported[val]; |
1847 | changed = true; | 1940 | changed = true; |
1848 | } else { | ||
1849 | ret = -EINVAL; | ||
1850 | goto out; | ||
1851 | } | 1941 | } |
1852 | 1942 | ||
1943 | if (sdvo_priv->is_tv) { | ||
1944 | cmd = 0; | ||
1945 | temp_value = val; | ||
1946 | if (sdvo_priv->left_property == property) { | ||
1947 | drm_connector_property_set_value(connector, | ||
1948 | sdvo_priv->right_property, val); | ||
1949 | if (sdvo_priv->left_margin == temp_value) | ||
1950 | goto out; | ||
1951 | |||
1952 | sdvo_priv->left_margin = temp_value; | ||
1953 | sdvo_priv->right_margin = temp_value; | ||
1954 | temp_value = sdvo_priv->max_hscan - | ||
1955 | sdvo_priv->left_margin; | ||
1956 | cmd = SDVO_CMD_SET_OVERSCAN_H; | ||
1957 | } else if (sdvo_priv->right_property == property) { | ||
1958 | drm_connector_property_set_value(connector, | ||
1959 | sdvo_priv->left_property, val); | ||
1960 | if (sdvo_priv->right_margin == temp_value) | ||
1961 | goto out; | ||
1962 | |||
1963 | sdvo_priv->left_margin = temp_value; | ||
1964 | sdvo_priv->right_margin = temp_value; | ||
1965 | temp_value = sdvo_priv->max_hscan - | ||
1966 | sdvo_priv->left_margin; | ||
1967 | cmd = SDVO_CMD_SET_OVERSCAN_H; | ||
1968 | } else if (sdvo_priv->top_property == property) { | ||
1969 | drm_connector_property_set_value(connector, | ||
1970 | sdvo_priv->bottom_property, val); | ||
1971 | if (sdvo_priv->top_margin == temp_value) | ||
1972 | goto out; | ||
1973 | |||
1974 | sdvo_priv->top_margin = temp_value; | ||
1975 | sdvo_priv->bottom_margin = temp_value; | ||
1976 | temp_value = sdvo_priv->max_vscan - | ||
1977 | sdvo_priv->top_margin; | ||
1978 | cmd = SDVO_CMD_SET_OVERSCAN_V; | ||
1979 | } else if (sdvo_priv->bottom_property == property) { | ||
1980 | drm_connector_property_set_value(connector, | ||
1981 | sdvo_priv->top_property, val); | ||
1982 | if (sdvo_priv->bottom_margin == temp_value) | ||
1983 | goto out; | ||
1984 | sdvo_priv->top_margin = temp_value; | ||
1985 | sdvo_priv->bottom_margin = temp_value; | ||
1986 | temp_value = sdvo_priv->max_vscan - | ||
1987 | sdvo_priv->top_margin; | ||
1988 | cmd = SDVO_CMD_SET_OVERSCAN_V; | ||
1989 | } else if (sdvo_priv->hpos_property == property) { | ||
1990 | if (sdvo_priv->cur_hpos == temp_value) | ||
1991 | goto out; | ||
1992 | |||
1993 | cmd = SDVO_CMD_SET_POSITION_H; | ||
1994 | sdvo_priv->cur_hpos = temp_value; | ||
1995 | } else if (sdvo_priv->vpos_property == property) { | ||
1996 | if (sdvo_priv->cur_vpos == temp_value) | ||
1997 | goto out; | ||
1998 | |||
1999 | cmd = SDVO_CMD_SET_POSITION_V; | ||
2000 | sdvo_priv->cur_vpos = temp_value; | ||
2001 | } else if (sdvo_priv->saturation_property == property) { | ||
2002 | if (sdvo_priv->cur_saturation == temp_value) | ||
2003 | goto out; | ||
2004 | |||
2005 | cmd = SDVO_CMD_SET_SATURATION; | ||
2006 | sdvo_priv->cur_saturation = temp_value; | ||
2007 | } else if (sdvo_priv->contrast_property == property) { | ||
2008 | if (sdvo_priv->cur_contrast == temp_value) | ||
2009 | goto out; | ||
2010 | |||
2011 | cmd = SDVO_CMD_SET_CONTRAST; | ||
2012 | sdvo_priv->cur_contrast = temp_value; | ||
2013 | } else if (sdvo_priv->hue_property == property) { | ||
2014 | if (sdvo_priv->cur_hue == temp_value) | ||
2015 | goto out; | ||
2016 | |||
2017 | cmd = SDVO_CMD_SET_HUE; | ||
2018 | sdvo_priv->cur_hue = temp_value; | ||
2019 | } else if (sdvo_priv->brightness_property == property) { | ||
2020 | if (sdvo_priv->cur_brightness == temp_value) | ||
2021 | goto out; | ||
2022 | |||
2023 | cmd = SDVO_CMD_SET_BRIGHTNESS; | ||
2024 | sdvo_priv->cur_brightness = temp_value; | ||
2025 | } | ||
2026 | if (cmd) { | ||
2027 | intel_sdvo_write_cmd(intel_output, cmd, &temp_value, 2); | ||
2028 | status = intel_sdvo_read_response(intel_output, | ||
2029 | NULL, 0); | ||
2030 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2031 | DRM_DEBUG_KMS("Incorrect SDVO command \n"); | ||
2032 | return -EINVAL; | ||
2033 | } | ||
2034 | changed = true; | ||
2035 | } | ||
2036 | } | ||
1853 | if (changed && crtc) | 2037 | if (changed && crtc) |
1854 | drm_crtc_helper_set_mode(crtc, &crtc->mode, crtc->x, | 2038 | drm_crtc_helper_set_mode(crtc, &crtc->mode, crtc->x, |
1855 | crtc->y, crtc->fb); | 2039 | crtc->y, crtc->fb); |
@@ -2176,6 +2360,310 @@ static void intel_sdvo_tv_create_property(struct drm_connector *connector) | |||
2176 | 2360 | ||
2177 | } | 2361 | } |
2178 | 2362 | ||
2363 | static void intel_sdvo_create_enhance_property(struct drm_connector *connector) | ||
2364 | { | ||
2365 | struct intel_output *intel_output = to_intel_output(connector); | ||
2366 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | ||
2367 | struct intel_sdvo_enhancements_reply sdvo_data; | ||
2368 | struct drm_device *dev = connector->dev; | ||
2369 | uint8_t status; | ||
2370 | uint16_t response, data_value[2]; | ||
2371 | |||
2372 | intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS, | ||
2373 | NULL, 0); | ||
2374 | status = intel_sdvo_read_response(intel_output, &sdvo_data, | ||
2375 | sizeof(sdvo_data)); | ||
2376 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2377 | DRM_DEBUG_KMS(" incorrect response is returned\n"); | ||
2378 | return; | ||
2379 | } | ||
2380 | response = *((uint16_t *)&sdvo_data); | ||
2381 | if (!response) { | ||
2382 | DRM_DEBUG_KMS("No enhancement is supported\n"); | ||
2383 | return; | ||
2384 | } | ||
2385 | if (sdvo_priv->is_tv) { | ||
2386 | /* when horizontal overscan is supported, Add the left/right | ||
2387 | * property | ||
2388 | */ | ||
2389 | if (sdvo_data.overscan_h) { | ||
2390 | intel_sdvo_write_cmd(intel_output, | ||
2391 | SDVO_CMD_GET_MAX_OVERSCAN_H, NULL, 0); | ||
2392 | status = intel_sdvo_read_response(intel_output, | ||
2393 | &data_value, 4); | ||
2394 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2395 | DRM_DEBUG_KMS("Incorrect SDVO max " | ||
2396 | "h_overscan\n"); | ||
2397 | return; | ||
2398 | } | ||
2399 | intel_sdvo_write_cmd(intel_output, | ||
2400 | SDVO_CMD_GET_OVERSCAN_H, NULL, 0); | ||
2401 | status = intel_sdvo_read_response(intel_output, | ||
2402 | &response, 2); | ||
2403 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2404 | DRM_DEBUG_KMS("Incorrect SDVO h_overscan\n"); | ||
2405 | return; | ||
2406 | } | ||
2407 | sdvo_priv->max_hscan = data_value[0]; | ||
2408 | sdvo_priv->left_margin = data_value[0] - response; | ||
2409 | sdvo_priv->right_margin = sdvo_priv->left_margin; | ||
2410 | sdvo_priv->left_property = | ||
2411 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2412 | "left_margin", 2); | ||
2413 | sdvo_priv->left_property->values[0] = 0; | ||
2414 | sdvo_priv->left_property->values[1] = data_value[0]; | ||
2415 | drm_connector_attach_property(connector, | ||
2416 | sdvo_priv->left_property, | ||
2417 | sdvo_priv->left_margin); | ||
2418 | sdvo_priv->right_property = | ||
2419 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2420 | "right_margin", 2); | ||
2421 | sdvo_priv->right_property->values[0] = 0; | ||
2422 | sdvo_priv->right_property->values[1] = data_value[0]; | ||
2423 | drm_connector_attach_property(connector, | ||
2424 | sdvo_priv->right_property, | ||
2425 | sdvo_priv->right_margin); | ||
2426 | DRM_DEBUG_KMS("h_overscan: max %d, " | ||
2427 | "default %d, current %d\n", | ||
2428 | data_value[0], data_value[1], response); | ||
2429 | } | ||
2430 | if (sdvo_data.overscan_v) { | ||
2431 | intel_sdvo_write_cmd(intel_output, | ||
2432 | SDVO_CMD_GET_MAX_OVERSCAN_V, NULL, 0); | ||
2433 | status = intel_sdvo_read_response(intel_output, | ||
2434 | &data_value, 4); | ||
2435 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2436 | DRM_DEBUG_KMS("Incorrect SDVO max " | ||
2437 | "v_overscan\n"); | ||
2438 | return; | ||
2439 | } | ||
2440 | intel_sdvo_write_cmd(intel_output, | ||
2441 | SDVO_CMD_GET_OVERSCAN_V, NULL, 0); | ||
2442 | status = intel_sdvo_read_response(intel_output, | ||
2443 | &response, 2); | ||
2444 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2445 | DRM_DEBUG_KMS("Incorrect SDVO v_overscan\n"); | ||
2446 | return; | ||
2447 | } | ||
2448 | sdvo_priv->max_vscan = data_value[0]; | ||
2449 | sdvo_priv->top_margin = data_value[0] - response; | ||
2450 | sdvo_priv->bottom_margin = sdvo_priv->top_margin; | ||
2451 | sdvo_priv->top_property = | ||
2452 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2453 | "top_margin", 2); | ||
2454 | sdvo_priv->top_property->values[0] = 0; | ||
2455 | sdvo_priv->top_property->values[1] = data_value[0]; | ||
2456 | drm_connector_attach_property(connector, | ||
2457 | sdvo_priv->top_property, | ||
2458 | sdvo_priv->top_margin); | ||
2459 | sdvo_priv->bottom_property = | ||
2460 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2461 | "bottom_margin", 2); | ||
2462 | sdvo_priv->bottom_property->values[0] = 0; | ||
2463 | sdvo_priv->bottom_property->values[1] = data_value[0]; | ||
2464 | drm_connector_attach_property(connector, | ||
2465 | sdvo_priv->bottom_property, | ||
2466 | sdvo_priv->bottom_margin); | ||
2467 | DRM_DEBUG_KMS("v_overscan: max %d, " | ||
2468 | "default %d, current %d\n", | ||
2469 | data_value[0], data_value[1], response); | ||
2470 | } | ||
2471 | if (sdvo_data.position_h) { | ||
2472 | intel_sdvo_write_cmd(intel_output, | ||
2473 | SDVO_CMD_GET_MAX_POSITION_H, NULL, 0); | ||
2474 | status = intel_sdvo_read_response(intel_output, | ||
2475 | &data_value, 4); | ||
2476 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2477 | DRM_DEBUG_KMS("Incorrect SDVO Max h_pos\n"); | ||
2478 | return; | ||
2479 | } | ||
2480 | intel_sdvo_write_cmd(intel_output, | ||
2481 | SDVO_CMD_GET_POSITION_H, NULL, 0); | ||
2482 | status = intel_sdvo_read_response(intel_output, | ||
2483 | &response, 2); | ||
2484 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2485 | DRM_DEBUG_KMS("Incorrect SDVO get h_postion\n"); | ||
2486 | return; | ||
2487 | } | ||
2488 | sdvo_priv->max_hpos = data_value[0]; | ||
2489 | sdvo_priv->cur_hpos = response; | ||
2490 | sdvo_priv->hpos_property = | ||
2491 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2492 | "hpos", 2); | ||
2493 | sdvo_priv->hpos_property->values[0] = 0; | ||
2494 | sdvo_priv->hpos_property->values[1] = data_value[0]; | ||
2495 | drm_connector_attach_property(connector, | ||
2496 | sdvo_priv->hpos_property, | ||
2497 | sdvo_priv->cur_hpos); | ||
2498 | DRM_DEBUG_KMS("h_position: max %d, " | ||
2499 | "default %d, current %d\n", | ||
2500 | data_value[0], data_value[1], response); | ||
2501 | } | ||
2502 | if (sdvo_data.position_v) { | ||
2503 | intel_sdvo_write_cmd(intel_output, | ||
2504 | SDVO_CMD_GET_MAX_POSITION_V, NULL, 0); | ||
2505 | status = intel_sdvo_read_response(intel_output, | ||
2506 | &data_value, 4); | ||
2507 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2508 | DRM_DEBUG_KMS("Incorrect SDVO Max v_pos\n"); | ||
2509 | return; | ||
2510 | } | ||
2511 | intel_sdvo_write_cmd(intel_output, | ||
2512 | SDVO_CMD_GET_POSITION_V, NULL, 0); | ||
2513 | status = intel_sdvo_read_response(intel_output, | ||
2514 | &response, 2); | ||
2515 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2516 | DRM_DEBUG_KMS("Incorrect SDVO get v_postion\n"); | ||
2517 | return; | ||
2518 | } | ||
2519 | sdvo_priv->max_vpos = data_value[0]; | ||
2520 | sdvo_priv->cur_vpos = response; | ||
2521 | sdvo_priv->vpos_property = | ||
2522 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2523 | "vpos", 2); | ||
2524 | sdvo_priv->vpos_property->values[0] = 0; | ||
2525 | sdvo_priv->vpos_property->values[1] = data_value[0]; | ||
2526 | drm_connector_attach_property(connector, | ||
2527 | sdvo_priv->vpos_property, | ||
2528 | sdvo_priv->cur_vpos); | ||
2529 | DRM_DEBUG_KMS("v_position: max %d, " | ||
2530 | "default %d, current %d\n", | ||
2531 | data_value[0], data_value[1], response); | ||
2532 | } | ||
2533 | } | ||
2534 | if (sdvo_priv->is_tv) { | ||
2535 | if (sdvo_data.saturation) { | ||
2536 | intel_sdvo_write_cmd(intel_output, | ||
2537 | SDVO_CMD_GET_MAX_SATURATION, NULL, 0); | ||
2538 | status = intel_sdvo_read_response(intel_output, | ||
2539 | &data_value, 4); | ||
2540 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2541 | DRM_DEBUG_KMS("Incorrect SDVO Max sat\n"); | ||
2542 | return; | ||
2543 | } | ||
2544 | intel_sdvo_write_cmd(intel_output, | ||
2545 | SDVO_CMD_GET_SATURATION, NULL, 0); | ||
2546 | status = intel_sdvo_read_response(intel_output, | ||
2547 | &response, 2); | ||
2548 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2549 | DRM_DEBUG_KMS("Incorrect SDVO get sat\n"); | ||
2550 | return; | ||
2551 | } | ||
2552 | sdvo_priv->max_saturation = data_value[0]; | ||
2553 | sdvo_priv->cur_saturation = response; | ||
2554 | sdvo_priv->saturation_property = | ||
2555 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2556 | "saturation", 2); | ||
2557 | sdvo_priv->saturation_property->values[0] = 0; | ||
2558 | sdvo_priv->saturation_property->values[1] = | ||
2559 | data_value[0]; | ||
2560 | drm_connector_attach_property(connector, | ||
2561 | sdvo_priv->saturation_property, | ||
2562 | sdvo_priv->cur_saturation); | ||
2563 | DRM_DEBUG_KMS("saturation: max %d, " | ||
2564 | "default %d, current %d\n", | ||
2565 | data_value[0], data_value[1], response); | ||
2566 | } | ||
2567 | if (sdvo_data.contrast) { | ||
2568 | intel_sdvo_write_cmd(intel_output, | ||
2569 | SDVO_CMD_GET_MAX_CONTRAST, NULL, 0); | ||
2570 | status = intel_sdvo_read_response(intel_output, | ||
2571 | &data_value, 4); | ||
2572 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2573 | DRM_DEBUG_KMS("Incorrect SDVO Max contrast\n"); | ||
2574 | return; | ||
2575 | } | ||
2576 | intel_sdvo_write_cmd(intel_output, | ||
2577 | SDVO_CMD_GET_CONTRAST, NULL, 0); | ||
2578 | status = intel_sdvo_read_response(intel_output, | ||
2579 | &response, 2); | ||
2580 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2581 | DRM_DEBUG_KMS("Incorrect SDVO get contrast\n"); | ||
2582 | return; | ||
2583 | } | ||
2584 | sdvo_priv->max_contrast = data_value[0]; | ||
2585 | sdvo_priv->cur_contrast = response; | ||
2586 | sdvo_priv->contrast_property = | ||
2587 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2588 | "contrast", 2); | ||
2589 | sdvo_priv->contrast_property->values[0] = 0; | ||
2590 | sdvo_priv->contrast_property->values[1] = data_value[0]; | ||
2591 | drm_connector_attach_property(connector, | ||
2592 | sdvo_priv->contrast_property, | ||
2593 | sdvo_priv->cur_contrast); | ||
2594 | DRM_DEBUG_KMS("contrast: max %d, " | ||
2595 | "default %d, current %d\n", | ||
2596 | data_value[0], data_value[1], response); | ||
2597 | } | ||
2598 | if (sdvo_data.hue) { | ||
2599 | intel_sdvo_write_cmd(intel_output, | ||
2600 | SDVO_CMD_GET_MAX_HUE, NULL, 0); | ||
2601 | status = intel_sdvo_read_response(intel_output, | ||
2602 | &data_value, 4); | ||
2603 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2604 | DRM_DEBUG_KMS("Incorrect SDVO Max hue\n"); | ||
2605 | return; | ||
2606 | } | ||
2607 | intel_sdvo_write_cmd(intel_output, | ||
2608 | SDVO_CMD_GET_HUE, NULL, 0); | ||
2609 | status = intel_sdvo_read_response(intel_output, | ||
2610 | &response, 2); | ||
2611 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2612 | DRM_DEBUG_KMS("Incorrect SDVO get hue\n"); | ||
2613 | return; | ||
2614 | } | ||
2615 | sdvo_priv->max_hue = data_value[0]; | ||
2616 | sdvo_priv->cur_hue = response; | ||
2617 | sdvo_priv->hue_property = | ||
2618 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2619 | "hue", 2); | ||
2620 | sdvo_priv->hue_property->values[0] = 0; | ||
2621 | sdvo_priv->hue_property->values[1] = | ||
2622 | data_value[0]; | ||
2623 | drm_connector_attach_property(connector, | ||
2624 | sdvo_priv->hue_property, | ||
2625 | sdvo_priv->cur_hue); | ||
2626 | DRM_DEBUG_KMS("hue: max %d, default %d, current %d\n", | ||
2627 | data_value[0], data_value[1], response); | ||
2628 | } | ||
2629 | } | ||
2630 | if (sdvo_priv->is_tv) { | ||
2631 | if (sdvo_data.brightness) { | ||
2632 | intel_sdvo_write_cmd(intel_output, | ||
2633 | SDVO_CMD_GET_MAX_BRIGHTNESS, NULL, 0); | ||
2634 | status = intel_sdvo_read_response(intel_output, | ||
2635 | &data_value, 4); | ||
2636 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2637 | DRM_DEBUG_KMS("Incorrect SDVO Max bright\n"); | ||
2638 | return; | ||
2639 | } | ||
2640 | intel_sdvo_write_cmd(intel_output, | ||
2641 | SDVO_CMD_GET_BRIGHTNESS, NULL, 0); | ||
2642 | status = intel_sdvo_read_response(intel_output, | ||
2643 | &response, 2); | ||
2644 | if (status != SDVO_CMD_STATUS_SUCCESS) { | ||
2645 | DRM_DEBUG_KMS("Incorrect SDVO get brigh\n"); | ||
2646 | return; | ||
2647 | } | ||
2648 | sdvo_priv->max_brightness = data_value[0]; | ||
2649 | sdvo_priv->cur_brightness = response; | ||
2650 | sdvo_priv->brightness_property = | ||
2651 | drm_property_create(dev, DRM_MODE_PROP_RANGE, | ||
2652 | "brightness", 2); | ||
2653 | sdvo_priv->brightness_property->values[0] = 0; | ||
2654 | sdvo_priv->brightness_property->values[1] = | ||
2655 | data_value[0]; | ||
2656 | drm_connector_attach_property(connector, | ||
2657 | sdvo_priv->brightness_property, | ||
2658 | sdvo_priv->cur_brightness); | ||
2659 | DRM_DEBUG_KMS("brightness: max %d, " | ||
2660 | "default %d, current %d\n", | ||
2661 | data_value[0], data_value[1], response); | ||
2662 | } | ||
2663 | } | ||
2664 | return; | ||
2665 | } | ||
2666 | |||
2179 | bool intel_sdvo_init(struct drm_device *dev, int output_device) | 2667 | bool intel_sdvo_init(struct drm_device *dev, int output_device) |
2180 | { | 2668 | { |
2181 | struct drm_connector *connector; | 2669 | struct drm_connector *connector; |
@@ -2262,8 +2750,10 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device) | |||
2262 | drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs); | 2750 | drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs); |
2263 | 2751 | ||
2264 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); | 2752 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); |
2265 | if (sdvo_priv->is_tv) | 2753 | if (sdvo_priv->is_tv) { |
2266 | intel_sdvo_tv_create_property(connector); | 2754 | intel_sdvo_tv_create_property(connector); |
2755 | intel_sdvo_create_enhance_property(connector); | ||
2756 | } | ||
2267 | drm_sysfs_connector_add(connector); | 2757 | drm_sysfs_connector_add(connector); |
2268 | 2758 | ||
2269 | intel_sdvo_select_ddc_bus(sdvo_priv); | 2759 | intel_sdvo_select_ddc_bus(sdvo_priv); |