Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
[linux-2.6-microblaze.git] / drivers / gpu / drm / tegra / hda.c
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 }