1 | // SPDX-License-Identifier: MIT |
---|---|
2 | /* |
3 | * Copyright (C) 2019 NVIDIA Corporation |
4 | */ |
5 | |
6 | #include <linux/bug.h> |
7 | |
8 | #include <sound/hda_verbs.h> |
9 | |
10 | #include "hda.h" |
11 | |
12 | void tegra_hda_parse_format(unsigned int format, struct tegra_hda_format *fmt) |
13 | { |
14 | unsigned int mul, div, bits, channels; |
15 | |
16 | if (format & AC_FMT_TYPE_NON_PCM) |
17 | fmt->pcm = false; |
18 | else |
19 | fmt->pcm = true; |
20 | |
21 | if (format & AC_FMT_BASE_44K) |
22 | fmt->sample_rate = 44100; |
23 | else |
24 | fmt->sample_rate = 48000; |
25 | |
26 | mul = (format & AC_FMT_MULT_MASK) >> AC_FMT_MULT_SHIFT; |
27 | div = (format & AC_FMT_DIV_MASK) >> AC_FMT_DIV_SHIFT; |
28 | |
29 | fmt->sample_rate *= (mul + 1) / (div + 1); |
30 | |
31 | switch (format & AC_FMT_BITS_MASK) { |
32 | case AC_FMT_BITS_8: |
33 | fmt->bits = 8; |
34 | break; |
35 | |
36 | case AC_FMT_BITS_16: |
37 | fmt->bits = 16; |
38 | break; |
39 | |
40 | case AC_FMT_BITS_20: |
41 | fmt->bits = 20; |
42 | break; |
43 | |
44 | case AC_FMT_BITS_24: |
45 | fmt->bits = 24; |
46 | break; |
47 | |
48 | case AC_FMT_BITS_32: |
49 | fmt->bits = 32; |
50 | break; |
51 | |
52 | default: |
53 | bits = (format & AC_FMT_BITS_MASK) >> AC_FMT_BITS_SHIFT; |
54 | WARN(1, "invalid number of bits: %#x\n", bits); |
55 | fmt->bits = 8; |
56 | break; |
57 | } |
58 | |
59 | channels = (format & AC_FMT_CHAN_MASK) >> AC_FMT_CHAN_SHIFT; |
60 | |
61 | /* channels are encoded as n - 1 */ |
62 | fmt->channels = channels + 1; |
63 | } |
64 |