@@ -94,17 +94,17 @@ static const struct pll_div ac108_pll_div_list[] = {
94
94
{ 800000 , _FREQ_24_576K , 0 , 0 , 614 , 9 , 1 },
95
95
{ 1024000 , _FREQ_24_576K , 0 , 0 , 480 , 9 , 1 }, //_FREQ_24_576K/24
96
96
{ 1600000 , _FREQ_24_576K , 0 , 0 , 307 , 9 , 1 },
97
- { 2048000 , _FREQ_24_576K , 0 , 0 , 240 , 9 , 1 }, //_FREQ_24_576K/12
98
- { 3072000 , _FREQ_24_576K , 0 , 0 , 160 , 9 , 1 }, //_FREQ_24_576K/8
99
- { 4096000 , _FREQ_24_576K , 2 , 0 , 360 , 9 , 1 }, //_FREQ_24_576K/6
97
+ { 2048000 , _FREQ_24_576K , 0 , 0 , 240 , 9 , 1 }, /* accurate, 8000 * 256 */
98
+ { 3072000 , _FREQ_24_576K , 0 , 0 , 160 , 9 , 1 }, /* accurate, 12000 * 256 */
99
+ { 4096000 , _FREQ_24_576K , 2 , 0 , 360 , 9 , 1 }, /* accurate, 16000 * 256 */
100
100
{ 6000000 , _FREQ_24_576K , 4 , 0 , 410 , 9 , 1 },
101
101
{ 12000000 , _FREQ_24_576K , 9 , 0 , 410 , 9 , 1 },
102
102
{ 13000000 , _FREQ_24_576K , 8 , 0 , 340 , 9 , 1 },
103
103
{ 15360000 , _FREQ_24_576K , 12 , 0 , 415 , 9 , 1 },
104
104
{ 16000000 , _FREQ_24_576K , 12 , 0 , 400 , 9 , 1 },
105
105
{ 19200000 , _FREQ_24_576K , 15 , 0 , 410 , 9 , 1 },
106
106
{ 19680000 , _FREQ_24_576K , 15 , 0 , 400 , 9 , 1 },
107
- { 24000000 , _FREQ_24_576K , 4 , 0 , 128 ,24 , 0 }, //accurate
107
+ { 24000000 , _FREQ_24_576K , 4 , 0 , 128 ,24 , 0 }, // accurate, 24M -> 24.576M */
108
108
109
109
{ 400000 , _FREQ_22_579K , 0 , 0 , 566 , 4 , 1 },
110
110
{ 512000 , _FREQ_22_579K , 0 , 0 , 880 , 9 , 1 },
@@ -122,13 +122,12 @@ static const struct pll_div ac108_pll_div_list[] = {
122
122
{ 16000000 , _FREQ_22_579K , 11 , 0 , 340 , 9 , 1 },
123
123
{ 19200000 , _FREQ_22_579K , 13 , 0 , 330 , 9 , 1 },
124
124
{ 19680000 , _FREQ_22_579K , 14 , 0 , 345 , 9 , 1 },
125
- { 24000000 , _FREQ_22_579K , 24 , 0 , 588 ,24 , 0 }, // accurate
125
+ { 24000000 , _FREQ_22_579K , 24 , 0 , 588 ,24 , 0 }, // accurate, 24M -> 22.5792M */
126
126
127
- { 12288000 , _FREQ_24_576K , 9 , 0 , 400 , 9 , 1 }, //_FREQ_24_576K/2
128
- { 11289600 , _FREQ_22_579K , 9 , 0 , 400 , 9 , 1 }, //_FREQ_22_579K/2
129
127
130
128
{ _FREQ_24_576K / 1 , _FREQ_24_576K , 9 , 0 , 200 , 9 , 1 }, //_FREQ_24_576K
131
- { _FREQ_24_576K / 4 , _FREQ_24_576K , 4 , 0 , 400 , 9 , 1 }, //6144000
129
+ { _FREQ_24_576K / 2 , _FREQ_24_576K , 9 , 0 , 400 , 9 , 1 }, /*12288000,accurate, 48000 * 256 */
130
+ { _FREQ_24_576K / 4 , _FREQ_24_576K , 4 , 0 , 400 , 9 , 1 }, /*6144000, accurate, 24000 * 256 */
132
131
{ _FREQ_24_576K / 16 , _FREQ_24_576K , 0 , 0 , 320 , 9 , 1 }, //1536000
133
132
{ _FREQ_24_576K / 64 , _FREQ_24_576K , 0 , 0 , 640 , 4 , 1 }, //384000
134
133
{ _FREQ_24_576K / 96 , _FREQ_24_576K , 0 , 0 , 960 , 4 , 1 }, //256000
@@ -137,7 +136,8 @@ static const struct pll_div ac108_pll_div_list[] = {
137
136
{ _FREQ_24_576K / 192 , _FREQ_24_576K , 0 , 0 , 960 , 4 , 0 }, //128000
138
137
139
138
{ _FREQ_22_579K / 1 , _FREQ_22_579K , 9 , 0 , 200 , 9 , 1 }, //_FREQ_22_579K
140
- { _FREQ_22_579K / 4 , _FREQ_22_579K , 4 , 0 , 400 , 9 , 1 }, //5644800
139
+ { _FREQ_22_579K / 2 , _FREQ_22_579K , 9 , 0 , 400 , 9 , 1 }, /*11289600,accurate, 44100 * 256 */
140
+ { _FREQ_22_579K / 4 , _FREQ_22_579K , 4 , 0 , 400 , 9 , 1 }, /*5644800, accurate, 22050 * 256 */
141
141
{ _FREQ_22_579K / 16 , _FREQ_22_579K , 0 , 0 , 320 , 9 , 1 }, //1411200
142
142
{ _FREQ_22_579K / 64 , _FREQ_22_579K , 0 , 0 , 640 , 4 , 1 }, //352800
143
143
{ _FREQ_22_579K / 96 , _FREQ_22_579K , 0 , 0 , 960 , 4 , 1 }, //235200
@@ -146,7 +146,7 @@ static const struct pll_div ac108_pll_div_list[] = {
146
146
{ _FREQ_22_579K / 192 , _FREQ_22_579K , 0 , 0 , 960 , 4 , 0 }, //117600
147
147
148
148
{ _FREQ_22_579K / 6 , _FREQ_22_579K , 2 , 0 , 360 , 9 , 1 }, //3763200
149
- { _FREQ_22_579K / 8 , _FREQ_22_579K , 0 , 0 , 160 , 9 , 1 }, // 2822400
149
+ { _FREQ_22_579K / 8 , _FREQ_22_579K , 0 , 0 , 160 , 9 , 1 }, /* 2822400, accurate, 11025 * 256 */
150
150
{ _FREQ_22_579K / 12 , _FREQ_22_579K , 0 , 0 , 240 , 9 , 1 }, //1881600
151
151
{ _FREQ_22_579K / 24 , _FREQ_22_579K , 0 , 0 , 480 , 9 , 1 }, //940800
152
152
{ _FREQ_22_579K / 32 , _FREQ_22_579K , 0 , 0 , 640 , 9 , 1 }, //705600
@@ -510,14 +510,26 @@ static void ac108_configure_power(struct ac10x_priv *ac10x) {
510
510
*
511
511
* @return int : fail or success
512
512
*/
513
- static int ac108_configure_clocking (struct ac10x_priv * ac10x , unsigned int rate ) {
513
+ static int ac108_config_pll (struct ac10x_priv * ac10x , unsigned rate , unsigned lrck_ratio ) {
514
514
unsigned int i = 0 ;
515
515
struct pll_div ac108_pll_div = { 0 };
516
516
517
517
if (ac10x -> clk_id == SYSCLK_SRC_PLL ) {
518
+ unsigned pll_src , pll_freq_in ;
519
+
520
+ if (lrck_ratio == 0 ) {
521
+ /* PLL clock source from MCLK */
522
+ pll_freq_in = ac10x -> sysclk ;
523
+ pll_src = 0x0 ;
524
+ } else {
525
+ /* PLL clock source from BCLK */
526
+ pll_freq_in = rate * lrck_ratio ;
527
+ pll_src = 0x1 ;
528
+ }
529
+
518
530
/* FOUT =(FIN * N) / [(M1+1) * (M2+1)*(K1+1)*(K2+1)] */
519
531
for (i = 0 ; i < ARRAY_SIZE (ac108_pll_div_list ); i ++ ) {
520
- if (ac108_pll_div_list [i ].freq_in == ac10x -> sysclk && ac108_pll_div_list [i ].freq_out % rate == 0 ) {
532
+ if (ac108_pll_div_list [i ].freq_in == pll_freq_in && ac108_pll_div_list [i ].freq_out % rate == 0 ) {
521
533
ac108_pll_div = ac108_pll_div_list [i ];
522
534
dev_dbg (& ac10x -> i2c [_MASTER_INDEX ]-> dev , "AC108 PLL freq_in match:%u, freq_out:%u\n\n" ,
523
535
ac108_pll_div .freq_in , ac108_pll_div .freq_out );
@@ -534,21 +546,21 @@ static int ac108_configure_clocking(struct ac10x_priv *ac10x, unsigned int rate)
534
546
535
547
/*0x18: PLL clk lock enable*/
536
548
ac108_multi_update_bits (PLL_LOCK_CTRL , 0x1 << PLL_LOCK_EN , 0x1 << PLL_LOCK_EN , ac10x );
549
+
537
550
/*0x10: PLL Common voltage Enable, PLL Enable,PLL loop divider factor detection enable*/
538
551
ac108_multi_update_bits (PLL_CTRL1 , 0x01 << PLL_EN | 0x01 << PLL_COM_EN | 0x01 << PLL_NDET ,
539
552
0x01 << PLL_EN | 0x01 << PLL_COM_EN | 0x01 << PLL_NDET , ac10x );
540
553
541
554
/**
542
- * 0x20: enable pll,pll source from mclk, sysclk source from
543
- * pll,enable sysclk
555
+ * 0x20: enable pll, pll source from mclk/bclk, sysclk source from pll, enable sysclk
544
556
*/
545
- ac108_multi_update_bits (SYSCLK_CTRL , 0x01 << PLLCLK_EN | 0x03 << PLLCLK_SRC | 0x01 << SYSCLK_SRC | 0x01 << SYSCLK_EN ,
546
- 0x01 << PLLCLK_EN | 0x00 << PLLCLK_SRC | 0x01 << SYSCLK_SRC | 0x01 << SYSCLK_EN , ac10x );
557
+ ac108_multi_update_bits (SYSCLK_CTRL , 0x01 << PLLCLK_EN | 0x03 << PLLCLK_SRC | 0x01 << SYSCLK_SRC | 0x01 << SYSCLK_EN ,
558
+ 0x01 << PLLCLK_EN |pll_src << PLLCLK_SRC | 0x01 << SYSCLK_SRC | 0x01 << SYSCLK_EN , ac10x );
547
559
ac10x -> mclk = ac108_pll_div .freq_out ;
548
560
}
549
561
if (ac10x -> clk_id == SYSCLK_SRC_MCLK ) {
550
562
/**
551
- *0x20: sysclk source from mclk,enable sysclk
563
+ *0x20: sysclk source from mclk, enable sysclk
552
564
*/
553
565
ac108_multi_update_bits (SYSCLK_CTRL , 0x01 << PLLCLK_EN | 0x01 << SYSCLK_SRC | 0x01 << SYSCLK_EN ,
554
566
0x00 << PLLCLK_EN | 0x00 << SYSCLK_SRC | 0x01 << SYSCLK_EN , ac10x );
@@ -688,7 +700,7 @@ static int ac108_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_h
688
700
return - EINVAL ;
689
701
}
690
702
691
- if (channels == 8 && ac108_sample_rate [rate ].real_val == 96000 ) {
703
+ if (channels == 8 && ac108_sample_rate [rate ].real_val == 96000 ) {
692
704
/* 24.576M bit clock is not support by ac108 */
693
705
return - EINVAL ;
694
706
}
@@ -749,8 +761,13 @@ static int ac108_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_h
749
761
* ADC Sample Rate synchronised with I2S1 clock zone
750
762
*/
751
763
ac108_multi_update_bits (ADC_SPRC , 0x0f << ADC_FS_I2S1 , ac108_sample_rate [rate ].reg_val << ADC_FS_I2S1 , ac10x );
752
- ac108_multi_write (HPF_EN ,0x0f ,ac10x );
753
- ac108_configure_clocking (ac10x , ac108_sample_rate [rate ].real_val );
764
+ ac108_multi_write (HPF_EN , 0x0F , ac10x );
765
+
766
+ if (ac10x -> i2c101 && _MASTER_MULTI_CODEC == _MASTER_AC101 ) {
767
+ ac108_config_pll (ac10x , ac108_sample_rate [rate ].real_val , ac108_samp_res [samp_res ].real_val * channels );
768
+ } else {
769
+ ac108_config_pll (ac10x , ac108_sample_rate [rate ].real_val , 0 );
770
+ }
754
771
755
772
/*
756
773
* master mode only
@@ -761,7 +778,7 @@ static int ac108_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_h
761
778
break ;
762
779
}
763
780
}
764
- ac108_multi_update_bits (I2S_BCLK_CTRL , 0x0F << BCLKDIV , i << BCLKDIV , ac10x );
781
+ ac108_multi_update_bits (I2S_BCLK_CTRL , 0x0F << BCLKDIV , i << BCLKDIV , ac10x );
765
782
766
783
/*
767
784
* slots allocation for each chip
@@ -818,7 +835,7 @@ static int ac108_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) {
818
835
819
836
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK ) {
820
837
case SND_SOC_DAIFMT_CBM_CFM : /*AC108 Master*/
821
- if (ac10x -> tdm_chips_cnt < 2 || _MASTER_MULTI_CODEC == _MASTER_AC108 ) {
838
+ if (! ac10x -> i2c101 || _MASTER_MULTI_CODEC == _MASTER_AC108 ) {
822
839
dev_dbg (dai -> dev , "AC108 set to work as Master\n" );
823
840
/**
824
841
* 0x30:chip is master mode ,BCLK & LRCK output
@@ -961,7 +978,6 @@ static int ac108_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) {
961
978
/*
962
979
* due to miss channels order in cpu_dai, we meed defer the clock starting.
963
980
*/
964
- #if _MASTER_MULTI_CODEC == _MASTER_AC108
965
981
static int ac108_set_clock (int y_start_n_stop ) {
966
982
u8 r ;
967
983
@@ -988,7 +1004,6 @@ static int ac108_set_clock(int y_start_n_stop) {
988
1004
989
1005
return 0 ;
990
1006
}
991
- #endif
992
1007
993
1008
static int ac108_trigger (struct snd_pcm_substream * substream , int cmd ,
994
1009
struct snd_soc_dai * dai )
@@ -1375,12 +1390,12 @@ static int ac108_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *i
1375
1390
}
1376
1391
1377
1392
__ret :
1378
- /* when all i2c prepared, we bind codec to i2c[_MASTER_INDEX] */
1393
+ /* It's time to bind codec to i2c[_MASTER_INDEX] when all i2c are ready */
1379
1394
if ((ac10x -> codec_cnt != 0 && ac10x -> tdm_chips_cnt < 2 )
1380
1395
|| (ac10x -> i2c [0 ] && ac10x -> i2c [1 ] && ac10x -> i2c101 )) {
1381
- # if _MASTER_MULTI_CODEC == _MASTER_AC108
1382
- asoc_simple_card_register_set_clock (ac108_set_clock );
1383
- #endif
1396
+ if (! ac10x -> i2c101 || _MASTER_MULTI_CODEC == _MASTER_AC108 ) {
1397
+ asoc_simple_card_register_set_clock (ac108_set_clock );
1398
+ }
1384
1399
/* no playback stream */
1385
1400
if (! ac10x -> i2c101 ) {
1386
1401
memset (& ac108_dai [_MASTER_INDEX ]-> playback , '\0' , sizeof ac108_dai [_MASTER_INDEX ]-> playback );
0 commit comments