audio: fix loopback channel map

PD#149869: audio: fix tdmin_lb channel mask and swap for loopback

Change-Id: I1bf2dd42a2869ca2404b72e1f0e57a267f365e23
Signed-off-by: Xing Wang <xing.wang@amlogic.com>
This commit is contained in:
Xing Wang
2017-08-31 00:00:35 +08:00
committed by Jianxin Pan
parent 3f653b7e57
commit f8225ed348
6 changed files with 101 additions and 19 deletions

View File

@@ -1050,7 +1050,7 @@
* 5: PAD_tdminC
*/
datalb_src = <2>;
datalb_chnum = <8>;
datalb_chnum = <2>;
datalb_chmask = <0x3>;
status = "okay";

View File

@@ -505,13 +505,15 @@
dai-tdm-slot-width = <32>;
};
codec {
/*
* prefix-names = "3101_A", "3101_B",
* "3101_C", "3101_D";
* sound-dai = <&tlv320adc3101_32
* &tlv320adc3101_30
* &tlv320adc3101_34
* &tlv320adc3101_36>;
*/
sound-dai = <&tlv320adc3101_32 &dummy_codec>;
/*prefix-names = "3101_A", "3101_B",*/
/*"3101_C", "3101_D";*/
/*sound-dai = <&tlv320adc3101_32*/
/*&tlv320adc3101_30*/
/*&tlv320adc3101_34*/
/*&tlv320adc3101_36>;*/
};
};
@@ -1048,7 +1050,7 @@
* 5: PAD_tdminC
*/
datalb_src = <2>;
datalb_chnum = <8>;
datalb_chnum = <2>;
datalb_chmask = <0x3>;
status = "okay";

View File

@@ -344,6 +344,8 @@
aml-audio-card,name = "AML-AXGSOUND";
//aml-audio-card,mclk-fs = <256>;
aml-audio-card,loopback = <&aml_loopback>;
aml-audio-card,dai-link@0 {
format = "dsp_a";
mclk-fs = <256>;//512
@@ -855,6 +857,40 @@
filter_mode = <1>; /* mode 0~4, defalut:1 */
status = "okay";
};
aml_loopback: loopback {
compatible = "amlogic, snd-loopback";
/*
* 0: out rate = in data rate;
* 1: out rate = loopback data rate;
*/
lb_mode = <0>;
/* datain src
* 0: tdmin_a;
* 1: tdmin_b;
* 2: tdmin_c;
* 3: spdifin;
* 4: pdmin;
*/
datain_src = <4>;
datain_chnum = <8>;
datain_chmask = <0xfc>;
/* tdmin_lb src
* 0: tdmoutA
* 1: tdmoutB
* 2: tdmoutC
* 3: PAD_tdminA
* 4: PAD_tdminB
* 5: PAD_tdminC
*/
datalb_src = <2>;
datalb_chnum = <2>;
datalb_chmask = <0x3>;
status = "okay";
};
}; /* end of audiobus */
&pinctrl_periphs {

View File

@@ -1047,7 +1047,7 @@ int loopback_prepare(
datain_config(&datain);
datalb_config(&datalb);
datalb_ctrl(lb_cfg->datalb_src, bitwidth);
datalb_ctrl(lb_cfg->datalb_src);
lb_enable_ex(lb_cfg->lb_mode, true);
return 0;

View File

@@ -47,16 +47,19 @@ void datalb_config(struct data_lb *datalb)
);
}
void datalb_ctrl(int lb_src, int bitdepth)
void datalb_ctrl(int lb_src)
{
int id = lb_src;
int offset = 0;
int reg, reg_base;
//tdmin lb, same as tdm out
audiobus_update_bits(
EE_AUDIO_CLK_TDMIN_LB_CTRL,
0x3 << 30 | 0 << 29 | 0xf << 24 | 0xf << 20,
0x3 << 30 | 0 << 29 | 2 << 24 | 2 << 20
0x3 << 30 | 1 << 29 | 0xf << 24 | 0xf << 20,
0x3 << 30 | 1 << 29 | 2 << 24 | 2 << 20
);
//tdmin ctrl, from tdmout
//reset
audiobus_update_bits(EE_AUDIO_TDMIN_LB_CTRL, 3<<28, 0);
audiobus_update_bits(EE_AUDIO_TDMIN_LB_CTRL, 1<<29, 1<<29);
audiobus_update_bits(EE_AUDIO_TDMIN_LB_CTRL, 1<<28, 1<<28);
@@ -64,17 +67,58 @@ void datalb_ctrl(int lb_src, int bitdepth)
audiobus_write(
EE_AUDIO_TDMIN_LB_CTRL,
1 << 31 |
0 << 30 | /*0:tdm mode; 1: i2s mode;*/
/*0:tdm mode; 1: i2s mode;*/
1 << 30 |
1 << 29 |
1 << 28 |
lb_src << 20|
4 << 16|
(bitdepth - 1) << 0
3 << 16|
31 << 0
);
if (id >= 0 && id <= 2) {
/* tdmout_a, tdmout_b, tdmout_c */
reg_base = EE_AUDIO_TDMOUT_A_SWAP;
offset = EE_AUDIO_TDMOUT_B_SWAP - EE_AUDIO_TDMOUT_A_SWAP;
} else if (id < 6) {
/* pad from tdmin_a, tdmin_b, tdmin_c */
id -= 3; /*id offset from tdmin_a */
reg_base = EE_AUDIO_TDMIN_A_SWAP;
offset = EE_AUDIO_TDMIN_B_SWAP - EE_AUDIO_TDMIN_A_SWAP;
} else {
pr_err("unsupport datalb_src\n");
return;
}
/*swap same as tdmout */
reg = reg_base + offset * id;
audiobus_write(EE_AUDIO_TDMIN_LB_SWAP,
audiobus_read(reg));
/*mask same as datalb*/
/* mask 0 */
reg += 1;
audiobus_write(
EE_AUDIO_TDMIN_LB_MASK0,
0xff);
audiobus_read(reg));
/* mask 0 */
reg += 1;
audiobus_write(
EE_AUDIO_TDMIN_LB_MASK1,
audiobus_read(reg));
/* mask 0 */
reg += 1;
audiobus_write(
EE_AUDIO_TDMIN_LB_MASK2,
audiobus_read(reg));
/* mask 0 */
reg += 1;
audiobus_write(
EE_AUDIO_TDMIN_LB_MASK3,
audiobus_read(reg));
}
void lb_enable_ex(int mode, bool is_enable)

View File

@@ -57,7 +57,7 @@ extern void datain_config(struct data_in *datain);
extern void datalb_config(struct data_lb *datalb);
extern void datalb_ctrl(int lb_src, int bitdepth);
extern void datalb_ctrl(int lb_src);
extern void lb_enable_ex(int mode, bool is_enable);