On 20/02/2020 06:34, Sameer Pujar wrote: > 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: Sameer Pujar <spujar@xxxxxxxxxx> > --- > sound/soc/tegra/tegra_cif.h | 63 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 63 insertions(+) > create mode 100644 sound/soc/tegra/tegra_cif.h > > diff --git a/sound/soc/tegra/tegra_cif.h b/sound/soc/tegra/tegra_cif.h > new file mode 100644 > index 0000000..ecc0850 > --- /dev/null > +++ b/sound/soc/tegra/tegra_cif.h > @@ -0,0 +1,63 @@ > +/* 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__ > + > +#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 Reviewed-by: Jon Hunter <jonathanh@xxxxxxxxxx> Cheers! Jon -- nvpublic