Lines Matching +full:tegra210 +full:- +full:ahub
1 // SPDX-License-Identifier: GPL-2.0-only
3 // tegra210_amx.c - Tegra210 AMX driver
5 // Copyright (c) 2021-2023 NVIDIA CORPORATION. All rights reserved.
25 * The counter is in terms of AHUB clock cycles. If a frame is not
28 * function of sample rate (8 kHz) and AHUB clock (49.152 MHz).
54 regmap_write(amx->regmap, TEGRA210_AMX_CFG_RAM_CTRL, in tegra210_amx_write_map_ram()
60 regmap_write(amx->regmap, TEGRA210_AMX_CFG_RAM_DATA, in tegra210_amx_write_map_ram()
61 amx->map[i]); in tegra210_amx_write_map_ram()
63 regmap_write(amx->regmap, TEGRA210_AMX_OUT_BYTE_EN0, amx->byte_mask[0]); in tegra210_amx_write_map_ram()
64 regmap_write(amx->regmap, TEGRA210_AMX_OUT_BYTE_EN1, amx->byte_mask[1]); in tegra210_amx_write_map_ram()
75 err = regmap_read_poll_timeout(amx->regmap, TEGRA210_AMX_STATUS, val, in tegra210_amx_startup()
78 dev_err(dai->dev, "failed to stop AMX, err = %d\n", err); in tegra210_amx_startup()
88 regmap_update_bits(amx->regmap, TEGRA210_AMX_SOFT_RESET, in tegra210_amx_startup()
92 err = regmap_read_poll_timeout(amx->regmap, TEGRA210_AMX_SOFT_RESET, in tegra210_amx_startup()
95 dev_err(dai->dev, "failed to reset AMX, err = %d\n", err); in tegra210_amx_startup()
106 regcache_cache_only(amx->regmap, true); in tegra210_amx_runtime_suspend()
107 regcache_mark_dirty(amx->regmap); in tegra210_amx_runtime_suspend()
116 regcache_cache_only(amx->regmap, false); in tegra210_amx_runtime_resume()
117 regcache_sync(amx->regmap); in tegra210_amx_runtime_resume()
119 regmap_update_bits(amx->regmap, in tegra210_amx_runtime_resume()
152 return -EINVAL; in tegra210_amx_set_audio_cif()
160 tegra_set_cif(amx->regmap, reg, &cif_conf); in tegra210_amx_set_audio_cif()
171 if (amx->soc_data->auto_disable) { in tegra210_amx_in_hw_params()
172 regmap_write(amx->regmap, in tegra210_amx_in_hw_params()
173 AMX_CH_REG(dai->id, TEGRA194_AMX_RX1_FRAME_PERIOD), in tegra210_amx_in_hw_params()
175 regmap_write(amx->regmap, TEGRA210_AMX_CYA, 1); in tegra210_amx_in_hw_params()
179 AMX_CH_REG(dai->id, TEGRA210_AMX_RX1_CIF_CTRL)); in tegra210_amx_in_hw_params()
195 (struct soc_mixer_control *)kcontrol->private_value; in tegra210_amx_get_byte_map()
197 unsigned char *bytes_map = (unsigned char *)&amx->map; in tegra210_amx_get_byte_map()
198 int reg = mc->reg; in tegra210_amx_get_byte_map()
202 enabled = amx->byte_mask[1] & (1 << (reg - 32)); in tegra210_amx_get_byte_map()
204 enabled = amx->byte_mask[0] & (1 << reg); in tegra210_amx_get_byte_map()
217 ucontrol->value.integer.value[0] = bytes_map[reg]; in tegra210_amx_get_byte_map()
219 ucontrol->value.integer.value[0] = 256; in tegra210_amx_get_byte_map()
228 (struct soc_mixer_control *)kcontrol->private_value; in tegra210_amx_put_byte_map()
231 unsigned char *bytes_map = (unsigned char *)&amx->map; in tegra210_amx_put_byte_map()
232 int reg = mc->reg; in tegra210_amx_put_byte_map()
233 int value = ucontrol->value.integer.value[0]; in tegra210_amx_put_byte_map()
234 unsigned int mask_val = amx->byte_mask[reg / 32]; in tegra210_amx_put_byte_map()
241 if (mask_val == amx->byte_mask[reg / 32]) in tegra210_amx_put_byte_map()
246 amx->byte_mask[reg / 32] = mask_val; in tegra210_amx_put_byte_map()
262 .name = "AMX-RX-CIF" #id, \
264 .stream_name = "RX" #id "-CIF-Playback",\
273 .stream_name = "RX" #id "-CIF-Capture", \
286 .name = "AMX-TX-CIF", \
288 .stream_name = "TX-CIF-Playback", \
297 .stream_name = "TX-CIF-Capture", \
326 { "RX" #id " XBAR-" sname, NULL, "RX" #id " XBAR-TX" }, \
327 { "RX" #id "-CIF-" sname, NULL, "RX" #id " XBAR-" sname },\
328 { "RX" #id, NULL, "RX" #id "-CIF-" sname }, \
330 { "TX-CIF-" sname, NULL, "TX" }, \
331 { "XBAR-" sname, NULL, "TX-CIF-" sname }, \
332 { "XBAR-RX", NULL, "XBAR-" sname }
527 { .compatible = "nvidia,tegra210-amx", .data = &soc_data_tegra210 },
528 { .compatible = "nvidia,tegra194-amx", .data = &soc_data_tegra194 },
535 struct device *dev = &pdev->dev; in tegra210_amx_platform_probe()
544 soc_data = (struct tegra210_amx_soc_data *)match->data; in tegra210_amx_platform_probe()
548 return -ENOMEM; in tegra210_amx_platform_probe()
550 amx->soc_data = soc_data; in tegra210_amx_platform_probe()
558 amx->regmap = devm_regmap_init_mmio(dev, regs, in tegra210_amx_platform_probe()
559 soc_data->regmap_conf); in tegra210_amx_platform_probe()
560 if (IS_ERR(amx->regmap)) { in tegra210_amx_platform_probe()
562 return PTR_ERR(amx->regmap); in tegra210_amx_platform_probe()
565 regcache_cache_only(amx->regmap, true); in tegra210_amx_platform_probe()
582 pm_runtime_disable(&pdev->dev); in tegra210_amx_platform_remove()
594 .name = "tegra210-amx",
604 MODULE_DESCRIPTION("Tegra210 AMX ASoC driver");