xref: /openbmc/linux/sound/soc/tegra/tegra210_mvc.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1e539891fSSameer Pujar /* SPDX-License-Identifier: GPL-2.0-only */
2e539891fSSameer Pujar /*
3e539891fSSameer Pujar  * tegra210_mvc.h - Definitions for Tegra210 MVC driver
4e539891fSSameer Pujar  *
5e539891fSSameer Pujar  * Copyright (c) 2021 NVIDIA CORPORATION.  All rights reserved.
6e539891fSSameer Pujar  *
7e539891fSSameer Pujar  */
8e539891fSSameer Pujar 
9e539891fSSameer Pujar #ifndef __TEGRA210_MVC_H__
10e539891fSSameer Pujar #define __TEGRA210_MVC_H__
11e539891fSSameer Pujar 
12e539891fSSameer Pujar /*
13e539891fSSameer Pujar  * MVC_RX registers are with respect to XBAR.
14e539891fSSameer Pujar  * The data comes from XBAR to MVC.
15e539891fSSameer Pujar  */
16e539891fSSameer Pujar #define TEGRA210_MVC_RX_STATUS			0x0c
17e539891fSSameer Pujar #define TEGRA210_MVC_RX_INT_STATUS		0x10
18e539891fSSameer Pujar #define TEGRA210_MVC_RX_INT_MASK		0x14
19e539891fSSameer Pujar #define TEGRA210_MVC_RX_INT_SET			0x18
20e539891fSSameer Pujar #define TEGRA210_MVC_RX_INT_CLEAR		0x1c
21e539891fSSameer Pujar #define TEGRA210_MVC_RX_CIF_CTRL		0x20
22e539891fSSameer Pujar 
23e539891fSSameer Pujar /*
24e539891fSSameer Pujar  * MVC_TX registers are with respect to XBAR.
25e539891fSSameer Pujar  * The data goes out of MVC.
26e539891fSSameer Pujar  */
27e539891fSSameer Pujar #define TEGRA210_MVC_TX_STATUS			0x4c
28e539891fSSameer Pujar #define TEGRA210_MVC_TX_INT_STATUS		0x50
29e539891fSSameer Pujar #define TEGRA210_MVC_TX_INT_MASK		0x54
30e539891fSSameer Pujar #define TEGRA210_MVC_TX_INT_SET			0x58
31e539891fSSameer Pujar #define TEGRA210_MVC_TX_INT_CLEAR		0x5c
32e539891fSSameer Pujar #define TEGRA210_MVC_TX_CIF_CTRL		0x60
33e539891fSSameer Pujar 
34e539891fSSameer Pujar /* Register offsets from TEGRA210_MVC*_BASE */
35e539891fSSameer Pujar #define TEGRA210_MVC_ENABLE			0x80
36e539891fSSameer Pujar #define TEGRA210_MVC_SOFT_RESET			0x84
37e539891fSSameer Pujar #define TEGRA210_MVC_CG				0x88
38e539891fSSameer Pujar #define TEGRA210_MVC_STATUS			0x90
39e539891fSSameer Pujar #define TEGRA210_MVC_INT_STATUS			0x94
40e539891fSSameer Pujar #define TEGRA210_MVC_CTRL			0xa8
41e539891fSSameer Pujar #define TEGRA210_MVC_SWITCH			0xac
42e539891fSSameer Pujar #define TEGRA210_MVC_INIT_VOL			0xb0
43e539891fSSameer Pujar #define TEGRA210_MVC_TARGET_VOL			0xd0
44e539891fSSameer Pujar #define TEGRA210_MVC_DURATION			0xf0
45e539891fSSameer Pujar #define TEGRA210_MVC_DURATION_INV		0xf4
46e539891fSSameer Pujar #define TEGRA210_MVC_POLY_N1			0xf8
47e539891fSSameer Pujar #define TEGRA210_MVC_POLY_N2			0xfc
48e539891fSSameer Pujar #define TEGRA210_MVC_PEAK_CTRL			0x100
49e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_CTRL		0x104
50e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_DATA		0x108
51e539891fSSameer Pujar #define TEGRA210_MVC_PEAK_VALUE			0x10c
52e539891fSSameer Pujar #define TEGRA210_MVC_CONFIG_ERR_TYPE		0x12c
53e539891fSSameer Pujar 
54e539891fSSameer Pujar /* Fields in TEGRA210_MVC_ENABLE */
55e539891fSSameer Pujar #define TEGRA210_MVC_EN_SHIFT			0
56e539891fSSameer Pujar #define TEGRA210_MVC_EN				(1 << TEGRA210_MVC_EN_SHIFT)
57e539891fSSameer Pujar 
58e539891fSSameer Pujar #define TEGRA210_MVC_MUTE_SHIFT			8
59e539891fSSameer Pujar #define TEGRA210_MUTE_MASK_EN			0xff
60e539891fSSameer Pujar #define TEGRA210_MVC_MUTE_MASK			(TEGRA210_MUTE_MASK_EN << TEGRA210_MVC_MUTE_SHIFT)
61e539891fSSameer Pujar #define TEGRA210_MVC_MUTE_EN			(TEGRA210_MUTE_MASK_EN << TEGRA210_MVC_MUTE_SHIFT)
62*0d242698SSameer Pujar #define TEGRA210_MVC_CH0_MUTE_EN		1
63e539891fSSameer Pujar 
64e539891fSSameer Pujar #define TEGRA210_MVC_PER_CHAN_CTRL_EN_SHIFT	30
65e539891fSSameer Pujar #define TEGRA210_MVC_PER_CHAN_CTRL_EN_MASK	(1 << TEGRA210_MVC_PER_CHAN_CTRL_EN_SHIFT)
66e539891fSSameer Pujar #define TEGRA210_MVC_PER_CHAN_CTRL_EN		(1 << TEGRA210_MVC_PER_CHAN_CTRL_EN_SHIFT)
67e539891fSSameer Pujar 
68e539891fSSameer Pujar #define TEGRA210_MVC_CURVE_TYPE_SHIFT		1
69e539891fSSameer Pujar #define TEGRA210_MVC_CURVE_TYPE_MASK		(1 << TEGRA210_MVC_CURVE_TYPE_SHIFT)
70e539891fSSameer Pujar 
71e539891fSSameer Pujar #define TEGRA210_MVC_VOLUME_SWITCH_SHIFT	2
72e539891fSSameer Pujar #define TEGRA210_MVC_VOLUME_SWITCH_MASK		(1 << TEGRA210_MVC_VOLUME_SWITCH_SHIFT)
73e539891fSSameer Pujar #define TEGRA210_MVC_VOLUME_SWITCH_TRIGGER	(1 << TEGRA210_MVC_VOLUME_SWITCH_SHIFT)
74e539891fSSameer Pujar #define TEGRA210_MVC_CTRL_DEFAULT	0x40000003
75e539891fSSameer Pujar 
76e539891fSSameer Pujar #define TEGRA210_MVC_INIT_VOL_DEFAULT_POLY	0x01000000
77e539891fSSameer Pujar #define TEGRA210_MVC_INIT_VOL_DEFAULT_LINEAR	0x00000000
78e539891fSSameer Pujar 
79e539891fSSameer Pujar /* Fields in TEGRA210_MVC ram ctrl */
80e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_CTRL_RW_SHIFT		14
81e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_CTRL_RW_WRITE		(1 << TEGRA210_MVC_CFG_RAM_CTRL_RW_SHIFT)
82e539891fSSameer Pujar 
83e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_CTRL_ADDR_INIT_EN_SHIFT	13
84e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_CTRL_ADDR_INIT_EN		(1 << TEGRA210_MVC_CFG_RAM_CTRL_ADDR_INIT_EN_SHIFT)
85e539891fSSameer Pujar 
86e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_CTRL_SEQ_ACCESS_EN_SHIFT	12
87e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_CTRL_SEQ_ACCESS_EN		(1 << TEGRA210_MVC_CFG_RAM_CTRL_SEQ_ACCESS_EN_SHIFT)
88e539891fSSameer Pujar 
89e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_CTRL_ADDR_SHIFT		0
90e539891fSSameer Pujar #define TEGRA210_MVC_CFG_RAM_CTRL_ADDR_MASK		(0x1ff << TEGRA210_MVC_CFG_RAM_CTRL_ADDR_SHIFT)
91e539891fSSameer Pujar 
92e539891fSSameer Pujar #define REG_SIZE 4
93e539891fSSameer Pujar #define TEGRA210_MVC_MAX_CHAN_COUNT 8
94e539891fSSameer Pujar #define TEGRA210_MVC_REG_OFFSET(reg, i) (reg + (REG_SIZE * i))
95e539891fSSameer Pujar 
96*0d242698SSameer Pujar #define TEGRA210_MVC_GET_CHAN(reg, base) (((reg) - (base)) / REG_SIZE)
97*0d242698SSameer Pujar 
98*0d242698SSameer Pujar #define TEGRA210_GET_MUTE_VAL(val) (((val) >> TEGRA210_MVC_MUTE_SHIFT) & TEGRA210_MUTE_MASK_EN)
99*0d242698SSameer Pujar 
100e539891fSSameer Pujar #define NUM_GAIN_POLY_COEFFS 9
101e539891fSSameer Pujar 
102e539891fSSameer Pujar enum {
103e539891fSSameer Pujar 	CURVE_POLY,
104e539891fSSameer Pujar 	CURVE_LINEAR,
105e539891fSSameer Pujar };
106e539891fSSameer Pujar 
107e539891fSSameer Pujar struct tegra210_mvc_gain_params {
108e539891fSSameer Pujar 	int poly_coeff[NUM_GAIN_POLY_COEFFS];
109e539891fSSameer Pujar 	int poly_n1;
110e539891fSSameer Pujar 	int poly_n2;
111e539891fSSameer Pujar 	int duration;
112e539891fSSameer Pujar 	int duration_inv;
113e539891fSSameer Pujar };
114e539891fSSameer Pujar 
115e539891fSSameer Pujar struct tegra210_mvc {
116e539891fSSameer Pujar 	int volume[TEGRA210_MVC_MAX_CHAN_COUNT];
117e539891fSSameer Pujar 	unsigned int curve_type;
118e539891fSSameer Pujar 	unsigned int ctrl_value;
119e539891fSSameer Pujar 	struct regmap *regmap;
120e539891fSSameer Pujar };
121e539891fSSameer Pujar 
122e539891fSSameer Pujar #endif
123