summaryrefslogtreecommitdiff
path: root/sound/soc/tegra/tegra210_ahub.h
blob: f355b2cfd19b22b76f28bc23439f6e0277a9c6e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * tegra210_ahub.h - TEGRA210 AHUB
 *
 * Copyright (c) 2020-2025, NVIDIA CORPORATION.  All rights reserved.
 *
 */

#ifndef __TEGRA210_AHUB__H__
#define __TEGRA210_AHUB__H__

/* Tegra210 specific */
#define TEGRA210_XBAR_PART1_RX				0x200
#define TEGRA210_XBAR_PART2_RX				0x400
#define TEGRA210_XBAR_RX_STRIDE				0x4
#define TEGRA210_XBAR_AUDIO_RX_COUNT			90
#define TEGRA210_XBAR_REG_MASK_0			0xf1f03ff
#define TEGRA210_XBAR_REG_MASK_1			0x3f30031f
#define TEGRA210_XBAR_REG_MASK_2			0xff1cf313
#define TEGRA210_XBAR_REG_MASK_3			0x0
#define TEGRA210_XBAR_UPDATE_MAX_REG			3
/* Tegra186 specific */
#define TEGRA186_XBAR_PART3_RX				0x600
#define TEGRA186_XBAR_AUDIO_RX_COUNT			115
#define TEGRA186_XBAR_REG_MASK_0			0xf3fffff
#define TEGRA186_XBAR_REG_MASK_1			0x3f310f1f
#define TEGRA186_XBAR_REG_MASK_2			0xff3cf311
#define TEGRA186_XBAR_REG_MASK_3			0x3f0f00ff
#define TEGRA186_XBAR_UPDATE_MAX_REG			4

/* Tegra264 specific */
#define TEGRA264_XBAR_PART1_RX				0x1000
#define TEGRA264_XBAR_PART2_RX				0x2000
#define TEGRA264_XBAR_PART3_RX				0x3000
#define TEGRA264_XBAR_PART4_RX				0x4000
#define TEGRA264_XBAR_PART0_ADX6_RX1			0x224
#define TEGRA264_XBAR_AUDIO_RX_COUNT			((TEGRA264_XBAR_PART0_ADX6_RX1 / 4) + 1)
#define TEGRA264_XBAR_REG_MASK_0			0xfffffff
#define TEGRA264_XBAR_REG_MASK_1			0x3f013f1f
#define TEGRA264_XBAR_REG_MASK_2			0xff3c0301
#define TEGRA264_XBAR_REG_MASK_3			0x3f00ffff
#define TEGRA264_XBAR_REG_MASK_4			0x7fff9f
#define TEGRA264_XBAR_UPDATE_MAX_REG			5

#define TEGRA264_AXBAR_ADMAIF_RX1			0x0
#define TEGRA264_AXBAR_SFC4_RX1				0x6c
#define TEGRA264_AXBAR_MIXER1_RX1			0x80
#define TEGRA264_AXBAR_MIXER1_RX10			0xa4
#define TEGRA264_AXBAR_DSPK1_RX1			0xc0
#define TEGRA264_AXBAR_OPE1_RX1				0x100
#define TEGRA264_AXBAR_MVC1_RX1				0x110
#define TEGRA264_AXBAR_MVC2_RX1				0x114
#define TEGRA264_AXBAR_AMX1_RX1				0x120
#define TEGRA264_AXBAR_AMX3_RX4				0x14c
#define TEGRA264_AXBAR_ADX1_RX1				0x160
#define TEGRA264_AXBAR_ASRC1_RX7			0x1a8
#define TEGRA264_AXBAR_ADMAIF_RX21			0x1d0
#define TEGRA264_AXBAR_ADX6_RX1				0x224

#define TEGRA_XBAR_UPDATE_MAX_REG (TEGRA264_XBAR_UPDATE_MAX_REG)

#define TEGRA264_MAX_REGISTER_ADDR (TEGRA264_XBAR_PART4_RX +		\
	(TEGRA210_XBAR_RX_STRIDE * (TEGRA264_XBAR_AUDIO_RX_COUNT - 1)))

#define TEGRA186_MAX_REGISTER_ADDR (TEGRA186_XBAR_PART3_RX +		\
	(TEGRA210_XBAR_RX_STRIDE * (TEGRA186_XBAR_AUDIO_RX_COUNT - 1)))

#define TEGRA210_MAX_REGISTER_ADDR (TEGRA210_XBAR_PART2_RX +		\
	(TEGRA210_XBAR_RX_STRIDE * (TEGRA210_XBAR_AUDIO_RX_COUNT - 1)))

#define MUX_REG(id) (TEGRA210_XBAR_RX_STRIDE * (id))

#define MUX_VALUE(npart, nbit) (1 + (nbit) + (npart) * 32)

