8
8
* it under the terms of the GNU General Public License version 2 as
9
9
* published by the Free Software Foundation.
10
10
*/
11
- #define DEBUG
11
+ #undef DEBUG
12
12
#include <linux/module.h>
13
13
#include <linux/moduleparam.h>
14
14
#include <linux/init.h>
27
27
#include "ac108.h"
28
28
29
29
#define _USE_CAPTURE 0
30
- #define _MASTER_INDEX 1
30
+ #define _MASTER_INDEX 0
31
31
32
32
/**
33
33
* TODO:
@@ -56,6 +56,7 @@ struct ac108_priv {
56
56
unsigned char data_protocol ;
57
57
struct delayed_work dlywork ;
58
58
int trgr_cnt ;
59
+ int tdm_chips_cnt ;
59
60
};
60
61
static struct ac108_priv * ac108 ;
61
62
@@ -165,8 +166,13 @@ static const struct pll_div ac108_pll_div_list[] = {
165
166
166
167
/* AC108 definition */
167
168
#define AC108_CHANNELS_MAX 16 /* range[1, 16] */
168
- #define AC108_RATES (SNDRV_PCM_RATE_8000_96000 | SNDRV_PCM_RATE_KNOT)
169
- #define AC108_FORMATS (/* SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE |*/ SNDRV_PCM_FMTBIT_S32_LE )
169
+ #define AC108_RATES (SNDRV_PCM_RATE_8000_96000 & \
170
+ ~(SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_64000 | \
171
+ SNDRV_PCM_RATE_88200))
172
+ #define AC108_FORMATS (/*SNDRV_PCM_FMTBIT_S16_LE | \
173
+ SNDRV_PCM_FMTBIT_S20_3LE | \
174
+ SNDRV_PCM_FMTBIT_S24_LE |*/ \
175
+ SNDRV_PCM_FMTBIT_S32_LE )
170
176
171
177
static const DECLARE_TLV_DB_SCALE (tlv_adc_pga_gain , 0 , 100 , 0 ) ;
172
178
static const DECLARE_TLV_DB_SCALE (tlv_ch_digital_vol , -11925 ,75 ,0 ) ;
@@ -463,6 +469,7 @@ static int snd_ac108_put_volsw(struct snd_kcontrol *kcontrol,
463
469
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, chip) }
464
470
465
471
static const struct snd_kcontrol_new ac108_snd_controls [] = {
472
+ /* ### chip 0 ### */
466
473
/*0x70: ADC1 Digital Channel Volume Control Register*/
467
474
SOC_AC108_SINGLE_TLV ("CH1 digital volume" , ADC1_DVOL_CTRL , 0 , 0xff , 0 , 0 , tlv_ch_digital_vol ),
468
475
/*0x71: ADC2 Digital Channel Volume Control Register*/
@@ -472,6 +479,16 @@ static const struct snd_kcontrol_new ac108_snd_controls[] = {
472
479
/*0x73: ADC4 Digital Channel Volume Control Register*/
473
480
SOC_AC108_SINGLE_TLV ("CH4 digital volume" , ADC4_DVOL_CTRL , 0 , 0xff , 0 , 0 , tlv_ch_digital_vol ),
474
481
482
+ /*0x90: Analog PGA1 Control Register*/
483
+ SOC_AC108_SINGLE_TLV ("ADC1 PGA gain" , ANA_PGA1_CTRL , ADC1_ANALOG_PGA , 0x1f , 0 , 0 , tlv_adc_pga_gain ),
484
+ /*0x91: Analog PGA2 Control Register*/
485
+ SOC_AC108_SINGLE_TLV ("ADC2 PGA gain" , ANA_PGA2_CTRL , ADC2_ANALOG_PGA , 0x1f , 0 , 0 , tlv_adc_pga_gain ),
486
+ /*0x92: Analog PGA3 Control Register*/
487
+ SOC_AC108_SINGLE_TLV ("ADC3 PGA gain" , ANA_PGA3_CTRL , ADC3_ANALOG_PGA , 0x1f , 0 , 0 , tlv_adc_pga_gain ),
488
+ /*0x93: Analog PGA4 Control Register*/
489
+ SOC_AC108_SINGLE_TLV ("ADC4 PGA gain" , ANA_PGA4_CTRL , ADC4_ANALOG_PGA , 0x1f , 0 , 0 , tlv_adc_pga_gain ),
490
+
491
+ /* ### chip 1 ### */
475
492
/*0x70: ADC1 Digital Channel Volume Control Register*/
476
493
SOC_AC108_SINGLE_TLV ("CH5 digital volume" , ADC1_DVOL_CTRL , 0 , 0xff , 0 , 1 , tlv_ch_digital_vol ),
477
494
/*0x71: ADC2 Digital Channel Volume Control Register*/
@@ -481,14 +498,6 @@ static const struct snd_kcontrol_new ac108_snd_controls[] = {
481
498
/*0x73: ADC4 Digital Channel Volume Control Register*/
482
499
SOC_AC108_SINGLE_TLV ("CH8 digital volume" , ADC4_DVOL_CTRL , 0 , 0xff , 0 , 1 , tlv_ch_digital_vol ),
483
500
484
- /*0x90: Analog PGA1 Control Register*/
485
- SOC_AC108_SINGLE_TLV ("ADC1 PGA gain" , ANA_PGA1_CTRL , ADC1_ANALOG_PGA , 0x1f , 0 , 0 , tlv_adc_pga_gain ),
486
- /*0x91: Analog PGA2 Control Register*/
487
- SOC_AC108_SINGLE_TLV ("ADC2 PGA gain" , ANA_PGA2_CTRL , ADC2_ANALOG_PGA , 0x1f , 0 , 0 , tlv_adc_pga_gain ),
488
- /*0x92: Analog PGA3 Control Register*/
489
- SOC_AC108_SINGLE_TLV ("ADC3 PGA gain" , ANA_PGA3_CTRL , ADC3_ANALOG_PGA , 0x1f , 0 , 0 , tlv_adc_pga_gain ),
490
- /*0x93: Analog PGA4 Control Register*/
491
- SOC_AC108_SINGLE_TLV ("ADC4 PGA gain" , ANA_PGA4_CTRL , ADC4_ANALOG_PGA , 0x1f , 0 , 0 , tlv_adc_pga_gain ),
492
501
/*0x90: Analog PGA1 Control Register*/
493
502
SOC_AC108_SINGLE_TLV ("ADC5 PGA gain" , ANA_PGA1_CTRL , ADC1_ANALOG_PGA , 0x1f , 0 , 1 , tlv_adc_pga_gain ),
494
503
/*0x91: Analog PGA2 Control Register*/
@@ -631,8 +640,6 @@ static const struct snd_soc_dapm_widget ac108_dapm_widgets[] = {
631
640
/*0x62:Digital MIC Enable Register*/
632
641
SND_SOC_DAPM_MICBIAS ("DMIC1 enable" , DMIC_EN , 0 , 0 ),
633
642
SND_SOC_DAPM_MICBIAS ("DMIC2 enable" , DMIC_EN , 1 , 0 ),
634
-
635
- /**/
636
643
};
637
644
638
645
static const struct snd_soc_dapm_route ac108_dapm_routes [] = {
@@ -860,20 +867,61 @@ static int ac108_configure_clocking(struct ac108_priv *ac108, unsigned int rate)
860
867
static int ac108_multi_chips_slots (struct ac108_priv * ac , int slots ) {
861
868
int i ;
862
869
863
- /* codec0 enable slots 1,2,3,4
864
- * codec1 enable slots 5,6,7,8 etc
870
+ /*
871
+ * codec0 enable slots 2,3,0,1 when 1 codec
872
+ *
873
+ * codec0 enable slots 6,7,0,1 when 2 codec
874
+ * codec1 enable slots 2,3,4,5
875
+ *
876
+ * ...
865
877
*/
866
878
for (i = 0 ; i < ac -> codec_index ; i ++ ) {
879
+ const unsigned vec_mask [] = {
880
+ 0x3 << 6 | 0x3 , // slots 6,7,0,1
881
+ 0xF << 2 , // slots 2,3,4,5
882
+ 0 ,
883
+ 0 ,
884
+ };
885
+ const unsigned vec_maps [] = {
886
+ /*
887
+ * chip 0,
888
+ * mic 0 sample -> slot 6
889
+ * mic 1 sample -> slot 7
890
+ * mic 2 sample -> slot 0
891
+ * mic 3 sample -> slot 1
892
+ */
893
+ 0x0 << 12 | 0x1 << 14 | 0x2 << 0 | 0x3 << 2 ,
894
+ /*
895
+ * chip 1,
896
+ * mic 0 sample -> slot 2
897
+ * mic 1 sample -> slot 3
898
+ * mic 2 sample -> slot 4
899
+ * mic 3 sample -> slot 5
900
+ */
901
+ 0x0 << 4 | 0x1 << 6 | 0x2 << 8 | 0x3 << 10 ,
902
+ 0 ,
903
+ 0 ,
904
+ };
867
905
unsigned vec ;
868
906
869
907
/* 0x38-0x3A I2S_TX1_CTRLx */
870
- vec = 0xFUL << (i << 2 );
908
+ /* rotate map, due to channels rotated by CPU_DAI */
909
+ if (ac -> codec_index == 1 ) {
910
+ vec = 0xFUL ;
911
+ } else {
912
+ vec = vec_mask [i ];
913
+ }
871
914
ac108_write (I2S_TX1_CTRL1 , slots - 1 , ac -> i2c [i ]);
872
915
ac108_write (I2S_TX1_CTRL2 , (vec >> 0 ) & 0xFF , ac -> i2c [i ]);
873
916
ac108_write (I2S_TX1_CTRL3 , (vec >> 8 ) & 0xFF , ac -> i2c [i ]);
874
917
875
918
/* 0x3C-0x3F I2S_TX1_CHMP_CTRLx */
876
- vec = (0x0 << 0 | 0x1 << 2 | 0x2 << 4 | 0x3 << 6 ) << (i << 3 );
919
+ if (ac -> codec_index == 1 ) {
920
+ vec = (0x2 << 0 | 0x3 << 2 | 0x0 << 4 | 0x1 << 6 );
921
+ } else if (ac -> codec_index == 2 ) {
922
+ vec = vec_maps [i ];
923
+ }
924
+
877
925
ac108_write (I2S_TX1_CHMP_CTRL1 , (vec >> 0 ) & 0xFF , ac -> i2c [i ]);
878
926
ac108_write (I2S_TX1_CHMP_CTRL2 , (vec >> 8 ) & 0xFF , ac -> i2c [i ]);
879
927
ac108_write (I2S_TX1_CHMP_CTRL3 , (vec >> 16 ) & 0xFF , ac -> i2c [i ]);
@@ -1064,17 +1112,20 @@ static int ac108_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) {
1064
1112
1065
1113
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK ) {
1066
1114
case SND_SOC_DAIFMT_CBM_CFM : /*AC108 Master*/
1067
- dev_dbg ( dai -> dev , "AC108 set to work as Master\n" );
1068
- #if 0
1069
- /**
1070
- * 0x30:chip is master mode ,BCLK & LRCK output
1071
- */
1072
- ac108_multi_chips_update_bits (I2S_CTRL , 0x03 << LRCK_IOEN | 0x03 << SDO1_EN | 0x1 << TXEN | 0x1 << GEN ,
1115
+ if ( ac108 -> tdm_chips_cnt < 2 ) {
1116
+ dev_dbg ( dai -> dev , "AC108 set to work as Master\n" );
1117
+ /**
1118
+ * 0x30:chip is master mode ,BCLK & LRCK output
1119
+ */
1120
+ ac108_multi_chips_update_bits (I2S_CTRL , 0x03 << LRCK_IOEN | 0x03 << SDO1_EN | 0x1 << TXEN | 0x1 << GEN ,
1073
1121
0x00 << LRCK_IOEN | 0x03 << SDO1_EN | 0x1 << TXEN | 0x1 << GEN , ac108 );
1074
- /* multi_chips: only one chip set as Master, and the others also need to set as Slave */
1075
- ac108_update_bits (I2S_CTRL , 0x3 << LRCK_IOEN , 0x2 << LRCK_IOEN , ac108 -> i2c [_MASTER_INDEX ]);
1076
- break ;
1077
- #endif
1122
+ /* multi_chips: only one chip set as Master, and the others also need to set as Slave */
1123
+ ac108_update_bits (I2S_CTRL , 0x3 << LRCK_IOEN , 0x2 << LRCK_IOEN , ac108 -> i2c [_MASTER_INDEX ]);
1124
+ break ;
1125
+ } else {
1126
+ /* TODO: Both cpu_dai and codec_dai(AC108) be set as slave in DTS */
1127
+ dev_dbg (dai -> dev , "used as slave when AC101 is master\n" );
1128
+ }
1078
1129
case SND_SOC_DAIFMT_CBS_CFS : /*AC108 Slave*/
1079
1130
dev_dbg (dai -> dev , "AC108 set to work as Slave\n" );
1080
1131
/**
@@ -1148,6 +1199,14 @@ static int ac108_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) {
1148
1199
pr_err ("AC108 config BCLK/LRCLK polarity error:%u\n\n" , (fmt & SND_SOC_DAIFMT_INV_MASK ) >> 8 );
1149
1200
return - EINVAL ;
1150
1201
}
1202
+
1203
+ #if 0
1204
+ /* revert LRCK polarity if it's single chip (master mode) */
1205
+ if (ac108 -> tdm_chips_cnt < 2 ) {
1206
+ lrck_polarity = (lrck_polarity == LRCK_LEFT_HIGH_RIGHT_LOW )?
1207
+ LRCK_LEFT_LOW_RIGHT_HIGH : LRCK_LEFT_HIGH_RIGHT_LOW ;
1208
+ }
1209
+ #endif
1151
1210
ac108_configure_power (ac108 );
1152
1211
1153
1212
/**
@@ -1358,10 +1417,15 @@ static struct snd_soc_dai_driver *ac108_dai[] = {
1358
1417
};
1359
1418
1360
1419
static int ac108_add_widgets (struct snd_soc_codec * codec ) {
1420
+ struct ac108_priv * ac108 = snd_soc_codec_get_drvdata (codec );
1361
1421
struct snd_soc_dapm_context * dapm = snd_soc_codec_get_dapm (codec );
1422
+ int ctrl_cnt = ARRAY_SIZE (ac108_snd_controls );
1362
1423
1363
- snd_soc_add_codec_controls (codec , ac108_snd_controls ,
1364
- ARRAY_SIZE (ac108_snd_controls ));
1424
+ /* only register controls correspond to exist chips */
1425
+ if (ac108 -> tdm_chips_cnt < 2 ) {
1426
+ ctrl_cnt /= 2 ;
1427
+ }
1428
+ snd_soc_add_codec_controls (codec , ac108_snd_controls , ctrl_cnt );
1365
1429
1366
1430
snd_soc_dapm_new_controls (dapm , ac108_dapm_widgets ,
1367
1431
ARRAY_SIZE (ac108_dapm_widgets ));
@@ -1508,19 +1572,25 @@ static int ac108_i2c_probe(struct i2c_client *i2c,
1508
1572
}
1509
1573
ac108 -> data_protocol = val ;
1510
1574
1511
- /*Writing this register 0x12 resets all register to their default state.*/
1575
+ ret = of_property_read_u32 (np , "tdm-chips-count" , & val );
1576
+ if (ret ) {
1577
+ val = 1 ;
1578
+ }
1579
+ ac108 -> tdm_chips_cnt = val ;
1580
+
1581
+ /* Writing this register with 0x12 will resets all register to their default state. */
1512
1582
ac108_write (CHIP_RST , CHIP_RST_VAL , i2c );
1513
1583
msleep (1 );
1514
1584
1515
- pr_err (" i2c_id number : %d\n" , (int )(i2c_id -> driver_data ));
1516
- pr_err (" ac108 codec_index : %d\n" , ac108 -> codec_index );
1517
- pr_err (" ac108 I2S data protocol type : %d\n" , ac108 -> data_protocol );
1585
+ pr_err (" i2c_id number : %d\n" , (int )(i2c_id -> driver_data ));
1586
+ pr_err (" ac108 codec_index : %d\n" , ac108 -> codec_index );
1587
+ pr_err (" ac108 data protocol: %d\n" , ac108 -> data_protocol );
1518
1588
1519
1589
ac108 -> i2c [i2c_id -> driver_data ] = i2c ;
1520
1590
ac108 -> codec_index ++ ;
1521
1591
1522
- /* we need i2c[0] && i2c[1], codec bind with i2c[_MASTER_INDEX] */
1523
- if (ac108 -> codec_index == 2 ) {
1592
+ /* when all i2c prepared, we bind codec to i2c[_MASTER_INDEX] */
1593
+ if (ac108 -> codec_index == ac108 -> tdm_chips_cnt ) {
1524
1594
ret = snd_soc_register_codec (& ac108 -> i2c [_MASTER_INDEX ]-> dev , & ac108_soc_codec_driver ,
1525
1595
ac108_dai [_MASTER_INDEX ], 1 );
1526
1596
if (ret < 0 ) {
0 commit comments