mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-08-01 15:07:49 +00:00
linux: update upstream patches (see https://bugs.freedesktop.org/show_bug.cgi?id=69675#c15)
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
b26792519a
commit
ee4b8ce6e2
@ -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);
|
41
packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-01.patch
vendored
Normal file
41
packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-01.patch
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
From 6a4a51f43cc6635c7b731d9fb2e1e32333d594fe Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
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 <alexander.deucher@amd.com>
|
||||
---
|
||||
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
|
||||
|
43
packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-02.patch
vendored
Normal file
43
packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-02.patch
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
From c8908f579ae9aac33122cfdfffaef30bba0a7697 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
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 <alexander.deucher@amd.com>
|
||||
---
|
||||
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
|
||||
|
50
packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-03.patch
vendored
Normal file
50
packages/linux/patches/3.11.3/linux-990.12-RADEON-upstream-fix-03.patch
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
From 37396f32fc8c8a4f68e0fd069e4e63ce19786ef4 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
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 <alexander.deucher@amd.com>
|
||||
---
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user