forked from Minki/linux
a99ab6f395
The Audio Demultiplexer (ADX) block takes an input stream with up to 16 channels and demultiplexes it into four output streams of up to 16 channels each. A byte RAM helps to form output frames by any combination of bytes from the input frame. Its design is identical to that of byte RAM in the AMX except that the data flow direction is reversed. This patch registers ADX driver with ASoC framework. The component driver exposes DAPM widgets, routes and kcontrols for the device. The DAI driver exposes ADX interfaces, which can be used to connect different components in the ASoC layer. Makefile and Kconfig support is added to allow build the driver. It can be enabled in the DT via "nvidia,tegra210-adx" compatible binding. Signed-off-by: Sameer Pujar <spujar@nvidia.com> Link: https://lore.kernel.org/r/1631551342-25469-10-git-send-email-spujar@nvidia.com Signed-off-by: Mark Brown <broonie@kernel.org>
73 lines
2.5 KiB
C
73 lines
2.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* tegra210_adx.h - Definitions for Tegra210 ADX driver
|
|
*
|
|
* Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
*/
|
|
|
|
#ifndef __TEGRA210_ADX_H__
|
|
#define __TEGRA210_ADX_H__
|
|
|
|
/* Register offsets from TEGRA210_ADX*_BASE */
|
|
#define TEGRA210_ADX_RX_STATUS 0x0c
|
|
#define TEGRA210_ADX_RX_INT_STATUS 0x10
|
|
#define TEGRA210_ADX_RX_INT_MASK 0x14
|
|
#define TEGRA210_ADX_RX_INT_SET 0x18
|
|
#define TEGRA210_ADX_RX_INT_CLEAR 0x1c
|
|
#define TEGRA210_ADX_RX_CIF_CTRL 0x20
|
|
#define TEGRA210_ADX_TX_STATUS 0x4c
|
|
#define TEGRA210_ADX_TX_INT_STATUS 0x50
|
|
#define TEGRA210_ADX_TX_INT_MASK 0x54
|
|
#define TEGRA210_ADX_TX_INT_SET 0x58
|
|
#define TEGRA210_ADX_TX_INT_CLEAR 0x5c
|
|
#define TEGRA210_ADX_TX1_CIF_CTRL 0x60
|
|
#define TEGRA210_ADX_TX2_CIF_CTRL 0x64
|
|
#define TEGRA210_ADX_TX3_CIF_CTRL 0x68
|
|
#define TEGRA210_ADX_TX4_CIF_CTRL 0x6c
|
|
#define TEGRA210_ADX_ENABLE 0x80
|
|
#define TEGRA210_ADX_SOFT_RESET 0x84
|
|
#define TEGRA210_ADX_CG 0x88
|
|
#define TEGRA210_ADX_STATUS 0x8c
|
|
#define TEGRA210_ADX_INT_STATUS 0x90
|
|
#define TEGRA210_ADX_CTRL 0xa4
|
|
#define TEGRA210_ADX_IN_BYTE_EN0 0xa8
|
|
#define TEGRA210_ADX_IN_BYTE_EN1 0xac
|
|
#define TEGRA210_ADX_CFG_RAM_CTRL 0xb8
|
|
#define TEGRA210_ADX_CFG_RAM_DATA 0xbc
|
|
|
|
/* Fields in TEGRA210_ADX_ENABLE */
|
|
#define TEGRA210_ADX_ENABLE_SHIFT 0
|
|
|
|
/* Fields in TEGRA210_ADX_CFG_RAM_CTRL */
|
|
#define TEGRA210_ADX_CFG_RAM_CTRL_RAM_ADDR_SHIFT 0
|
|
|
|
#define TEGRA210_ADX_CFG_RAM_CTRL_RW_SHIFT 14
|
|
#define TEGRA210_ADX_CFG_RAM_CTRL_RW_WRITE (1 << TEGRA210_ADX_CFG_RAM_CTRL_RW_SHIFT)
|
|
|
|
#define TEGRA210_ADX_CFG_RAM_CTRL_ADDR_INIT_EN_SHIFT 13
|
|
#define TEGRA210_ADX_CFG_RAM_CTRL_ADDR_INIT_EN (1 << TEGRA210_ADX_CFG_RAM_CTRL_ADDR_INIT_EN_SHIFT)
|
|
|
|
#define TEGRA210_ADX_CFG_RAM_CTRL_SEQ_ACCESS_EN_SHIFT 12
|
|
#define TEGRA210_ADX_CFG_RAM_CTRL_SEQ_ACCESS_EN (1 << TEGRA210_ADX_CFG_RAM_CTRL_SEQ_ACCESS_EN_SHIFT)
|
|
|
|
/* Fields in TEGRA210_ADX_SOFT_RESET */
|
|
#define TEGRA210_ADX_SOFT_RESET_SOFT_RESET_SHIFT 0
|
|
#define TEGRA210_ADX_SOFT_RESET_SOFT_RESET_MASK (1 << TEGRA210_ADX_SOFT_RESET_SOFT_RESET_SHIFT)
|
|
#define TEGRA210_ADX_SOFT_RESET_SOFT_EN (1 << TEGRA210_ADX_SOFT_RESET_SOFT_RESET_SHIFT)
|
|
#define TEGRA210_ADX_SOFT_RESET_SOFT_DEFAULT (0 << TEGRA210_ADX_SOFT_RESET_SOFT_RESET_SHIFT)
|
|
|
|
#define TEGRA210_ADX_AUDIOCIF_CH_STRIDE 4
|
|
#define TEGRA210_ADX_RAM_DEPTH 16
|
|
#define TEGRA210_ADX_MAP_STREAM_NUMBER_SHIFT 6
|
|
#define TEGRA210_ADX_MAP_WORD_NUMBER_SHIFT 2
|
|
#define TEGRA210_ADX_MAP_BYTE_NUMBER_SHIFT 0
|
|
|
|
struct tegra210_adx {
|
|
struct regmap *regmap;
|
|
unsigned int map[TEGRA210_ADX_RAM_DEPTH];
|
|
unsigned int byte_mask[2];
|
|
};
|
|
|
|
#endif
|