Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: MIT
0002 /*
0003  * Copyright (C) 2019 NVIDIA Corporation
0004  */
0005 
0006 #include <linux/bug.h>
0007 
0008 #include <sound/hda_verbs.h>
0009 
0010 #include "hda.h"
0011 
0012 void tegra_hda_parse_format(unsigned int format, struct tegra_hda_format *fmt)
0013 {
0014     unsigned int mul, div, bits, channels;
0015 
0016     if (format & AC_FMT_TYPE_NON_PCM)
0017         fmt->pcm = false;
0018     else
0019         fmt->pcm = true;
0020 
0021     if (format & AC_FMT_BASE_44K)
0022         fmt->sample_rate = 44100;
0023     else
0024         fmt->sample_rate = 48000;
0025 
0026     mul = (format & AC_FMT_MULT_MASK) >> AC_FMT_MULT_SHIFT;
0027     div = (format & AC_FMT_DIV_MASK) >> AC_FMT_DIV_SHIFT;
0028 
0029     fmt->sample_rate *= (mul + 1) / (div + 1);
0030 
0031     switch (format & AC_FMT_BITS_MASK) {
0032     case AC_FMT_BITS_8:
0033         fmt->bits = 8;
0034         break;
0035 
0036     case AC_FMT_BITS_16:
0037         fmt->bits = 16;
0038         break;
0039 
0040     case AC_FMT_BITS_20:
0041         fmt->bits = 20;
0042         break;
0043 
0044     case AC_FMT_BITS_24:
0045         fmt->bits = 24;
0046         break;
0047 
0048     case AC_FMT_BITS_32:
0049         fmt->bits = 32;
0050         break;
0051 
0052     default:
0053         bits = (format & AC_FMT_BITS_MASK) >> AC_FMT_BITS_SHIFT;
0054         WARN(1, "invalid number of bits: %#x\n", bits);
0055         fmt->bits = 8;
0056         break;
0057     }
0058 
0059     channels = (format & AC_FMT_CHAN_MASK) >> AC_FMT_CHAN_SHIFT;
0060 
0061     /* channels are encoded as n - 1 */
0062     fmt->channels = channels + 1;
0063 }