diff options
| author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-02-05 20:20:17 +0000 | 
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-02-11 16:06:25 +0000 | 
| commit | bf14ee5a460276a99ed35f9034bae9e74b01600f (patch) | |
| tree | cdbdf09b18c74374952d6cc70fa65f1759f4c96a /drivers/extcon | |
| parent | c37b387f077c54c5a01fa240dc8448b60bd731c1 (diff) | |
| download | olio-linux-3.10-bf14ee5a460276a99ed35f9034bae9e74b01600f.tar.xz olio-linux-3.10-bf14ee5a460276a99ed35f9034bae9e74b01600f.zip  | |
extcon: arizona: Use MICDET for final microphone identification
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>
Diffstat (limited to 'drivers/extcon')
| -rw-r--r-- | drivers/extcon/extcon-arizona.c | 16 | 
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c index d9918421e80..dc357a4051f 100644 --- a/drivers/extcon/extcon-arizona.c +++ b/drivers/extcon/extcon-arizona.c @@ -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,  |