diff options
author | Scott Peterson <speterson@nvidia.com> | 2013-04-26 13:07:32 -0700 |
---|---|---|
committer | Riham Haidar <rhaidar@nvidia.com> | 2013-05-06 12:06:23 -0700 |
commit | afebf28f22a86468f1d96e380aa86dbfb36c08a1 (patch) | |
tree | faaeb6676de53717c3abaf407bf4b295b6a1ce7d /drivers | |
parent | e20a0759c2094941186aa79cd2ea61fc5f254b75 (diff) |
arm: Reduce tfa9887 speaker pops
Reduce speakers pops when enabling/disabling
the NXP speaker protection device. Add an alsa
mixer control to mute the device from the audio
HAL prior to disabling the device.
Bug 1268519
Change-Id: I2d16c0443bd833b65d07ec2fabc36102443cc8ad
Signed-off-by: Scott Peterson <speterson@nvidia.com>
Reviewed-on: http://git-master/r/224002
Reviewed-by: Vinod Subbarayalu <vsubbarayalu@nvidia.com>
GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/misc/tfa9887.c | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/drivers/misc/tfa9887.c b/drivers/misc/tfa9887.c index c6104da22279..700896150047 100644 --- a/drivers/misc/tfa9887.c +++ b/drivers/misc/tfa9887.c @@ -1227,34 +1227,51 @@ EXPORT_SYMBOL(Tfa9887_Powerdown); int Powerdown(struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_byte, int powerdown) { int error; - unsigned int value; + unsigned int audioctrl_value = 0; + unsigned int sysctrl_value = 0; /* read the SystemControl register, modify the bit and write again */ - error = Tfa9887_ReadRegister(tfa9887, TFA9887_SYSTEM_CONTROL, &value); - if (error != Tfa9887_Error_Ok) { + error = Tfa9887_ReadRegister(tfa9887, TFA9887_SYSTEM_CONTROL, &sysctrl_value); + if (error != Tfa9887_Error_Ok) return error; - } switch(powerdown) { case 1: - value |= TFA9887_SYSCTRL_POWERDOWN; - SetMute(tfa9887,Tfa9887_Mute_Amplifier); + sysctrl_value &= ~TFA9887_SYSCTRL_ENBL_AMP; + sysctrl_value |= TFA9887_SYSCTRL_SEL_ENBL_AMP; + error = Tfa9887_WriteRegister(tfa9887, TFA9887_SYSTEM_CONTROL, + sysctrl_value); + msleep(50); + sysctrl_value |= TFA9887_SYSCTRL_POWERDOWN; + error = Tfa9887_WriteRegister(tfa9887, TFA9887_SYSTEM_CONTROL, + sysctrl_value); + msleep(10); break; - case 0: - value &= ~(TFA9887_SYSCTRL_POWERDOWN); + case 0: + sysctrl_value |= TFA9887_SYSCTRL_ENBL_AMP; + sysctrl_value |= TFA9887_SYSCTRL_SEL_ENBL_AMP; + sysctrl_value &= ~(TFA9887_SYSCTRL_POWERDOWN); + error = Tfa9887_WriteRegister(tfa9887, TFA9887_SYSTEM_CONTROL, + sysctrl_value); + error = Tfa9887_ReadRegister(tfa9887, TFA9887_AUDIO_CONTROL, + &audioctrl_value); + if (error != Tfa9887_Error_Ok) + return error; + audioctrl_value |= TFA9887_AUDIOCTRL_MUTE; + Tfa9887_WriteRegister(tfa9887, TFA9887_AUDIO_CONTROL, + audioctrl_value); + preset_mode = 0; + SetPreset(tfa9887,tfa9887_byte); + SetEq(tfa9887,tfa9887_byte); + audioctrl_value &= ~(TFA9887_AUDIOCTRL_MUTE); + Tfa9887_WriteRegister(tfa9887, TFA9887_AUDIO_CONTROL, + audioctrl_value); + break; + default: + error = -1; break; - default: - return -1; - } - error = Tfa9887_WriteRegister(tfa9887, TFA9887_SYSTEM_CONTROL, value); - if(!powerdown) { - SetMute(tfa9887,Tfa9887_Mute_Off); - preset_mode = 0; - SetPreset(tfa9887,tfa9887_byte); - SetEq(tfa9887,tfa9887_byte); } - - return error; + return error; } int SetMute(struct tfa9887_priv *tfa9887, Tfa9887_Mute_t mute) |