ALSA: hda - Define AC_FMT_* constants
authorTakashi Iwai <tiwai@suse.de>
Tue, 3 Aug 2010 12:21:00 +0000 (14:21 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 3 Aug 2010 12:21:00 +0000 (14:21 +0200)
Define constants for the HD-audio stream format bits, and replace the
magic numbers in codes.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h
sound/pci/hda/patch_hdmi.c

index bd8d7a63d7fe94a84e647b44794a660d19a1256d..05e8995f9aec610523b2d403be597f0f4bca5e70 100644 (file)
@@ -3013,26 +3013,31 @@ struct hda_rate_tbl {
        unsigned int hda_fmt;
 };
 
+/* rate = base * mult / div */
+#define HDA_RATE(base, mult, div) \
+       (AC_FMT_BASE_##base##K | (((mult) - 1) << AC_FMT_MULT_SHIFT) | \
+        (((div) - 1) << AC_FMT_DIV_SHIFT))
+
 static struct hda_rate_tbl rate_bits[] = {
        /* rate in Hz, ALSA rate bitmask, HDA format value */
 
        /* autodetected value used in snd_hda_query_supported_pcm */
-       { 8000, SNDRV_PCM_RATE_8000, 0x0500 }, /* 1/6 x 48 */
-       { 11025, SNDRV_PCM_RATE_11025, 0x4300 }, /* 1/4 x 44 */
-       { 16000, SNDRV_PCM_RATE_16000, 0x0200 }, /* 1/3 x 48 */
-       { 22050, SNDRV_PCM_RATE_22050, 0x4100 }, /* 1/2 x 44 */
-       { 32000, SNDRV_PCM_RATE_32000, 0x0a00 }, /* 2/3 x 48 */
-       { 44100, SNDRV_PCM_RATE_44100, 0x4000 }, /* 44 */
-       { 48000, SNDRV_PCM_RATE_48000, 0x0000 }, /* 48 */
-       { 88200, SNDRV_PCM_RATE_88200, 0x4800 }, /* 2 x 44 */
-       { 96000, SNDRV_PCM_RATE_96000, 0x0800 }, /* 2 x 48 */
-       { 176400, SNDRV_PCM_RATE_176400, 0x5800 },/* 4 x 44 */
-       { 192000, SNDRV_PCM_RATE_192000, 0x1800 }, /* 4 x 48 */
+       { 8000, SNDRV_PCM_RATE_8000, HDA_RATE(48, 1, 6) },
+       { 11025, SNDRV_PCM_RATE_11025, HDA_RATE(44, 1, 4) },
+       { 16000, SNDRV_PCM_RATE_16000, HDA_RATE(48, 1, 3) },
+       { 22050, SNDRV_PCM_RATE_22050, HDA_RATE(44, 1, 2) },
+       { 32000, SNDRV_PCM_RATE_32000, HDA_RATE(48, 2, 3) },
+       { 44100, SNDRV_PCM_RATE_44100, HDA_RATE(44, 1, 1) },
+       { 48000, SNDRV_PCM_RATE_48000, HDA_RATE(48, 1, 1) },
+       { 88200, SNDRV_PCM_RATE_88200, HDA_RATE(44, 2, 1) },
+       { 96000, SNDRV_PCM_RATE_96000, HDA_RATE(48, 2, 1) },
+       { 176400, SNDRV_PCM_RATE_176400, HDA_RATE(44, 4, 1) },
+       { 192000, SNDRV_PCM_RATE_192000, HDA_RATE(48, 4, 1) },
 #define AC_PAR_PCM_RATE_BITS   11
        /* up to bits 10, 384kHZ isn't supported properly */
 
        /* not autodetected value */
-       { 9600, SNDRV_PCM_RATE_KNOT, 0x0400 }, /* 1/5 x 48 */
+       { 9600, SNDRV_PCM_RATE_KNOT, HDA_RATE(48, 1, 5) },
 
        { 0 } /* terminator */
 };
@@ -3075,20 +3080,20 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate,
 
        switch (snd_pcm_format_width(format)) {
        case 8:
-               val |= 0x00;
+               val |= AC_FMT_BITS_8;
                break;
        case 16:
-               val |= 0x10;
+               val |= AC_FMT_BITS_16;
                break;
        case 20:
        case 24:
        case 32:
                if (maxbps >= 32 || format == SNDRV_PCM_FORMAT_FLOAT_LE)
-                       val |= 0x40;
+                       val |= AC_FMT_BITS_32;
                else if (maxbps >= 24)
-                       val |= 0x30;
+                       val |= AC_FMT_BITS_24;
                else
-                       val |= 0x20;
+                       val |= AC_FMT_BITS_20;
                break;
        default:
                snd_printdd("invalid format width %d\n",
@@ -3097,7 +3102,7 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate,
        }
 
        if (spdif_ctls & AC_DIG1_NONAUDIO)
-               val |= 0x8000;
+               val |= AC_FMT_TYPE_NON_PCM;
 
        return val;
 }
index 48b33671e7277a7aa4e53681563dc2a3f72d18d7..46f75bccf0d365d91dc869d600849d08d09b9408 100644 (file)
@@ -224,6 +224,27 @@ enum {
 /* Input converter SDI select */
 #define AC_SDI_SELECT                  (0xf<<0)
 
+/* stream format id */
+#define AC_FMT_CHAN_SHIFT              0
+#define AC_FMT_CHAN_MASK               (0x0f << 0)
+#define AC_FMT_BITS_SHIFT              4
+#define AC_FMT_BITS_MASK               (7 << 4)
+#define AC_FMT_BITS_8                  (0 << 4)
+#define AC_FMT_BITS_16                 (1 << 4)
+#define AC_FMT_BITS_20                 (2 << 4)
+#define AC_FMT_BITS_24                 (3 << 4)
+#define AC_FMT_BITS_32                 (4 << 4)
+#define AC_FMT_DIV_SHIFT               8
+#define AC_FMT_DIV_MASK                        (7 << 8)
+#define AC_FMT_MULT_SHIFT              11
+#define AC_FMT_MULT_MASK               (7 << 11)
+#define AC_FMT_BASE_SHIFT              14
+#define AC_FMT_BASE_48K                        (0 << 14)
+#define AC_FMT_BASE_44K                        (1 << 14)
+#define AC_FMT_TYPE_SHIFT              15
+#define AC_FMT_TYPE_PCM                        (0 << 15)
+#define AC_FMT_TYPE_NON_PCM            (1 << 15)
+
 /* Unsolicited response control */
 #define AC_UNSOL_TAG                   (0x3f<<0)
 #define AC_UNSOL_ENABLED               (1<<7)
index 8534792591fcf2670f9f3e6b733bc0c9f52bb0aa..522e0748ee99f841cf6458823bd8228013bbd83c 100644 (file)
@@ -698,6 +698,10 @@ static void hdmi_unsol_event(struct hda_codec *codec, unsigned int res)
  * Callbacks
  */
 
+/* HBR should be Non-PCM, 8 channels */
+#define is_hbr_format(format) \
+       ((format & AC_FMT_TYPE_NON_PCM) && (format & AC_FMT_CHAN_MASK) == 7)
+
 static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid,
                              u32 stream_tag, int format)
 {
@@ -718,8 +722,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid,
                                            AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
 
                new_pinctl = pinctl & ~AC_PINCTL_EPT;
-               /* Non-PCM, 8 channels */
-               if ((format & 0x8000) && (format & 0x0f) == 7)
+               if (is_hbr_format(format))
                        new_pinctl |= AC_PINCTL_EPT_HBR;
                else
                        new_pinctl |= AC_PINCTL_EPT_NATIVE;
@@ -736,7 +739,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid,
                                            new_pinctl);
        }
 
-       if ((format & 0x8000) && (format & 0x0f) == 7 && !new_pinctl) {
+       if (is_hbr_format(format) && !new_pinctl) {
                snd_printdd("hdmi_setup_stream: HBR is not supported\n");
                return -EINVAL;
        }