static int msm_mclk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { pr_debug("%s: event = %d\n", __func__, event); switch (event) { case SND_SOC_DAPM_PRE_PMU: clk_users++; pr_debug("%s: clk_users = %d\n", __func__, clk_users); if (clk_users != 1) return 0; codec_clk = clk_get(NULL, "i2s_spkr_osr_clk"); if (codec_clk) { clk_set_rate(codec_clk, 12288000); clk_enable(codec_clk); tabla_mclk_enable(w->codec, 1, true); } else { pr_err("%s: Error setting Tabla MCLK\n", __func__); clk_users--; return -EINVAL; } break; case SND_SOC_DAPM_POST_PMD: pr_debug("%s: clk_users = %d\n", __func__, clk_users); if (clk_users == 0) return 0; clk_users--; if (!clk_users) { pr_debug("%s: disabling MCLK. clk_users = %d\n", __func__, clk_users); clk_disable(codec_clk); clk_put(codec_clk); tabla_mclk_enable(w->codec, 0, true); } break; } return 0; }
static int msm8960_enable_codec_ext_clk(struct snd_soc_codec *codec, int enable, bool dapm) { int r = 0; pr_debug("%s: enable = %d\n", __func__, enable); mutex_lock(&cdc_mclk_mutex); if (enable) { clk_users++; pr_debug("%s: clk_users = %d\n", __func__, clk_users); if (clk_users == 1) { codec_clk = clk_get(NULL, "i2s_spkr_osr_clk"); if (codec_clk) { clk_set_rate(codec_clk, TABLA_EXT_CLK_RATE); clk_enable(codec_clk); tabla_mclk_enable(codec, 1, dapm); } else { pr_err("%s: Error setting Tabla MCLK\n", __func__); clk_users--; r = -EINVAL; } } } else { if (clk_users > 0) { clk_users--; pr_debug("%s: clk_users = %d\n", __func__, clk_users); if (clk_users == 0) { pr_debug("%s: disabling MCLK. clk_users = %d\n", __func__, clk_users); clk_disable(codec_clk); clk_put(codec_clk); tabla_mclk_enable(codec, 0, dapm); } } else { pr_err("%s: Error releasing Tabla MCLK\n", __func__); r = -EINVAL; } } mutex_unlock(&cdc_mclk_mutex); return r; }