Commit 85157387 authored by Vlad Karpovich's avatar Vlad Karpovich Committed by DidntRead
Browse files

switch: arizona: Add LINEOUT detection state



Report LINEOUT ( 0x20) detection state if headset impedance is
greater than 5000 Ohm.

Change-Id: If399c85ebe786386e6973e150545d0be81f71143
Signed-off-by: default avatarVlad Karpovich <Vlad.Karpovich@cirrus.com>
parent cdd06c91
Loading
Loading
Loading
Loading
+22 −10
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@
#define ARIZONA_MICD_CLAMP_MODE_JDL_GP5H 0x9
#define ARIZONA_MICD_CLAMP_MODE_JDH_GP5H 0xb

#define ARIZONA_HPDET_LINEOUT 500000 /* 5,000 ohms */
#define ARIZONA_HPDET_MAX 1000000 /* 10,000 ohms */

#define HPDET_DEBOUNCE 600
@@ -242,7 +243,7 @@ enum headset_state {
	BIT_NO_HEADSET = 0,
	BIT_HEADSET = (1 << 0),
	BIT_HEADSET_NO_MIC = (1 << 1),
	BIT_HEADSET_UNSUPPORTED  = (1 << 2),
	BIT_LINEOUT = (1 << 5),
};

static ssize_t arizona_extcon_show(struct device *dev,
@@ -255,6 +256,11 @@ static ssize_t arizona_extcon_mic_show(struct device *dev,
				       char *buf);
static DEVICE_ATTR(mic_impedance, S_IRUGO, arizona_extcon_mic_show, NULL);

inline bool arizona_is_lineout(struct arizona_extcon_info *info)
{
	return info->arizona->hp_impedance_x100 >= ARIZONA_HPDET_LINEOUT;
}

inline void arizona_extcon_report(struct arizona_extcon_info *info, int state)
{
	dev_dbg(info->arizona->dev, "Switch Report: %d\n", state);
@@ -1691,11 +1697,9 @@ int arizona_hpdet_reading(struct arizona_extcon_info *info, int val)
		arizona_extcon_report(info, BIT_HEADSET);
		arizona_jds_set_state(info, &arizona_micd_button);
	} else {
		if (triple_pole_headphone || (large_mic_imp && val<=ARIZONA_HPDET_MAX))
		arizona_extcon_report(info, BIT_HEADSET_NO_MIC);
		else{
			arizona_extcon_report(info, BIT_HEADSET_UNSUPPORTED);
		}
		arizona_extcon_report(info, arizona_is_lineout(info) ?
				      BIT_LINEOUT :
				      BIT_HEADSET_NO_MIC);
		arizona_jds_set_state(info, NULL);
	}

@@ -2073,7 +2077,9 @@ done:
		if (info->mic)
			arizona_extcon_report(info, BIT_HEADSET);
		else
			arizona_extcon_report(info, BIT_HEADSET_NO_MIC);
			arizona_extcon_report(info, arizona_is_lineout(info) ?
					      BIT_LINEOUT :
					      BIT_HEADSET_NO_MIC);
	}

	if (arizona->pdata.micd_cb)
@@ -2104,7 +2110,9 @@ void arizona_micd_mic_timeout(struct arizona_extcon_info *info)
	else
		ret = arizona_jds_set_state(info, &arizona_hpdet_left);
	if (ret < 0)
		arizona_extcon_report(info, BIT_HEADSET_NO_MIC);
		arizona_extcon_report(info, arizona_is_lineout(info) ?
				      BIT_LINEOUT :
				      BIT_HEADSET_NO_MIC);
}
EXPORT_SYMBOL_GPL(arizona_micd_mic_timeout);

@@ -2171,7 +2179,9 @@ static int arizona_hpdet_acc_id_reading(struct arizona_extcon_info *info,
	} else {
		dev_dbg(arizona->dev, "Detected headphone\n");

		arizona_extcon_report(info, BIT_HEADSET_NO_MIC);
		arizona_extcon_report(info, arizona_is_lineout(info) ?
				      BIT_LINEOUT :
				      BIT_HEADSET_NO_MIC);

		arizona_jds_set_state(info, NULL);
	}
@@ -2230,7 +2240,9 @@ err:

	pm_runtime_put_autosuspend(info->dev);
	/* Just report headphone */
	arizona_extcon_report(info, BIT_HEADSET_NO_MIC);
	arizona_extcon_report(info, arizona_is_lineout(info) ?
			      BIT_LINEOUT :
			      BIT_HEADSET_NO_MIC);

	return ret;
}