aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_tv.c
diff options
context:
space:
mode:
authorZhenyu Wang <zhenyu.z.wang@intel.com>2009-03-04 06:36:01 -0500
committerEric Anholt <eric@anholt.net>2009-03-27 18:12:13 -0400
commit02c5dd985ddc5407aa9cc7e0f4456ca63b294f16 (patch)
tree779e05304b4ff2f75b2327f62858ed3b8b415b1f /drivers/gpu/drm/i915/intel_tv.c
parent771cb081354161eea21534ba58e5cc1a2db94a25 (diff)
drm/i915: Fix TV get_modes to return modes count
The get_modes hook must return the number of modes added. This also fixes TV mode's clock calculation int overflow issue, and use 0.01 precision for mode refresh validation. Signed-off-by: Zhenyu Wang <zhenyu.z.wang@intel.com> Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_tv.c')
-rw-r--r--drivers/gpu/drm/i915/intel_tv.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index 0e606855c858..08c4034c44c3 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -1082,7 +1082,7 @@ intel_tv_mode_valid(struct drm_connector *connector, struct drm_display_mode *mo
1082 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_output); 1082 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_output);
1083 1083
1084 /* Ensure TV refresh is close to desired refresh */ 1084 /* Ensure TV refresh is close to desired refresh */
1085 if (tv_mode && abs(tv_mode->refresh - drm_mode_vrefresh(mode)) < 1) 1085 if (tv_mode && abs(tv_mode->refresh - drm_mode_vrefresh(mode)) < 10)
1086 return MODE_OK; 1086 return MODE_OK;
1087 return MODE_CLOCK_RANGE; 1087 return MODE_CLOCK_RANGE;
1088} 1088}
@@ -1495,7 +1495,8 @@ intel_tv_get_modes(struct drm_connector *connector)
1495 struct drm_display_mode *mode_ptr; 1495 struct drm_display_mode *mode_ptr;
1496 struct intel_output *intel_output = to_intel_output(connector); 1496 struct intel_output *intel_output = to_intel_output(connector);
1497 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_output); 1497 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_output);
1498 int j; 1498 int j, count = 0;
1499 u64 tmp;
1499 1500
1500 for (j = 0; j < sizeof(input_res_table) / sizeof(input_res_table[0]); 1501 for (j = 0; j < sizeof(input_res_table) / sizeof(input_res_table[0]);
1501 j++) { 1502 j++) {
@@ -1510,8 +1511,9 @@ intel_tv_get_modes(struct drm_connector *connector)
1510 && !tv_mode->component_only)) 1511 && !tv_mode->component_only))
1511 continue; 1512 continue;
1512 1513
1513 mode_ptr = drm_calloc(1, sizeof(struct drm_display_mode), 1514 mode_ptr = drm_mode_create(connector->dev);
1514 DRM_MEM_DRIVER); 1515 if (!mode_ptr)
1516 continue;
1515 strncpy(mode_ptr->name, input->name, DRM_DISPLAY_MODE_LEN); 1517 strncpy(mode_ptr->name, input->name, DRM_DISPLAY_MODE_LEN);
1516 1518
1517 mode_ptr->hdisplay = hactive_s; 1519 mode_ptr->hdisplay = hactive_s;
@@ -1528,15 +1530,17 @@ intel_tv_get_modes(struct drm_connector *connector)
1528 mode_ptr->vsync_end = mode_ptr->vsync_start + 1; 1530 mode_ptr->vsync_end = mode_ptr->vsync_start + 1;
1529 mode_ptr->vtotal = vactive_s + 33; 1531 mode_ptr->vtotal = vactive_s + 33;
1530 1532
1531 mode_ptr->clock = (int) (tv_mode->refresh * 1533 tmp = (u64) tv_mode->refresh * mode_ptr->vtotal;
1532 mode_ptr->vtotal * 1534 tmp *= mode_ptr->htotal;
1533 mode_ptr->htotal / 1000) / 1000; 1535 tmp = div_u64(tmp, 1000000);
1536 mode_ptr->clock = (int) tmp;
1534 1537
1535 mode_ptr->type = DRM_MODE_TYPE_DRIVER; 1538 mode_ptr->type = DRM_MODE_TYPE_DRIVER;
1536 drm_mode_probed_add(connector, mode_ptr); 1539 drm_mode_probed_add(connector, mode_ptr);
1540 count++;
1537 } 1541 }
1538 1542
1539 return 0; 1543 return count;
1540} 1544}
1541 1545
1542static void 1546static void