#define SOC_VALUE_ENUM_WIDE(xreg, shift, xmax, xtexts, xvalues)		\
	{								\
		.reg = xreg,						\
		.shift_l = shift,					\
		.shift_r = shift,					\
		.items = xmax,						\
		.texts = xtexts,					\
		.values = xvalues,					\
		.mask = xmax ? roundup_pow_of_two(xmax) - 1 : 0		\
	}

#define SOC_VALUE_ENUM_WIDE_DECL(name, xreg, shift, xtexts, xvalues)	\
	static struct soc_enum name =					\
		SOC_VALUE_ENUM_WIDE(xreg, shift, ARRAY_SIZE(xtexts),	\
				    xtexts, xvalues)

#define MUX_ENUM_CTRL_DECL(ename, id)					\
	SOC_VALUE_ENUM_WIDE_DECL(ename##_enum, MUX_REG(id), 0,		\
				 tegra210_ahub_mux_texts,		\
				 tegra210_ahub_mux_values);		\
	static const struct snd_kcontrol_new ename##_control =		\
		SOC_DAPM_ENUM_EXT("Route", ename##_enum,		\
				  tegra_ahub_get_value_enum,		\
				  tegra_ahub_put_value_enum)

#define MUX_ENUM_CTRL_DECL_186(ename, id)				\
	SOC_VALUE_ENUM_WIDE_DECL(ename##_enum, MUX_REG(id), 0,		\
				 tegra186_ahub_mux_texts,		\
				 tegra186_ahub_mux_values);		\
	static const struct snd_kcontrol_new ename##_control =		\
		SOC_DAPM_ENUM_EXT("Route", ename##_enum,		\
				  tegra_ahub_get_value_enum,		\
				  tegra_ahub_put_value_enum)

#define MUX_ENUM_CTRL_DECL_234(ename, id) MUX_ENUM_CTRL_DECL_186(ename, id)

#define MUX_ENUM_CTRL_DECL_264(ename, id)				\
	SOC_VALUE_ENUM_WIDE_DECL(ename##_enum, MUX_REG(id), 0,		\
				 tegra264_ahub_mux_texts,		\
				 tegra264_ahub_mux_values);		\
	static const struct snd_kcontrol_new ename##_control =		\
		SOC_DAPM_ENUM_EXT("Route", ename##_enum,		\
				  tegra_ahub_get_value_enum,		\
				  tegra_ahub_put_value_enum)

#define WIDGETS(sname, ename)						     \
	SND_SOC_DAPM_AIF_IN(sname " XBAR-RX", NULL, 0, SND_SOC_NOPM, 0, 0),  \
	SND_SOC_DAPM_AIF_OUT(sname " XBAR-TX", NULL, 0, SND_SOC_NOPM, 0, 0), \
	SND_SOC_DAPM_MUX(sname " Mux", SND_SOC_NOPM, 0, 0,		     \
			 &ename##_control)

#define TX_WIDGETS(sname)						    \
	SND_SOC_DAPM_AIF_IN(sname " XBAR-RX", NULL, 0, SND_SOC_NOPM, 0, 0), \
	SND_SOC_DAPM_AIF_OUT(sname " XBAR-TX", NULL, 0, SND_SOC_NOPM, 0, 0)

#define DAI(sname)							\
	{								\
		.name = "XBAR-" #sname,					\
		.playback = {						\
			.stream_name = #sname " XBAR-Playback",		\
			.channels_min = 1,				\
			.channels_max = 32,				\
			.rates = SNDRV_PCM_RATE_8000_192000,		\
			.formats = SNDRV_PCM_FMTBIT_S8 |		\
				SNDRV_PCM_FMTBIT_S16_LE |		\
				SNDRV_PCM_FMTBIT_S24_LE |		\
				SNDRV_PCM_FMTBIT_S32_LE,		\
		},							\
		.capture = {						\
			.stream_name = #sname " XBAR-Capture",		\
			.channels_min = 1,				\
			.channels_max = 32,				\
			.rates = SNDRV_PCM_RATE_8000_192000,		\
			.formats = SNDRV_PCM_FMTBIT_S8 |		\
				SNDRV_PCM_FMTBIT_S16_LE |		\
				SNDRV_PCM_FMTBIT_S24_LE |		\
				SNDRV_PCM_FMTBIT_S32_LE,		\
		},							\
	}

struct tegra_ahub_soc_data {
	const struct regmap_config *regmap_config;
	const struct snd_soc_component_driver *cmpnt_drv;
	struct snd_soc_dai_driver *dai_drv;
	unsigned int mask[TEGRA_XBAR_UPDATE_MAX_REG];
	unsigned int reg_count;
	unsigned int num_dais;
	unsigned int xbar_part_size;
};

struct tegra_ahub {
	const struct tegra_ahub_soc_data *soc_data;
	struct regmap *regmap;
	struct clk *clk;
};

#endif