From 21d1f8644699d29c3032f39ca2bf9e8c45a8d4c3 Mon Sep 17 00:00:00 2001 From: Karthikeyan Mani Date: Wed, 28 Dec 2016 12:26:51 -0800 Subject: [PATCH] ASoC: wcd9xxx: Enable EAR LO concurrency in codec Add support for ear-lineout concurrency for wcd934x audio codec. Add LO path power up, power down, EAR path power up, power down sequences. Avoid using class H when both EAR and LO enabled. CRs-fixed: 1107183 Change-Id: I60099381cbf042b795f703b673717ab5ff4bd88f Signed-off-by: Karthikeyan Mani --- sound/soc/codecs/wcd9xxx-common-v2.c | 55 ++++++++++++++-------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/sound/soc/codecs/wcd9xxx-common-v2.c b/sound/soc/codecs/wcd9xxx-common-v2.c index 47518ec92661..d637a7b48f75 100644 --- a/sound/soc/codecs/wcd9xxx-common-v2.c +++ b/sound/soc/codecs/wcd9xxx-common-v2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -758,35 +758,35 @@ static void wcd_clsh_state_ear_lo(struct snd_soc_codec *codec, dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), is_enable ? "enable" : "disable"); - if (is_enable && (req_state == WCD_CLSH_STATE_LO)) { - wcd_clsh_set_buck_regulator_mode(codec, CLS_AB); - } else { - if (req_state == WCD_CLSH_STATE_EAR) - goto end; - - /* LO powerdown. - * If EAR Class-H is already enabled, just - * turn on regulator other enable Class-H - * configuration + if (is_enable) { + /* LO powerup is taken care in PA sequence. + * No need to change to class AB here. */ - if (wcd_clsh_enable_status(codec)) { - wcd_clsh_set_buck_regulator_mode(codec, - CLS_H_NORMAL); - goto end; + if (req_state == WCD_CLSH_STATE_EAR) { + /* EAR powerup.*/ + if (!wcd_clsh_enable_status(codec)) { + wcd_enable_clsh_block(codec, clsh_d, true); + wcd_clsh_set_buck_mode(codec, mode); + wcd_clsh_set_flyback_mode(codec, mode); + } + snd_soc_update_bits(codec, + WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, + 0x40, 0x40); } - wcd_enable_clsh_block(codec, clsh_d, true); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - wcd_clsh_set_buck_regulator_mode(codec, - CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); + } else { + if (req_state == WCD_CLSH_STATE_EAR) { + /* EAR powerdown.*/ + wcd_enable_clsh_block(codec, clsh_d, false); + wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); + wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); + snd_soc_update_bits(codec, + WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, + 0x40, 0x00); + } + /* LO powerdown is taken care in PA sequence. + * No need to change to class H here. + */ } -end: - return; } static void wcd_clsh_state_hph_lo(struct snd_soc_codec *codec, @@ -1135,6 +1135,7 @@ static bool wcd_clsh_is_state_valid(u8 state) case WCD_CLSH_STATE_HPHL_LO: case WCD_CLSH_STATE_HPHR_LO: case WCD_CLSH_STATE_HPH_ST_LO: + case WCD_CLSH_STATE_EAR_LO: return true; default: return false;