| 1 | |
| 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 |
|
| 62 | fmt->channels = channels + 1;
|
| 63 | }
|