extcon: arizona: Use MICDET for final microphone identification
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 5 Feb 2013 20:20:17 +0000 (20:20 +0000)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 11 Feb 2013 16:06:25 +0000 (16:06 +0000)
When using HPDET to identify the accessory still run MICDET before we
report a microphone in order to ensure that the accessory identified is
compatible with the MICDET detection ranges after having confirmed that
the device is not using a headphone.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
drivers/extcon/extcon-arizona.c

index d9918421e80b264887e60fb0bbcedd00b93d045d..dc357a4051f6d79aa5497ee0883c903d0baf97ac 100644 (file)
@@ -56,6 +56,7 @@ struct arizona_extcon_info {
        struct delayed_work hpdet_work;
 
        bool hpdet_active;
+       bool hpdet_done;
 
        int num_hpdet_res;
        unsigned int hpdet_res[3];
@@ -394,7 +395,6 @@ static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading)
 {
        struct arizona *arizona = info->arizona;
        int id_gpio = arizona->pdata.hpdet_id_gpio;
-       int ret;
 
        /*
         * If we're using HPDET for accessory identification we need
@@ -463,13 +463,7 @@ static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading)
                    (id_gpio && info->hpdet_res[2] > 10)) {
                        dev_dbg(arizona->dev, "Detected mic\n");
                        info->mic = true;
-                       ret = extcon_set_cable_state_(&info->edev,
-                                                     ARIZONA_CABLE_MICROPHONE,
-                                                     true);
-                       if (ret != 0) {
-                               dev_err(arizona->dev,
-                                       "Failed to report mic: %d\n", ret);
-                       }
+                       info->detecting = true;
                } else {
                        dev_dbg(arizona->dev, "Detected headphone\n");
                }
@@ -586,6 +580,8 @@ done:
                info->hpdet_active = false;
        }
 
+       info->hpdet_done = true;
+
 out:
        mutex_unlock(&info->lock);
 
@@ -597,6 +593,9 @@ static void arizona_identify_headphone(struct arizona_extcon_info *info)
        struct arizona *arizona = info->arizona;
        int ret;
 
+       if (info->hpdet_done)
+               return;
+
        dev_dbg(arizona->dev, "Starting HPDET\n");
 
        /* Make sure we keep the device enabled during the measurement */
@@ -923,6 +922,7 @@ static irqreturn_t arizona_jackdet(int irq, void *data)
                for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
                        info->hpdet_res[i] = 0;
                info->mic = false;
+               info->hpdet_done = false;
 
                for (i = 0; i < ARIZONA_NUM_BUTTONS; i++)
                        input_report_key(info->input,