162306a36Sopenharmony_ci// SPDX-License-Identifier: MIT
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2019 NVIDIA Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/bug.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <sound/hda_verbs.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "hda.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_civoid tegra_hda_parse_format(unsigned int format, struct tegra_hda_format *fmt)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	unsigned int mul, div, bits, channels;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	if (format & AC_FMT_TYPE_NON_PCM)
1762306a36Sopenharmony_ci		fmt->pcm = false;
1862306a36Sopenharmony_ci	else
1962306a36Sopenharmony_ci		fmt->pcm = true;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	if (format & AC_FMT_BASE_44K)
2262306a36Sopenharmony_ci		fmt->sample_rate = 44100;
2362306a36Sopenharmony_ci	else
2462306a36Sopenharmony_ci		fmt->sample_rate = 48000;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	mul = (format & AC_FMT_MULT_MASK) >> AC_FMT_MULT_SHIFT;
2762306a36Sopenharmony_ci	div = (format & AC_FMT_DIV_MASK) >> AC_FMT_DIV_SHIFT;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	fmt->sample_rate *= (mul + 1) / (div + 1);
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	switch (format & AC_FMT_BITS_MASK) {
3262306a36Sopenharmony_ci	case AC_FMT_BITS_8:
3362306a36Sopenharmony_ci		fmt->bits = 8;
3462306a36Sopenharmony_ci		break;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	case AC_FMT_BITS_16:
3762306a36Sopenharmony_ci		fmt->bits = 16;
3862306a36Sopenharmony_ci		break;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	case AC_FMT_BITS_20:
4162306a36Sopenharmony_ci		fmt->bits = 20;
4262306a36Sopenharmony_ci		break;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	case AC_FMT_BITS_24:
4562306a36Sopenharmony_ci		fmt->bits = 24;
4662306a36Sopenharmony_ci		break;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	case AC_FMT_BITS_32:
4962306a36Sopenharmony_ci		fmt->bits = 32;
5062306a36Sopenharmony_ci		break;
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	default:
5362306a36Sopenharmony_ci		bits = (format & AC_FMT_BITS_MASK) >> AC_FMT_BITS_SHIFT;
5462306a36Sopenharmony_ci		WARN(1, "invalid number of bits: %#x\n", bits);
5562306a36Sopenharmony_ci		fmt->bits = 8;
5662306a36Sopenharmony_ci		break;
5762306a36Sopenharmony_ci	}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	channels = (format & AC_FMT_CHAN_MASK) >> AC_FMT_CHAN_SHIFT;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	/* channels are encoded as n - 1 */
6262306a36Sopenharmony_ci	fmt->channels = channels + 1;
6362306a36Sopenharmony_ci}
64