|
@@ -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;
|
|
|
}
|