summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorScott Peterson <speterson@nvidia.com>2013-04-26 13:07:32 -0700
committerRiham Haidar <rhaidar@nvidia.com>2013-05-06 12:06:23 -0700
commitafebf28f22a86468f1d96e380aa86dbfb36c08a1 (patch)
treefaaeb6676de53717c3abaf407bf4b295b6a1ce7d /drivers
parente20a0759c2094941186aa79cd2ea61fc5f254b75 (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.c55
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)