diff options
Diffstat (limited to 'sound/soc/msm/msm8x16.c')
-rw-r--r-- | sound/soc/msm/msm8x16.c | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/sound/soc/msm/msm8x16.c b/sound/soc/msm/msm8x16.c index a17cdfe1a6ef..c7b153260be7 100644 --- a/sound/soc/msm/msm8x16.c +++ b/sound/soc/msm/msm8x16.c @@ -593,28 +593,29 @@ static int msm8x16_enable_codec_ext_clk(struct snd_soc_codec *codec, atomic_read(&pdata->mclk_rsc_ref)); if (enable) { if (atomic_inc_return(&pdata->mclk_rsc_ref) == 1) { + cancel_delayed_work_sync( + &pdata->disable_mclk_work); mutex_lock(&pdata->cdc_mclk_mutex); - if (atomic_read(&pdata->dis_work_mclk) == true) { - cancel_delayed_work_sync( - &pdata->enable_mclk_work); - } else { - pdata->digital_cdc_clk.clk_val = pdata->mclk_freq; + if (atomic_read(&pdata->mclk_enabled) == false) { + pdata->digital_cdc_clk.clk_val = + pdata->mclk_freq; afe_set_digital_codec_core_clock( AFE_PORT_ID_PRIMARY_MI2S_RX, &pdata->digital_cdc_clk); - atomic_set(&pdata->dis_work_mclk, true); + atomic_set(&pdata->mclk_enabled, true); } mutex_unlock(&pdata->cdc_mclk_mutex); } } else { + cancel_delayed_work_sync(&pdata->disable_mclk_work); mutex_lock(&pdata->cdc_mclk_mutex); - atomic_set(&pdata->mclk_rsc_ref, 0); - cancel_delayed_work_sync(&pdata->enable_mclk_work); - pdata->digital_cdc_clk.clk_val = 0; - afe_set_digital_codec_core_clock( - AFE_PORT_ID_PRIMARY_MI2S_RX, - &pdata->digital_cdc_clk); - atomic_set(&pdata->dis_work_mclk, false); + if (atomic_read(&pdata->mclk_enabled) == true) { + pdata->digital_cdc_clk.clk_val = 0; + afe_set_digital_codec_core_clock( + AFE_PORT_ID_PRIMARY_MI2S_RX, + &pdata->digital_cdc_clk); + atomic_set(&pdata->mclk_enabled, false); + } mutex_unlock(&pdata->cdc_mclk_mutex); } return ret; @@ -1820,26 +1821,30 @@ static struct snd_soc_card bear_cards[MAX_SND_CARDS] = { }, }; -void enable_mclk(struct work_struct *work) +void disable_mclk(struct work_struct *work) { struct msm8916_asoc_mach_data *pdata = NULL; struct delayed_work *dwork; int ret = 0; - pr_debug("%s:\n", __func__); dwork = to_delayed_work(work); pdata = container_of(dwork, struct msm8916_asoc_mach_data, - enable_mclk_work); + disable_mclk_work); mutex_lock(&pdata->cdc_mclk_mutex); - if (atomic_read(&pdata->dis_work_mclk) == true) { - pr_debug("clock enabled now disable\n"); + pr_debug("%s: mclk_enabled %d mclk_rsc_ref %d\n", __func__, + atomic_read(&pdata->mclk_enabled), + atomic_read(&pdata->mclk_rsc_ref)); + + if (atomic_read(&pdata->mclk_enabled) == true + && atomic_read(&pdata->mclk_rsc_ref) == 0) { + pr_debug("Disable the mclk\n"); pdata->digital_cdc_clk.clk_val = 0; ret = afe_set_digital_codec_core_clock( AFE_PORT_ID_PRIMARY_MI2S_RX, &pdata->digital_cdc_clk); if (ret < 0) - pr_err("failed to disable the MCLK\n"); - atomic_set(&pdata->dis_work_mclk, false); + pr_err("%s failed to disable the MCLK\n", __func__); + atomic_set(&pdata->mclk_enabled, false); } mutex_unlock(&pdata->cdc_mclk_mutex); } @@ -2161,6 +2166,8 @@ static int msm8x16_asoc_machine_probe(struct platform_device *pdev) pdata->digital_cdc_clk.clk_val = pdata->mclk_freq; pdata->digital_cdc_clk.clk_root = 5; pdata->digital_cdc_clk.reserved = 0; + /* Initialize loopback mode to false */ + pdata->lb_mode = false; msm8x16_setup_hs_jack(pdev, pdata); @@ -2171,10 +2178,10 @@ static int msm8x16_asoc_machine_probe(struct platform_device *pdev) if (ret) goto err; /* initialize timer */ - INIT_DELAYED_WORK(&pdata->enable_mclk_work, enable_mclk); + INIT_DELAYED_WORK(&pdata->disable_mclk_work, disable_mclk); mutex_init(&pdata->cdc_mclk_mutex); atomic_set(&pdata->mclk_rsc_ref, 0); - atomic_set(&pdata->dis_work_mclk, false); + atomic_set(&pdata->mclk_enabled, false); ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); |