1 // SPDX-License-Identifier: GPL-2.0-only
3 // tegra210_ahub.c - Tegra210 AHUB driver
5 // Copyright (c) 2020-2024, NVIDIA CORPORATION. All rights reserved.
8 #include <linux/device.h>
9 #include <linux/module.h>
10 #include <linux/of_platform.h>
11 #include <linux/platform_device.h>
12 #include <linux/pm_runtime.h>
13 #include <linux/regmap.h>
14 #include <sound/soc.h>
15 #include "tegra210_ahub.h"
17 static int tegra_ahub_get_value_enum(struct snd_kcontrol
*kctl
,
18 struct snd_ctl_elem_value
*uctl
)
20 struct snd_soc_component
*cmpnt
= snd_soc_dapm_kcontrol_component(kctl
);
21 struct tegra_ahub
*ahub
= snd_soc_component_get_drvdata(cmpnt
);
22 struct soc_enum
*e
= (struct soc_enum
*)kctl
->private_value
;
23 unsigned int reg
, i
, bit_pos
= 0;
26 * Find the bit position of current MUX input.
27 * If nothing is set, position would be 0 and it corresponds to 'None'.
29 for (i
= 0; i
< ahub
->soc_data
->reg_count
; i
++) {
32 reg
= e
->reg
+ (TEGRA210_XBAR_PART1_RX
* i
);
33 reg_val
= snd_soc_component_read(cmpnt
, reg
);
34 reg_val
&= ahub
->soc_data
->mask
[i
];
37 bit_pos
= ffs(reg_val
) +
38 (8 * cmpnt
->val_bytes
* i
);
43 /* Find index related to the item in array *_ahub_mux_texts[] */
44 for (i
= 0; i
< e
->items
; i
++) {
45 if (bit_pos
== e
->values
[i
]) {
46 uctl
->value
.enumerated
.item
[0] = i
;
54 static int tegra_ahub_put_value_enum(struct snd_kcontrol
*kctl
,
55 struct snd_ctl_elem_value
*uctl
)
57 struct snd_soc_component
*cmpnt
= snd_soc_dapm_kcontrol_component(kctl
);
58 struct tegra_ahub
*ahub
= snd_soc_component_get_drvdata(cmpnt
);
59 struct snd_soc_dapm_context
*dapm
= snd_soc_dapm_kcontrol_dapm(kctl
);
60 struct soc_enum
*e
= (struct soc_enum
*)kctl
->private_value
;
61 struct snd_soc_dapm_update update
[TEGRA_XBAR_UPDATE_MAX_REG
] = { };
62 unsigned int *item
= uctl
->value
.enumerated
.item
;
63 unsigned int value
= e
->values
[item
[0]];
64 unsigned int i
, bit_pos
, reg_idx
= 0, reg_val
= 0;
67 if (item
[0] >= e
->items
)
71 /* Get the register index and value to set */
72 reg_idx
= (value
- 1) / (8 * cmpnt
->val_bytes
);
73 bit_pos
= (value
- 1) % (8 * cmpnt
->val_bytes
);
74 reg_val
= BIT(bit_pos
);
78 * Run through all parts of a MUX register to find the state changes.
79 * There will be an additional update if new MUX input value is from
80 * different part of the MUX register.
82 for (i
= 0; i
< ahub
->soc_data
->reg_count
; i
++) {
83 update
[i
].reg
= e
->reg
+ (TEGRA210_XBAR_PART1_RX
* i
);
84 update
[i
].val
= (i
== reg_idx
) ? reg_val
: 0;
85 update
[i
].mask
= ahub
->soc_data
->mask
[i
];
86 update
[i
].kcontrol
= kctl
;
88 /* Update widget power if state has changed */
89 if (snd_soc_component_test_bits(cmpnt
, update
[i
].reg
,
92 change
|= snd_soc_dapm_mux_update_power(dapm
, kctl
,
100 static struct snd_soc_dai_driver tegra210_ahub_dais
[] = {
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 */
180 static struct snd_soc_dai_driver tegra186_ahub_dais
[] = {
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 */
307 static const char * const tegra210_ahub_mux_texts
[] = {
352 static const char * const tegra186_ahub_mux_texts
[] = {
424 static const unsigned int tegra210_ahub_mux_values
[] = {
478 static const unsigned int tegra186_ahub_mux_values
[] = {
561 /* Controls for t210 */
562 MUX_ENUM_CTRL_DECL(t210_admaif1_tx
, 0x00);
563 MUX_ENUM_CTRL_DECL(t210_admaif2_tx
, 0x01);
564 MUX_ENUM_CTRL_DECL(t210_admaif3_tx
, 0x02);
565 MUX_ENUM_CTRL_DECL(t210_admaif4_tx
, 0x03);
566 MUX_ENUM_CTRL_DECL(t210_admaif5_tx
, 0x04);
567 MUX_ENUM_CTRL_DECL(t210_admaif6_tx
, 0x05);
568 MUX_ENUM_CTRL_DECL(t210_admaif7_tx
, 0x06);
569 MUX_ENUM_CTRL_DECL(t210_admaif8_tx
, 0x07);
570 MUX_ENUM_CTRL_DECL(t210_admaif9_tx
, 0x08);
571 MUX_ENUM_CTRL_DECL(t210_admaif10_tx
, 0x09);
572 MUX_ENUM_CTRL_DECL(t210_i2s1_tx
, 0x10);
573 MUX_ENUM_CTRL_DECL(t210_i2s2_tx
, 0x11);
574 MUX_ENUM_CTRL_DECL(t210_i2s3_tx
, 0x12);
575 MUX_ENUM_CTRL_DECL(t210_i2s4_tx
, 0x13);
576 MUX_ENUM_CTRL_DECL(t210_i2s5_tx
, 0x14);
577 MUX_ENUM_CTRL_DECL(t210_sfc1_tx
, 0x18);
578 MUX_ENUM_CTRL_DECL(t210_sfc2_tx
, 0x19);
579 MUX_ENUM_CTRL_DECL(t210_sfc3_tx
, 0x1a);
580 MUX_ENUM_CTRL_DECL(t210_sfc4_tx
, 0x1b);
581 MUX_ENUM_CTRL_DECL(t210_mvc1_tx
, 0x48);
582 MUX_ENUM_CTRL_DECL(t210_mvc2_tx
, 0x49);
583 MUX_ENUM_CTRL_DECL(t210_amx11_tx
, 0x50);
584 MUX_ENUM_CTRL_DECL(t210_amx12_tx
, 0x51);
585 MUX_ENUM_CTRL_DECL(t210_amx13_tx
, 0x52);
586 MUX_ENUM_CTRL_DECL(t210_amx14_tx
, 0x53);
587 MUX_ENUM_CTRL_DECL(t210_amx21_tx
, 0x54);
588 MUX_ENUM_CTRL_DECL(t210_amx22_tx
, 0x55);
589 MUX_ENUM_CTRL_DECL(t210_amx23_tx
, 0x56);
590 MUX_ENUM_CTRL_DECL(t210_amx24_tx
, 0x57);
591 MUX_ENUM_CTRL_DECL(t210_adx1_tx
, 0x58);
592 MUX_ENUM_CTRL_DECL(t210_adx2_tx
, 0x59);
593 MUX_ENUM_CTRL_DECL(t210_mixer11_tx
, 0x20);
594 MUX_ENUM_CTRL_DECL(t210_mixer12_tx
, 0x21);
595 MUX_ENUM_CTRL_DECL(t210_mixer13_tx
, 0x22);
596 MUX_ENUM_CTRL_DECL(t210_mixer14_tx
, 0x23);
597 MUX_ENUM_CTRL_DECL(t210_mixer15_tx
, 0x24);
598 MUX_ENUM_CTRL_DECL(t210_mixer16_tx
, 0x25);
599 MUX_ENUM_CTRL_DECL(t210_mixer17_tx
, 0x26);
600 MUX_ENUM_CTRL_DECL(t210_mixer18_tx
, 0x27);
601 MUX_ENUM_CTRL_DECL(t210_mixer19_tx
, 0x28);
602 MUX_ENUM_CTRL_DECL(t210_mixer110_tx
, 0x29);
603 MUX_ENUM_CTRL_DECL(t210_ope1_tx
, 0x40);
604 MUX_ENUM_CTRL_DECL(t210_ope2_tx
, 0x41);
606 /* Controls for t186 */
607 MUX_ENUM_CTRL_DECL_186(t186_admaif1_tx
, 0x00);
608 MUX_ENUM_CTRL_DECL_186(t186_admaif2_tx
, 0x01);
609 MUX_ENUM_CTRL_DECL_186(t186_admaif3_tx
, 0x02);
610 MUX_ENUM_CTRL_DECL_186(t186_admaif4_tx
, 0x03);
611 MUX_ENUM_CTRL_DECL_186(t186_admaif5_tx
, 0x04);
612 MUX_ENUM_CTRL_DECL_186(t186_admaif6_tx
, 0x05);
613 MUX_ENUM_CTRL_DECL_186(t186_admaif7_tx
, 0x06);
614 MUX_ENUM_CTRL_DECL_186(t186_admaif8_tx
, 0x07);
615 MUX_ENUM_CTRL_DECL_186(t186_admaif9_tx
, 0x08);
616 MUX_ENUM_CTRL_DECL_186(t186_admaif10_tx
, 0x09);
617 MUX_ENUM_CTRL_DECL_186(t186_i2s1_tx
, 0x10);
618 MUX_ENUM_CTRL_DECL_186(t186_i2s2_tx
, 0x11);
619 MUX_ENUM_CTRL_DECL_186(t186_i2s3_tx
, 0x12);
620 MUX_ENUM_CTRL_DECL_186(t186_i2s4_tx
, 0x13);
621 MUX_ENUM_CTRL_DECL_186(t186_i2s5_tx
, 0x14);
622 MUX_ENUM_CTRL_DECL_186(t186_admaif11_tx
, 0x0a);
623 MUX_ENUM_CTRL_DECL_186(t186_admaif12_tx
, 0x0b);
624 MUX_ENUM_CTRL_DECL_186(t186_admaif13_tx
, 0x0c);
625 MUX_ENUM_CTRL_DECL_186(t186_admaif14_tx
, 0x0d);
626 MUX_ENUM_CTRL_DECL_186(t186_admaif15_tx
, 0x0e);
627 MUX_ENUM_CTRL_DECL_186(t186_admaif16_tx
, 0x0f);
628 MUX_ENUM_CTRL_DECL_186(t186_i2s6_tx
, 0x15);
629 MUX_ENUM_CTRL_DECL_186(t186_dspk1_tx
, 0x30);
630 MUX_ENUM_CTRL_DECL_186(t186_dspk2_tx
, 0x31);
631 MUX_ENUM_CTRL_DECL_186(t186_admaif17_tx
, 0x68);
632 MUX_ENUM_CTRL_DECL_186(t186_admaif18_tx
, 0x69);
633 MUX_ENUM_CTRL_DECL_186(t186_admaif19_tx
, 0x6a);
634 MUX_ENUM_CTRL_DECL_186(t186_admaif20_tx
, 0x6b);
635 MUX_ENUM_CTRL_DECL_186(t186_sfc1_tx
, 0x18);
636 MUX_ENUM_CTRL_DECL_186(t186_sfc2_tx
, 0x19);
637 MUX_ENUM_CTRL_DECL_186(t186_sfc3_tx
, 0x1a);
638 MUX_ENUM_CTRL_DECL_186(t186_sfc4_tx
, 0x1b);
639 MUX_ENUM_CTRL_DECL_186(t186_mvc1_tx
, 0x48);
640 MUX_ENUM_CTRL_DECL_186(t186_mvc2_tx
, 0x49);
641 MUX_ENUM_CTRL_DECL_186(t186_amx11_tx
, 0x50);
642 MUX_ENUM_CTRL_DECL_186(t186_amx12_tx
, 0x51);
643 MUX_ENUM_CTRL_DECL_186(t186_amx13_tx
, 0x52);
644 MUX_ENUM_CTRL_DECL_186(t186_amx14_tx
, 0x53);
645 MUX_ENUM_CTRL_DECL_186(t186_amx21_tx
, 0x54);
646 MUX_ENUM_CTRL_DECL_186(t186_amx22_tx
, 0x55);
647 MUX_ENUM_CTRL_DECL_186(t186_amx23_tx
, 0x56);
648 MUX_ENUM_CTRL_DECL_186(t186_amx24_tx
, 0x57);
649 MUX_ENUM_CTRL_DECL_186(t186_amx31_tx
, 0x58);
650 MUX_ENUM_CTRL_DECL_186(t186_amx32_tx
, 0x59);
651 MUX_ENUM_CTRL_DECL_186(t186_amx33_tx
, 0x5a);
652 MUX_ENUM_CTRL_DECL_186(t186_amx34_tx
, 0x5b);
653 MUX_ENUM_CTRL_DECL_186(t186_amx41_tx
, 0x64);
654 MUX_ENUM_CTRL_DECL_186(t186_amx42_tx
, 0x65);
655 MUX_ENUM_CTRL_DECL_186(t186_amx43_tx
, 0x66);
656 MUX_ENUM_CTRL_DECL_186(t186_amx44_tx
, 0x67);
657 MUX_ENUM_CTRL_DECL_186(t186_adx1_tx
, 0x60);
658 MUX_ENUM_CTRL_DECL_186(t186_adx2_tx
, 0x61);
659 MUX_ENUM_CTRL_DECL_186(t186_adx3_tx
, 0x62);
660 MUX_ENUM_CTRL_DECL_186(t186_adx4_tx
, 0x63);
661 MUX_ENUM_CTRL_DECL_186(t186_mixer11_tx
, 0x20);
662 MUX_ENUM_CTRL_DECL_186(t186_mixer12_tx
, 0x21);
663 MUX_ENUM_CTRL_DECL_186(t186_mixer13_tx
, 0x22);
664 MUX_ENUM_CTRL_DECL_186(t186_mixer14_tx
, 0x23);
665 MUX_ENUM_CTRL_DECL_186(t186_mixer15_tx
, 0x24);
666 MUX_ENUM_CTRL_DECL_186(t186_mixer16_tx
, 0x25);
667 MUX_ENUM_CTRL_DECL_186(t186_mixer17_tx
, 0x26);
668 MUX_ENUM_CTRL_DECL_186(t186_mixer18_tx
, 0x27);
669 MUX_ENUM_CTRL_DECL_186(t186_mixer19_tx
, 0x28);
670 MUX_ENUM_CTRL_DECL_186(t186_mixer110_tx
, 0x29);
671 MUX_ENUM_CTRL_DECL_186(t186_asrc11_tx
, 0x6c);
672 MUX_ENUM_CTRL_DECL_186(t186_asrc12_tx
, 0x6d);
673 MUX_ENUM_CTRL_DECL_186(t186_asrc13_tx
, 0x6e);
674 MUX_ENUM_CTRL_DECL_186(t186_asrc14_tx
, 0x6f);
675 MUX_ENUM_CTRL_DECL_186(t186_asrc15_tx
, 0x70);
676 MUX_ENUM_CTRL_DECL_186(t186_asrc16_tx
, 0x71);
677 MUX_ENUM_CTRL_DECL_186(t186_asrc17_tx
, 0x72);
678 MUX_ENUM_CTRL_DECL_186(t186_ope1_tx
, 0x40);
680 /* Controls for t234 */
681 MUX_ENUM_CTRL_DECL_234(t234_mvc1_tx
, 0x44);
682 MUX_ENUM_CTRL_DECL_234(t234_mvc2_tx
, 0x45);
683 MUX_ENUM_CTRL_DECL_234(t234_amx11_tx
, 0x48);
684 MUX_ENUM_CTRL_DECL_234(t234_amx12_tx
, 0x49);
685 MUX_ENUM_CTRL_DECL_234(t234_amx13_tx
, 0x4a);
686 MUX_ENUM_CTRL_DECL_234(t234_amx14_tx
, 0x4b);
687 MUX_ENUM_CTRL_DECL_234(t234_amx21_tx
, 0x4c);
688 MUX_ENUM_CTRL_DECL_234(t234_amx22_tx
, 0x4d);
689 MUX_ENUM_CTRL_DECL_234(t234_amx23_tx
, 0x4e);
690 MUX_ENUM_CTRL_DECL_234(t234_amx24_tx
, 0x4f);
691 MUX_ENUM_CTRL_DECL_234(t234_amx31_tx
, 0x50);
692 MUX_ENUM_CTRL_DECL_234(t234_amx32_tx
, 0x51);
693 MUX_ENUM_CTRL_DECL_234(t234_amx33_tx
, 0x52);
694 MUX_ENUM_CTRL_DECL_234(t234_amx34_tx
, 0x53);
695 MUX_ENUM_CTRL_DECL_234(t234_adx1_tx
, 0x58);
696 MUX_ENUM_CTRL_DECL_234(t234_adx2_tx
, 0x59);
697 MUX_ENUM_CTRL_DECL_234(t234_adx3_tx
, 0x5a);
698 MUX_ENUM_CTRL_DECL_234(t234_adx4_tx
, 0x5b);
699 MUX_ENUM_CTRL_DECL_234(t234_amx41_tx
, 0x5c);
700 MUX_ENUM_CTRL_DECL_234(t234_amx42_tx
, 0x5d);
701 MUX_ENUM_CTRL_DECL_234(t234_amx43_tx
, 0x5e);
702 MUX_ENUM_CTRL_DECL_234(t234_amx44_tx
, 0x5f);
703 MUX_ENUM_CTRL_DECL_234(t234_admaif17_tx
, 0x60);
704 MUX_ENUM_CTRL_DECL_234(t234_admaif18_tx
, 0x61);
705 MUX_ENUM_CTRL_DECL_234(t234_admaif19_tx
, 0x62);
706 MUX_ENUM_CTRL_DECL_234(t234_admaif20_tx
, 0x63);
707 MUX_ENUM_CTRL_DECL_234(t234_asrc11_tx
, 0x64);
708 MUX_ENUM_CTRL_DECL_234(t234_asrc12_tx
, 0x65);
709 MUX_ENUM_CTRL_DECL_234(t234_asrc13_tx
, 0x66);
710 MUX_ENUM_CTRL_DECL_234(t234_asrc14_tx
, 0x67);
711 MUX_ENUM_CTRL_DECL_234(t234_asrc15_tx
, 0x68);
712 MUX_ENUM_CTRL_DECL_234(t234_asrc16_tx
, 0x69);
713 MUX_ENUM_CTRL_DECL_234(t234_asrc17_tx
, 0x6a);
715 static const struct snd_soc_dapm_widget tegra210_ahub_widgets
[] = {
716 WIDGETS("ADMAIF1", t210_admaif1_tx
),
717 WIDGETS("ADMAIF2", t210_admaif2_tx
),
718 WIDGETS("ADMAIF3", t210_admaif3_tx
),
719 WIDGETS("ADMAIF4", t210_admaif4_tx
),
720 WIDGETS("ADMAIF5", t210_admaif5_tx
),
721 WIDGETS("ADMAIF6", t210_admaif6_tx
),
722 WIDGETS("ADMAIF7", t210_admaif7_tx
),
723 WIDGETS("ADMAIF8", t210_admaif8_tx
),
724 WIDGETS("ADMAIF9", t210_admaif9_tx
),
725 WIDGETS("ADMAIF10", t210_admaif10_tx
),
726 WIDGETS("I2S1", t210_i2s1_tx
),
727 WIDGETS("I2S2", t210_i2s2_tx
),
728 WIDGETS("I2S3", t210_i2s3_tx
),
729 WIDGETS("I2S4", t210_i2s4_tx
),
730 WIDGETS("I2S5", t210_i2s5_tx
),
734 WIDGETS("SFC1", t210_sfc1_tx
),
735 WIDGETS("SFC2", t210_sfc2_tx
),
736 WIDGETS("SFC3", t210_sfc3_tx
),
737 WIDGETS("SFC4", t210_sfc4_tx
),
738 WIDGETS("MVC1", t210_mvc1_tx
),
739 WIDGETS("MVC2", t210_mvc2_tx
),
740 WIDGETS("AMX1 RX1", t210_amx11_tx
),
741 WIDGETS("AMX1 RX2", t210_amx12_tx
),
742 WIDGETS("AMX1 RX3", t210_amx13_tx
),
743 WIDGETS("AMX1 RX4", t210_amx14_tx
),
744 WIDGETS("AMX2 RX1", t210_amx21_tx
),
745 WIDGETS("AMX2 RX2", t210_amx22_tx
),
746 WIDGETS("AMX2 RX3", t210_amx23_tx
),
747 WIDGETS("AMX2 RX4", t210_amx24_tx
),
750 WIDGETS("ADX1", t210_adx1_tx
),
751 WIDGETS("ADX2", t210_adx2_tx
),
752 TX_WIDGETS("ADX1 TX1"),
753 TX_WIDGETS("ADX1 TX2"),
754 TX_WIDGETS("ADX1 TX3"),
755 TX_WIDGETS("ADX1 TX4"),
756 TX_WIDGETS("ADX2 TX1"),
757 TX_WIDGETS("ADX2 TX2"),
758 TX_WIDGETS("ADX2 TX3"),
759 TX_WIDGETS("ADX2 TX4"),
760 WIDGETS("MIXER1 RX1", t210_mixer11_tx
),
761 WIDGETS("MIXER1 RX2", t210_mixer12_tx
),
762 WIDGETS("MIXER1 RX3", t210_mixer13_tx
),
763 WIDGETS("MIXER1 RX4", t210_mixer14_tx
),
764 WIDGETS("MIXER1 RX5", t210_mixer15_tx
),
765 WIDGETS("MIXER1 RX6", t210_mixer16_tx
),
766 WIDGETS("MIXER1 RX7", t210_mixer17_tx
),
767 WIDGETS("MIXER1 RX8", t210_mixer18_tx
),
768 WIDGETS("MIXER1 RX9", t210_mixer19_tx
),
769 WIDGETS("MIXER1 RX10", t210_mixer110_tx
),
770 TX_WIDGETS("MIXER1 TX1"),
771 TX_WIDGETS("MIXER1 TX2"),
772 TX_WIDGETS("MIXER1 TX3"),
773 TX_WIDGETS("MIXER1 TX4"),
774 TX_WIDGETS("MIXER1 TX5"),
775 WIDGETS("OPE1", t210_ope1_tx
),
776 WIDGETS("OPE2", t210_ope2_tx
),
779 static const struct snd_soc_dapm_widget tegra186_ahub_widgets
[] = {
780 WIDGETS("ADMAIF1", t186_admaif1_tx
),
781 WIDGETS("ADMAIF2", t186_admaif2_tx
),
782 WIDGETS("ADMAIF3", t186_admaif3_tx
),
783 WIDGETS("ADMAIF4", t186_admaif4_tx
),
784 WIDGETS("ADMAIF5", t186_admaif5_tx
),
785 WIDGETS("ADMAIF6", t186_admaif6_tx
),
786 WIDGETS("ADMAIF7", t186_admaif7_tx
),
787 WIDGETS("ADMAIF8", t186_admaif8_tx
),
788 WIDGETS("ADMAIF9", t186_admaif9_tx
),
789 WIDGETS("ADMAIF10", t186_admaif10_tx
),
790 WIDGETS("ADMAIF11", t186_admaif11_tx
),
791 WIDGETS("ADMAIF12", t186_admaif12_tx
),
792 WIDGETS("ADMAIF13", t186_admaif13_tx
),
793 WIDGETS("ADMAIF14", t186_admaif14_tx
),
794 WIDGETS("ADMAIF15", t186_admaif15_tx
),
795 WIDGETS("ADMAIF16", t186_admaif16_tx
),
796 WIDGETS("ADMAIF17", t186_admaif17_tx
),
797 WIDGETS("ADMAIF18", t186_admaif18_tx
),
798 WIDGETS("ADMAIF19", t186_admaif19_tx
),
799 WIDGETS("ADMAIF20", t186_admaif20_tx
),
800 WIDGETS("I2S1", t186_i2s1_tx
),
801 WIDGETS("I2S2", t186_i2s2_tx
),
802 WIDGETS("I2S3", t186_i2s3_tx
),
803 WIDGETS("I2S4", t186_i2s4_tx
),
804 WIDGETS("I2S5", t186_i2s5_tx
),
805 WIDGETS("I2S6", t186_i2s6_tx
),
810 WIDGETS("DSPK1", t186_dspk1_tx
),
811 WIDGETS("DSPK2", t186_dspk2_tx
),
812 WIDGETS("SFC1", t186_sfc1_tx
),
813 WIDGETS("SFC2", t186_sfc2_tx
),
814 WIDGETS("SFC3", t186_sfc3_tx
),
815 WIDGETS("SFC4", t186_sfc4_tx
),
816 WIDGETS("MVC1", t186_mvc1_tx
),
817 WIDGETS("MVC2", t186_mvc2_tx
),
818 WIDGETS("AMX1 RX1", t186_amx11_tx
),
819 WIDGETS("AMX1 RX2", t186_amx12_tx
),
820 WIDGETS("AMX1 RX3", t186_amx13_tx
),
821 WIDGETS("AMX1 RX4", t186_amx14_tx
),
822 WIDGETS("AMX2 RX1", t186_amx21_tx
),
823 WIDGETS("AMX2 RX2", t186_amx22_tx
),
824 WIDGETS("AMX2 RX3", t186_amx23_tx
),
825 WIDGETS("AMX2 RX4", t186_amx24_tx
),
826 WIDGETS("AMX3 RX1", t186_amx31_tx
),
827 WIDGETS("AMX3 RX2", t186_amx32_tx
),
828 WIDGETS("AMX3 RX3", t186_amx33_tx
),
829 WIDGETS("AMX3 RX4", t186_amx34_tx
),
830 WIDGETS("AMX4 RX1", t186_amx41_tx
),
831 WIDGETS("AMX4 RX2", t186_amx42_tx
),
832 WIDGETS("AMX4 RX3", t186_amx43_tx
),
833 WIDGETS("AMX4 RX4", t186_amx44_tx
),
838 WIDGETS("ADX1", t186_adx1_tx
),
839 WIDGETS("ADX2", t186_adx2_tx
),
840 WIDGETS("ADX3", t186_adx3_tx
),
841 WIDGETS("ADX4", t186_adx4_tx
),
842 TX_WIDGETS("ADX1 TX1"),
843 TX_WIDGETS("ADX1 TX2"),
844 TX_WIDGETS("ADX1 TX3"),
845 TX_WIDGETS("ADX1 TX4"),
846 TX_WIDGETS("ADX2 TX1"),
847 TX_WIDGETS("ADX2 TX2"),
848 TX_WIDGETS("ADX2 TX3"),
849 TX_WIDGETS("ADX2 TX4"),
850 TX_WIDGETS("ADX3 TX1"),
851 TX_WIDGETS("ADX3 TX2"),
852 TX_WIDGETS("ADX3 TX3"),
853 TX_WIDGETS("ADX3 TX4"),
854 TX_WIDGETS("ADX4 TX1"),
855 TX_WIDGETS("ADX4 TX2"),
856 TX_WIDGETS("ADX4 TX3"),
857 TX_WIDGETS("ADX4 TX4"),
858 WIDGETS("MIXER1 RX1", t186_mixer11_tx
),
859 WIDGETS("MIXER1 RX2", t186_mixer12_tx
),
860 WIDGETS("MIXER1 RX3", t186_mixer13_tx
),
861 WIDGETS("MIXER1 RX4", t186_mixer14_tx
),
862 WIDGETS("MIXER1 RX5", t186_mixer15_tx
),
863 WIDGETS("MIXER1 RX6", t186_mixer16_tx
),
864 WIDGETS("MIXER1 RX7", t186_mixer17_tx
),
865 WIDGETS("MIXER1 RX8", t186_mixer18_tx
),
866 WIDGETS("MIXER1 RX9", t186_mixer19_tx
),
867 WIDGETS("MIXER1 RX10", t186_mixer110_tx
),
868 TX_WIDGETS("MIXER1 TX1"),
869 TX_WIDGETS("MIXER1 TX2"),
870 TX_WIDGETS("MIXER1 TX3"),
871 TX_WIDGETS("MIXER1 TX4"),
872 TX_WIDGETS("MIXER1 TX5"),
873 WIDGETS("ASRC1 RX1", t186_asrc11_tx
),
874 WIDGETS("ASRC1 RX2", t186_asrc12_tx
),
875 WIDGETS("ASRC1 RX3", t186_asrc13_tx
),
876 WIDGETS("ASRC1 RX4", t186_asrc14_tx
),
877 WIDGETS("ASRC1 RX5", t186_asrc15_tx
),
878 WIDGETS("ASRC1 RX6", t186_asrc16_tx
),
879 WIDGETS("ASRC1 RX7", t186_asrc17_tx
),
880 TX_WIDGETS("ASRC1 TX1"),
881 TX_WIDGETS("ASRC1 TX2"),
882 TX_WIDGETS("ASRC1 TX3"),
883 TX_WIDGETS("ASRC1 TX4"),
884 TX_WIDGETS("ASRC1 TX5"),
885 TX_WIDGETS("ASRC1 TX6"),
886 WIDGETS("OPE1", t186_ope1_tx
),
889 static const struct snd_soc_dapm_widget tegra234_ahub_widgets
[] = {
890 WIDGETS("ADMAIF1", t186_admaif1_tx
),
891 WIDGETS("ADMAIF2", t186_admaif2_tx
),
892 WIDGETS("ADMAIF3", t186_admaif3_tx
),
893 WIDGETS("ADMAIF4", t186_admaif4_tx
),
894 WIDGETS("ADMAIF5", t186_admaif5_tx
),
895 WIDGETS("ADMAIF6", t186_admaif6_tx
),
896 WIDGETS("ADMAIF7", t186_admaif7_tx
),
897 WIDGETS("ADMAIF8", t186_admaif8_tx
),
898 WIDGETS("ADMAIF9", t186_admaif9_tx
),
899 WIDGETS("ADMAIF10", t186_admaif10_tx
),
900 WIDGETS("ADMAIF11", t186_admaif11_tx
),
901 WIDGETS("ADMAIF12", t186_admaif12_tx
),
902 WIDGETS("ADMAIF13", t186_admaif13_tx
),
903 WIDGETS("ADMAIF14", t186_admaif14_tx
),
904 WIDGETS("ADMAIF15", t186_admaif15_tx
),
905 WIDGETS("ADMAIF16", t186_admaif16_tx
),
906 WIDGETS("ADMAIF17", t234_admaif17_tx
),
907 WIDGETS("ADMAIF18", t234_admaif18_tx
),
908 WIDGETS("ADMAIF19", t234_admaif19_tx
),
909 WIDGETS("ADMAIF20", t234_admaif20_tx
),
910 WIDGETS("I2S1", t186_i2s1_tx
),
911 WIDGETS("I2S2", t186_i2s2_tx
),
912 WIDGETS("I2S3", t186_i2s3_tx
),
913 WIDGETS("I2S4", t186_i2s4_tx
),
914 WIDGETS("I2S5", t186_i2s5_tx
),
915 WIDGETS("I2S6", t186_i2s6_tx
),
920 WIDGETS("DSPK1", t186_dspk1_tx
),
921 WIDGETS("DSPK2", t186_dspk2_tx
),
922 WIDGETS("SFC1", t186_sfc1_tx
),
923 WIDGETS("SFC2", t186_sfc2_tx
),
924 WIDGETS("SFC3", t186_sfc3_tx
),
925 WIDGETS("SFC4", t186_sfc4_tx
),
926 WIDGETS("MVC1", t234_mvc1_tx
),
927 WIDGETS("MVC2", t234_mvc2_tx
),
928 WIDGETS("AMX1 RX1", t234_amx11_tx
),
929 WIDGETS("AMX1 RX2", t234_amx12_tx
),
930 WIDGETS("AMX1 RX3", t234_amx13_tx
),
931 WIDGETS("AMX1 RX4", t234_amx14_tx
),
932 WIDGETS("AMX2 RX1", t234_amx21_tx
),
933 WIDGETS("AMX2 RX2", t234_amx22_tx
),
934 WIDGETS("AMX2 RX3", t234_amx23_tx
),
935 WIDGETS("AMX2 RX4", t234_amx24_tx
),
936 WIDGETS("AMX3 RX1", t234_amx31_tx
),
937 WIDGETS("AMX3 RX2", t234_amx32_tx
),
938 WIDGETS("AMX3 RX3", t234_amx33_tx
),
939 WIDGETS("AMX3 RX4", t234_amx34_tx
),
940 WIDGETS("AMX4 RX1", t234_amx41_tx
),
941 WIDGETS("AMX4 RX2", t234_amx42_tx
),
942 WIDGETS("AMX4 RX3", t234_amx43_tx
),
943 WIDGETS("AMX4 RX4", t234_amx44_tx
),
948 WIDGETS("ADX1", t234_adx1_tx
),
949 WIDGETS("ADX2", t234_adx2_tx
),
950 WIDGETS("ADX3", t234_adx3_tx
),
951 WIDGETS("ADX4", t234_adx4_tx
),
952 TX_WIDGETS("ADX1 TX1"),
953 TX_WIDGETS("ADX1 TX2"),
954 TX_WIDGETS("ADX1 TX3"),
955 TX_WIDGETS("ADX1 TX4"),
956 TX_WIDGETS("ADX2 TX1"),
957 TX_WIDGETS("ADX2 TX2"),
958 TX_WIDGETS("ADX2 TX3"),
959 TX_WIDGETS("ADX2 TX4"),
960 TX_WIDGETS("ADX3 TX1"),
961 TX_WIDGETS("ADX3 TX2"),
962 TX_WIDGETS("ADX3 TX3"),
963 TX_WIDGETS("ADX3 TX4"),
964 TX_WIDGETS("ADX4 TX1"),
965 TX_WIDGETS("ADX4 TX2"),
966 TX_WIDGETS("ADX4 TX3"),
967 TX_WIDGETS("ADX4 TX4"),
968 WIDGETS("MIXER1 RX1", t186_mixer11_tx
),
969 WIDGETS("MIXER1 RX2", t186_mixer12_tx
),
970 WIDGETS("MIXER1 RX3", t186_mixer13_tx
),
971 WIDGETS("MIXER1 RX4", t186_mixer14_tx
),
972 WIDGETS("MIXER1 RX5", t186_mixer15_tx
),
973 WIDGETS("MIXER1 RX6", t186_mixer16_tx
),
974 WIDGETS("MIXER1 RX7", t186_mixer17_tx
),
975 WIDGETS("MIXER1 RX8", t186_mixer18_tx
),
976 WIDGETS("MIXER1 RX9", t186_mixer19_tx
),
977 WIDGETS("MIXER1 RX10", t186_mixer110_tx
),
978 TX_WIDGETS("MIXER1 TX1"),
979 TX_WIDGETS("MIXER1 TX2"),
980 TX_WIDGETS("MIXER1 TX3"),
981 TX_WIDGETS("MIXER1 TX4"),
982 TX_WIDGETS("MIXER1 TX5"),
983 WIDGETS("ASRC1 RX1", t234_asrc11_tx
),
984 WIDGETS("ASRC1 RX2", t234_asrc12_tx
),
985 WIDGETS("ASRC1 RX3", t234_asrc13_tx
),
986 WIDGETS("ASRC1 RX4", t234_asrc14_tx
),
987 WIDGETS("ASRC1 RX5", t234_asrc15_tx
),
988 WIDGETS("ASRC1 RX6", t234_asrc16_tx
),
989 WIDGETS("ASRC1 RX7", t234_asrc17_tx
),
990 TX_WIDGETS("ASRC1 TX1"),
991 TX_WIDGETS("ASRC1 TX2"),
992 TX_WIDGETS("ASRC1 TX3"),
993 TX_WIDGETS("ASRC1 TX4"),
994 TX_WIDGETS("ASRC1 TX5"),
995 TX_WIDGETS("ASRC1 TX6"),
996 WIDGETS("OPE1", t186_ope1_tx
),
999 #define TEGRA_COMMON_MUX_ROUTES(name) \
1000 { name " XBAR-TX", NULL, name " Mux" }, \
1001 { name " Mux", "ADMAIF1", "ADMAIF1 XBAR-RX" }, \
1002 { name " Mux", "ADMAIF2", "ADMAIF2 XBAR-RX" }, \
1003 { name " Mux", "ADMAIF3", "ADMAIF3 XBAR-RX" }, \
1004 { name " Mux", "ADMAIF4", "ADMAIF4 XBAR-RX" }, \
1005 { name " Mux", "ADMAIF5", "ADMAIF5 XBAR-RX" }, \
1006 { name " Mux", "ADMAIF6", "ADMAIF6 XBAR-RX" }, \
1007 { name " Mux", "ADMAIF7", "ADMAIF7 XBAR-RX" }, \
1008 { name " Mux", "ADMAIF8", "ADMAIF8 XBAR-RX" }, \
1009 { name " Mux", "ADMAIF9", "ADMAIF9 XBAR-RX" }, \
1010 { name " Mux", "ADMAIF10", "ADMAIF10 XBAR-RX" }, \
1011 { name " Mux", "I2S1", "I2S1 XBAR-RX" }, \
1012 { name " Mux", "I2S2", "I2S2 XBAR-RX" }, \
1013 { name " Mux", "I2S3", "I2S3 XBAR-RX" }, \
1014 { name " Mux", "I2S4", "I2S4 XBAR-RX" }, \
1015 { name " Mux", "I2S5", "I2S5 XBAR-RX" }, \
1016 { name " Mux", "DMIC1", "DMIC1 XBAR-RX" }, \
1017 { name " Mux", "DMIC2", "DMIC2 XBAR-RX" }, \
1018 { name " Mux", "DMIC3", "DMIC3 XBAR-RX" }, \
1019 { name " Mux", "SFC1", "SFC1 XBAR-RX" }, \
1020 { name " Mux", "SFC2", "SFC2 XBAR-RX" }, \
1021 { name " Mux", "SFC3", "SFC3 XBAR-RX" }, \
1022 { name " Mux", "SFC4", "SFC4 XBAR-RX" }, \
1023 { name " Mux", "MVC1", "MVC1 XBAR-RX" }, \
1024 { name " Mux", "MVC2", "MVC2 XBAR-RX" }, \
1025 { name " Mux", "AMX1", "AMX1 XBAR-RX" }, \
1026 { name " Mux", "AMX2", "AMX2 XBAR-RX" }, \
1027 { name " Mux", "ADX1 TX1", "ADX1 TX1 XBAR-RX" }, \
1028 { name " Mux", "ADX1 TX2", "ADX1 TX2 XBAR-RX" }, \
1029 { name " Mux", "ADX1 TX3", "ADX1 TX3 XBAR-RX" }, \
1030 { name " Mux", "ADX1 TX4", "ADX1 TX4 XBAR-RX" }, \
1031 { name " Mux", "ADX2 TX1", "ADX2 TX1 XBAR-RX" }, \
1032 { name " Mux", "ADX2 TX2", "ADX2 TX2 XBAR-RX" }, \
1033 { name " Mux", "ADX2 TX3", "ADX2 TX3 XBAR-RX" }, \
1034 { name " Mux", "ADX2 TX4", "ADX2 TX4 XBAR-RX" }, \
1035 { name " Mux", "MIXER1 TX1", "MIXER1 TX1 XBAR-RX" }, \
1036 { name " Mux", "MIXER1 TX2", "MIXER1 TX2 XBAR-RX" }, \
1037 { name " Mux", "MIXER1 TX3", "MIXER1 TX3 XBAR-RX" }, \
1038 { name " Mux", "MIXER1 TX4", "MIXER1 TX4 XBAR-RX" }, \
1039 { name " Mux", "MIXER1 TX5", "MIXER1 TX5 XBAR-RX" }, \
1040 { name " Mux", "OPE1", "OPE1 XBAR-RX" },
1042 #define TEGRA210_ONLY_MUX_ROUTES(name) \
1043 { name " Mux", "OPE2", "OPE2 XBAR-RX" },
1045 #define TEGRA186_ONLY_MUX_ROUTES(name) \
1046 { name " Mux", "ADMAIF11", "ADMAIF11 XBAR-RX" }, \
1047 { name " Mux", "ADMAIF12", "ADMAIF12 XBAR-RX" }, \
1048 { name " Mux", "ADMAIF13", "ADMAIF13 XBAR-RX" }, \
1049 { name " Mux", "ADMAIF14", "ADMAIF14 XBAR-RX" }, \
1050 { name " Mux", "ADMAIF15", "ADMAIF15 XBAR-RX" }, \
1051 { name " Mux", "ADMAIF16", "ADMAIF16 XBAR-RX" }, \
1052 { name " Mux", "ADMAIF17", "ADMAIF17 XBAR-RX" }, \
1053 { name " Mux", "ADMAIF18", "ADMAIF18 XBAR-RX" }, \
1054 { name " Mux", "ADMAIF19", "ADMAIF19 XBAR-RX" }, \
1055 { name " Mux", "ADMAIF20", "ADMAIF20 XBAR-RX" }, \
1056 { name " Mux", "I2S6", "I2S6 XBAR-RX" }, \
1057 { name " Mux", "DMIC4", "DMIC4 XBAR-RX" }, \
1058 { name " Mux", "AMX3", "AMX3 XBAR-RX" }, \
1059 { name " Mux", "AMX4", "AMX4 XBAR-RX" }, \
1060 { name " Mux", "ADX3 TX1", "ADX3 TX1 XBAR-RX" }, \
1061 { name " Mux", "ADX3 TX2", "ADX3 TX2 XBAR-RX" }, \
1062 { name " Mux", "ADX3 TX3", "ADX3 TX3 XBAR-RX" }, \
1063 { name " Mux", "ADX3 TX4", "ADX3 TX4 XBAR-RX" }, \
1064 { name " Mux", "ADX4 TX1", "ADX4 TX1 XBAR-RX" }, \
1065 { name " Mux", "ADX4 TX2", "ADX4 TX2 XBAR-RX" }, \
1066 { name " Mux", "ADX4 TX3", "ADX4 TX3 XBAR-RX" }, \
1067 { name " Mux", "ADX4 TX4", "ADX4 TX4 XBAR-RX" }, \
1068 { name " Mux", "ASRC1 TX1", "ASRC1 TX1 XBAR-RX" }, \
1069 { name " Mux", "ASRC1 TX2", "ASRC1 TX2 XBAR-RX" }, \
1070 { name " Mux", "ASRC1 TX3", "ASRC1 TX3 XBAR-RX" }, \
1071 { name " Mux", "ASRC1 TX4", "ASRC1 TX4 XBAR-RX" }, \
1072 { name " Mux", "ASRC1 TX5", "ASRC1 TX5 XBAR-RX" }, \
1073 { name " Mux", "ASRC1 TX6", "ASRC1 TX6 XBAR-RX" },
1075 #define TEGRA210_MUX_ROUTES(name) \
1076 TEGRA_COMMON_MUX_ROUTES(name) \
1077 TEGRA210_ONLY_MUX_ROUTES(name)
1079 #define TEGRA186_MUX_ROUTES(name) \
1080 TEGRA_COMMON_MUX_ROUTES(name) \
1081 TEGRA186_ONLY_MUX_ROUTES(name)
1083 /* Connect FEs with XBAR */
1084 #define TEGRA_FE_ROUTES(name) \
1085 { name " XBAR-Playback", NULL, name " Playback" }, \
1086 { name " XBAR-RX", NULL, name " XBAR-Playback"}, \
1087 { name " XBAR-Capture", NULL, name " XBAR-TX" }, \
1088 { name " Capture", NULL, name " XBAR-Capture" },
1090 static const struct snd_soc_dapm_route tegra210_ahub_routes
[] = {
1091 TEGRA_FE_ROUTES("ADMAIF1")
1092 TEGRA_FE_ROUTES("ADMAIF2")
1093 TEGRA_FE_ROUTES("ADMAIF3")
1094 TEGRA_FE_ROUTES("ADMAIF4")
1095 TEGRA_FE_ROUTES("ADMAIF5")
1096 TEGRA_FE_ROUTES("ADMAIF6")
1097 TEGRA_FE_ROUTES("ADMAIF7")
1098 TEGRA_FE_ROUTES("ADMAIF8")
1099 TEGRA_FE_ROUTES("ADMAIF9")
1100 TEGRA_FE_ROUTES("ADMAIF10")
1101 TEGRA210_MUX_ROUTES("ADMAIF1")
1102 TEGRA210_MUX_ROUTES("ADMAIF2")
1103 TEGRA210_MUX_ROUTES("ADMAIF3")
1104 TEGRA210_MUX_ROUTES("ADMAIF4")
1105 TEGRA210_MUX_ROUTES("ADMAIF5")
1106 TEGRA210_MUX_ROUTES("ADMAIF6")
1107 TEGRA210_MUX_ROUTES("ADMAIF7")
1108 TEGRA210_MUX_ROUTES("ADMAIF8")
1109 TEGRA210_MUX_ROUTES("ADMAIF9")
1110 TEGRA210_MUX_ROUTES("ADMAIF10")
1111 TEGRA210_MUX_ROUTES("I2S1")
1112 TEGRA210_MUX_ROUTES("I2S2")
1113 TEGRA210_MUX_ROUTES("I2S3")
1114 TEGRA210_MUX_ROUTES("I2S4")
1115 TEGRA210_MUX_ROUTES("I2S5")
1116 TEGRA210_MUX_ROUTES("SFC1")
1117 TEGRA210_MUX_ROUTES("SFC2")
1118 TEGRA210_MUX_ROUTES("SFC3")
1119 TEGRA210_MUX_ROUTES("SFC4")
1120 TEGRA210_MUX_ROUTES("MVC1")
1121 TEGRA210_MUX_ROUTES("MVC2")
1122 TEGRA210_MUX_ROUTES("AMX1 RX1")
1123 TEGRA210_MUX_ROUTES("AMX1 RX2")
1124 TEGRA210_MUX_ROUTES("AMX1 RX3")
1125 TEGRA210_MUX_ROUTES("AMX1 RX4")
1126 TEGRA210_MUX_ROUTES("AMX2 RX1")
1127 TEGRA210_MUX_ROUTES("AMX2 RX2")
1128 TEGRA210_MUX_ROUTES("AMX2 RX3")
1129 TEGRA210_MUX_ROUTES("AMX2 RX4")
1130 TEGRA210_MUX_ROUTES("ADX1")
1131 TEGRA210_MUX_ROUTES("ADX2")
1132 TEGRA210_MUX_ROUTES("MIXER1 RX1")
1133 TEGRA210_MUX_ROUTES("MIXER1 RX2")
1134 TEGRA210_MUX_ROUTES("MIXER1 RX3")
1135 TEGRA210_MUX_ROUTES("MIXER1 RX4")
1136 TEGRA210_MUX_ROUTES("MIXER1 RX5")
1137 TEGRA210_MUX_ROUTES("MIXER1 RX6")
1138 TEGRA210_MUX_ROUTES("MIXER1 RX7")
1139 TEGRA210_MUX_ROUTES("MIXER1 RX8")
1140 TEGRA210_MUX_ROUTES("MIXER1 RX9")
1141 TEGRA210_MUX_ROUTES("MIXER1 RX10")
1142 TEGRA210_MUX_ROUTES("OPE1")
1143 TEGRA210_MUX_ROUTES("OPE2")
1146 static const struct snd_soc_dapm_route tegra186_ahub_routes
[] = {
1147 TEGRA_FE_ROUTES("ADMAIF1")
1148 TEGRA_FE_ROUTES("ADMAIF2")
1149 TEGRA_FE_ROUTES("ADMAIF3")
1150 TEGRA_FE_ROUTES("ADMAIF4")
1151 TEGRA_FE_ROUTES("ADMAIF5")
1152 TEGRA_FE_ROUTES("ADMAIF6")
1153 TEGRA_FE_ROUTES("ADMAIF7")
1154 TEGRA_FE_ROUTES("ADMAIF8")
1155 TEGRA_FE_ROUTES("ADMAIF9")
1156 TEGRA_FE_ROUTES("ADMAIF10")
1157 TEGRA_FE_ROUTES("ADMAIF11")
1158 TEGRA_FE_ROUTES("ADMAIF12")
1159 TEGRA_FE_ROUTES("ADMAIF13")
1160 TEGRA_FE_ROUTES("ADMAIF14")
1161 TEGRA_FE_ROUTES("ADMAIF15")
1162 TEGRA_FE_ROUTES("ADMAIF16")
1163 TEGRA_FE_ROUTES("ADMAIF17")
1164 TEGRA_FE_ROUTES("ADMAIF18")
1165 TEGRA_FE_ROUTES("ADMAIF19")
1166 TEGRA_FE_ROUTES("ADMAIF20")
1167 TEGRA186_MUX_ROUTES("ADMAIF1")
1168 TEGRA186_MUX_ROUTES("ADMAIF2")
1169 TEGRA186_MUX_ROUTES("ADMAIF3")
1170 TEGRA186_MUX_ROUTES("ADMAIF4")
1171 TEGRA186_MUX_ROUTES("ADMAIF5")
1172 TEGRA186_MUX_ROUTES("ADMAIF6")
1173 TEGRA186_MUX_ROUTES("ADMAIF7")
1174 TEGRA186_MUX_ROUTES("ADMAIF8")
1175 TEGRA186_MUX_ROUTES("ADMAIF9")
1176 TEGRA186_MUX_ROUTES("ADMAIF10")
1177 TEGRA186_MUX_ROUTES("ADMAIF11")
1178 TEGRA186_MUX_ROUTES("ADMAIF12")
1179 TEGRA186_MUX_ROUTES("ADMAIF13")
1180 TEGRA186_MUX_ROUTES("ADMAIF14")
1181 TEGRA186_MUX_ROUTES("ADMAIF15")
1182 TEGRA186_MUX_ROUTES("ADMAIF16")
1183 TEGRA186_MUX_ROUTES("ADMAIF17")
1184 TEGRA186_MUX_ROUTES("ADMAIF18")
1185 TEGRA186_MUX_ROUTES("ADMAIF19")
1186 TEGRA186_MUX_ROUTES("ADMAIF20")
1187 TEGRA186_MUX_ROUTES("I2S1")
1188 TEGRA186_MUX_ROUTES("I2S2")
1189 TEGRA186_MUX_ROUTES("I2S3")
1190 TEGRA186_MUX_ROUTES("I2S4")
1191 TEGRA186_MUX_ROUTES("I2S5")
1192 TEGRA186_MUX_ROUTES("I2S6")
1193 TEGRA186_MUX_ROUTES("DSPK1")
1194 TEGRA186_MUX_ROUTES("DSPK2")
1195 TEGRA186_MUX_ROUTES("SFC1")
1196 TEGRA186_MUX_ROUTES("SFC2")
1197 TEGRA186_MUX_ROUTES("SFC3")
1198 TEGRA186_MUX_ROUTES("SFC4")
1199 TEGRA186_MUX_ROUTES("MVC1")
1200 TEGRA186_MUX_ROUTES("MVC2")
1201 TEGRA186_MUX_ROUTES("AMX1 RX1")
1202 TEGRA186_MUX_ROUTES("AMX1 RX2")
1203 TEGRA186_MUX_ROUTES("AMX1 RX3")
1204 TEGRA186_MUX_ROUTES("AMX1 RX4")
1205 TEGRA186_MUX_ROUTES("AMX2 RX1")
1206 TEGRA186_MUX_ROUTES("AMX2 RX2")
1207 TEGRA186_MUX_ROUTES("AMX2 RX3")
1208 TEGRA186_MUX_ROUTES("AMX2 RX4")
1209 TEGRA186_MUX_ROUTES("AMX3 RX1")
1210 TEGRA186_MUX_ROUTES("AMX3 RX2")
1211 TEGRA186_MUX_ROUTES("AMX3 RX3")
1212 TEGRA186_MUX_ROUTES("AMX3 RX4")
1213 TEGRA186_MUX_ROUTES("AMX4 RX1")
1214 TEGRA186_MUX_ROUTES("AMX4 RX2")
1215 TEGRA186_MUX_ROUTES("AMX4 RX3")
1216 TEGRA186_MUX_ROUTES("AMX4 RX4")
1217 TEGRA186_MUX_ROUTES("ADX1")
1218 TEGRA186_MUX_ROUTES("ADX2")
1219 TEGRA186_MUX_ROUTES("ADX3")
1220 TEGRA186_MUX_ROUTES("ADX4")
1221 TEGRA186_MUX_ROUTES("MIXER1 RX1")
1222 TEGRA186_MUX_ROUTES("MIXER1 RX2")
1223 TEGRA186_MUX_ROUTES("MIXER1 RX3")
1224 TEGRA186_MUX_ROUTES("MIXER1 RX4")
1225 TEGRA186_MUX_ROUTES("MIXER1 RX5")
1226 TEGRA186_MUX_ROUTES("MIXER1 RX6")
1227 TEGRA186_MUX_ROUTES("MIXER1 RX7")
1228 TEGRA186_MUX_ROUTES("MIXER1 RX8")
1229 TEGRA186_MUX_ROUTES("MIXER1 RX9")
1230 TEGRA186_MUX_ROUTES("MIXER1 RX10")
1231 TEGRA186_MUX_ROUTES("ASRC1 RX1")
1232 TEGRA186_MUX_ROUTES("ASRC1 RX2")
1233 TEGRA186_MUX_ROUTES("ASRC1 RX3")
1234 TEGRA186_MUX_ROUTES("ASRC1 RX4")
1235 TEGRA186_MUX_ROUTES("ASRC1 RX5")
1236 TEGRA186_MUX_ROUTES("ASRC1 RX6")
1237 TEGRA186_MUX_ROUTES("ASRC1 RX7")
1238 TEGRA186_MUX_ROUTES("OPE1")
1241 static const struct snd_soc_component_driver tegra210_ahub_component
= {
1242 .dapm_widgets
= tegra210_ahub_widgets
,
1243 .num_dapm_widgets
= ARRAY_SIZE(tegra210_ahub_widgets
),
1244 .dapm_routes
= tegra210_ahub_routes
,
1245 .num_dapm_routes
= ARRAY_SIZE(tegra210_ahub_routes
),
1248 static const struct snd_soc_component_driver tegra186_ahub_component
= {
1249 .dapm_widgets
= tegra186_ahub_widgets
,
1250 .num_dapm_widgets
= ARRAY_SIZE(tegra186_ahub_widgets
),
1251 .dapm_routes
= tegra186_ahub_routes
,
1252 .num_dapm_routes
= ARRAY_SIZE(tegra186_ahub_routes
),
1255 static const struct snd_soc_component_driver tegra234_ahub_component
= {
1256 .dapm_widgets
= tegra234_ahub_widgets
,
1257 .num_dapm_widgets
= ARRAY_SIZE(tegra234_ahub_widgets
),
1258 .dapm_routes
= tegra186_ahub_routes
,
1259 .num_dapm_routes
= ARRAY_SIZE(tegra186_ahub_routes
),
1262 static const struct regmap_config tegra210_ahub_regmap_config
= {
1266 .max_register
= TEGRA210_MAX_REGISTER_ADDR
,
1267 .cache_type
= REGCACHE_FLAT
,
1270 static const struct regmap_config tegra186_ahub_regmap_config
= {
1274 .max_register
= TEGRA186_MAX_REGISTER_ADDR
,
1275 .cache_type
= REGCACHE_FLAT
,
1278 static const struct tegra_ahub_soc_data soc_data_tegra210
= {
1279 .cmpnt_drv
= &tegra210_ahub_component
,
1280 .dai_drv
= tegra210_ahub_dais
,
1281 .num_dais
= ARRAY_SIZE(tegra210_ahub_dais
),
1282 .regmap_config
= &tegra210_ahub_regmap_config
,
1283 .mask
[0] = TEGRA210_XBAR_REG_MASK_0
,
1284 .mask
[1] = TEGRA210_XBAR_REG_MASK_1
,
1285 .mask
[2] = TEGRA210_XBAR_REG_MASK_2
,
1286 .mask
[3] = TEGRA210_XBAR_REG_MASK_3
,
1287 .reg_count
= TEGRA210_XBAR_UPDATE_MAX_REG
,
1290 static const struct tegra_ahub_soc_data soc_data_tegra186
= {
1291 .cmpnt_drv
= &tegra186_ahub_component
,
1292 .dai_drv
= tegra186_ahub_dais
,
1293 .num_dais
= ARRAY_SIZE(tegra186_ahub_dais
),
1294 .regmap_config
= &tegra186_ahub_regmap_config
,
1295 .mask
[0] = TEGRA186_XBAR_REG_MASK_0
,
1296 .mask
[1] = TEGRA186_XBAR_REG_MASK_1
,
1297 .mask
[2] = TEGRA186_XBAR_REG_MASK_2
,
1298 .mask
[3] = TEGRA186_XBAR_REG_MASK_3
,
1299 .reg_count
= TEGRA186_XBAR_UPDATE_MAX_REG
,
1302 static const struct tegra_ahub_soc_data soc_data_tegra234
= {
1303 .cmpnt_drv
= &tegra234_ahub_component
,
1304 .dai_drv
= tegra186_ahub_dais
,
1305 .num_dais
= ARRAY_SIZE(tegra186_ahub_dais
),
1306 .regmap_config
= &tegra186_ahub_regmap_config
,
1307 .mask
[0] = TEGRA186_XBAR_REG_MASK_0
,
1308 .mask
[1] = TEGRA186_XBAR_REG_MASK_1
,
1309 .mask
[2] = TEGRA186_XBAR_REG_MASK_2
,
1310 .mask
[3] = TEGRA186_XBAR_REG_MASK_3
,
1311 .reg_count
= TEGRA186_XBAR_UPDATE_MAX_REG
,
1314 static const struct of_device_id tegra_ahub_of_match
[] = {
1315 { .compatible
= "nvidia,tegra210-ahub", .data
= &soc_data_tegra210
},
1316 { .compatible
= "nvidia,tegra186-ahub", .data
= &soc_data_tegra186
},
1317 { .compatible
= "nvidia,tegra234-ahub", .data
= &soc_data_tegra234
},
1320 MODULE_DEVICE_TABLE(of
, tegra_ahub_of_match
);
1322 static int __maybe_unused
tegra_ahub_runtime_suspend(struct device
*dev
)
1324 struct tegra_ahub
*ahub
= dev_get_drvdata(dev
);
1326 regcache_cache_only(ahub
->regmap
, true);
1327 regcache_mark_dirty(ahub
->regmap
);
1329 clk_disable_unprepare(ahub
->clk
);
1334 static int __maybe_unused
tegra_ahub_runtime_resume(struct device
*dev
)
1336 struct tegra_ahub
*ahub
= dev_get_drvdata(dev
);
1339 err
= clk_prepare_enable(ahub
->clk
);
1341 dev_err(dev
, "failed to enable AHUB clock, err: %d\n", err
);
1345 regcache_cache_only(ahub
->regmap
, false);
1346 regcache_sync(ahub
->regmap
);
1351 static int tegra_ahub_probe(struct platform_device
*pdev
)
1353 struct tegra_ahub
*ahub
;
1357 ahub
= devm_kzalloc(&pdev
->dev
, sizeof(*ahub
), GFP_KERNEL
);
1361 ahub
->soc_data
= of_device_get_match_data(&pdev
->dev
);
1363 platform_set_drvdata(pdev
, ahub
);
1365 ahub
->clk
= devm_clk_get(&pdev
->dev
, "ahub");
1366 if (IS_ERR(ahub
->clk
)) {
1367 dev_err(&pdev
->dev
, "can't retrieve AHUB clock\n");
1368 return PTR_ERR(ahub
->clk
);
1371 regs
= devm_platform_ioremap_resource(pdev
, 0);
1373 return PTR_ERR(regs
);
1375 ahub
->regmap
= devm_regmap_init_mmio(&pdev
->dev
, regs
,
1376 ahub
->soc_data
->regmap_config
);
1377 if (IS_ERR(ahub
->regmap
)) {
1378 dev_err(&pdev
->dev
, "regmap init failed\n");
1379 return PTR_ERR(ahub
->regmap
);
1382 regcache_cache_only(ahub
->regmap
, true);
1384 err
= devm_snd_soc_register_component(&pdev
->dev
,
1385 ahub
->soc_data
->cmpnt_drv
,
1386 ahub
->soc_data
->dai_drv
,
1387 ahub
->soc_data
->num_dais
);
1389 dev_err(&pdev
->dev
, "can't register AHUB component, err: %d\n",
1394 pm_runtime_enable(&pdev
->dev
);
1396 err
= of_platform_populate(pdev
->dev
.of_node
, NULL
, NULL
, &pdev
->dev
);
1398 pm_runtime_disable(&pdev
->dev
);
1405 static void tegra_ahub_remove(struct platform_device
*pdev
)
1407 pm_runtime_disable(&pdev
->dev
);
1410 static const struct dev_pm_ops tegra_ahub_pm_ops
= {
1411 SET_RUNTIME_PM_OPS(tegra_ahub_runtime_suspend
,
1412 tegra_ahub_runtime_resume
, NULL
)
1413 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
,
1414 pm_runtime_force_resume
)
1417 static struct platform_driver tegra_ahub_driver
= {
1418 .probe
= tegra_ahub_probe
,
1419 .remove
= tegra_ahub_remove
,
1421 .name
= "tegra210-ahub",
1422 .of_match_table
= tegra_ahub_of_match
,
1423 .pm
= &tegra_ahub_pm_ops
,
1426 module_platform_driver(tegra_ahub_driver
);
1428 MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");
1429 MODULE_AUTHOR("Mohan Kumar <mkumard@nvidia.com>");
1430 MODULE_DESCRIPTION("Tegra210 ASoC AHUB driver");
1431 MODULE_LICENSE("GPL v2");