Unverified Commit 1c3b89fb authored by Sameer Pujar's avatar Sameer Pujar Committed by Mark Brown
Browse files

ASoC: tegra: Add support for CIF programming



Audio Client Interface (CIF) is a proprietary interface employed to route
audio samples through Audio Hub (AHUB) components by inter connecting the
various modules.

This patch exports an inline function tegra_set_cif() which can be used,
for now, to program CIF on Tegra210 and later Tegra generations. Later it
can be extended to include helpers for legacy chips as well.

Signed-off-by: default avatarSameer Pujar <spujar@nvidia.com>
Reviewed-by: default avatarJon Hunter <jonathanh@nvidia.com>
Reviewed-by: default avatarDmitry Osipenko <digetx@gmail.com>
Link: https://lore.kernel.org/r/1595134890-16470-3-git-send-email-spujar@nvidia.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 665308c0
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * tegra_cif.h - TEGRA Audio CIF Programming
 *
 * Copyright (c) 2020 NVIDIA CORPORATION.  All rights reserved.
 *
 */

#ifndef __TEGRA_CIF_H__
#define __TEGRA_CIF_H__

#include <linux/regmap.h>

#define TEGRA_ACIF_CTRL_FIFO_TH_SHIFT		24
#define TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT		20
#define TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT		16
#define TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT	12
#define TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT	8
#define TEGRA_ACIF_CTRL_EXPAND_SHIFT		6
#define TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT	4
#define TEGRA_ACIF_CTRL_REPLICATE_SHIFT		3
#define TEGRA_ACIF_CTRL_TRUNCATE_SHIFT		1
#define TEGRA_ACIF_CTRL_MONO_CONV_SHIFT		0

/* AUDIO/CLIENT_BITS values */
#define TEGRA_ACIF_BITS_8			1
#define TEGRA_ACIF_BITS_16			3
#define TEGRA_ACIF_BITS_24			5
#define TEGRA_ACIF_BITS_32			7

#define TEGRA_ACIF_UPDATE_MASK			0x3ffffffb

struct tegra_cif_conf {
	unsigned int threshold;
	unsigned int audio_ch;
	unsigned int client_ch;
	unsigned int audio_bits;
	unsigned int client_bits;
	unsigned int expand;
	unsigned int stereo_conv;
	unsigned int replicate;
	unsigned int truncate;
	unsigned int mono_conv;
};

static inline void tegra_set_cif(struct regmap *regmap, unsigned int reg,
				 struct tegra_cif_conf *conf)
{
	unsigned int value;

	value = (conf->threshold << TEGRA_ACIF_CTRL_FIFO_TH_SHIFT) |
		((conf->audio_ch - 1) << TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT) |
		((conf->client_ch - 1) << TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT) |
		(conf->audio_bits << TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT) |
		(conf->client_bits << TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT) |
		(conf->expand << TEGRA_ACIF_CTRL_EXPAND_SHIFT) |
		(conf->stereo_conv << TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT) |
		(conf->replicate << TEGRA_ACIF_CTRL_REPLICATE_SHIFT) |
		(conf->truncate << TEGRA_ACIF_CTRL_TRUNCATE_SHIFT) |
		(conf->mono_conv << TEGRA_ACIF_CTRL_MONO_CONV_SHIFT);

	regmap_update_bits(regmap, reg, TEGRA_ACIF_UPDATE_MASK, value);
}

#endif