diff options
author | Zhenyu Wang <zhenyu.z.wang@intel.com> | 2009-03-04 06:36:01 -0500 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-03-27 18:12:13 -0400 |
commit | 02c5dd985ddc5407aa9cc7e0f4456ca63b294f16 (patch) | |
tree | 779e05304b4ff2f75b2327f62858ed3b8b415b1f /drivers | |
parent | 771cb081354161eea21534ba58e5cc1a2db94a25 (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')
-rw-r--r-- | drivers/gpu/drm/i915/intel_tv.c | 20 |
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 | ||
1542 | static void | 1546 | static void |