summaryrefslogtreecommitdiff
authorRenjun Xu <renjun.xu@amlogic.com>2018-08-03 05:54:52 (GMT)
committer Jianxin Pan <jianxin.pan@amlogic.com>2018-08-03 11:20:53 (GMT)
commit305e6776cdf68f41ea30b3d3460b52eb28b4e76f (patch)
tree08b697f90ee3ea558d2bd26921c9a39307c2e447
parente39e646127c08cc462cf5ecffbe34f0be630fd43 (diff)
downloadcommon-305e6776cdf68f41ea30b3d3460b52eb28b4e76f.zip
common-305e6776cdf68f41ea30b3d3460b52eb28b4e76f.tar.gz
common-305e6776cdf68f41ea30b3d3460b52eb28b4e76f.tar.bz2
audio: fix adc3101 8ch PCM format support
PD#171085: fix adc3101 8ch PCM format support For S400 & S420 board, please modify dts to enable adc3101 8ch PCM please read following file: Documentation/devicetree/bindings/amlogic/axg-adc3010-pcm.txt Change-Id: I945441f80d269b167148ccf3d6c33093a20a4f2f Signed-off-by: Renjun Xu <renjun.xu@amlogic.com>
Diffstat
-rw-r--r--Documentation/devicetree/bindings/amlogic/axg-adc3010-pcm.txt114
-rw-r--r--MAINTAINERS4
-rw-r--r--sound/soc/codecs/amlogic/tlv320adc3101.c29
3 files changed, 145 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/amlogic/axg-adc3010-pcm.txt b/Documentation/devicetree/bindings/amlogic/axg-adc3010-pcm.txt
new file mode 100644
index 0000000..ae96780
--- a/dev/null
+++ b/Documentation/devicetree/bindings/amlogic/axg-adc3010-pcm.txt
@@ -0,0 +1,114 @@
+diff --git a/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts
+ b/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts
+index f184fce..5a43ba1 100644
+--- a/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts
++++ b/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts
+@@ -383,24 +383,24 @@
+ };
+ aml-audio-card,dai-link@1 {
+- format = "i2s";
++ format = "dsp_a";
+ mclk-fs = <256>;
+ //continuous-clock;
+- //bitclock-inversion;
++ bitclock-inversion;
+ //frame-inversion;
+ bitclock-master = <&aml_tdmb>;
+ frame-master = <&aml_tdmb>;
+ cpu {
+ sound-dai = <&aml_tdmb>;
+- dai-tdm-slot-tx-mask = <1 1>;
+- dai-tdm-slot-rx-mask = <1 1>;
+- dai-tdm-slot-num = <2>;
++ dai-tdm-slot-tx-mask = <1 1 1 1 1 1 1 1>;
++ dai-tdm-slot-rx-mask = <1 1 1 1 1 1 1 1>;
++ dai-tdm-slot-num = <8>;
+ dai-tdm-slot-width = <32>;
+ system-clock-frequency = <12288000>;
+ };
+ codec {
+- sound-dai = <&tlv320adc3101_32>;
+- /*&tlv320adc3101_30>;*/
++ prefix-names = "3101_A", "3101_B",
++ "3101_C", "3101_D";
++ sound-dai = <&tlv320adc3101_30 &tlv320adc3101_32
++ &tlv320adc3101_34 &tlv320adc3101_36>;
+ };
+ };
+@@ -728,7 +728,7 @@
+ status = "okay";
+ pinctrl-names="default";
+ pinctrl-0=<&b_i2c_master>;
+-
++/*
+ tlv320adc3101_32: tlv320adc3101_32@30 {
+ compatible = "ti,tlv320adc3101";
+ #sound-dai-cells = <0>;
+@@ -736,7 +736,7 @@
+ differential_pair = <1>;
+ status = "okay";
+ };
+-
++*/
+ tas5707_36: tas5707_36@36 {
+ compatible = "ti,tas5707";
+ #sound-dai-cells = <0>;
+@@ -771,23 +771,34 @@
+ status = "okay";
+ };
++ tlv320adc3101_32: tlv320adc3101_32@32 {
++ compatible = "ti,tlv320adc3101";
++ #sound-dai-cells = <0>;
++ reg = <0x19>;
++ slot_number = <3>;
++ //differential_pair = <1>;
++ status = "okay";
++ };
+ tlv320adc3101_30: tlv320adc3101_30@30 {
+ compatible = "ti,tlv320adc3101";
+ #sound-dai-cells = <0>;
+ reg = <0x18>;
+- status = "disable";
++ slot_number = <0>;
++ status = "okay";
+ };
+- tlv320adc3101_34: tlv320adc3101_34@30 {
++ tlv320adc3101_34: tlv320adc3101_34@34 {
+ compatible = "ti,tlv320adc3101";
+ #sound-dai-cells = <0>;
+ reg = <0x1a>;
+- status = "disable";
++ slot_number = <2>;
++ status = "okay";
+ };
+- tlv320adc3101_36: tlv320adc3101_36@30 {
++ tlv320adc3101_36: tlv320adc3101_36@36 {
+ compatible = "ti,tlv320adc3101";
+ #sound-dai-cells = <0>;
+ reg = <0x1b>;
+- status = "disable";
++ slot_number = <1>;
++ status = "okay";
+ };
+ es7243_10: es7243_10@10 {
+ compatible = "MicArray_0";
+@@ -928,8 +939,8 @@
+ aml_tdmb: tdmb {
+ compatible = "amlogic, axg-snd-tdmb";
+ #sound-dai-cells = <0>;
+- dai-tdm-lane-slot-mask-out = <1 0>;
+- dai-tdm-lane-slot-mask-in = <0 1>;
++ dai-tdm-lane-slot-mask-out = <1 1>;
++ dai-tdm-lane-slot-mask-in = <1 0>;
+ dai-tdm-clk-sel = <1>;
+ clocks = <&clkaudio CLKID_AUDIO_MCLK_B
+ &clkc CLKID_MPLL1>;
+@@ -1089,8 +1100,7 @@
+ tdmin_b: tdmin_b {
+ mux {
+- groups = "tdmb_din0",
+- "tdmb_din1";
++ groups = "tdmb_din0";
+ function = "tdmb_in";
+ };
+ };
diff --git a/MAINTAINERS b/MAINTAINERS
index df4636a..1eb2ed2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14583,3 +14583,7 @@ F: sound/soc/codecs/amlogic/cs42528.h
AMLOGIC SPIDEV
M: Ivan Nie <Ivan.nie@amlogic.com>
F: Documentation/devicetree/bindings/spi/spidev.txt
+
+AMLOGIC SOUND ADC3101
+M: Renjun Xu <renjun.xu@amlogic.com>
+F: Documentation/devicetree/bindings/amlogic/axg-sound-adc3010-d608mic-pcm.txt
diff --git a/sound/soc/codecs/amlogic/tlv320adc3101.c b/sound/soc/codecs/amlogic/tlv320adc3101.c
index acb1cc9..6c3a742 100644
--- a/sound/soc/codecs/amlogic/tlv320adc3101.c
+++ b/sound/soc/codecs/amlogic/tlv320adc3101.c
@@ -65,6 +65,7 @@ struct adc3101_priv {
/* for more control */
int codec_cnt;
int codec_mask;
+ unsigned int slot_number;
struct i2c_client *client[4];
u8 page_no;
/* differential_pair
@@ -300,11 +301,16 @@ static int adc3101_set_dai_sysclk(struct snd_soc_dai *codec_dai,
static int adc3101_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
{
struct snd_soc_codec *codec = codec_dai->codec;
+ struct adc3101_priv *adc3101 = NULL;
u8 iface_reg_1;
u8 dsp_a_val;
u8 iface_reg_2;
- pr_info("%s ...\n", __func__);
+ adc3101 = snd_soc_codec_get_drvdata(codec);
+ if (adc3101 == NULL)
+ return -EINVAL;
+
+ pr_info("[%s]:slot_number=%d\n", __func__, adc3101->slot_number);
iface_reg_1 = snd_soc_read(codec, ADC3101_IFACE1);
iface_reg_1 = iface_reg_1 & ~(3 << 6 | 3 << 2);
@@ -344,7 +350,18 @@ static int adc3101_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
case SND_SOC_DAIFMT_DSP_A:
iface_reg_1 |= (ADC3101_DSP_MODE << ADC3101_PLLJ_SHIFT);
iface_reg_2 |= (1 << 3); /* invert bit clock */
- dsp_a_val = 0x01; /* add offset 1 */
+
+ /* set bclk offset according to diffrent adc */
+ if (adc3101->slot_number == 0)
+ dsp_a_val = 0;
+ else if (adc3101->slot_number == 1)
+ dsp_a_val = 64;
+ else if (adc3101->slot_number == 2)
+ dsp_a_val = 128;
+ else if (adc3101->slot_number == 3)
+ dsp_a_val = 192;
+ else
+ dsp_a_val = 0x01; /* default add offset 1 */
break;
case SND_SOC_DAIFMT_DSP_B:
iface_reg_1 |= (ADC3101_DSP_MODE << ADC3101_PLLJ_SHIFT);
@@ -840,6 +857,14 @@ static int adc3101_i2c_probe(struct i2c_client *i2c,
adc3101->differential_pair = 0;
ret = 0;
}
+
+ ret = of_property_read_u32(i2c->dev.of_node, "slot_number",
+ &adc3101->slot_number);
+ if (ret) {
+ pr_err("failed to get slot_number, set it default\n");
+ adc3101->slot_number = 0;
+ ret = 0;
+ }
pr_info("%s i2c:%p\n", __func__, i2c);
ret = snd_soc_register_codec(&i2c->dev,
&soc_codec_dev_adc3101, adc3101_dai, 1);