/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * tegra210_mixer.h - Definitions for Tegra210 MIXER driver
 *
 * Copyright (c) 2021, NVIDIA CORPORATION.  All rights reserved.
 *
 */

#ifndef __TEGRA210_MIXER_H__
#define __TEGRA210_MIXER_H__

/* XBAR_RX related MIXER offsets */
#define TEGRA210_MIXER_RX1_SOFT_RESET	0x04
#define TEGRA210_MIXER_RX1_STATUS	0x10
#define TEGRA210_MIXER_RX1_CIF_CTRL	0x24
#define TEGRA210_MIXER_RX1_CTRL		0x28
#define TEGRA210_MIXER_RX1_PEAK_CTRL	0x2c
#define TEGRA210_MIXER_RX1_SAMPLE_COUNT	0x30

/* XBAR_TX related MIXER offsets */
#define TEGRA210_MIXER_TX1_ENABLE	0x280
#define TEGRA210_MIXER_TX1_SOFT_RESET	0x284
#define TEGRA210_MIXER_TX1_STATUS	0x290
#define TEGRA210_MIXER_TX1_INT_STATUS	0x294
#define TEGRA210_MIXER_TX1_INT_MASK	0x298
#define TEGRA210_MIXER_TX1_INT_SET	0x29c
#define TEGRA210_MIXER_TX1_INT_CLEAR	0x2a0
#define TEGRA210_MIXER_TX1_CIF_CTRL	0x2a4
#define TEGRA210_MIXER_TX1_ADDER_CONFIG	0x2a8

/* MIXER related offsets */
#define TEGRA210_MIXER_ENABLE			0x400
#define TEGRA210_MIXER_SOFT_RESET		0x404
#define TEGRA210_MIXER_CG			0x408
#define TEGRA210_MIXER_STATUS			0x410
#define TEGRA210_MIXER_INT_STATUS		0x414
#define TEGRA210_MIXER_GAIN_CFG_RAM_CTRL	0x42c
#define TEGRA210_MIXER_GAIN_CFG_RAM_DATA	0x430
#define TEGRA210_MIXER_PEAKM_RAM_CTRL		0x434
#define TEGRA210_MIXER_PEAKM_RAM_DATA		0x438
#define TEGRA210_MIXER_CTRL			0x43c

#define TEGRA210_MIXER_TX2_ADDER_CONFIG	(TEGRA210_MIXER_TX1_ADDER_CONFIG + TEGRA210_MIXER_REG_STRIDE)
#define TEGRA210_MIXER_TX3_ADDER_CONFIG	(TEGRA210_MIXER_TX2_ADDER_CONFIG + TEGRA210_MIXER_REG_STRIDE)
#define TEGRA210_MIXER_TX4_ADDER_CONFIG	(TEGRA210_MIXER_TX3_ADDER_CONFIG + TEGRA210_MIXER_REG_STRIDE)
#define TEGRA210_MIXER_TX5_ADDER_CONFIG	(TEGRA210_MIXER_TX4_ADDER_CONFIG + TEGRA210_MIXER_REG_STRIDE)

#define TEGRA210_MIXER_TX2_ENABLE	(TEGRA210_MIXER_TX1_ENABLE + TEGRA210_MIXER_REG_STRIDE)
#define TEGRA210_MIXER_TX3_ENABLE	(TEGRA210_MIXER_TX2_ENABLE + TEGRA210_MIXER_REG_STRIDE)
#define TEGRA210_MIXER_TX4_ENABLE	(TEGRA210_MIXER_TX3_ENABLE + TEGRA210_MIXER_REG_STRIDE)
#define TEGRA210_MIXER_TX5_ENABLE	(TEGRA210_MIXER_TX4_ENABLE + TEGRA210_MIXER_REG_STRIDE)

/* Fields in TEGRA210_MIXER_ENABLE */
#define TEGRA210_MIXER_ENABLE_SHIFT	0
#define TEGRA210_MIXER_ENABLE_MASK	(1 << TEGRA210_MIXER_ENABLE_SHIFT)
#define TEGRA210_MIXER_EN		(1 << TEGRA210_MIXER_ENABLE_SHIFT)

/* Fields in TEGRA210_MIXER_GAIN_CFG_RAM_CTRL */
#define TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_0		0x0
#define TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_STRIDE		0x10

#define TEGRA210_MIXER_GAIN_CFG_RAM_RW_SHIFT		14
#define TEGRA210_MIXER_GAIN_CFG_RAM_RW_MASK		(1 << TEGRA210_MIXER_GAIN_CFG_RAM_RW_SHIFT)
#define TEGRA210_MIXER_GAIN_CFG_RAM_RW_WRITE		(1 << TEGRA210_MIXER_GAIN_CFG_RAM_RW_SHIFT)

#define TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_INIT_EN_SHIFT	13
#define TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_INIT_EN_MASK	(1 << TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_INIT_EN_SHIFT)
#define TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_INIT_EN	(1 << TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_INIT_EN_SHIFT)

#define TEGRA210_MIXER_GAIN_CFG_RAM_SEQ_ACCESS_EN_SHIFT	12
#define TEGRA210_MIXER_GAIN_CFG_RAM_SEQ_ACCESS_EN_MASK	(1 << TEGRA210_MIXER_GAIN_CFG_RAM_SEQ_ACCESS_EN_SHIFT)
#define TEGRA210_MIXER_GAIN_CFG_RAM_SEQ_ACCESS_EN	(1 << TEGRA210_MIXER_GAIN_CFG_RAM_SEQ_ACCESS_EN_SHIFT)

#define TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_SHIFT		0
#define TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_MASK		(0x1ff << TEGRA210_MIXER_GAIN_CFG_RAM_ADDR_SHIFT)

#define TEGRA210_MIXER_REG_STRIDE	0x40
#define TEGRA210_MIXER_RX_MAX		10
#define TEGRA210_MIXER_RX_LIMIT		(TEGRA210_MIXER_RX_MAX * TEGRA210_MIXER_REG_STRIDE)
#define TEGRA210_MIXER_TX_MAX		5
#define TEGRA210_MIXER_TX_LIMIT		(TEGRA210_MIXER_RX_LIMIT + (TEGRA210_MIXER_TX_MAX * TEGRA210_MIXER_REG_STRIDE))

#define REG_CFG_DONE_TRIGGER	0xf
#define VAL_CFG_DONE_TRIGGER	0x1

#define NUM_GAIN_POLY_COEFFS 9
#define NUM_DURATION_PARMS 4

struct tegra210_mixer_gain_params {
	int poly_coeff[NUM_GAIN_POLY_COEFFS];
	int gain_value;
	int duration[NUM_DURATION_PARMS];
};

struct tegra210_mixer {
	int gain_value[TEGRA210_MIXER_RX_MAX];
	struct regmap *regmap;
};

#endif