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
12void 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

source code of linux/drivers/gpu/drm/tegra/hda.c