diff --git a/sound/soc/tegra-alt/include/tegra210_amx_alt.h b/sound/soc/tegra-alt/include/tegra210_amx_alt.h index ecf3fbd5..0e347342 100644 --- a/sound/soc/tegra-alt/include/tegra210_amx_alt.h +++ b/sound/soc/tegra-alt/include/tegra210_amx_alt.h @@ -50,6 +50,10 @@ #define TEGRA210_AMX_AHUBRAMCTL_AMX_CTRL 0xb8 #define TEGRA210_AMX_AHUBRAMCTL_AMX_DATA 0xbc #define TEGRA194_AMX_RX1_CTRL_FRAME_PERIOD 0xc0 +#define TEGRA194_AMX_RX2_CTRL_FRAME_PERIOD 0xc4 +#define TEGRA194_AMX_RX3_CTRL_FRAME_PERIOD 0xc8 +#define TEGRA194_AMX_RX4_CTRL_FRAME_PERIOD 0xcc +#define TEGRA194_AMX_RX4_LAST_FRAME_PERIOD 0xdc /* Fields in TEGRA210_AMX_AXBAR_RX1_CIF_CTRL */ /* Uses field from TEGRA210_AUDIOCIF_CTRL_* in tegra210_xbar_alt.h */ @@ -179,6 +183,7 @@ struct tegra210_amx_soc_data { unsigned int reg, struct tegra210_xbar_cif_conf *conf); bool is_auto_disable_supported; + const struct regmap_config *regmap_conf; }; struct tegra210_amx { diff --git a/sound/soc/tegra-alt/tegra210_amx_alt.c b/sound/soc/tegra-alt/tegra210_amx_alt.c index 88af7941..e63eeadd 100644 --- a/sound/soc/tegra-alt/tegra210_amx_alt.c +++ b/sound/soc/tegra-alt/tegra210_amx_alt.c @@ -382,11 +382,13 @@ static int tegra210_amx_in_hw_params(struct snd_pcm_substream *substream, * sample_rate = 8000 * ahub_clk_rate = 49152000 */ - if (amx->soc_data->is_auto_disable_supported) + if (amx->soc_data->is_auto_disable_supported) { regmap_write(amx->regmap, TEGRA194_AMX_RX1_CTRL_FRAME_PERIOD + (dai->id * TEGRA210_AMX_AUDIOCIF_CH_STRIDE), 0x1800); + regmap_write(amx->regmap, TEGRA210_AMX_CYA, 1); + } ret = tegra210_amx_set_audio_cif(dai, params, TEGRA210_AMX_AXBAR_RX1_CIF_CTRL + @@ -784,6 +786,10 @@ static bool tegra210_amx_wr_reg(struct device *dev, case TEGRA210_AMX_CYA: case TEGRA210_AMX_AHUBRAMCTL_AMX_CTRL: case TEGRA210_AMX_AHUBRAMCTL_AMX_DATA: + case TEGRA194_AMX_RX1_CTRL_FRAME_PERIOD: + case TEGRA194_AMX_RX2_CTRL_FRAME_PERIOD: + case TEGRA194_AMX_RX3_CTRL_FRAME_PERIOD: + case TEGRA194_AMX_RX4_CTRL_FRAME_PERIOD: return true; default: return false; @@ -821,6 +827,10 @@ static bool tegra210_amx_rd_reg(struct device *dev, case TEGRA210_AMX_DBG: case TEGRA210_AMX_AHUBRAMCTL_AMX_CTRL: case TEGRA210_AMX_AHUBRAMCTL_AMX_DATA: + case TEGRA194_AMX_RX1_CTRL_FRAME_PERIOD: + case TEGRA194_AMX_RX2_CTRL_FRAME_PERIOD: + case TEGRA194_AMX_RX3_CTRL_FRAME_PERIOD: + case TEGRA194_AMX_RX4_CTRL_FRAME_PERIOD: return true; default: return false; @@ -863,13 +873,28 @@ static const struct regmap_config tegra210_amx_regmap_config = { .cache_type = REGCACHE_FLAT, }; +static const struct regmap_config tegra194_amx_regmap_config = { + .reg_bits = 32, + .reg_stride = 4, + .val_bits = 32, + .max_register = TEGRA194_AMX_RX4_LAST_FRAME_PERIOD, + .writeable_reg = tegra210_amx_wr_reg, + .readable_reg = tegra210_amx_rd_reg, + .volatile_reg = tegra210_amx_volatile_reg, + .reg_defaults = tegra210_amx_reg_defaults, + .num_reg_defaults = ARRAY_SIZE(tegra210_amx_reg_defaults), + .cache_type = REGCACHE_FLAT, +}; + static const struct tegra210_amx_soc_data soc_data_tegra210 = { .set_audio_cif = tegra210_xbar_set_cif, + .regmap_conf = &tegra210_amx_regmap_config, .is_auto_disable_supported = false, }; static const struct tegra210_amx_soc_data soc_data_tegra194 = { .set_audio_cif = tegra210_xbar_set_cif, + .regmap_conf = &tegra194_amx_regmap_config, .is_auto_disable_supported = true, }; @@ -931,7 +956,7 @@ static int tegra210_amx_platform_probe(struct platform_device *pdev) } amx->regmap = devm_regmap_init_mmio(&pdev->dev, regs, - &tegra210_amx_regmap_config); + soc_data->regmap_conf); if (IS_ERR(amx->regmap)) { dev_err(&pdev->dev, "regmap init failed\n"); ret = PTR_ERR(amx->regmap);