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