]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Dec 2013 19:38:11 +0000 (11:38 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Dec 2013 19:38:11 +0000 (11:38 -0800)
added patches:
drm-radeon-audio-correct-acr-table.patch
drm-radeon-audio-improve-acr-calculation.patch

queue-3.10/drm-radeon-audio-correct-acr-table.patch [new file with mode: 0644]
queue-3.10/drm-radeon-audio-improve-acr-calculation.patch [new file with mode: 0644]
queue-3.10/series

diff --git a/queue-3.10/drm-radeon-audio-correct-acr-table.patch b/queue-3.10/drm-radeon-audio-correct-acr-table.patch
new file mode 100644 (file)
index 0000000..df73e93
--- /dev/null
@@ -0,0 +1,50 @@
+From 3e71985f2439d8c4090dc2820e497e6f3d72dcff Mon Sep 17 00:00:00 2001
+From: Pierre Ossman <pierre@ossman.eu>
+Date: Wed, 6 Nov 2013 20:00:32 +0100
+Subject: drm/radeon/audio: correct ACR table
+
+From: Pierre Ossman <pierre@ossman.eu>
+
+commit 3e71985f2439d8c4090dc2820e497e6f3d72dcff upstream.
+
+The values were taken from the HDMI spec, but they assumed
+exact x/1.001 clocks. Since we round the clocks, we also need
+to calculate different N and CTS values.
+
+Note that the N for 25.2/1.001 MHz at 44.1 kHz audio is out of
+spec. Hopefully this mode is rarely used and/or HDMI sinks
+tolerate overly large values of N.
+
+bug:
+https://bugs.freedesktop.org/show_bug.cgi?id=69675
+
+Signed-off-by: Pierre Ossman <pierre@ossman.eu>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Cc: Josh Boyer <jwboyer@fedoraproject.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/r600_hdmi.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- 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 */
+-    {  25175,  4576,  28125,  7007,  31250,  6864,  28125 }, /*  25,20/1.001 MHz */
++    {  25175,  4096,  25175, 28224, 125875,  6144,  25175 }, /*  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 */
+-    {  74176, 11648, 210937, 17836, 234375, 11648, 140625 }, /*  74.25/1.001 MHz */
++    {  74176,  4096,  74176,  5733,  75335,  6144,  74176 }, /*  74.25/1.001 MHz */
+     {  74250,  4096,  74250,  6272,  82500,  6144,  74250 }, /*  74.25       MHz */
+-    { 148352, 11648, 421875,  8918, 234375,  5824, 140625 }, /* 148.50/1.001 MHz */
++    { 148352,  4096, 148352,  5733, 150670,  6144, 148352 }, /* 148.50/1.001 MHz */
+     { 148500,  4096, 148500,  6272, 165000,  6144, 148500 }, /* 148.50       MHz */
+ };
diff --git a/queue-3.10/drm-radeon-audio-improve-acr-calculation.patch b/queue-3.10/drm-radeon-audio-improve-acr-calculation.patch
new file mode 100644 (file)
index 0000000..64a4a9d
--- /dev/null
@@ -0,0 +1,123 @@
+From a2098250fbda149cfad9e626afe80abe3b21e574 Mon Sep 17 00:00:00 2001
+From: Pierre Ossman <pierre@ossman.eu>
+Date: Wed, 6 Nov 2013 20:09:08 +0100
+Subject: drm/radeon/audio: improve ACR calculation
+
+From: Pierre Ossman <pierre@ossman.eu>
+
+commit a2098250fbda149cfad9e626afe80abe3b21e574 upstream.
+
+In order to have any realistic chance of calculating proper
+ACR values, we need to be able to calculate both N and CTS,
+not just CTS. We still aim for the ideal N as specified in
+the HDMI spec though.
+
+bug:
+https://bugs.freedesktop.org/show_bug.cgi?id=69675
+
+Signed-off-by: Pierre Ossman <pierre@ossman.eu>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Cc: Josh Boyer <jwboyer@fedoraproject.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/r600_hdmi.c |   68 +++++++++++++++++++++++++------------
+ 1 file changed, 46 insertions(+), 22 deletions(-)
+
+--- a/drivers/gpu/drm/radeon/r600_hdmi.c
++++ b/drivers/gpu/drm/radeon/r600_hdmi.c
+@@ -24,6 +24,7 @@
+  * Authors: Christian König
+  */
+ #include <linux/hdmi.h>
++#include <linux/gcd.h>
+ #include <drm/drmP.h>
+ #include <drm/radeon_drm.h>
+ #include "radeon.h"
+@@ -67,25 +68,47 @@ static const struct radeon_hdmi_acr r600
+     {  74250,  4096,  74250,  6272,  82500,  6144,  74250 }, /*  74.25       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 */
+ };
++
+ /*
+- * calculate CTS value if it's not found in the table
++ * calculate CTS and N values if they are not found in the table
+  */
+-static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int N, int freq)
++static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int *N, int freq)
+ {
+-      u64 n;
+-      u32 d;
++      int n, cts;
++      unsigned long div, mul;
+-      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);
++      /* Safe, but overly large values */
++      n = 128 * freq;
++      cts = clock * 1000;
++
++      /* Smallest valid fraction */
++      div = gcd(n, cts);
++
++      n /= div;
++      cts /= div;
++
++      /*
++       * The optimal N is 128*freq/1000. Calculate the closest larger
++       * value that doesn't truncate any bits.
++       */
++      mul = ((128*freq/1000) + (n-1))/n;
++
++      n *= mul;
++      cts *= mul;
++
++      /* Check that we are in spec (not always possible) */
++      if (n < (128*freq/1500))
++              printk(KERN_WARNING "Calculated ACR N value is too small. You may experience audio problems.\n");
++      if (n > (128*freq/300))
++              printk(KERN_WARNING "Calculated ACR N value is too large. You may experience audio problems.\n");
++
++      *N = n;
++      *CTS = cts;
++
++      DRM_DEBUG("Calculated ACR timing N=%d CTS=%d for frequency %d\n",
++                *N, *CTS, freq);
+ }
+ struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock)
+@@ -93,15 +116,16 @@ struct radeon_hdmi_acr r600_hdmi_acr(uin
+       struct radeon_hdmi_acr res;
+       u8 i;
+-      for (i = 0; r600_hdmi_predefined_acr[i].clock != clock &&
+-           r600_hdmi_predefined_acr[i].clock != 0; i++)
+-              ;
+-      res = r600_hdmi_predefined_acr[i];
+-
+-      /* In case some CTS are missing */
+-      r600_hdmi_calc_cts(clock, &res.cts_32khz, res.n_32khz, 32000);
+-      r600_hdmi_calc_cts(clock, &res.cts_44_1khz, res.n_44_1khz, 44100);
+-      r600_hdmi_calc_cts(clock, &res.cts_48khz, res.n_48khz, 48000);
++      /* Precalculated values for common clocks */
++      for (i = 0; i < ARRAY_SIZE(r600_hdmi_predefined_acr); i++) {
++              if (r600_hdmi_predefined_acr[i].clock == clock)
++                      return r600_hdmi_predefined_acr[i];
++      }
++
++      /* And odd clocks get manually calculated */
++      r600_hdmi_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000);
++      r600_hdmi_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100);
++      r600_hdmi_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000);
+       return res;
+ }
index e668d0a556d6af5dccaac968930ecb92c2882b72..46d36e07fa2ff605f6d8078fba2b56a440efcf30 100644 (file)
@@ -54,3 +54,5 @@ iommu-remove-stack-trace-from-broken-irq-remapping-warning.patch
 elevator-fix-a-race-in-elevator-switching-and-md-device-initialization.patch
 elevator-acquire-q-sysfs_lock-in-elevator_change.patch
 ntp-make-periodic-rtc-update-more-reliable.patch
+drm-radeon-audio-improve-acr-calculation.patch
+drm-radeon-audio-correct-acr-table.patch