audio: auge: fix sharebuffer channel map [1/1]

PD#SWPL-2645

Problem:
play ddp source, then play pcm source, no sound

Solution:
1. fix same source control and channel map issue
2. i2s 8ch, spdif 2ch, channels are not mapped, make spdif 8 channel mask
3. when same source used, keep mpll use same mpll

Verify:
x301

Change-Id: I2fe4bbcbcbfff0a1c1a6cebf61d1da5aba9b7a9d
Signed-off-by: Xing Wang <xing.wang@amlogic.com>

Conflicts:
	arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts
	arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts
	arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts
	arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts
	sound/soc/amlogic/auge/ddr_mngr.c
	sound/soc/amlogic/auge/sharebuffer.c
	sound/soc/amlogic/auge/spdif_hw.c
	sound/soc/amlogic/auge/spdif_hw.h
This commit is contained in:
Xing Wang
2018-12-29 19:14:23 +08:00
committed by Luke Go
parent f13656ff13
commit c6017751c3
6 changed files with 78 additions and 34 deletions

View File

@@ -1247,10 +1247,8 @@
clocks = <&clkaudio CLKID_AUDIO_MCLK_A
&clkc CLKID_MPLL0
&clkc CLKID_MPLL1
&clkaudio CLKID_AUDIO_SPDIFOUT_A>;
clock-names = "mclk", "clk_srcpll",
"samesource_srcpll", "samesource_clk";
&clkc CLKID_MPLL0>;
clock-names = "mclk", "clk_srcpll", "samesource_sysclk";
pinctrl-names = "tdm_pins";
pinctrl-0 = <&tdma_mclk &tdmout_a>;

View File

@@ -939,10 +939,8 @@
clocks = <&clkaudio CLKID_AUDIO_MCLK_A
&clkc CLKID_MPLL0
&clkc CLKID_MPLL1
&clkaudio CLKID_AUDIO_SPDIFOUT_A>;
clock-names = "mclk", "clk_srcpll",
"samesource_srcpll", "samesource_clk";
&clkc CLKID_MPLL0>;
clock-names = "mclk", "clk_srcpll", "samesource_sysclk";
pinctrl-names = "tdm_pins";
pinctrl-0 = <&tdma_mclk &tdmout_a>;

View File

@@ -1011,8 +1011,8 @@ int aml_check_sharebuffer_valid(struct frddr *fr, int ss_sel)
&& (frddrs[i].fifo_id != current_fifo_id)
&& (frddrs[i].dest == ss_sel)) {
pr_debug("%s, ss_sel:%d used, not for share buffer at same time\n",
__func__,
pr_info(" frddr:%d, ss_sel:%d used, invalid for share buffer\n",
i,
ss_sel);
ret = 0;
break;
@@ -1240,14 +1240,69 @@ void aml_frddr_select_dst(struct frddr *fr, enum frddr_dest dst)
void aml_frddr_select_dst_ss(struct frddr *fr,
enum frddr_dest dst, int sel, bool enable)
{
unsigned int ss_valid = aml_check_sharebuffer_valid(fr, dst);
struct aml_audio_controller *actrl = fr->actrl;
unsigned int reg_base = fr->reg_base;
unsigned int reg, ss_valid;
ss_valid = aml_check_sharebuffer_valid(fr, dst);
/* same source en */
if (fr->chipinfo
&& fr->chipinfo->same_src_fn
&& ss_valid
)
frddr_set_sharebuffer_enable(fr, dst, sel, enable);
&& ss_valid) {
int s_v = 0, s_m = 0;
if (fr->chipinfo
&& fr->chipinfo->src_sel_ctrl) {
reg = calc_frddr_address(EE_AUDIO_FRDDR_A_CTRL2,
reg_base);
switch (sel) {
case 1:
s_m = 0x17 << 8;
s_v = enable ?
(dst << 8 | 1 << 12) : 0 << 8;
break;
case 2:
s_m = 0x17 << 16;
s_v = enable ?
(dst << 16 | 1 << 20) : 0 << 16;
break;
default:
pr_warn_once("sel :%d is not supported for same source\n",
sel);
break;
}
s_m |= 0xff << 24;
if (enable)
s_v |= (fr->channels - 1) << 24;
else
s_v |= 0x0 << 24;
} else {
reg = calc_frddr_address(EE_AUDIO_FRDDR_A_CTRL0,
reg_base);
switch (sel) {
case 1:
s_m = 0xf << 4;
s_v = enable ?
(dst << 4 | 1 << 7) : 0 << 4;
break;
case 2:
s_m = 0xf << 8;
s_v = enable ?
(dst << 8 | 1 << 11) : 0 << 8;
break;
default:
pr_warn_once("sel :%d is not supported for same source\n",
sel);
break;
}
}
pr_debug("%s sel:%d, dst_src:%d\n",
__func__, sel, dst);
aml_audiobus_update_bits(actrl, reg, s_m, s_v);
}
}
void aml_frddr_set_fifos(struct frddr *fr,

View File

@@ -36,8 +36,7 @@ static int sharebuffer_spdifout_prepare(struct snd_pcm_substream *substream,
aml_frddr_get_fifo_id(fr),
bit_depth,
runtime->channels,
true,
lane_i2s);
true);
/* spdif to hdmitx */
spdifout_to_hdmitx_ctrl(spdif_id);
@@ -64,7 +63,7 @@ static int sharebuffer_spdifout_free(struct snd_pcm_substream *substream,
aml_frddr_get_fifo_id(fr),
bit_depth,
runtime->channels,
false, 0);
false);
return 0;
}
@@ -96,7 +95,7 @@ int sharebuffer_prepare(struct snd_pcm_substream *substream,
} else if (samesource_sel < 5) {
/* same source with spdif a/b */
sharebuffer_spdifout_prepare(substream,
fr, samesource_sel - 3, lane_i2s);
fr, samesource_sel - 3);
}
/* frddr, share buffer, src_sel1 */

