diff --git a/packages/linux/patches/3.11.3/linux-990.11-DRM-revert-e6e7920.patch b/packages/linux/patches/3.11.3/linux-990.11-DRM-revert-e6e7920.patch deleted file mode 100644 index 33e1509ba8..0000000000 --- a/packages/linux/patches/3.11.3/linux-990.11-DRM-revert-e6e7920.patch +++ /dev/null @@ -1,134 +0,0 @@ -diff -Naur linux-3.11.1/drivers/gpu/drm/drm_edid.c linux-3.11.1.patch/drivers/gpu/drm/drm_edid.c ---- linux-3.11.1/drivers/gpu/drm/drm_edid.c 2013-09-14 16:07:01.000000000 +0200 -+++ linux-3.11.1.patch/drivers/gpu/drm/drm_edid.c 2013-09-24 02:41:23.718220411 +0200 -@@ -2324,31 +2324,6 @@ - } - EXPORT_SYMBOL(drm_find_cea_extension); - --/* -- * Calculate the alternate clock for the CEA mode -- * (60Hz vs. 59.94Hz etc.) -- */ --static unsigned int --cea_mode_alternate_clock(const struct drm_display_mode *cea_mode) --{ -- unsigned int clock = cea_mode->clock; -- -- if (cea_mode->vrefresh % 6 != 0) -- return clock; -- -- /* -- * edid_cea_modes contains the 59.94Hz -- * variant for 240 and 480 line modes, -- * and the 60Hz variant otherwise. -- */ -- if (cea_mode->vdisplay == 240 || cea_mode->vdisplay == 480) -- clock = clock * 1001 / 1000; -- else -- clock = DIV_ROUND_UP(clock * 1000, 1001); -- -- return clock; --} -- - /** - * drm_match_cea_mode - look for a CEA mode matching given mode - * @to_match: display mode -@@ -2367,9 +2342,21 @@ - const struct drm_display_mode *cea_mode = &edid_cea_modes[mode]; - unsigned int clock1, clock2; - -+ clock1 = clock2 = cea_mode->clock; -+ - /* Check both 60Hz and 59.94Hz */ -- clock1 = cea_mode->clock; -- clock2 = cea_mode_alternate_clock(cea_mode); -+ if (cea_mode->vrefresh % 6 == 0) { -+ /* -+ * edid_cea_modes contains the 59.94Hz -+ * variant for 240 and 480 line modes, -+ * and the 60Hz variant otherwise. -+ */ -+ if (cea_mode->vdisplay == 240 || -+ cea_mode->vdisplay == 480) -+ clock1 = clock1 * 1001 / 1000; -+ else -+ clock2 = DIV_ROUND_UP(clock2 * 1000, 1001); -+ } - - if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) || - KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) && -@@ -2380,66 +2367,6 @@ - } - EXPORT_SYMBOL(drm_match_cea_mode); - --static int --add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid) --{ -- struct drm_device *dev = connector->dev; -- struct drm_display_mode *mode, *tmp; -- LIST_HEAD(list); -- int modes = 0; -- -- /* Don't add CEA modes if the CEA extension block is missing */ -- if (!drm_find_cea_extension(edid)) -- return 0; -- -- /* -- * Go through all probed modes and create a new mode -- * with the alternate clock for certain CEA modes. -- */ -- list_for_each_entry(mode, &connector->probed_modes, head) { -- const struct drm_display_mode *cea_mode; -- struct drm_display_mode *newmode; -- u8 cea_mode_idx = drm_match_cea_mode(mode) - 1; -- unsigned int clock1, clock2; -- -- if (cea_mode_idx >= ARRAY_SIZE(edid_cea_modes)) -- continue; -- -- cea_mode = &edid_cea_modes[cea_mode_idx]; -- -- clock1 = cea_mode->clock; -- clock2 = cea_mode_alternate_clock(cea_mode); -- -- if (clock1 == clock2) -- continue; -- -- if (mode->clock != clock1 && mode->clock != clock2) -- continue; -- -- newmode = drm_mode_duplicate(dev, cea_mode); -- if (!newmode) -- continue; -- -- /* -- * The current mode could be either variant. Make -- * sure to pick the "other" clock for the new mode. -- */ -- if (mode->clock != clock1) -- newmode->clock = clock1; -- else -- newmode->clock = clock2; -- -- list_add_tail(&newmode->head, &list); -- } -- -- list_for_each_entry_safe(mode, tmp, &list, head) { -- list_del(&mode->head); -- drm_mode_probed_add(connector, mode); -- modes++; -- } -- -- return modes; --} - - static int - do_cea_modes (struct drm_connector *connector, u8 *db, u8 len) -@@ -3022,7 +2949,6 @@ - if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) - num_modes += add_inferred_modes(connector, edid); - num_modes += add_cea_modes(connector, edid); -- num_modes += add_alternate_cea_modes(connector, edid); - - if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) - edid_fixup_preferred(connector, quirks); diff --git a/packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-01.patch b/packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-01.patch new file mode 100644 index 0000000000..80454716cd --- /dev/null +++ b/packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-01.patch @@ -0,0 +1,41 @@ +From 6a4a51f43cc6635c7b731d9fb2e1e32333d594fe Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Fri, 27 Sep 2013 18:09:54 -0400 +Subject: [PATCH 1/3] 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 +--- + drivers/gpu/drm/radeon/r600_hdmi.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c +index b0fa600..49043a5 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); + } +-- +1.8.3.1 + diff --git a/packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-02.patch b/packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-02.patch new file mode 100644 index 0000000000..c8613eba95 --- /dev/null +++ b/packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-02.patch @@ -0,0 +1,43 @@ +From c8908f579ae9aac33122cfdfffaef30bba0a7697 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Fri, 27 Sep 2013 18:19:42 -0400 +Subject: [PATCH 2/3] drm/radeon: fix N/CTS clock matching for audio + +The drm code that calculates the 1001 clocks rounds up +rather than truncating. This allows the table to match +properly on those modes. + +See bug: +https://bugs.freedesktop.org/show_bug.cgi?id=69675 + +Signed-off-by: Alex Deucher +--- + drivers/gpu/drm/radeon/r600_hdmi.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c +index 2ce2793..a378081 100644 +--- a/drivers/gpu/drm/radeon/r600_hdmi.c ++++ b/drivers/gpu/drm/radeon/r600_hdmi.c +@@ -58,15 +58,15 @@ enum r600_hdmi_iec_status_bits { + static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = { + /* 32kHz 44.1kHz 48kHz */ + /* Clock N CTS N CTS N CTS */ +- { 25174, 4576, 28125, 7007, 31250, 6864, 28125 }, /* 25,20/1.001 MHz */ ++ { 25175, 4576, 28125, 7007, 31250, 6864, 28125 }, /* 25,20/1.001 MHz */ + { 25200, 4096, 25200, 6272, 28000, 6144, 25200 }, /* 25.20 MHz */ + { 27000, 4096, 27000, 6272, 30000, 6144, 27000 }, /* 27.00 MHz */ + { 27027, 4096, 27027, 6272, 30030, 6144, 27027 }, /* 27.00*1.001 MHz */ + { 54000, 4096, 54000, 6272, 60000, 6144, 54000 }, /* 54.00 MHz */ + { 54054, 4096, 54054, 6272, 60060, 6144, 54054 }, /* 54.00*1.001 MHz */ +- { 74175, 11648, 210937, 17836, 234375, 11648, 140625 }, /* 74.25/1.001 MHz */ ++ { 74176, 11648, 210937, 17836, 234375, 11648, 140625 }, /* 74.25/1.001 MHz */ + { 74250, 4096, 74250, 6272, 82500, 6144, 74250 }, /* 74.25 MHz */ +- { 148351, 11648, 421875, 8918, 234375, 5824, 140625 }, /* 148.50/1.001 MHz */ ++ { 148352, 11648, 421875, 8918, 234375, 5824, 140625 }, /* 148.50/1.001 MHz */ + { 148500, 4096, 148500, 6272, 165000, 6144, 148500 }, /* 148.50 MHz */ + { 0, 4096, 0, 6272, 0, 6144, 0 } /* Other */ + }; +-- +1.8.3.1 + diff --git a/packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-03.patch b/packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-03.patch new file mode 100644 index 0000000000..bd5e75d61f --- /dev/null +++ b/packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-03.patch @@ -0,0 +1,50 @@ +From 37396f32fc8c8a4f68e0fd069e4e63ce19786ef4 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Fri, 27 Sep 2013 18:22:15 -0400 +Subject: [PATCH 3/3] drm/radeon: use hw generated CTS/N values for audio + +Use the hw generated values rather than calculating +them in the driver. There may be some older r6xx +asics where this doesn't work correctly. This remains +to be seen. + +See bug: +https://bugs.freedesktop.org/show_bug.cgi?id=69675 + +Signed-off-by: Alex Deucher +--- + drivers/gpu/drm/radeon/evergreen_hdmi.c | 3 +-- + drivers/gpu/drm/radeon/r600_hdmi.c | 3 +-- + 2 files changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c +index f71ce39..f815c20 100644 +--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c ++++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c +@@ -288,8 +288,7 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode + /* fglrx clears sth in AFMT_AUDIO_PACKET_CONTROL2 here */ + + WREG32(HDMI_ACR_PACKET_CONTROL + offset, +- HDMI_ACR_AUTO_SEND | /* allow hw to sent ACR packets when required */ +- HDMI_ACR_SOURCE); /* select SW CTS value */ ++ HDMI_ACR_AUTO_SEND); /* allow hw to sent ACR packets when required */ + + evergreen_hdmi_update_ACR(encoder, mode->clock); + +diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c +index a378081..2b5f9a7 100644 +--- a/drivers/gpu/drm/radeon/r600_hdmi.c ++++ b/drivers/gpu/drm/radeon/r600_hdmi.c +@@ -451,8 +451,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod + } + + WREG32(HDMI0_ACR_PACKET_CONTROL + offset, +- HDMI0_ACR_AUTO_SEND | /* allow hw to sent ACR packets when required */ +- HDMI0_ACR_SOURCE); /* select SW CTS value */ ++ HDMI0_ACR_AUTO_SEND); /* allow hw to sent ACR packets when required */ + + WREG32(HDMI0_VBI_PACKET_CONTROL + offset, + HDMI0_NULL_SEND | /* send null packets when required */ +-- +1.8.3.1 +