0001
0002
0003
0004
0005
0006 #include <linux/bug.h>
0007
0008 #include <sound/hda_verbs.h>
0009
0010 #include "hda.h"
0011
0012 void tegra_hda_parse_format(unsigned int format, struct tegra_hda_format *fmt)
0013 {
0014 unsigned int mul, div, bits, channels;
0015
0016 if (format & AC_FMT_TYPE_NON_PCM)
0017 fmt->pcm = false;
0018 else
0019 fmt->pcm = true;
0020
0021 if (format & AC_FMT_BASE_44K)
0022 fmt->sample_rate = 44100;
0023 else
0024 fmt->sample_rate = 48000;
0025
0026 mul = (format & AC_FMT_MULT_MASK) >> AC_FMT_MULT_SHIFT;
0027 div = (format & AC_FMT_DIV_MASK) >> AC_FMT_DIV_SHIFT;
0028
0029 fmt->sample_rate *= (mul + 1) / (div + 1);
0030
0031 switch (format & AC_FMT_BITS_MASK) {
0032 case AC_FMT_BITS_8:
0033 fmt->bits = 8;
0034 break;
0035
0036 case AC_FMT_BITS_16:
0037 fmt->bits = 16;
0038 break;
0039
0040 case AC_FMT_BITS_20:
0041 fmt->bits = 20;
0042 break;
0043
0044 case AC_FMT_BITS_24:
0045 fmt->bits = 24;
0046 break;
0047
0048 case AC_FMT_BITS_32:
0049 fmt->bits = 32;
0050 break;
0051
0052 default:
0053 bits = (format & AC_FMT_BITS_MASK) >> AC_FMT_BITS_SHIFT;
0054 WARN(1, "invalid number of bits: %#x\n", bits);
0055 fmt->bits = 8;
0056 break;
0057 }
0058
0059 channels = (format & AC_FMT_CHAN_MASK) >> AC_FMT_CHAN_SHIFT;
0060
0061
0062 fmt->channels = channels + 1;
0063 }