View File

@@ -420,18 +420,13 @@ static void spdifout_clk_ctrl(int spdif_id, bool is_enable)
}
#endif
static void spdifout_fifo_ctrl(int spdif_id,
int fifo_id, int bitwidth, int channels, int lane_i2s)
int fifo_id, int bitwidth, int channels)
{
unsigned int frddr_type = spdifout_get_frddr_type(bitwidth);
unsigned int offset, reg, i, chmask = 0;
unsigned int swap_masks = 0;
/* spdif always masks two channel */
if (lane_i2s * 2 >= channels) {
pr_err("invalid lane(%d) and channels(%d)\n",
lane_i2s, channels);
return;
}
for (i = 0; i < channels; i++)
chmask |= (1 << i);
for (i = 0; i < channels; i++)
chmask |= (1 << i);
@@ -450,8 +445,8 @@ static void spdifout_fifo_ctrl(int spdif_id,
offset = EE_AUDIO_SPDIFOUT_B_CTRL0 - EE_AUDIO_SPDIFOUT_CTRL0;
reg = EE_AUDIO_SPDIFOUT_CTRL0 + offset * spdif_id;
audiobus_update_bits(reg,
0x1<<20|0x1<<19|0xff<<4,
0<<20|0<<19|chmask<<4);
0x3<<21|0x1<<20|0x1<<19|0xff<<4,
0x0<<21|0<<20|0<<19|chmask<<4);
offset = EE_AUDIO_SPDIFOUT_B_CTRL1 - EE_AUDIO_SPDIFOUT_CTRL1;
reg = EE_AUDIO_SPDIFOUT_CTRL1 + offset * spdif_id;
@@ -505,7 +500,7 @@ void spdifout_enable(int spdif_id, bool is_enable, bool reenable)
}
void spdifout_samesource_set(int spdif_index, int fifo_id,
int bitwidth, int channels, bool is_enable, int lane_i2s)
int bitwidth, int channels, bool is_enable)
{
int spdif_id;
@@ -515,8 +510,7 @@ void spdifout_samesource_set(int spdif_index, int fifo_id,
spdif_id = 0;
if (is_enable)
spdifout_fifo_ctrl(spdif_id,
fifo_id, bitwidth, channels, lane_i2s);
spdifout_fifo_ctrl(spdif_id, fifo_id, bitwidth, channels);
}
int spdifin_get_sample_rate(void)
@@ -660,7 +654,7 @@ void spdifout_play_with_zerodata(unsigned int spdif_id, bool reenable)
/* spdif ctrl */
spdifout_fifo_ctrl(spdif_id,
frddr_index, bitwidth, runtime.channels, 0);
frddr_index, bitwidth, runtime.channels);
/* channel status info */
spdif_get_channel_status_info(&chsts, sample_rate);

View File

@@ -78,8 +78,8 @@ extern void aml_spdifout_get_aed_info(int spdifout_id,
extern void spdifout_to_hdmitx_ctrl(int spdif_index);
extern void spdifout_samesource_set(int spdif_index, int fifo_id,
int bitwidth, int channels, bool is_enable, int lane_i2s);
extern void spdifout_enable(int spdif_id, bool is_enable, bool reenable);
int bitwidth, int channels, bool is_enable);
extern void spdifout_enable(int spdif_id, bool is_enable);
extern int spdifin_get_sample_rate(void);