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

1 // SPDX-License-Identifier: GPL-2.0-only
3 // tegra210_ahub.c - Tegra210 AHUB driver
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 + (TEGRA210_XBAR_PART1_RX * 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 + (TEGRA210_XBAR_PART1_RX * i); in tegra_ahub_put_value_enum()
85 update[i].mask = ahub->soc_data->mask[i]; in tegra_ahub_put_value_enum()
377 { name " XBAR-TX", NULL, name " Mux" }, \
378 { name " Mux", "ADMAIF1", "ADMAIF1 XBAR-RX" }, \
379 { name " Mux", "ADMAIF2", "ADMAIF2 XBAR-RX" }, \
380 { name " Mux", "ADMAIF3", "ADMAIF3 XBAR-RX" }, \
381 { name " Mux", "ADMAIF4", "ADMAIF4 XBAR-RX" }, \
382 { name " Mux", "ADMAIF5", "ADMAIF5 XBAR-RX" }, \
383 { name " Mux", "ADMAIF6", "ADMAIF6 XBAR-RX" }, \
384 { name " Mux", "ADMAIF7", "ADMAIF7 XBAR-RX" }, \
385 { name " Mux", "ADMAIF8", "ADMAIF8 XBAR-RX" }, \
386 { name " Mux", "ADMAIF9", "ADMAIF9 XBAR-RX" }, \
387 { name " Mux", "ADMAIF10", "ADMAIF10 XBAR-RX" }, \
388 { name " Mux", "I2S1", "I2S1 XBAR-RX" }, \
389 { name " Mux", "I2S2", "I2S2 XBAR-RX" }, \
390 { name " Mux", "I2S3", "I2S3 XBAR-RX" }, \
391 { name " Mux", "I2S4", "I2S4 XBAR-RX" }, \
392 { name " Mux", "I2S5", "I2S5 XBAR-RX" }, \
393 { name " Mux", "DMIC1", "DMIC1 XBAR-RX" }, \
394 { name " Mux", "DMIC2", "DMIC2 XBAR-RX" }, \
395 { name " Mux", "DMIC3", "DMIC3 XBAR-RX" },
398 { name " Mux", "ADMAIF11", "ADMAIF11 XBAR-RX" }, \
399 { name " Mux", "ADMAIF12", "ADMAIF12 XBAR-RX" }, \
400 { name " Mux", "ADMAIF13", "ADMAIF13 XBAR-RX" }, \
401 { name " Mux", "ADMAIF14", "ADMAIF14 XBAR-RX" }, \
402 { name " Mux", "ADMAIF15", "ADMAIF15 XBAR-RX" }, \
403 { name " Mux", "ADMAIF16", "ADMAIF16 XBAR-RX" }, \
404 { name " Mux", "ADMAIF17", "ADMAIF17 XBAR-RX" }, \
405 { name " Mux", "ADMAIF18", "ADMAIF18 XBAR-RX" }, \
406 { name " Mux", "ADMAIF19", "ADMAIF19 XBAR-RX" }, \
407 { name " Mux", "ADMAIF20", "ADMAIF20 XBAR-RX" }, \
408 { name " Mux", "I2S6", "I2S6 XBAR-RX" }, \
409 { name " Mux", "DMIC4", "DMIC4 XBAR-RX" },
420 { name " XBAR-Playback", NULL, name " Playback" }, \
421 { name " XBAR-RX", NULL, name " XBAR-Playback"}, \
422 { name " XBAR-Capture", NULL, name " XBAR-TX" }, \
423 { name " Capture", NULL, name " XBAR-Capture" },
564 { .compatible = "nvidia,tegra210-ahub", .data = &soc_data_tegra210 },
565 { .compatible = "nvidia,tegra186-ahub", .data = &soc_data_tegra186 },
572 struct tegra_ahub *ahub = dev_get_drvdata(dev); in tegra_ahub_runtime_suspend() local
574 regcache_cache_only(ahub->regmap, true); in tegra_ahub_runtime_suspend()
575 regcache_mark_dirty(ahub->regmap); in tegra_ahub_runtime_suspend()
577 clk_disable_unprepare(ahub->clk); in tegra_ahub_runtime_suspend()
584 struct tegra_ahub *ahub = dev_get_drvdata(dev); in tegra_ahub_runtime_resume() local
587 err = clk_prepare_enable(ahub->clk); in tegra_ahub_runtime_resume()
589 dev_err(dev, "failed to enable AHUB clock, err: %d\n", err); in tegra_ahub_runtime_resume()
593 regcache_cache_only(ahub->regmap, false); in tegra_ahub_runtime_resume()
594 regcache_sync(ahub->regmap); in tegra_ahub_runtime_resume()
601 struct tegra_ahub *ahub; in tegra_ahub_probe() local
605 ahub = devm_kzalloc(&pdev->dev, sizeof(*ahub), GFP_KERNEL); in tegra_ahub_probe()
606 if (!ahub) in tegra_ahub_probe()
607 return -ENOMEM; in tegra_ahub_probe()
609 ahub->soc_data = of_device_get_match_data(&pdev->dev); in tegra_ahub_probe()
611 platform_set_drvdata(pdev, ahub); in tegra_ahub_probe()
613 ahub->clk = devm_clk_get(&pdev->dev, "ahub"); in tegra_ahub_probe()
614 if (IS_ERR(ahub->clk)) { in tegra_ahub_probe()
615 dev_err(&pdev->dev, "can't retrieve AHUB clock\n"); in tegra_ahub_probe()
616 return PTR_ERR(ahub->clk); in tegra_ahub_probe()
623 ahub->regmap = devm_regmap_init_mmio(&pdev->dev, regs, in tegra_ahub_probe()
624 ahub->soc_data->regmap_config); in tegra_ahub_probe()
625 if (IS_ERR(ahub->regmap)) { in tegra_ahub_probe()
626 dev_err(&pdev->dev, "regmap init failed\n"); in tegra_ahub_probe()
627 return PTR_ERR(ahub->regmap); in tegra_ahub_probe()
630 regcache_cache_only(ahub->regmap, true); in tegra_ahub_probe()
632 err = devm_snd_soc_register_component(&pdev->dev, in tegra_ahub_probe()
633 ahub->soc_data->cmpnt_drv, in tegra_ahub_probe()
634 ahub->soc_data->dai_drv, in tegra_ahub_probe()
635 ahub->soc_data->num_dais); in tegra_ahub_probe()
637 dev_err(&pdev->dev, "can't register AHUB component, err: %d\n", in tegra_ahub_probe()
642 err = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); in tegra_ahub_probe()
646 pm_runtime_enable(&pdev->dev); in tegra_ahub_probe()
653 pm_runtime_disable(&pdev->dev); in tegra_ahub_remove()
669 .name = "tegra210-ahub",
678 MODULE_DESCRIPTION("Tegra210 ASoC AHUB driver");