Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5445822e authored by Yeleswarapu Nagaradhesh's avatar Yeleswarapu Nagaradhesh
Browse files

ASoC: msm: 8939: schedule mbhc start after 4sec



mbhc initial calibration needs mclk to be enabled, so schedule
headset detection for 4sec so that modem gets loaded and will be ready
to accept mclk enable request command.

Change-Id: I19d07f5c4d9b35cbff3df72ebf7cdff99419d38e
Signed-off-by: default avatarYeleswarapu Nagaradhesh <nagaradh@codeaurora.org>
parent 110f3df6
Loading
Loading
Loading
Loading
+40 −5
Original line number Original line Diff line number Diff line
@@ -70,6 +70,7 @@
#define LPASS_CSR_GP_IO_MUX_SPKR_CTL 0x07702004
#define LPASS_CSR_GP_IO_MUX_SPKR_CTL 0x07702004


#define ADSP_STATE_READY_TIMEOUT_MS    50
#define ADSP_STATE_READY_TIMEOUT_MS    50
#define HS_STARTWORK_TIMEOUT		4000


static int slim0_rx_sample_rate = SAMPLING_RATE_48KHZ;
static int slim0_rx_sample_rate = SAMPLING_RATE_48KHZ;
static int slim0_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int slim0_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
@@ -91,6 +92,8 @@ struct msm8939_asoc_mach_data {
	int us_euro_gpio;
	int us_euro_gpio;
	struct mutex cdc_mclk_mutex;
	struct mutex cdc_mclk_mutex;
	struct afe_digital_clk_cfg digital_cdc_clk;
	struct afe_digital_clk_cfg digital_cdc_clk;
	struct delayed_work hs_detect_dwork;
	struct snd_soc_codec *codec;
};
};


static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, int enable,
static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, int enable,
@@ -896,6 +899,29 @@ out:
	return err;
	return err;
}
}


static void hs_detect_work(struct work_struct *work)
{
	struct delayed_work *dwork;
	struct msm8939_asoc_mach_data *pdata;
	int ret;

	pr_debug("%s: enter\n", __func__);

	dwork = to_delayed_work(work);
	pdata = container_of(dwork, struct msm8939_asoc_mach_data,
			hs_detect_dwork);
	ret = tapan_hs_detect(pdata->codec, &wcd9xxx_mbhc_cfg);
	if (ret < 0)
		pr_err("%s: Failed to intialise mbhc %d\n", __func__, ret);

	/*
	 *  Set pdata->codec back to NULL, to ensure codec pointer
	 *  is not referenced further from this structure.
	 */
	pdata->codec =  NULL;
	pr_debug("%s: leave\n", __func__);
}

static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
{
{


@@ -903,6 +929,8 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
	struct snd_soc_dapm_context *dapm = &codec->dapm;
	struct snd_soc_dapm_context *dapm = &codec->dapm;
	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
	struct snd_soc_dai *codec_dai = rtd->codec_dai;
	struct snd_soc_dai *codec_dai = rtd->codec_dai;
	struct snd_soc_card *card = codec->card;
	struct msm8939_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
	void __iomem *vaddr = NULL;
	void __iomem *vaddr = NULL;
	int val = 0;
	int val = 0;
	int ret = 0;
	int ret = 0;
@@ -992,13 +1020,19 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
	pr_debug("%s:val2 %x\n", __func__, val);
	pr_debug("%s:val2 %x\n", __func__, val);
	iounmap(vaddr);
	iounmap(vaddr);



	/* start mbhc */
	wcd9xxx_mbhc_cfg.calibration = def_codec_mbhc_cal();
	wcd9xxx_mbhc_cfg.calibration = def_codec_mbhc_cal();
	if (wcd9xxx_mbhc_cfg.calibration)
	if (wcd9xxx_mbhc_cfg.calibration) {
		ret = tapan_hs_detect(codec, &wcd9xxx_mbhc_cfg);
		/*
	else
		 * mbhc inital calibration needs mclk to be enabled, so schedule
		 * headset detection for 4sec so that modem gets loaded and
		 * will be ready to accept mclk request command.
		 */
		pdata->codec = codec;
		schedule_delayed_work(&pdata->hs_detect_dwork,
				  msecs_to_jiffies(HS_STARTWORK_TIMEOUT));
	} else {
		ret = -ENOMEM;
		ret = -ENOMEM;
	}
	return ret;
	return ret;
}
}


@@ -2099,6 +2133,7 @@ static int msm8939_asoc_machine_probe(struct platform_device *pdev)
	spdev = pdev;
	spdev = pdev;
	card->dev = &pdev->dev;
	card->dev = &pdev->dev;


	INIT_DELAYED_WORK(&pdata->hs_detect_dwork, hs_detect_work);
	mutex_init(&pdata->cdc_mclk_mutex);
	mutex_init(&pdata->cdc_mclk_mutex);
	ret = snd_soc_of_parse_card_name(card, "qcom,model");
	ret = snd_soc_of_parse_card_name(card, "qcom,model");
	if (ret) {
	if (ret) {