Lines Matching +full:tegra210 +full:- +full:adx

1 // SPDX-License-Identifier: GPL-2.0-only
2 // SPDX-FileCopyrightText: Copyright (c) 2021-2025 NVIDIA CORPORATION & AFFILIATES.
5 // tegra210_adx.c - Tegra210 ADX driver
35 static void tegra210_adx_write_map_ram(struct tegra210_adx *adx) in tegra210_adx_write_map_ram() argument
39 regmap_write(adx->regmap, TEGRA210_ADX_CFG_RAM_CTRL, in tegra210_adx_write_map_ram()
45 regmap_write(adx->regmap, TEGRA210_ADX_CFG_RAM_DATA, in tegra210_adx_write_map_ram()
46 adx->map[i]); in tegra210_adx_write_map_ram()
48 regmap_write(adx->regmap, TEGRA210_ADX_IN_BYTE_EN0, adx->byte_mask[0]); in tegra210_adx_write_map_ram()
49 regmap_write(adx->regmap, TEGRA210_ADX_IN_BYTE_EN1, adx->byte_mask[1]); in tegra210_adx_write_map_ram()
55 struct tegra210_adx *adx = snd_soc_dai_get_drvdata(dai); in tegra210_adx_startup() local
59 /* Ensure if ADX status is disabled */ in tegra210_adx_startup()
60 err = regmap_read_poll_timeout(adx->regmap, TEGRA210_ADX_STATUS, in tegra210_adx_startup()
63 dev_err(dai->dev, "failed to stop ADX, err = %d\n", err); in tegra210_adx_startup()
73 regmap_update_bits(adx->regmap, TEGRA210_ADX_SOFT_RESET, in tegra210_adx_startup()
77 err = regmap_read_poll_timeout(adx->regmap, TEGRA210_ADX_SOFT_RESET, in tegra210_adx_startup()
80 dev_err(dai->dev, "failed to reset ADX, err = %d\n", err); in tegra210_adx_startup()
89 struct tegra210_adx *adx = dev_get_drvdata(dev); in tegra210_adx_runtime_suspend() local
91 regcache_cache_only(adx->regmap, true); in tegra210_adx_runtime_suspend()
92 regcache_mark_dirty(adx->regmap); in tegra210_adx_runtime_suspend()
99 struct tegra210_adx *adx = dev_get_drvdata(dev); in tegra210_adx_runtime_resume() local
101 regcache_cache_only(adx->regmap, false); in tegra210_adx_runtime_resume()
102 regcache_sync(adx->regmap); in tegra210_adx_runtime_resume()
104 tegra210_adx_write_map_ram(adx); in tegra210_adx_runtime_resume()
114 struct tegra210_adx *adx = snd_soc_dai_get_drvdata(dai); in tegra210_adx_set_audio_cif() local
121 return -EINVAL; in tegra210_adx_set_audio_cif()
135 return -EINVAL; in tegra210_adx_set_audio_cif()
143 tegra_set_cif(adx->regmap, reg, &cif_conf); in tegra210_adx_set_audio_cif()
154 TEGRA210_ADX_TX1_CIF_CTRL + ((dai->id - 1) * TEGRA210_ADX_AUDIOCIF_CH_STRIDE)); in tegra210_adx_out_hw_params()
170 struct tegra210_adx *adx = snd_soc_component_get_drvdata(cmpnt); in tegra210_adx_get_byte_map() local
172 unsigned char *bytes_map = (unsigned char *)&adx->map; in tegra210_adx_get_byte_map()
175 mc = (struct soc_mixer_control *)kcontrol->private_value; in tegra210_adx_get_byte_map()
176 enabled = adx->byte_mask[mc->reg / 32] & (1 << (mc->reg % 32)); in tegra210_adx_get_byte_map()
189 ucontrol->value.integer.value[0] = bytes_map[mc->reg]; in tegra210_adx_get_byte_map()
191 ucontrol->value.integer.value[0] = 256; in tegra210_adx_get_byte_map()
200 struct tegra210_adx *adx = snd_soc_component_get_drvdata(cmpnt); in tegra210_adx_put_byte_map() local
201 unsigned char *bytes_map = (unsigned char *)&adx->map; in tegra210_adx_put_byte_map()
202 int value = ucontrol->value.integer.value[0]; in tegra210_adx_put_byte_map()
204 (struct soc_mixer_control *)kcontrol->private_value; in tegra210_adx_put_byte_map()
205 unsigned int mask_val = adx->byte_mask[mc->reg / 32]; in tegra210_adx_put_byte_map()
208 mask_val |= (1 << (mc->reg % 32)); in tegra210_adx_put_byte_map()
210 mask_val &= ~(1 << (mc->reg % 32)); in tegra210_adx_put_byte_map()
212 if (mask_val == adx->byte_mask[mc->reg / 32]) in tegra210_adx_put_byte_map()
216 bytes_map[mc->reg] = value % 256; in tegra210_adx_put_byte_map()
217 adx->byte_mask[mc->reg / 32] = mask_val; in tegra210_adx_put_byte_map()
233 .name = "ADX-RX-CIF", \
235 .stream_name = "RX-CIF-Playback", \
245 .stream_name = "RX-CIF-Capture", \
259 .name = "ADX-TX" #id "-CIF", \
261 .stream_name = "TX" #id "-CIF-Playback",\
271 .stream_name = "TX" #id "-CIF-Capture", \
301 { "XBAR-" sname, NULL, "XBAR-TX" }, \
302 { "RX-CIF-" sname, NULL, "XBAR-" sname }, \
303 { "RX", NULL, "RX-CIF-" sname }, \
305 { "TX" #id "-CIF-" sname, NULL, "TX" #id }, \
306 { "TX" #id " XBAR-" sname, NULL, "TX" #id "-CIF-" sname }, \
307 { "TX" #id " XBAR-RX", NULL, "TX" #id " XBAR-" sname }
314 { "XBAR-" sname, NULL, "XBAR-TX" }, \
315 { "RX-CIF-" sname, NULL, "XBAR-" sname }, \
316 { "RX", NULL, "RX-CIF-" sname }, \
318 { "TX" #id "-CIF-" sname, NULL, "TX" #id }, \
319 { "TX" #id " XBAR-" sname, NULL, "TX" #id "-CIF-" sname }, \
320 { "TX" #id " XBAR-RX", NULL, "TX" #id " XBAR-" sname }
477 { .compatible = "nvidia,tegra210-adx" },
484 struct device *dev = &pdev->dev; in tegra210_adx_platform_probe()
485 struct tegra210_adx *adx; in tegra210_adx_platform_probe() local
489 adx = devm_kzalloc(dev, sizeof(*adx), GFP_KERNEL); in tegra210_adx_platform_probe()
490 if (!adx) in tegra210_adx_platform_probe()
491 return -ENOMEM; in tegra210_adx_platform_probe()
493 dev_set_drvdata(dev, adx); in tegra210_adx_platform_probe()
499 adx->regmap = devm_regmap_init_mmio(dev, regs, in tegra210_adx_platform_probe()
501 if (IS_ERR(adx->regmap)) { in tegra210_adx_platform_probe()
503 return PTR_ERR(adx->regmap); in tegra210_adx_platform_probe()
506 regcache_cache_only(adx->regmap, true); in tegra210_adx_platform_probe()
512 dev_err(dev, "can't register ADX component, err: %d\n", err); in tegra210_adx_platform_probe()
523 pm_runtime_disable(&pdev->dev); in tegra210_adx_platform_remove()
535 .name = "tegra210-adx",
545 MODULE_DESCRIPTION("Tegra210 ADX ASoC driver");