[ALSA] vx-driver - Fix the calculation of frequency parameter
authorTakashi Iwai <tiwai@suse.de>
Wed, 27 Jul 2005 15:26:59 +0000 (17:26 +0200)
committerJaroslav Kysela <perex@suse.cz>
Thu, 28 Jul 2005 10:27:02 +0000 (12:27 +0200)
Digigram VX core
Fixed the calculation of frequency parameter of vx boards.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/drivers/vx/vx_uer.c

index 18114713c3b35c1b3baff73185ef3dbec62c5850..4fc38bde34f475e2b6742fed924fc5f5e8d74322 100644 (file)
@@ -162,34 +162,24 @@ static int vx_read_uer_status(vx_core_t *chip, int *mode)
 
 static int vx_calc_clock_from_freq(vx_core_t *chip, int freq)
 {
-#define XX_FECH48000                    0x0000004B
-#define XX_FECH32000                    0x00000171
-#define XX_FECH24000                    0x0000024B
-#define XX_FECH16000                    0x00000371
-#define XX_FECH12000                    0x0000044B
-#define XX_FECH8000                     0x00000571
-#define XX_FECH44100                    0x0000007F
-#define XX_FECH29400                    0x0000016F
-#define XX_FECH22050                    0x0000027F
-#define XX_FECH14000                    0x000003EF
-#define XX_FECH11025                    0x0000047F
-#define XX_FECH7350                     0x000005BF
-
-       switch (freq) {
-       case 48000:     return XX_FECH48000;
-       case 44100:     return XX_FECH44100;
-       case 32000:     return XX_FECH32000;
-       case 29400:     return XX_FECH29400;
-       case 24000:     return XX_FECH24000;
-       case 22050:     return XX_FECH22050;
-       case 16000:     return XX_FECH16000;
-       case 14000:     return XX_FECH14000;
-       case 12000:     return XX_FECH12000;
-       case 11025:     return XX_FECH11025;
-       case 8000:      return XX_FECH8000;
-       case 7350:      return XX_FECH7350;
-       default:        return freq;   /* The value is already correct */
-       }
+       int hexfreq;
+
+       snd_assert(freq > 0, return 0);
+
+       hexfreq = (28224000 * 10) / freq;
+       hexfreq = (hexfreq + 5) / 10;
+
+       /* max freq = 55125 Hz */
+       snd_assert(hexfreq > 0x00000200, return 0);
+
+       if (hexfreq <= 0x03ff)
+               return hexfreq - 0x00000201;
+       if (hexfreq <= 0x07ff) 
+               return (hexfreq / 2) - 1;
+       if (hexfreq <= 0x0fff)
+               return (hexfreq / 4) + 0x000001ff;
+
+       return 0x5fe;   /* min freq = 6893 Hz */
 }