audio: add codec trigger mute for depop [1/1]

PD#SWPL-6944

Problem:
TV-3381
Speaker sometimes has clicking noise when playing DTV program.

Solution:
add codec trigger mute for depop

Verify:
Local verified.

Change-Id: Ib15a6b90bd3a6cdda2255afaf86daeab68ba07e2
Signed-off-by: Shuai Li <shuai.li@amlogic.com>
This commit is contained in:
Shuai Li
2019-04-06 16:17:57 +08:00
committed by Tao Zeng
parent 35eb57d7df
commit 27c68d02b0
3 changed files with 52 additions and 7 deletions

View File

@@ -645,7 +645,7 @@ static int aml_card_dai_link_of(struct device_node *node,
dai_link->ops = &aml_card_ops;
dai_link->init = aml_card_dai_init;
dai_link->nonatomic = 1;
dev_dbg(dev, "\tname : %s\n", dai_link->stream_name);
dev_dbg(dev, "\tformat : %04x\n", dai_link->dai_fmt);
dev_dbg(dev, "\tcpu : %s / %d\n",

View File

@@ -67,6 +67,12 @@ static struct frddr_attach attach_aed;
static void aml_check_aed(bool enable, int dst);
static bool aml_check_aed_module(int dst);
static irqreturn_t aml_ddr_isr(int irq, void *devid)
{
(void)devid;
return IRQ_WAKE_THREAD;
}
/* to DDRS */
static struct toddr *register_toddr_l(struct device *dev,
struct aml_audio_controller *actrl,
@@ -88,8 +94,8 @@ static struct toddr *register_toddr_l(struct device *dev,
to = &toddrs[i];
/* irqs request */
ret = request_irq(to->irq, handler,
0, dev_name(dev), data);
ret = request_threaded_irq(to->irq, aml_ddr_isr, handler,
IRQF_SHARED, dev_name(dev), data);
if (ret) {
dev_err(dev, "failed to claim irq %u\n", to->irq);
return NULL;
@@ -879,8 +885,8 @@ static struct frddr *register_frddr_l(struct device *dev,
/* (1 << 31)|(1 << mask_bit));*/
/* irqs request */
ret = request_irq(from->irq, handler,
0, dev_name(dev), data);
ret = request_threaded_irq(from->irq, aml_ddr_isr, handler,
IRQF_SHARED, dev_name(dev), data);
if (ret) {
dev_err(dev, "failed to claim irq %u\n", from->irq);
return NULL;

View File

@@ -52,7 +52,9 @@
#define TAS5805M_REG_29 (0x29)
#define TAS5805M_REG_2A (0x2a)
#define TAS5805M_REG_2B (0x2b)
#define TAS5805M_SDOUT_SEL (0x30)
#define TAS5805M_REG_35 (0x35)
#define TAS5805M_DIG_VAL_CTL (0x4c)
#define TAS5805M_REG_7F (0x7f)
#define TAS5805M_PAGE_00 (0x00)
@@ -231,6 +233,7 @@ struct tas5805m_priv {
struct tas5805m_platform_data *pdata;
int vol;
int mute;
struct snd_soc_codec *codec;
};
const struct regmap_config tas5805m_regmap = {
@@ -303,6 +306,7 @@ static void tas5805m_set_volume(struct snd_soc_codec *codec, int vol)
uint8_t byte3;
uint8_t byte2;
uint8_t byte1;
pr_info("%s(), vol = %d\n", __func__, vol);
index = get_volume_index(vol);
volume_hex = tas5805m_volume[index];
@@ -340,7 +344,6 @@ static int tas5805m_vol_locked_put(struct snd_kcontrol *kcontrol,
tas5805m->vol = ucontrol->value.integer.value[0];
tas5805m_set_volume(codec, tas5805m->vol);
return 0;
}
@@ -433,10 +436,13 @@ static int tas5805m_set_bias_level(struct snd_soc_codec *codec,
static int tas5805m_snd_probe(struct snd_soc_codec *codec)
{
struct tas5805m_priv *tas5805m = snd_soc_codec_get_drvdata(codec);
int ret;
ret = snd_soc_add_codec_controls(codec, tas5805m_vol_control, 2);
ret = snd_soc_add_codec_controls(codec, tas5805m_vol_control,
ARRAY_SIZE(tas5805m_vol_control));
tas5805m->codec = codec;
return ret;
}
@@ -476,8 +482,41 @@ static struct snd_soc_codec_driver soc_codec_tas5805m = {
.set_bias_level = tas5805m_set_bias_level,
};
static int tas5805m_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *codec_dai)
{
struct tas5805m_priv *tas5805m = snd_soc_dai_get_drvdata(codec_dai);
struct snd_soc_codec *codec = tas5805m->codec;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
pr_debug("%s(), start\n", __func__);
snd_soc_write(codec, TAS5805M_REG_00, TAS5805M_PAGE_00);
snd_soc_write(codec, TAS5805M_REG_7F, TAS5805M_BOOK_00);
snd_soc_write(codec, TAS5805M_REG_00, TAS5805M_PAGE_00);
snd_soc_write(codec, TAS5805M_DIG_VAL_CTL, 0x30);
break;
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
pr_debug("%s(), stop\n", __func__);
snd_soc_write(codec, TAS5805M_REG_00, TAS5805M_PAGE_00);
snd_soc_write(codec, TAS5805M_REG_7F, TAS5805M_BOOK_00);
snd_soc_write(codec, TAS5805M_REG_00, TAS5805M_PAGE_00);
snd_soc_write(codec, TAS5805M_DIG_VAL_CTL, 0xff);
break;
}
}
return 0;
}
static const struct snd_soc_dai_ops tas5805m_dai_ops = {
//.digital_mute = tas5805m_mute,
.trigger = tas5805m_trigger,
};
static struct snd_soc_dai_driver tas5805m_dai = {