|
@@ -2202,6 +2202,16 @@ int da7218_hpldet(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(da7218_hpldet);
|
|
EXPORT_SYMBOL_GPL(da7218_hpldet);
|
|
|
|
|
|
|
|
+static void da7218_micldet_irq(struct snd_soc_codec *codec)
|
|
|
|
+{
|
|
|
|
+ char *envp[] = {
|
|
|
|
+ "EVENT=MIC_LEVEL_DETECT",
|
|
|
|
+ NULL,
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ kobject_uevent_env(&codec->dev->kobj, KOBJ_CHANGE, envp);
|
|
|
|
+}
|
|
|
|
+
|
|
static void da7218_hpldet_irq(struct snd_soc_codec *codec)
|
|
static void da7218_hpldet_irq(struct snd_soc_codec *codec)
|
|
{
|
|
{
|
|
struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
|
|
struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
|
|
@@ -2232,6 +2242,10 @@ static irqreturn_t da7218_irq_thread(int irq, void *data)
|
|
if (!status)
|
|
if (!status)
|
|
return IRQ_NONE;
|
|
return IRQ_NONE;
|
|
|
|
|
|
|
|
+ /* Mic level detect */
|
|
|
|
+ if (status & DA7218_LVL_DET_EVENT_MASK)
|
|
|
|
+ da7218_micldet_irq(codec);
|
|
|
|
+
|
|
/* HP detect */
|
|
/* HP detect */
|
|
if (status & DA7218_HPLDET_JACK_EVENT_MASK)
|
|
if (status & DA7218_HPLDET_JACK_EVENT_MASK)
|
|
da7218_hpldet_irq(codec);
|
|
da7218_hpldet_irq(codec);
|
|
@@ -2936,11 +2950,6 @@ static int da7218_probe(struct snd_soc_codec *codec)
|
|
}
|
|
}
|
|
|
|
|
|
if (da7218->irq) {
|
|
if (da7218->irq) {
|
|
- /* Mask off mic level events, currently not handled */
|
|
|
|
- snd_soc_update_bits(codec, DA7218_EVENT_MASK,
|
|
|
|
- DA7218_LVL_DET_EVENT_MSK_MASK,
|
|
|
|
- DA7218_LVL_DET_EVENT_MSK_MASK);
|
|
|
|
-
|
|
|
|
ret = devm_request_threaded_irq(codec->dev, da7218->irq, NULL,
|
|
ret = devm_request_threaded_irq(codec->dev, da7218->irq, NULL,
|
|
da7218_irq_thread,
|
|
da7218_irq_thread,
|
|
IRQF_TRIGGER_LOW | IRQF_ONESHOT,
|
|
IRQF_TRIGGER_LOW | IRQF_ONESHOT,
|