From 8cbdae16b29ddf95d9eccc74c355d8a37c520bdd Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Mon, 24 Aug 2015 16:02:34 +0100 Subject: [PATCH 167/203] tpa6130a2: Add headphone switch control Signed-off-by: Jan Grulich --- sound/soc/codecs/tpa6130a2.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) --- a/sound/soc/codecs/tpa6130a2.c +++ b/sound/soc/codecs/tpa6130a2.c @@ -4,6 +4,7 @@ * Copyright (C) Nokia Corporation * * Author: Peter Ujfalusi + * Modified: Jan Grulich * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -52,6 +53,8 @@ struct tpa6130a2_data { enum tpa_model id; }; +static void tpa6130a2_channel_enable(u8 channel, int enable); + static int tpa6130a2_i2c_read(int reg) { struct tpa6130a2_data *data; @@ -189,7 +192,7 @@ exit: } static int tpa6130a2_get_volsw(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) + struct snd_ctl_elem_value *ucontrol) { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; @@ -218,7 +221,7 @@ static int tpa6130a2_get_volsw(struct sn } static int tpa6130a2_put_volsw(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) + struct snd_ctl_elem_value *ucontrol) { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; @@ -255,8 +258,22 @@ static int tpa6130a2_put_volsw(struct sn return 1; } +static int tpa6130a2_put_hp_sw(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int enable = ucontrol->value.integer.value[0]; + unsigned int state; + + state = (tpa6130a2_read(TPA6130A2_REG_VOL_MUTE) & 0x80) == 0; + if (state == enable) + return 0; /* No change */ + + tpa6130a2_channel_enable(TPA6130A2_HP_EN_R | TPA6130A2_HP_EN_L, enable); + return 1; /* Changed */ +} + /* - * TPA6130 volume. From -59.5 to 4 dB with increasing step size when going + * TPA6130 volume. From -59.5 to +4.0 dB with increasing step size when going * down in gain. */ static const unsigned int tpa6130_tlv[] = { @@ -278,6 +295,9 @@ static const struct snd_kcontrol_new tpa TPA6130A2_REG_VOL_MUTE, 0, 0x3f, 0, tpa6130a2_get_volsw, tpa6130a2_put_volsw, tpa6130_tlv), + SOC_SINGLE_EXT("TPA6130A2 Headphone Playback Switch", + TPA6130A2_REG_VOL_MUTE, 7, 1, 1, + tpa6130a2_get_volsw, tpa6130a2_put_hp_sw), }; static const unsigned int tpa6140_tlv[] = { @@ -292,6 +312,9 @@ static const struct snd_kcontrol_new tpa TPA6130A2_REG_VOL_MUTE, 1, 0x1f, 0, tpa6130a2_get_volsw, tpa6130a2_put_volsw, tpa6140_tlv), + SOC_SINGLE_EXT("TPA6140A2 Headphone Playback Switch", + TPA6130A2_REG_VOL_MUTE, 7, 1, 1, + tpa6130a2_get_volsw, tpa6130a2_put_hp_sw), }; /*