mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 12:17:12 +09:00
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:
@@ -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>;
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user