mirror of https://gitee.com/openkylin/linux.git
64 lines
1.1 KiB
C
64 lines
1.1 KiB
C
// SPDX-License-Identifier: MIT
|
|
/*
|
|
* Copyright (C) 2019 NVIDIA Corporation
|
|
*/
|
|
|
|
#include <linux/bug.h>
|
|
|
|
#include <sound/hda_verbs.h>
|
|
|
|
#include "hda.h"
|
|
|
|
void tegra_hda_parse_format(unsigned int format, struct tegra_hda_format *fmt)
|
|
{
|
|
unsigned int mul, div, bits, channels;
|
|
|
|
if (format & AC_FMT_TYPE_NON_PCM)
|
|
fmt->pcm = false;
|
|
else
|
|
fmt->pcm = true;
|
|
|
|
if (format & AC_FMT_BASE_44K)
|
|
fmt->sample_rate = 44100;
|
|
else
|
|
fmt->sample_rate = 48000;
|
|
|
|
mul = (format & AC_FMT_MULT_MASK) >> AC_FMT_MULT_SHIFT;
|
|
div = (format & AC_FMT_DIV_MASK) >> AC_FMT_DIV_SHIFT;
|
|
|
|
fmt->sample_rate *= (mul + 1) / (div + 1);
|
|
|
|
switch (format & AC_FMT_BITS_MASK) {
|
|
case AC_FMT_BITS_8:
|
|
fmt->bits = 8;
|
|
break;
|
|
|
|
case AC_FMT_BITS_16:
|
|
fmt->bits = 16;
|
|
break;
|
|
|
|
case AC_FMT_BITS_20:
|
|
fmt->bits = 20;
|
|
break;
|
|
|
|
case AC_FMT_BITS_24:
|
|
fmt->bits = 24;
|
|
break;
|
|
|
|
case AC_FMT_BITS_32:
|
|
fmt->bits = 32;
|
|
break;
|
|
|
|
default:
|
|
bits = (format & AC_FMT_BITS_MASK) >> AC_FMT_BITS_SHIFT;
|
|
WARN(1, "invalid number of bits: %#x\n", bits);
|
|
fmt->bits = 8;
|
|
break;
|
|
}
|
|
|
|
channels = (format & AC_FMT_CHAN_MASK) >> AC_FMT_CHAN_SHIFT;
|
|
|
|
/* channels are encoded as n - 1 */
|
|
fmt->channels = channels + 1;
|
|
}
|