audio: auge: fix S/PDIF reset

PD#170264: audio: auge: fix S/PDIF reset

Change-Id: I515319feb04b6c97850d218a5786990980054c51
Signed-off-by: Xing Wang <xing.wang@amlogic.com>
This commit is contained in:
Xing Wang
2018-07-20 10:37:50 +08:00
committed by Yixun Lan
parent 9a89c68999
commit 16c9cd9443
4 changed files with 42 additions and 31 deletions

View File

@@ -37,7 +37,7 @@ static int sharebuffer_spdifout_prepare(struct snd_pcm_substream *substream,
bit_depth, true);
/* spdif to hdmitx */
spdifoutb_to_hdmitx_ctrl(spdif_id);
spdifout_to_hdmitx_ctrl(spdif_id);
/* check and set channel status */
spdif_get_channel_status_info(&chsts, runtime->rate);
spdif_set_channel_status_info(&chsts, spdif_id);

View File

@@ -43,6 +43,9 @@
#define SPDIF_A 0
#define SPDIF_B 1
/* Debug by PTM when bringup */
/* #define G12A_PTM */
struct spdif_chipinfo {
unsigned int id;
@@ -472,7 +475,10 @@ static int aml_spdif_new(struct snd_soc_pcm_runtime *rtd)
__func__,
(p_spdif->id == 0) ? "a":"b",
p_spdif->clk_cont);
/* keep frddr, when spdif init done, frddr can be released. */
/* keep frddr when probe, after spdif_frddr_init done
* frddr can be released, and spdif outputs zero data
* without frddr used.
*/
if (p_spdif->clk_cont)
spdifout_play_with_zerodata_free(p_spdif->id);
@@ -520,11 +526,6 @@ static int aml_dai_spdif_startup(
pr_info("asoc debug: %s-%d\n", __func__, __LINE__);
if (!p_spdif->clk_cont)
aml_spdif_fifo_reset(p_spdif->actrl,
substream->stream,
p_spdif->id);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
if (p_spdif->clk_cont) {
@@ -647,13 +648,13 @@ static int aml_dai_spdif_prepare(
spdif_get_channel_status_info(&chsts, runtime->rate);
spdif_set_channel_status_info(&chsts, p_spdif->id);
/* TOHDMITX_CTRL0 */
if (p_spdif->id == 1) {
spdifoutb_to_hdmitx_ctrl(p_spdif->id);
/* TOHDMITX_CTRL0
* Both spdif_a/spdif_b would notify to hdmitx
*/
spdifout_to_hdmitx_ctrl(p_spdif->id);
/* notify to hdmitx */
spdif_notify_to_hdmitx(substream);
/* notify to hdmitx */
spdif_notify_to_hdmitx(substream);
}
} else {
struct toddr *to = p_spdif->tddr;
unsigned int msb, lsb, toddr_type;
@@ -725,13 +726,19 @@ static int aml_dai_spdif_trigger(struct snd_pcm_substream *substream, int cmd,
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
/* reset fifo */
aml_spdif_fifo_reset(p_spdif->actrl,
substream->stream,
p_spdif->id);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
dev_info(substream->pcm->card->dev, "spdif playback enable\n");
dev_info(substream->pcm->card->dev, "S/PDIF Playback enable\n");
aml_frddr_enable(p_spdif->fddr, 1);
} else {
dev_info(substream->pcm->card->dev, "spdif capture enable\n");
dev_info(substream->pcm->card->dev, "S/PDIF Capture enable\n");
aml_toddr_enable(p_spdif->tddr, 1);
}
aml_spdif_enable(p_spdif->actrl,
substream->stream, p_spdif->id, true);
break;
@@ -739,13 +746,15 @@ static int aml_dai_spdif_trigger(struct snd_pcm_substream *substream, int cmd,
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
dev_info(substream->pcm->card->dev, "spdif playback disable\n");
dev_info(substream->pcm->card->dev, "S/PDIF Playback disable\n");
aml_frddr_enable(p_spdif->fddr, 0);
} else {
dev_info(substream->pcm->card->dev, "spdif capture disable\n");
dev_info(substream->pcm->card->dev, "S/PDIF Capture disable\n");
aml_toddr_enable(p_spdif->tddr, 0);
}
/* continuous, spdif out is only mute, not disable */
/* continuous-clock, spdif out is not disable,
* only mute, ensure spdif outputs zero data.
*/
if (p_spdif->clk_cont
&& (substream->stream == SNDRV_PCM_STREAM_PLAYBACK))
aml_spdif_mute(p_spdif->actrl,
@@ -791,8 +800,6 @@ static int aml_dai_set_spdif_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
return 0;
}
/*#define G12A_PTM*/
static void aml_set_spdifclk(struct aml_spdif *p_spdif)
{
unsigned int mpll_freq = 0;
@@ -903,7 +910,6 @@ static int aml_spdif_parse_of(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct aml_spdif *p_spdif = dev_get_drvdata(dev);
int ret = 0;
/* clock for spdif in */
@@ -940,7 +946,10 @@ static int aml_spdif_parse_of(struct platform_device *pdev)
if (p_spdif->irq_spdifin < 0)
dev_err(dev, "platform_get_irq_byname failed\n");
/* spdif pinmux */
/* spdif pinmux
* only for spdif_a
* spdif_b has no pin to output yet
*/
p_spdif->pin_ctl = devm_pinctrl_get_select(dev, "spdif_pins");
if (IS_ERR(p_spdif->pin_ctl)) {
dev_info(dev, "aml_spdif_get_pins error!\n");
@@ -963,7 +972,7 @@ static int aml_spdif_parse_of(struct platform_device *pdev)
pr_err("SPDIF IN extcon failed to register!!, ignore it\n");
}
/* clock for spdif in */
/* clock for spdif out */
/* clock gate */
p_spdif->gate_spdifout = devm_clk_get(dev, "gate_spdifout");
if (IS_ERR(p_spdif->gate_spdifout)) {
@@ -987,7 +996,7 @@ static int aml_spdif_parse_of(struct platform_device *pdev)
}
struct spdif_chipinfo axg_spdif_chipinfo = {
.id = SPDIF_A,
.id = SPDIF_A,
};
struct spdif_chipinfo g12a_spdif_a_chipinfo = {
@@ -1102,7 +1111,7 @@ struct platform_driver aml_spdif_driver = {
module_platform_driver(aml_spdif_driver);
MODULE_AUTHOR("Amlogic, Inc.");
MODULE_DESCRIPTION("Amlogic SPDIF ASoc driver");
MODULE_DESCRIPTION("Amlogic S/PDIF ASoc driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" DRV_NAME);
MODULE_DEVICE_TABLE(of, aml_spdif_device_id);

View File

@@ -297,15 +297,17 @@ void aml_spdifout_get_aed_info(int spdifout_id,
*frddrtype = (val >> 4) & 0x7;
}
/*value for spdif_index is only 0, 1 */
void spdifoutb_to_hdmitx_ctrl(int spdif_index)
/* spdifout to hdmix ctrl
* allow spdif out data to hdmitx
*/
void spdifout_to_hdmitx_ctrl(int spdif_index)
{
audiobus_write(EE_AUDIO_TOHDMITX_CTRL0,
1 << 31
| 1 << 3 /* spdif_clk_cap_inv */
| 0 << 2 /* spdif_clk_inv */
| spdif_index << 1 /* spdif_out_b */
| spdif_index << 0 /* spdif_clk_b */
| spdif_index << 1 /* spdif_out */
| spdif_index << 0 /* spdif_clk */
);
}
@@ -533,7 +535,7 @@ void spdifout_play_with_zerodata(unsigned int spdif_id)
/* spdif clk */
spdifout_clk_ctrl(spdif_id, true);
/* spdif to hdmitx */
spdifoutb_to_hdmitx_ctrl(spdif_id);
spdifout_to_hdmitx_ctrl(spdif_id);
/* spdif ctrl */
spdifout_fifo_ctrl(spdif_id, frddr_index, bitwidth);

View File

@@ -61,7 +61,7 @@ extern void aml_spdifout_select_aed(bool enable, int spdifout_id);
extern void aml_spdifout_get_aed_info(int spdifout_id,
int *bitwidth, int *frddrtype);
extern void spdifoutb_to_hdmitx_ctrl(int spdif_index);
extern void spdifout_to_hdmitx_ctrl(int spdif_index);
extern void spdifout_samesource_set(int spdif_index, int fifo_id,
int bitwidth, bool is_enable);