xref: /linux/sound/soc/tegra/tegra_cif.h (revision a9e6060bb2a6cae6d43a98ec0794844ad01273d3)
1 /* SPDX-License-Identifier: GPL-2.0-only
2  * SPDX-FileCopyrightText: Copyright (c) 2020-2025 NVIDIA CORPORATION. All rights reserved.
3  *
4  * tegra_cif.h - TEGRA Audio CIF Programming
5  *
6  */
7 
8 #ifndef __TEGRA_CIF_H__
9 #define __TEGRA_CIF_H__
10 
11 #include <linux/regmap.h>
12 
13 #define TEGRA_ACIF_CTRL_FIFO_TH_SHIFT		24
14 #define TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT		20
15 #define TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT		16
16 #define TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT	12
17 #define TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT	8
18 #define TEGRA_ACIF_CTRL_EXPAND_SHIFT		6
19 #define TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT	4
20 #define TEGRA_ACIF_CTRL_REPLICATE_SHIFT		3
21 #define TEGRA_ACIF_CTRL_TRUNCATE_SHIFT		1
22 #define TEGRA_ACIF_CTRL_MONO_CONV_SHIFT		0
23 
24 #define TEGRA264_ACIF_CTRL_AUDIO_BITS_SHIFT	11
25 #define TEGRA264_ACIF_CTRL_CLIENT_CH_SHIFT	14
26 #define TEGRA264_ACIF_CTRL_AUDIO_CH_SHIFT	19
27 
28 /* AUDIO/CLIENT_BITS values */
29 #define TEGRA_ACIF_BITS_8			1
30 #define TEGRA_ACIF_BITS_16			3
31 #define TEGRA_ACIF_BITS_24			5
32 #define TEGRA_ACIF_BITS_32			7
33 
34 #define TEGRA_ACIF_UPDATE_MASK			0x3ffffffb
35 
36 struct tegra_cif_conf {
37 	unsigned int threshold;
38 	unsigned int audio_ch;
39 	unsigned int client_ch;
40 	unsigned int audio_bits;
41 	unsigned int client_bits;
42 	unsigned int expand;
43 	unsigned int stereo_conv;
44 	unsigned int replicate;
45 	unsigned int truncate;
46 	unsigned int mono_conv;
47 };
48 
tegra_set_cif(struct regmap * regmap,unsigned int reg,struct tegra_cif_conf * conf)49 static inline void tegra_set_cif(struct regmap *regmap, unsigned int reg,
50 				 struct tegra_cif_conf *conf)
51 {
52 	unsigned int value;
53 
54 	value = (conf->threshold << TEGRA_ACIF_CTRL_FIFO_TH_SHIFT) |
55 		((conf->audio_ch - 1) << TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT) |
56 		((conf->client_ch - 1) << TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT) |
57 		(conf->audio_bits << TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT) |
58 		(conf->client_bits << TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT) |
59 		(conf->expand << TEGRA_ACIF_CTRL_EXPAND_SHIFT) |
60 		(conf->stereo_conv << TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT) |
61 		(conf->replicate << TEGRA_ACIF_CTRL_REPLICATE_SHIFT) |
62 		(conf->truncate << TEGRA_ACIF_CTRL_TRUNCATE_SHIFT) |
63 		(conf->mono_conv << TEGRA_ACIF_CTRL_MONO_CONV_SHIFT);
64 
65 	regmap_update_bits(regmap, reg, TEGRA_ACIF_UPDATE_MASK, value);
66 }
67 
tegra264_set_cif(struct regmap * regmap,unsigned int reg,struct tegra_cif_conf * conf)68 static inline void tegra264_set_cif(struct regmap *regmap, unsigned int reg,
69 				    struct tegra_cif_conf *conf)
70 {
71 	unsigned int value;
72 
73 	value = (conf->threshold << TEGRA_ACIF_CTRL_FIFO_TH_SHIFT) |
74 		((conf->audio_ch - 1) << TEGRA264_ACIF_CTRL_AUDIO_CH_SHIFT) |
75 		((conf->client_ch - 1) << TEGRA264_ACIF_CTRL_CLIENT_CH_SHIFT) |
76 		(conf->audio_bits << TEGRA264_ACIF_CTRL_AUDIO_BITS_SHIFT) |
77 		(conf->client_bits << TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT) |
78 		(conf->expand << TEGRA_ACIF_CTRL_EXPAND_SHIFT) |
79 		(conf->stereo_conv << TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT) |
80 		(conf->replicate << TEGRA_ACIF_CTRL_REPLICATE_SHIFT) |
81 		(conf->truncate << TEGRA_ACIF_CTRL_TRUNCATE_SHIFT) |
82 		(conf->mono_conv << TEGRA_ACIF_CTRL_MONO_CONV_SHIFT);
83 
84 	regmap_update_bits(regmap, reg, TEGRA_ACIF_UPDATE_MASK, value);
85 }
86 
87 #endif
88