cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hda.c (1176B)


      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}