Lines Matching +full:tegra210 +full:- +full:ahub

1 // SPDX-License-Identifier: GPL-2.0-only
2 // SPDX-FileCopyrightText: Copyright (c) 2021-2025 NVIDIA CORPORATION & AFFILIATES.
5 // tegra210_amx.c - Tegra210 AMX driver
24 * The counter is in terms of AHUB clock cycles. If a frame is not
27 * function of sample rate (8 kHz) and AHUB clock (49.152 MHz).
65 regmap_write(amx->regmap, TEGRA210_AMX_CFG_RAM_CTRL + amx->soc_data->reg_offset, in tegra210_amx_write_map_ram()
70 for (i = 0; i < amx->soc_data->ram_depth; i++) in tegra210_amx_write_map_ram()
71 regmap_write(amx->regmap, TEGRA210_AMX_CFG_RAM_DATA + amx->soc_data->reg_offset, in tegra210_amx_write_map_ram()
72 amx->map[i]); in tegra210_amx_write_map_ram()
74 for (i = 0; i < amx->soc_data->byte_mask_size; i++) in tegra210_amx_write_map_ram()
75 regmap_write(amx->regmap, in tegra210_amx_write_map_ram()
77 amx->byte_mask[i]); in tegra210_amx_write_map_ram()
88 err = regmap_read_poll_timeout(amx->regmap, TEGRA210_AMX_STATUS, val, in tegra210_amx_startup()
91 dev_err(dai->dev, "failed to stop AMX, err = %d\n", err); in tegra210_amx_startup()
101 regmap_update_bits(amx->regmap, TEGRA210_AMX_SOFT_RESET, in tegra210_amx_startup()
105 err = regmap_read_poll_timeout(amx->regmap, TEGRA210_AMX_SOFT_RESET, in tegra210_amx_startup()
108 dev_err(dai->dev, "failed to reset AMX, err = %d\n", err); in tegra210_amx_startup()
119 regcache_cache_only(amx->regmap, true); in tegra210_amx_runtime_suspend()
120 regcache_mark_dirty(amx->regmap); in tegra210_amx_runtime_suspend()
129 regcache_cache_only(amx->regmap, false); in tegra210_amx_runtime_resume()
130 regcache_sync(amx->regmap); in tegra210_amx_runtime_resume()
132 regmap_update_bits(amx->regmap, in tegra210_amx_runtime_resume()
166 return -EINVAL; in tegra210_amx_set_audio_cif()
174 if (amx->soc_data->max_ch == TEGRA264_AMX_MAX_CHANNEL) in tegra210_amx_set_audio_cif()
175 tegra264_set_cif(amx->regmap, reg, &cif_conf); in tegra210_amx_set_audio_cif()
177 tegra_set_cif(amx->regmap, reg, &cif_conf); in tegra210_amx_set_audio_cif()
188 if (amx->soc_data->auto_disable) { in tegra210_amx_in_hw_params()
189 regmap_write(amx->regmap, in tegra210_amx_in_hw_params()
190 AMX_CH_REG(dai->id, TEGRA194_AMX_RX1_FRAME_PERIOD + in tegra210_amx_in_hw_params()
191 amx->soc_data->reg_offset), in tegra210_amx_in_hw_params()
193 regmap_write(amx->regmap, TEGRA210_AMX_CYA + amx->soc_data->reg_offset, 1); in tegra210_amx_in_hw_params()
197 AMX_CH_REG(dai->id, TEGRA210_AMX_RX1_CIF_CTRL)); in tegra210_amx_in_hw_params()
213 (struct soc_mixer_control *)kcontrol->private_value; in tegra210_amx_get_byte_map()
215 unsigned char *bytes_map = (unsigned char *)amx->map; in tegra210_amx_get_byte_map()
216 int reg = mc->reg; in tegra210_amx_get_byte_map()
219 enabled = amx->byte_mask[reg / 32] & (1 << (reg % 32)); in tegra210_amx_get_byte_map()
232 ucontrol->value.integer.value[0] = bytes_map[reg]; in tegra210_amx_get_byte_map()
234 ucontrol->value.integer.value[0] = 256; in tegra210_amx_get_byte_map()
243 (struct soc_mixer_control *)kcontrol->private_value; in tegra210_amx_put_byte_map()
246 unsigned char *bytes_map = (unsigned char *)amx->map; in tegra210_amx_put_byte_map()
247 int reg = mc->reg; in tegra210_amx_put_byte_map()
248 int value = ucontrol->value.integer.value[0]; in tegra210_amx_put_byte_map()
249 unsigned int mask_val = amx->byte_mask[reg / 32]; in tegra210_amx_put_byte_map()
256 if (mask_val == amx->byte_mask[reg / 32]) in tegra210_amx_put_byte_map()
261 amx->byte_mask[reg / 32] = mask_val; in tegra210_amx_put_byte_map()
277 .name = "AMX-RX-CIF" #id, \
279 .stream_name = "RX" #id "-CIF-Playback",\
289 .stream_name = "RX" #id "-CIF-Capture", \
303 .name = "AMX-TX-CIF", \
305 .stream_name = "TX-CIF-Playback", \
315 .stream_name = "TX-CIF-Capture", \
345 { "RX" #id " XBAR-" sname, NULL, "RX" #id " XBAR-TX" }, \
346 { "RX" #id "-CIF-" sname, NULL, "RX" #id " XBAR-" sname },\
347 { "RX" #id, NULL, "RX" #id "-CIF-" sname }, \
349 { "TX-CIF-" sname, NULL, "TX" }, \
350 { "XBAR-" sname, NULL, "TX-CIF-" sname }, \
351 { "XBAR-RX", NULL, "XBAR-" sname }
508 if (amx->soc_data->num_controls) { in tegra210_amx_component_probe()
509 err = snd_soc_add_component_controls(component, amx->soc_data->controls, in tegra210_amx_component_probe()
510 amx->soc_data->num_controls); in tegra210_amx_component_probe()
512 dev_err(component->dev, "can't add AMX controls, err: %d\n", err); in tegra210_amx_component_probe()
715 { .compatible = "nvidia,tegra210-amx", .data = &soc_data_tegra210 },
716 { .compatible = "nvidia,tegra194-amx", .data = &soc_data_tegra194 },
717 { .compatible = "nvidia,tegra264-amx", .data = &soc_data_tegra264 },
724 struct device *dev = &pdev->dev; in tegra210_amx_platform_probe()
731 return -ENOMEM; in tegra210_amx_platform_probe()
733 amx->soc_data = device_get_match_data(dev); in tegra210_amx_platform_probe()
741 amx->regmap = devm_regmap_init_mmio(dev, regs, in tegra210_amx_platform_probe()
742 amx->soc_data->regmap_conf); in tegra210_amx_platform_probe()
743 if (IS_ERR(amx->regmap)) { in tegra210_amx_platform_probe()
745 return PTR_ERR(amx->regmap); in tegra210_amx_platform_probe()
748 regcache_cache_only(amx->regmap, true); in tegra210_amx_platform_probe()
750 amx->map = devm_kzalloc(dev, amx->soc_data->ram_depth * sizeof(*amx->map), in tegra210_amx_platform_probe()
752 if (!amx->map) in tegra210_amx_platform_probe()
753 return -ENOMEM; in tegra210_amx_platform_probe()
755 amx->byte_mask = devm_kzalloc(dev, in tegra210_amx_platform_probe()
756 amx->soc_data->byte_mask_size * sizeof(*amx->byte_mask), in tegra210_amx_platform_probe()
758 if (!amx->byte_mask) in tegra210_amx_platform_probe()
759 return -ENOMEM; in tegra210_amx_platform_probe()
762 amx->soc_data->max_ch; in tegra210_amx_platform_probe()
779 pm_runtime_disable(&pdev->dev); in tegra210_amx_platform_remove()
790 .name = "tegra210-amx",
800 MODULE_DESCRIPTION("Tegra210 AMX ASoC driver");