ASoC: rt5665: calibration should be done before jack detection
authorBard Liao <bardliao@realtek.com>
Thu, 29 Jun 2017 12:07:50 +0000 (20:07 +0800)
committerMark Brown <broonie@kernel.org>
Fri, 30 Jun 2017 11:36:38 +0000 (12:36 +0100)
We will set some volatile registers in jack detection function. But
those volatile registers will be clear in rt5665_calibrate function
because we set cache bypass and reset codec in rt5665_calibrate function.
This patch add a flag to make sure that rt5665_calibrate is done
before starting jack detection.

Signed-off-by: Bard Liao <bardliao@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5665.c

index 7420010fd8e9fca33119442d8a50badf23365c33..370ed54d1e1590f1036a4ff4425c0462245d3360 100644 (file)
@@ -70,6 +70,7 @@ struct rt5665_priv {
        int jack_type;
        int irq_work_delay_time;
        unsigned int sar_adc_value;
+       bool calibration_done;
 };
 
 static const struct reg_default rt5665_reg[] = {
@@ -1305,6 +1306,11 @@ static void rt5665_jack_detect_handler(struct work_struct *work)
                usleep_range(10000, 15000);
        }
 
+       while (!rt5665->calibration_done) {
+               pr_debug("%s calibration not ready\n", __func__);
+               usleep_range(10000, 15000);
+       }
+
        mutex_lock(&rt5665->calibrate_mutex);
 
        val = snd_soc_read(rt5665->codec, RT5665_AJD1_CTRL) & 0x0010;
@@ -4695,6 +4701,7 @@ static void rt5665_calibrate(struct rt5665_priv *rt5665)
        regmap_write(rt5665->regmap, RT5665_ASRC_8, 0x0120);
 
 out_unlock:
+       rt5665->calibration_done = true;
        mutex_unlock(&rt5665->calibrate_mutex);
 }