Lines Matching +full:tegra210 +full:- +full:ahub
1 // SPDX-License-Identifier: GPL-2.0-only
3 // tegra210_ahub.c - Tegra210 AHUB driver
5 // Copyright (c) 2020-2025, NVIDIA CORPORATION. All rights reserved.
21 struct tegra_ahub *ahub = snd_soc_component_get_drvdata(cmpnt); in tegra_ahub_get_value_enum() local
22 struct soc_enum *e = (struct soc_enum *)kctl->private_value; in tegra_ahub_get_value_enum()
29 for (i = 0; i < ahub->soc_data->reg_count; i++) { in tegra_ahub_get_value_enum()
32 reg = e->reg + (ahub->soc_data->xbar_part_size * i); in tegra_ahub_get_value_enum()
34 reg_val &= ahub->soc_data->mask[i]; in tegra_ahub_get_value_enum()
38 (8 * cmpnt->val_bytes * i); in tegra_ahub_get_value_enum()
44 for (i = 0; i < e->items; i++) { in tegra_ahub_get_value_enum()
45 if (bit_pos == e->values[i]) { in tegra_ahub_get_value_enum()
46 uctl->value.enumerated.item[0] = i; in tegra_ahub_get_value_enum()
58 struct tegra_ahub *ahub = snd_soc_component_get_drvdata(cmpnt); in tegra_ahub_put_value_enum() local
60 struct soc_enum *e = (struct soc_enum *)kctl->private_value; in tegra_ahub_put_value_enum()
62 unsigned int *item = uctl->value.enumerated.item; in tegra_ahub_put_value_enum()
63 unsigned int value = e->values[item[0]]; in tegra_ahub_put_value_enum()
67 if (item[0] >= e->items) in tegra_ahub_put_value_enum()
68 return -EINVAL; in tegra_ahub_put_value_enum()
72 reg_idx = (value - 1) / (8 * cmpnt->val_bytes); in tegra_ahub_put_value_enum()
73 bit_pos = (value - 1) % (8 * cmpnt->val_bytes); in tegra_ahub_put_value_enum()
82 for (i = 0; i < ahub->soc_data->reg_count; i++) { in tegra_ahub_put_value_enum()
83 update[i].reg = e->reg + (ahub->soc_data->xbar_part_size * i); in tegra_ahub_put_value_enum()
85 update[i].mask = ahub->soc_data->mask[i]; in tegra_ahub_put_value_enum()
111 /* XBAR <-> I2S <-> Codec */
117 /* XBAR <- DMIC <- Codec */
121 /* XBAR -> SFC -> XBAR */
130 /* XBAR -> MVC -> XBAR */
135 /* XBAR -> AMX(4:1) -> XBAR */
146 /* XBAR -> ADX(1:4) -> XBAR */
157 /* XBAR -> MIXER(10:5) -> XBAR */
173 /* XBAR -> OPE -> XBAR */
201 /* XBAR <-> I2S <-> Codec */
208 /* XBAR <- DMIC <- Codec */
213 /* XBAR -> DSPK -> Codec */
216 /* XBAR -> SFC -> XBAR */
225 /* XBAR -> MVC -> XBAR */
230 /* XBAR -> AMX(4:1) -> XBAR */
251 /* XBAR -> ADX(1:4) -> XBAR */
272 /* XBAR -> MIXER1(10:5) -> XBAR */
288 /* XBAR -> ASRC -> XBAR */
302 /* XBAR -> OPE -> XBAR */
340 /* XBAR <-> I2S <-> Codec */
349 /* XBAR <-> DMIC <-> Codec */
352 /* XBAR <-> DSPK <-> Codec */
354 /* XBAR -> SFC -> XBAR */
363 /* XBAR -> MVC -> XBAR */
368 /* XBAR -> AMX(4:1) -> XBAR */
399 /* XBAR -> ADX(1:4) -> XBAR */
430 /* XBAR -> MIXER1(10:5) -> XBAR */
446 /* XBAR -> ASRC -> XBAR */
460 /* XBAR -> OPE -> XBAR */
1595 { name " XBAR-TX", NULL, name " Mux" }, \
1596 { name " Mux", "ADMAIF1", "ADMAIF1 XBAR-RX" }, \
1597 { name " Mux", "ADMAIF2", "ADMAIF2 XBAR-RX" }, \
1598 { name " Mux", "ADMAIF3", "ADMAIF3 XBAR-RX" }, \
1599 { name " Mux", "ADMAIF4", "ADMAIF4 XBAR-RX" }, \
1600 { name " Mux", "ADMAIF5", "ADMAIF5 XBAR-RX" }, \
1601 { name " Mux", "ADMAIF6", "ADMAIF6 XBAR-RX" }, \
1602 { name " Mux", "ADMAIF7", "ADMAIF7 XBAR-RX" }, \
1603 { name " Mux", "ADMAIF8", "ADMAIF8 XBAR-RX" }, \
1604 { name " Mux", "ADMAIF9", "ADMAIF9 XBAR-RX" }, \
1605 { name " Mux", "ADMAIF10", "ADMAIF10 XBAR-RX" }, \
1606 { name " Mux", "I2S1", "I2S1 XBAR-RX" }, \
1607 { name " Mux", "I2S2", "I2S2 XBAR-RX" }, \
1608 { name " Mux", "I2S3", "I2S3 XBAR-RX" }, \
1609 { name " Mux", "I2S4", "I2S4 XBAR-RX" }, \
1610 { name " Mux", "I2S5", "I2S5 XBAR-RX" }, \
1611 { name " Mux", "DMIC1", "DMIC1 XBAR-RX" }, \
1612 { name " Mux", "DMIC2", "DMIC2 XBAR-RX" }, \
1613 { name " Mux", "SFC1", "SFC1 XBAR-RX" }, \
1614 { name " Mux", "SFC2", "SFC2 XBAR-RX" }, \
1615 { name " Mux", "SFC3", "SFC3 XBAR-RX" }, \
1616 { name " Mux", "SFC4", "SFC4 XBAR-RX" }, \
1617 { name " Mux", "MVC1", "MVC1 XBAR-RX" }, \
1618 { name " Mux", "MVC2", "MVC2 XBAR-RX" }, \
1619 { name " Mux", "AMX1", "AMX1 XBAR-RX" }, \
1620 { name " Mux", "AMX2", "AMX2 XBAR-RX" }, \
1621 { name " Mux", "ADX1 TX1", "ADX1 TX1 XBAR-RX" }, \
1622 { name " Mux", "ADX1 TX2", "ADX1 TX2 XBAR-RX" }, \
1623 { name " Mux", "ADX1 TX3", "ADX1 TX3 XBAR-RX" }, \
1624 { name " Mux", "ADX1 TX4", "ADX1 TX4 XBAR-RX" }, \
1625 { name " Mux", "ADX2 TX1", "ADX2 TX1 XBAR-RX" }, \
1626 { name " Mux", "ADX2 TX2", "ADX2 TX2 XBAR-RX" }, \
1627 { name " Mux", "ADX2 TX3", "ADX2 TX3 XBAR-RX" }, \
1628 { name " Mux", "ADX2 TX4", "ADX2 TX4 XBAR-RX" }, \
1629 { name " Mux", "MIXER1 TX1", "MIXER1 TX1 XBAR-RX" }, \
1630 { name " Mux", "MIXER1 TX2", "MIXER1 TX2 XBAR-RX" }, \
1631 { name " Mux", "MIXER1 TX3", "MIXER1 TX3 XBAR-RX" }, \
1632 { name " Mux", "MIXER1 TX4", "MIXER1 TX4 XBAR-RX" }, \
1633 { name " Mux", "MIXER1 TX5", "MIXER1 TX5 XBAR-RX" }, \
1634 { name " Mux", "OPE1", "OPE1 XBAR-RX" },
1637 { name " Mux", "DMIC3", "DMIC3 XBAR-RX" }, \
1638 { name " Mux", "OPE2", "OPE2 XBAR-RX" },
1641 { name " Mux", "ADMAIF11", "ADMAIF11 XBAR-RX" }, \
1642 { name " Mux", "ADMAIF12", "ADMAIF12 XBAR-RX" }, \
1643 { name " Mux", "ADMAIF13", "ADMAIF13 XBAR-RX" }, \
1644 { name " Mux", "ADMAIF14", "ADMAIF14 XBAR-RX" }, \
1645 { name " Mux", "ADMAIF15", "ADMAIF15 XBAR-RX" }, \
1646 { name " Mux", "ADMAIF16", "ADMAIF16 XBAR-RX" }, \
1647 { name " Mux", "ADMAIF17", "ADMAIF17 XBAR-RX" }, \
1648 { name " Mux", "ADMAIF18", "ADMAIF18 XBAR-RX" }, \
1649 { name " Mux", "ADMAIF19", "ADMAIF19 XBAR-RX" }, \
1650 { name " Mux", "ADMAIF20", "ADMAIF20 XBAR-RX" }, \
1651 { name " Mux", "I2S6", "I2S6 XBAR-RX" }, \
1652 { name " Mux", "DMIC3", "DMIC3 XBAR-RX" }, \
1653 { name " Mux", "DMIC4", "DMIC4 XBAR-RX" }, \
1654 { name " Mux", "AMX3", "AMX3 XBAR-RX" }, \
1655 { name " Mux", "AMX4", "AMX4 XBAR-RX" }, \
1656 { name " Mux", "ADX3 TX1", "ADX3 TX1 XBAR-RX" }, \
1657 { name " Mux", "ADX3 TX2", "ADX3 TX2 XBAR-RX" }, \
1658 { name " Mux", "ADX3 TX3", "ADX3 TX3 XBAR-RX" }, \
1659 { name " Mux", "ADX3 TX4", "ADX3 TX4 XBAR-RX" }, \
1660 { name " Mux", "ADX4 TX1", "ADX4 TX1 XBAR-RX" }, \
1661 { name " Mux", "ADX4 TX2", "ADX4 TX2 XBAR-RX" }, \
1662 { name " Mux", "ADX4 TX3", "ADX4 TX3 XBAR-RX" }, \
1663 { name " Mux", "ADX4 TX4", "ADX4 TX4 XBAR-RX" }, \
1664 { name " Mux", "ASRC1 TX1", "ASRC1 TX1 XBAR-RX" }, \
1665 { name " Mux", "ASRC1 TX2", "ASRC1 TX2 XBAR-RX" }, \
1666 { name " Mux", "ASRC1 TX3", "ASRC1 TX3 XBAR-RX" }, \
1667 { name " Mux", "ASRC1 TX4", "ASRC1 TX4 XBAR-RX" }, \
1668 { name " Mux", "ASRC1 TX5", "ASRC1 TX5 XBAR-RX" }, \
1669 { name " Mux", "ASRC1 TX6", "ASRC1 TX6 XBAR-RX" },
1672 { name " Mux", "ADMAIF11", "ADMAIF11 XBAR-RX" }, \
1673 { name " Mux", "ADMAIF12", "ADMAIF12 XBAR-RX" }, \
1674 { name " Mux", "ADMAIF13", "ADMAIF13 XBAR-RX" }, \
1675 { name " Mux", "ADMAIF14", "ADMAIF14 XBAR-RX" }, \
1676 { name " Mux", "ADMAIF15", "ADMAIF15 XBAR-RX" }, \
1677 { name " Mux", "ADMAIF16", "ADMAIF16 XBAR-RX" }, \
1678 { name " Mux", "ADMAIF17", "ADMAIF17 XBAR-RX" }, \
1679 { name " Mux", "ADMAIF18", "ADMAIF18 XBAR-RX" }, \
1680 { name " Mux", "ADMAIF19", "ADMAIF19 XBAR-RX" }, \
1681 { name " Mux", "ADMAIF20", "ADMAIF20 XBAR-RX" }, \
1682 { name " Mux", "ADMAIF21", "ADMAIF21 XBAR-RX" }, \
1683 { name " Mux", "ADMAIF22", "ADMAIF22 XBAR-RX" }, \
1684 { name " Mux", "ADMAIF23", "ADMAIF23 XBAR-RX" }, \
1685 { name " Mux", "ADMAIF24", "ADMAIF24 XBAR-RX" }, \
1686 { name " Mux", "ADMAIF25", "ADMAIF25 XBAR-RX" }, \
1687 { name " Mux", "ADMAIF26", "ADMAIF26 XBAR-RX" }, \
1688 { name " Mux", "ADMAIF27", "ADMAIF27 XBAR-RX" }, \
1689 { name " Mux", "ADMAIF28", "ADMAIF28 XBAR-RX" }, \
1690 { name " Mux", "ADMAIF29", "ADMAIF29 XBAR-RX" }, \
1691 { name " Mux", "ADMAIF30", "ADMAIF30 XBAR-RX" }, \
1692 { name " Mux", "ADMAIF31", "ADMAIF31 XBAR-RX" }, \
1693 { name " Mux", "ADMAIF32", "ADMAIF32 XBAR-RX" }, \
1694 { name " Mux", "I2S6", "I2S6 XBAR-RX" }, \
1695 { name " Mux", "I2S7", "I2S7 XBAR-RX" }, \
1696 { name " Mux", "I2S8", "I2S8 XBAR-RX" }, \
1697 { name " Mux", "AMX3", "AMX3 XBAR-RX" }, \
1698 { name " Mux", "AMX4", "AMX4 XBAR-RX" }, \
1699 { name " Mux", "AMX5", "AMX5 XBAR-RX" }, \
1700 { name " Mux", "AMX6", "AMX6 XBAR-RX" }, \
1701 { name " Mux", "ADX3 TX1", "ADX3 TX1 XBAR-RX" }, \
1702 { name " Mux", "ADX3 TX2", "ADX3 TX2 XBAR-RX" }, \
1703 { name " Mux", "ADX3 TX3", "ADX3 TX3 XBAR-RX" }, \
1704 { name " Mux", "ADX3 TX4", "ADX3 TX4 XBAR-RX" }, \
1705 { name " Mux", "ADX4 TX1", "ADX4 TX1 XBAR-RX" }, \
1706 { name " Mux", "ADX4 TX2", "ADX4 TX2 XBAR-RX" }, \
1707 { name " Mux", "ADX4 TX3", "ADX4 TX3 XBAR-RX" }, \
1708 { name " Mux", "ADX4 TX4", "ADX4 TX4 XBAR-RX" }, \
1709 { name " Mux", "ADX5 TX1", "ADX5 TX1 XBAR-RX" }, \
1710 { name " Mux", "ADX5 TX2", "ADX5 TX2 XBAR-RX" }, \
1711 { name " Mux", "ADX5 TX3", "ADX5 TX3 XBAR-RX" }, \
1712 { name " Mux", "ADX5 TX4", "ADX5 TX4 XBAR-RX" }, \
1713 { name " Mux", "ADX6 TX1", "ADX6 TX1 XBAR-RX" }, \
1714 { name " Mux", "ADX6 TX2", "ADX6 TX2 XBAR-RX" }, \
1715 { name " Mux", "ADX6 TX3", "ADX6 TX3 XBAR-RX" }, \
1716 { name " Mux", "ADX6 TX4", "ADX6 TX4 XBAR-RX" }, \
1717 { name " Mux", "ASRC1 TX1", "ASRC1 TX1 XBAR-RX" }, \
1718 { name " Mux", "ASRC1 TX2", "ASRC1 TX2 XBAR-RX" }, \
1719 { name " Mux", "ASRC1 TX3", "ASRC1 TX3 XBAR-RX" }, \
1720 { name " Mux", "ASRC1 TX4", "ASRC1 TX4 XBAR-RX" }, \
1721 { name " Mux", "ASRC1 TX5", "ASRC1 TX5 XBAR-RX" }, \
1722 { name " Mux", "ASRC1 TX6", "ASRC1 TX6 XBAR-RX" },
1738 { name " XBAR-Playback", NULL, name " Playback" }, \
1739 { name " XBAR-RX", NULL, name " XBAR-Playback"}, \
1740 { name " XBAR-Capture", NULL, name " XBAR-TX" }, \
1741 { name " Capture", NULL, name " XBAR-Capture" },
2154 { .compatible = "nvidia,tegra210-ahub", .data = &soc_data_tegra210 },
2155 { .compatible = "nvidia,tegra186-ahub", .data = &soc_data_tegra186 },
2156 { .compatible = "nvidia,tegra234-ahub", .data = &soc_data_tegra234 },
2157 { .compatible = "nvidia,tegra264-ahub", .data = &soc_data_tegra264 },
2164 struct tegra_ahub *ahub = dev_get_drvdata(dev); in tegra_ahub_runtime_suspend() local
2166 regcache_cache_only(ahub->regmap, true); in tegra_ahub_runtime_suspend()
2167 regcache_mark_dirty(ahub->regmap); in tegra_ahub_runtime_suspend()
2169 clk_disable_unprepare(ahub->clk); in tegra_ahub_runtime_suspend()
2176 struct tegra_ahub *ahub = dev_get_drvdata(dev); in tegra_ahub_runtime_resume() local
2179 err = clk_prepare_enable(ahub->clk); in tegra_ahub_runtime_resume()
2181 dev_err(dev, "failed to enable AHUB clock, err: %d\n", err); in tegra_ahub_runtime_resume()
2185 regcache_cache_only(ahub->regmap, false); in tegra_ahub_runtime_resume()
2186 regcache_sync(ahub->regmap); in tegra_ahub_runtime_resume()
2193 struct tegra_ahub *ahub; in tegra_ahub_probe() local
2197 ahub = devm_kzalloc(&pdev->dev, sizeof(*ahub), GFP_KERNEL); in tegra_ahub_probe()
2198 if (!ahub) in tegra_ahub_probe()
2199 return -ENOMEM; in tegra_ahub_probe()
2201 ahub->soc_data = of_device_get_match_data(&pdev->dev); in tegra_ahub_probe()
2202 if (!ahub->soc_data) in tegra_ahub_probe()
2203 return -ENODEV; in tegra_ahub_probe()
2205 platform_set_drvdata(pdev, ahub); in tegra_ahub_probe()
2207 ahub->clk = devm_clk_get(&pdev->dev, "ahub"); in tegra_ahub_probe()
2208 if (IS_ERR(ahub->clk)) { in tegra_ahub_probe()
2209 dev_err(&pdev->dev, "can't retrieve AHUB clock\n"); in tegra_ahub_probe()
2210 return PTR_ERR(ahub->clk); in tegra_ahub_probe()
2217 ahub->regmap = devm_regmap_init_mmio(&pdev->dev, regs, in tegra_ahub_probe()
2218 ahub->soc_data->regmap_config); in tegra_ahub_probe()
2219 if (IS_ERR(ahub->regmap)) { in tegra_ahub_probe()
2220 dev_err(&pdev->dev, "regmap init failed\n"); in tegra_ahub_probe()
2221 return PTR_ERR(ahub->regmap); in tegra_ahub_probe()
2224 regcache_cache_only(ahub->regmap, true); in tegra_ahub_probe()
2226 err = devm_snd_soc_register_component(&pdev->dev, in tegra_ahub_probe()
2227 ahub->soc_data->cmpnt_drv, in tegra_ahub_probe()
2228 ahub->soc_data->dai_drv, in tegra_ahub_probe()
2229 ahub->soc_data->num_dais); in tegra_ahub_probe()
2231 dev_err(&pdev->dev, "can't register AHUB component, err: %d\n", in tegra_ahub_probe()
2236 pm_runtime_enable(&pdev->dev); in tegra_ahub_probe()
2238 err = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); in tegra_ahub_probe()
2240 pm_runtime_disable(&pdev->dev); in tegra_ahub_probe()
2249 pm_runtime_disable(&pdev->dev); in tegra_ahub_remove()
2262 .name = "tegra210-ahub",
2271 MODULE_DESCRIPTION("Tegra210 ASoC AHUB driver");