drm/tegra: hda: Extract HDA format parsing code
This code can be reused for HDMI, so extract it into a reusable function. Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
63
drivers/gpu/drm/tegra/hda.c
Normal file
63
drivers/gpu/drm/tegra/hda.c
Normal file
@@ -0,0 +1,63 @@
|
||||
// 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;
|
||||
}
|
Reference in New Issue
Block a user