[ALSA] hdsp - RME 9632 fix at 192kHz
authorRemy Bruno <remy.bruno@trinnov.com>
Fri, 22 Feb 2008 16:57:02 +0000 (17:57 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 24 Apr 2008 10:00:15 +0000 (12:00 +0200)
The bits indicating SPDIF frequency in the status register are not the same for
the 9632 than for the other cards, because it also supports 192kHz. A specific
bitmask has thus been added (used in hdsp_spdif_sample_rate()).
The 9632 does not seem to report external sample rates greater than 96kHz. In
this case, the best seems to report spdif rate when autosync reference is
spdif. This also required to move function hdsp_spdif_sample_rate().

Signed-off-by: Remy Bruno <remy.bruno@trinnov.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/rme9652/hdsp.c

index 1be84f2..4d6fbb3 100644 (file)
@@ -318,6 +318,10 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin");
 #define HDSP_midi1IRQPending    (1<<31)
 
 #define HDSP_spdifFrequencyMask    (HDSP_spdifFrequency0|HDSP_spdifFrequency1|HDSP_spdifFrequency2)
+#define HDSP_spdifFrequencyMask_9632 (HDSP_spdifFrequency0|\
+                                     HDSP_spdifFrequency1|\
+                                     HDSP_spdifFrequency2|\
+                                     HDSP_spdifFrequency3)
 
 #define HDSP_spdifFrequency32KHz   (HDSP_spdifFrequency0)
 #define HDSP_spdifFrequency44_1KHz (HDSP_spdifFrequency1)
@@ -328,7 +332,9 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin");
 #define HDSP_spdifFrequency96KHz   (HDSP_spdifFrequency2|HDSP_spdifFrequency1)
 
 /* This is for H9632 cards */
-#define HDSP_spdifFrequency128KHz   HDSP_spdifFrequencyMask
+#define HDSP_spdifFrequency128KHz   (HDSP_spdifFrequency0|\
+                                    HDSP_spdifFrequency1|\
+                                    HDSP_spdifFrequency2)
 #define HDSP_spdifFrequency176_4KHz HDSP_spdifFrequency3
 #define HDSP_spdifFrequency192KHz   (HDSP_spdifFrequency3|HDSP_spdifFrequency0)
 
@@ -885,28 +891,15 @@ static int snd_hdsp_use_is_exclusive(struct hdsp *hdsp)
        return ret;
 }
 
-static int hdsp_external_sample_rate (struct hdsp *hdsp)
-{
-       unsigned int status2 = hdsp_read(hdsp, HDSP_status2Register);
-       unsigned int rate_bits = status2 & HDSP_systemFrequencyMask;
-
-       switch (rate_bits) {
-       case HDSP_systemFrequency32:   return 32000;
-       case HDSP_systemFrequency44_1: return 44100;
-       case HDSP_systemFrequency48:   return 48000;
-       case HDSP_systemFrequency64:   return 64000;
-       case HDSP_systemFrequency88_2: return 88200;
-       case HDSP_systemFrequency96:   return 96000;
-       default:
-               return 0;
-       }
-}
-
 static int hdsp_spdif_sample_rate(struct hdsp *hdsp)
 {
        unsigned int status = hdsp_read(hdsp, HDSP_statusRegister);
        unsigned int rate_bits = (status & HDSP_spdifFrequencyMask);
 
+       /* For the 9632, the mask is different */
+       if (hdsp->io_type == H9632)
+                rate_bits = (status & HDSP_spdifFrequencyMask_9632);
+
        if (status & HDSP_SPDIFErrorFlag)
                return 0;
        
@@ -933,6 +926,31 @@ static int hdsp_spdif_sample_rate(struct hdsp *hdsp)
        return 0;
 }
 
+static int hdsp_external_sample_rate(struct hdsp *hdsp)
+{
+       unsigned int status2 = hdsp_read(hdsp, HDSP_status2Register);
+       unsigned int rate_bits = status2 & HDSP_systemFrequencyMask;
+
+       /* For the 9632 card, there seems to be no bit for indicating external
+        * sample rate greater than 96kHz. The card reports the corresponding
+        * single speed. So the best means seems to get spdif rate when
+        * autosync reference is spdif */
+       if (hdsp->io_type == H9632 &&
+           hdsp_autosync_ref(hdsp) == HDSP_AUTOSYNC_FROM_SPDIF)
+                return hdsp_spdif_sample_rate(hdsp);
+
+       switch (rate_bits) {
+       case HDSP_systemFrequency32:   return 32000;
+       case HDSP_systemFrequency44_1: return 44100;
+       case HDSP_systemFrequency48:   return 48000;
+       case HDSP_systemFrequency64:   return 64000;
+       case HDSP_systemFrequency88_2: return 88200;
+       case HDSP_systemFrequency96:   return 96000;
+       default:
+               return 0;
+       }
+}
+
 static void hdsp_compute_period_size(struct hdsp *hdsp)
 {
        hdsp->period_bytes = 1 << ((hdsp_decode_latency(hdsp->control_register) + 8));