aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2009-09-10 03:45:46 -0400
committerEric Anholt <eric@anholt.net>2009-09-10 14:28:57 -0400
commitb9219c5e8be99ddd697e3f9b61069d7ea477ddec (patch)
tree7e6f6d5d5831350780eeca27901fd77abcb86809
parent5323fd042f89164927ee8c311f0a975e8c846412 (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.c500
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
140static bool 164static 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
1844static
1845void 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
1795static void intel_sdvo_destroy(struct drm_connector *connector) 1883static 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
2363static 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
2179bool intel_sdvo_init(struct drm_device *dev, int output_device) 2667bool 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);