25
25
26
26
#define CH_RX_REG (reg , id ) CH_REG(admaif->soc_data->rx_base, reg, id)
27
27
28
- #define REG_DEFAULTS (id , rx_ctrl , tx_ctrl , tx_base , rx_base ) \
28
+ #define REG_DEFAULTS (id , rx_ctrl , tx_ctrl , tx_base , rx_base , cif_ctrl ) \
29
29
{ CH_REG(rx_base, TEGRA_ADMAIF_RX_INT_MASK, id), 0x00000001 }, \
30
- { CH_REG(rx_base, TEGRA_ADMAIF_CH_ACIF_RX_CTRL, id), 0x00007700 }, \
30
+ { CH_REG(rx_base, TEGRA_ADMAIF_CH_ACIF_RX_CTRL, id), cif_ctrl }, \
31
31
{ CH_REG(rx_base, TEGRA_ADMAIF_RX_FIFO_CTRL, id), rx_ctrl }, \
32
32
{ CH_REG(tx_base, TEGRA_ADMAIF_TX_INT_MASK, id), 0x00000001 }, \
33
- { CH_REG(tx_base, TEGRA_ADMAIF_CH_ACIF_TX_CTRL, id), 0x00007700 }, \
33
+ { CH_REG(tx_base, TEGRA_ADMAIF_CH_ACIF_TX_CTRL, id), cif_ctrl }, \
34
34
{ CH_REG(tx_base, TEGRA_ADMAIF_TX_FIFO_CTRL, id), tx_ctrl }
35
35
36
36
#define ADMAIF_REG_DEFAULTS (id , chip ) \
37
37
REG_DEFAULTS((id) - 1, \
38
38
chip ## _ADMAIF_RX ## id ## _FIFO_CTRL_REG_DEFAULT, \
39
39
chip ## _ADMAIF_TX ## id ## _FIFO_CTRL_REG_DEFAULT, \
40
40
chip ## _ADMAIF_TX_BASE, \
41
- chip ## _ADMAIF_RX_BASE)
41
+ chip ## _ADMAIF_RX_BASE, \
42
+ chip ## _ADMAIF_CIF_REG_DEFAULT)
42
43
43
44
static const struct reg_default tegra186_admaif_reg_defaults [] = {
44
45
{(TEGRA_ADMAIF_GLOBAL_CG_0 + TEGRA186_ADMAIF_GLOBAL_BASE ), 0x00000003 },
@@ -78,6 +79,42 @@ static const struct reg_default tegra210_admaif_reg_defaults[] = {
78
79
ADMAIF_REG_DEFAULTS (10 , TEGRA210 )
79
80
};
80
81
82
+ static const struct reg_default tegra264_admaif_reg_defaults [] = {
83
+ {(TEGRA_ADMAIF_GLOBAL_CG_0 + TEGRA264_ADMAIF_GLOBAL_BASE ), 0x00000003 },
84
+ ADMAIF_REG_DEFAULTS (1 , TEGRA264 ),
85
+ ADMAIF_REG_DEFAULTS (2 , TEGRA264 ),
86
+ ADMAIF_REG_DEFAULTS (3 , TEGRA264 ),
87
+ ADMAIF_REG_DEFAULTS (4 , TEGRA264 ),
88
+ ADMAIF_REG_DEFAULTS (5 , TEGRA264 ),
89
+ ADMAIF_REG_DEFAULTS (6 , TEGRA264 ),
90
+ ADMAIF_REG_DEFAULTS (7 , TEGRA264 ),
91
+ ADMAIF_REG_DEFAULTS (8 , TEGRA264 ),
92
+ ADMAIF_REG_DEFAULTS (9 , TEGRA264 ),
93
+ ADMAIF_REG_DEFAULTS (10 , TEGRA264 ),
94
+ ADMAIF_REG_DEFAULTS (11 , TEGRA264 ),
95
+ ADMAIF_REG_DEFAULTS (12 , TEGRA264 ),
96
+ ADMAIF_REG_DEFAULTS (13 , TEGRA264 ),
97
+ ADMAIF_REG_DEFAULTS (14 , TEGRA264 ),
98
+ ADMAIF_REG_DEFAULTS (15 , TEGRA264 ),
99
+ ADMAIF_REG_DEFAULTS (16 , TEGRA264 ),
100
+ ADMAIF_REG_DEFAULTS (17 , TEGRA264 ),
101
+ ADMAIF_REG_DEFAULTS (18 , TEGRA264 ),
102
+ ADMAIF_REG_DEFAULTS (19 , TEGRA264 ),
103
+ ADMAIF_REG_DEFAULTS (20 , TEGRA264 ),
104
+ ADMAIF_REG_DEFAULTS (21 , TEGRA264 ),
105
+ ADMAIF_REG_DEFAULTS (22 , TEGRA264 ),
106
+ ADMAIF_REG_DEFAULTS (23 , TEGRA264 ),
107
+ ADMAIF_REG_DEFAULTS (24 , TEGRA264 ),
108
+ ADMAIF_REG_DEFAULTS (25 , TEGRA264 ),
109
+ ADMAIF_REG_DEFAULTS (26 , TEGRA264 ),
110
+ ADMAIF_REG_DEFAULTS (27 , TEGRA264 ),
111
+ ADMAIF_REG_DEFAULTS (28 , TEGRA264 ),
112
+ ADMAIF_REG_DEFAULTS (29 , TEGRA264 ),
113
+ ADMAIF_REG_DEFAULTS (30 , TEGRA264 ),
114
+ ADMAIF_REG_DEFAULTS (31 , TEGRA264 ),
115
+ ADMAIF_REG_DEFAULTS (32 , TEGRA264 )
116
+ };
117
+
81
118
static bool tegra_admaif_wr_reg (struct device * dev , unsigned int reg )
82
119
{
83
120
struct tegra_admaif * admaif = dev_get_drvdata (dev );
@@ -220,6 +257,19 @@ static const struct regmap_config tegra186_admaif_regmap_config = {
220
257
.cache_type = REGCACHE_FLAT ,
221
258
};
222
259
260
+ static const struct regmap_config tegra264_admaif_regmap_config = {
261
+ .reg_bits = 32 ,
262
+ .reg_stride = 4 ,
263
+ .val_bits = 32 ,
264
+ .max_register = TEGRA264_ADMAIF_LAST_REG ,
265
+ .writeable_reg = tegra_admaif_wr_reg ,
266
+ .readable_reg = tegra_admaif_rd_reg ,
267
+ .volatile_reg = tegra_admaif_volatile_reg ,
268
+ .reg_defaults = tegra264_admaif_reg_defaults ,
269
+ .num_reg_defaults = TEGRA264_ADMAIF_CHANNEL_COUNT * 6 + 1 ,
270
+ .cache_type = REGCACHE_FLAT ,
271
+ };
272
+
223
273
static int tegra_admaif_runtime_suspend (struct device * dev )
224
274
{
225
275
struct tegra_admaif * admaif = dev_get_drvdata (dev );
@@ -330,7 +380,10 @@ static int tegra_admaif_hw_params(struct snd_pcm_substream *substream,
330
380
331
381
tegra_admaif_set_pack_mode (admaif -> regmap , reg , valid_bit );
332
382
333
- tegra_set_cif (admaif -> regmap , reg , & cif_conf );
383
+ if (admaif -> soc_data -> max_stream_ch == TEGRA264_ADMAIF_MAX_CHANNEL )
384
+ tegra264_set_cif (admaif -> regmap , reg , & cif_conf );
385
+ else
386
+ tegra_set_cif (admaif -> regmap , reg , & cif_conf );
334
387
335
388
return 0 ;
336
389
}
@@ -571,13 +624,13 @@ static const struct snd_soc_dai_ops tegra_admaif_dai_ops = {
571
624
.prepare = tegra_admaif_prepare ,
572
625
};
573
626
574
- #define DAI (dai_name ) \
627
+ #define DAI (dai_name , channel ) \
575
628
{ \
576
629
.name = dai_name, \
577
630
.playback = { \
578
631
.stream_name = dai_name " Playback", \
579
632
.channels_min = 1, \
580
- .channels_max = 16, \
633
+ .channels_max = channel, \
581
634
.rates = SNDRV_PCM_RATE_8000_192000, \
582
635
.formats = SNDRV_PCM_FMTBIT_S8 | \
583
636
SNDRV_PCM_FMTBIT_S16_LE | \
@@ -587,7 +640,7 @@ static const struct snd_soc_dai_ops tegra_admaif_dai_ops = {
587
640
.capture = { \
588
641
.stream_name = dai_name " Capture", \
589
642
.channels_min = 1, \
590
- .channels_max = 16, \
643
+ .channels_max = channel, \
591
644
.rates = SNDRV_PCM_RATE_8000_192000, \
592
645
.formats = SNDRV_PCM_FMTBIT_S8 | \
593
646
SNDRV_PCM_FMTBIT_S16_LE | \
@@ -598,39 +651,74 @@ static const struct snd_soc_dai_ops tegra_admaif_dai_ops = {
598
651
}
599
652
600
653
static struct snd_soc_dai_driver tegra210_admaif_cmpnt_dais [] = {
601
- DAI ("ADMAIF1" ),
602
- DAI ("ADMAIF2" ),
603
- DAI ("ADMAIF3" ),
604
- DAI ("ADMAIF4" ),
605
- DAI ("ADMAIF5" ),
606
- DAI ("ADMAIF6" ),
607
- DAI ("ADMAIF7" ),
608
- DAI ("ADMAIF8" ),
609
- DAI ("ADMAIF9" ),
610
- DAI ("ADMAIF10" ),
654
+ DAI ("ADMAIF1" , TEGRA210_ADMAIF_MAX_CHANNEL ),
655
+ DAI ("ADMAIF2" , TEGRA210_ADMAIF_MAX_CHANNEL ),
656
+ DAI ("ADMAIF3" , TEGRA210_ADMAIF_MAX_CHANNEL ),
657
+ DAI ("ADMAIF4" , TEGRA210_ADMAIF_MAX_CHANNEL ),
658
+ DAI ("ADMAIF5" , TEGRA210_ADMAIF_MAX_CHANNEL ),
659
+ DAI ("ADMAIF6" , TEGRA210_ADMAIF_MAX_CHANNEL ),
660
+ DAI ("ADMAIF7" , TEGRA210_ADMAIF_MAX_CHANNEL ),
661
+ DAI ("ADMAIF8" , TEGRA210_ADMAIF_MAX_CHANNEL ),
662
+ DAI ("ADMAIF9" , TEGRA210_ADMAIF_MAX_CHANNEL ),
663
+ DAI ("ADMAIF10" , TEGRA210_ADMAIF_MAX_CHANNEL ),
611
664
};
612
665
613
666
static struct snd_soc_dai_driver tegra186_admaif_cmpnt_dais [] = {
614
- DAI ("ADMAIF1" ),
615
- DAI ("ADMAIF2" ),
616
- DAI ("ADMAIF3" ),
617
- DAI ("ADMAIF4" ),
618
- DAI ("ADMAIF5" ),
619
- DAI ("ADMAIF6" ),
620
- DAI ("ADMAIF7" ),
621
- DAI ("ADMAIF8" ),
622
- DAI ("ADMAIF9" ),
623
- DAI ("ADMAIF10" ),
624
- DAI ("ADMAIF11" ),
625
- DAI ("ADMAIF12" ),
626
- DAI ("ADMAIF13" ),
627
- DAI ("ADMAIF14" ),
628
- DAI ("ADMAIF15" ),
629
- DAI ("ADMAIF16" ),
630
- DAI ("ADMAIF17" ),
631
- DAI ("ADMAIF18" ),
632
- DAI ("ADMAIF19" ),
633
- DAI ("ADMAIF20" ),
667
+ DAI ("ADMAIF1" , TEGRA186_ADMAIF_MAX_CHANNEL ),
668
+ DAI ("ADMAIF2" , TEGRA186_ADMAIF_MAX_CHANNEL ),
669
+ DAI ("ADMAIF3" , TEGRA186_ADMAIF_MAX_CHANNEL ),
670
+ DAI ("ADMAIF4" , TEGRA186_ADMAIF_MAX_CHANNEL ),
671
+ DAI ("ADMAIF5" , TEGRA186_ADMAIF_MAX_CHANNEL ),
672
+ DAI ("ADMAIF6" , TEGRA186_ADMAIF_MAX_CHANNEL ),
673
+ DAI ("ADMAIF7" , TEGRA186_ADMAIF_MAX_CHANNEL ),
674
+ DAI ("ADMAIF8" , TEGRA186_ADMAIF_MAX_CHANNEL ),
675
+ DAI ("ADMAIF9" , TEGRA186_ADMAIF_MAX_CHANNEL ),
676
+ DAI ("ADMAIF10" , TEGRA186_ADMAIF_MAX_CHANNEL ),
677
+ DAI ("ADMAIF11" , TEGRA186_ADMAIF_MAX_CHANNEL ),
678
+ DAI ("ADMAIF12" , TEGRA186_ADMAIF_MAX_CHANNEL ),
679
+ DAI ("ADMAIF13" , TEGRA186_ADMAIF_MAX_CHANNEL ),
680
+ DAI ("ADMAIF14" , TEGRA186_ADMAIF_MAX_CHANNEL ),
681
+ DAI ("ADMAIF15" , TEGRA186_ADMAIF_MAX_CHANNEL ),
682
+ DAI ("ADMAIF16" , TEGRA186_ADMAIF_MAX_CHANNEL ),
683
+ DAI ("ADMAIF17" , TEGRA186_ADMAIF_MAX_CHANNEL ),
684
+ DAI ("ADMAIF18" , TEGRA186_ADMAIF_MAX_CHANNEL ),
685
+ DAI ("ADMAIF19" , TEGRA186_ADMAIF_MAX_CHANNEL ),
686
+ DAI ("ADMAIF20" , TEGRA186_ADMAIF_MAX_CHANNEL ),
687
+ };
688
+
689
+ static struct snd_soc_dai_driver tegra264_admaif_cmpnt_dais [] = {
690
+ DAI ("ADMAIF1" , TEGRA264_ADMAIF_MAX_CHANNEL ),
691
+ DAI ("ADMAIF2" , TEGRA264_ADMAIF_MAX_CHANNEL ),
692
+ DAI ("ADMAIF3" , TEGRA264_ADMAIF_MAX_CHANNEL ),
693
+ DAI ("ADMAIF4" , TEGRA264_ADMAIF_MAX_CHANNEL ),
694
+ DAI ("ADMAIF5" , TEGRA264_ADMAIF_MAX_CHANNEL ),
695
+ DAI ("ADMAIF6" , TEGRA264_ADMAIF_MAX_CHANNEL ),
696
+ DAI ("ADMAIF7" , TEGRA264_ADMAIF_MAX_CHANNEL ),
697
+ DAI ("ADMAIF8" , TEGRA264_ADMAIF_MAX_CHANNEL ),
698
+ DAI ("ADMAIF9" , TEGRA264_ADMAIF_MAX_CHANNEL ),
699
+ DAI ("ADMAIF10" , TEGRA264_ADMAIF_MAX_CHANNEL ),
700
+ DAI ("ADMAIF11" , TEGRA264_ADMAIF_MAX_CHANNEL ),
701
+ DAI ("ADMAIF12" , TEGRA264_ADMAIF_MAX_CHANNEL ),
702
+ DAI ("ADMAIF13" , TEGRA264_ADMAIF_MAX_CHANNEL ),
703
+ DAI ("ADMAIF14" , TEGRA264_ADMAIF_MAX_CHANNEL ),
704
+ DAI ("ADMAIF15" , TEGRA264_ADMAIF_MAX_CHANNEL ),
705
+ DAI ("ADMAIF16" , TEGRA264_ADMAIF_MAX_CHANNEL ),
706
+ DAI ("ADMAIF17" , TEGRA264_ADMAIF_MAX_CHANNEL ),
707
+ DAI ("ADMAIF18" , TEGRA264_ADMAIF_MAX_CHANNEL ),
708
+ DAI ("ADMAIF19" , TEGRA264_ADMAIF_MAX_CHANNEL ),
709
+ DAI ("ADMAIF20" , TEGRA264_ADMAIF_MAX_CHANNEL ),
710
+ DAI ("ADMAIF21" , TEGRA264_ADMAIF_MAX_CHANNEL ),
711
+ DAI ("ADMAIF22" , TEGRA264_ADMAIF_MAX_CHANNEL ),
712
+ DAI ("ADMAIF23" , TEGRA264_ADMAIF_MAX_CHANNEL ),
713
+ DAI ("ADMAIF24" , TEGRA264_ADMAIF_MAX_CHANNEL ),
714
+ DAI ("ADMAIF25" , TEGRA264_ADMAIF_MAX_CHANNEL ),
715
+ DAI ("ADMAIF26" , TEGRA264_ADMAIF_MAX_CHANNEL ),
716
+ DAI ("ADMAIF27" , TEGRA264_ADMAIF_MAX_CHANNEL ),
717
+ DAI ("ADMAIF28" , TEGRA264_ADMAIF_MAX_CHANNEL ),
718
+ DAI ("ADMAIF29" , TEGRA264_ADMAIF_MAX_CHANNEL ),
719
+ DAI ("ADMAIF30" , TEGRA264_ADMAIF_MAX_CHANNEL ),
720
+ DAI ("ADMAIF31" , TEGRA264_ADMAIF_MAX_CHANNEL ),
721
+ DAI ("ADMAIF32" , TEGRA264_ADMAIF_MAX_CHANNEL ),
634
722
};
635
723
636
724
static const char * const tegra_admaif_stereo_conv_text [] = {
@@ -710,6 +798,41 @@ static struct snd_kcontrol_new tegra186_admaif_controls[] = {
710
798
TEGRA_ADMAIF_CIF_CTRL (20 ),
711
799
};
712
800
801
+ static struct snd_kcontrol_new tegra264_admaif_controls [] = {
802
+ TEGRA_ADMAIF_CIF_CTRL (1 ),
803
+ TEGRA_ADMAIF_CIF_CTRL (2 ),
804
+ TEGRA_ADMAIF_CIF_CTRL (3 ),
805
+ TEGRA_ADMAIF_CIF_CTRL (4 ),
806
+ TEGRA_ADMAIF_CIF_CTRL (5 ),
807
+ TEGRA_ADMAIF_CIF_CTRL (6 ),
808
+ TEGRA_ADMAIF_CIF_CTRL (7 ),
809
+ TEGRA_ADMAIF_CIF_CTRL (8 ),
810
+ TEGRA_ADMAIF_CIF_CTRL (9 ),
811
+ TEGRA_ADMAIF_CIF_CTRL (10 ),
812
+ TEGRA_ADMAIF_CIF_CTRL (11 ),
813
+ TEGRA_ADMAIF_CIF_CTRL (12 ),
814
+ TEGRA_ADMAIF_CIF_CTRL (13 ),
815
+ TEGRA_ADMAIF_CIF_CTRL (14 ),
816
+ TEGRA_ADMAIF_CIF_CTRL (15 ),
817
+ TEGRA_ADMAIF_CIF_CTRL (16 ),
818
+ TEGRA_ADMAIF_CIF_CTRL (17 ),
819
+ TEGRA_ADMAIF_CIF_CTRL (18 ),
820
+ TEGRA_ADMAIF_CIF_CTRL (19 ),
821
+ TEGRA_ADMAIF_CIF_CTRL (20 ),
822
+ TEGRA_ADMAIF_CIF_CTRL (21 ),
823
+ TEGRA_ADMAIF_CIF_CTRL (22 ),
824
+ TEGRA_ADMAIF_CIF_CTRL (23 ),
825
+ TEGRA_ADMAIF_CIF_CTRL (24 ),
826
+ TEGRA_ADMAIF_CIF_CTRL (25 ),
827
+ TEGRA_ADMAIF_CIF_CTRL (26 ),
828
+ TEGRA_ADMAIF_CIF_CTRL (27 ),
829
+ TEGRA_ADMAIF_CIF_CTRL (28 ),
830
+ TEGRA_ADMAIF_CIF_CTRL (29 ),
831
+ TEGRA_ADMAIF_CIF_CTRL (30 ),
832
+ TEGRA_ADMAIF_CIF_CTRL (31 ),
833
+ TEGRA_ADMAIF_CIF_CTRL (32 ),
834
+ };
835
+
713
836
static const struct snd_soc_component_driver tegra210_admaif_cmpnt = {
714
837
.controls = tegra210_admaif_controls ,
715
838
.num_controls = ARRAY_SIZE (tegra210_admaif_controls ),
@@ -730,8 +853,19 @@ static const struct snd_soc_component_driver tegra186_admaif_cmpnt = {
730
853
.pointer = tegra_pcm_pointer ,
731
854
};
732
855
856
+ static const struct snd_soc_component_driver tegra264_admaif_cmpnt = {
857
+ .controls = tegra264_admaif_controls ,
858
+ .num_controls = ARRAY_SIZE (tegra264_admaif_controls ),
859
+ .pcm_construct = tegra_pcm_construct ,
860
+ .open = tegra_pcm_open ,
861
+ .close = tegra_pcm_close ,
862
+ .hw_params = tegra_pcm_hw_params ,
863
+ .pointer = tegra_pcm_pointer ,
864
+ };
865
+
733
866
static const struct tegra_admaif_soc_data soc_data_tegra210 = {
734
867
.num_ch = TEGRA210_ADMAIF_CHANNEL_COUNT ,
868
+ .max_stream_ch = TEGRA210_ADMAIF_MAX_CHANNEL ,
735
869
.cmpnt = & tegra210_admaif_cmpnt ,
736
870
.dais = tegra210_admaif_cmpnt_dais ,
737
871
.regmap_conf = & tegra210_admaif_regmap_config ,
@@ -742,6 +876,7 @@ static const struct tegra_admaif_soc_data soc_data_tegra210 = {
742
876
743
877
static const struct tegra_admaif_soc_data soc_data_tegra186 = {
744
878
.num_ch = TEGRA186_ADMAIF_CHANNEL_COUNT ,
879
+ .max_stream_ch = TEGRA186_ADMAIF_MAX_CHANNEL ,
745
880
.cmpnt = & tegra186_admaif_cmpnt ,
746
881
.dais = tegra186_admaif_cmpnt_dais ,
747
882
.regmap_conf = & tegra186_admaif_regmap_config ,
@@ -750,9 +885,21 @@ static const struct tegra_admaif_soc_data soc_data_tegra186 = {
750
885
.rx_base = TEGRA186_ADMAIF_RX_BASE ,
751
886
};
752
887
888
+ static const struct tegra_admaif_soc_data soc_data_tegra264 = {
889
+ .num_ch = TEGRA264_ADMAIF_CHANNEL_COUNT ,
890
+ .max_stream_ch = TEGRA264_ADMAIF_MAX_CHANNEL ,
891
+ .cmpnt = & tegra264_admaif_cmpnt ,
892
+ .dais = tegra264_admaif_cmpnt_dais ,
893
+ .regmap_conf = & tegra264_admaif_regmap_config ,
894
+ .global_base = TEGRA264_ADMAIF_GLOBAL_BASE ,
895
+ .tx_base = TEGRA264_ADMAIF_TX_BASE ,
896
+ .rx_base = TEGRA264_ADMAIF_RX_BASE ,
897
+ };
898
+
753
899
static const struct of_device_id tegra_admaif_of_match [] = {
754
900
{ .compatible = "nvidia,tegra210-admaif" , .data = & soc_data_tegra210 },
755
901
{ .compatible = "nvidia,tegra186-admaif" , .data = & soc_data_tegra186 },
902
+ { .compatible = "nvidia,tegra264-admaif" , .data = & soc_data_tegra264 },
756
903
{},
757
904
};
758
905
MODULE_DEVICE_TABLE (of , tegra_admaif_of_match );
0 commit comments