diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-09-28 00:09:54 +0200 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-10-09 23:13:43 +0200 |
commit | 062c2e4363451d49ef840232fe65e8bff0dde2a5 (patch) | |
tree | 9ac4839d0baeaecbb6b39e88fdf781be731b2a6d /drivers | |
parent | drm/edid: catch kmalloc failure in drm_edid_to_speaker_allocation (diff) | |
download | linux-062c2e4363451d49ef840232fe65e8bff0dde2a5.tar.xz linux-062c2e4363451d49ef840232fe65e8bff0dde2a5.zip |
drm/radeon: use 64-bit math to calculate CTS values for audio (v2)
Avoid losing precision. See bug:
https://bugs.freedesktop.org/show_bug.cgi?id=69675
v2: fix math as per Anssi's comments.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/radeon/r600_hdmi.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index b0fa6002af3e..49043a5ac65c 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c @@ -75,8 +75,15 @@ static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = { */ static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int N, int freq) { - if (*CTS == 0) - *CTS = clock * N / (128 * freq) * 1000; + u64 n; + u32 d; + + if (*CTS == 0) { + n = (u64)clock * (u64)N * 1000ULL; + d = 128 * freq; + do_div(n, d); + *CTS = n; + } DRM_DEBUG("Using ACR timing N=%d CTS=%d for frequency %d\n", N, *CTS, freq); } |