diff options
-rw-r--r-- | sound/soc/codecs/wm8994.c | 87 | ||||
-rw-r--r-- | sound/soc/codecs/wm8994.h | 2 |
2 files changed, 37 insertions, 52 deletions
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 4b4d58d3875e..4cd1b6cdb34f 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
@@ -91,8 +91,6 @@ static int wm8994_retune_mobile_base[] = { | |||
91 | WM8994_AIF2_EQ_GAINS_1, | 91 | WM8994_AIF2_EQ_GAINS_1, |
92 | }; | 92 | }; |
93 | 93 | ||
94 | static void wm8958_default_micdet(u16 status, void *data); | ||
95 | |||
96 | static const struct wm8958_micd_rate micdet_rates[] = { | 94 | static const struct wm8958_micd_rate micdet_rates[] = { |
97 | { 32768, true, 1, 4 }, | 95 | { 32768, true, 1, 4 }, |
98 | { 32768, false, 1, 1 }, | 96 | { 32768, false, 1, 1 }, |
@@ -116,9 +114,6 @@ static void wm8958_micd_set_rate(struct snd_soc_codec *codec) | |||
116 | const struct wm8958_micd_rate *rates; | 114 | const struct wm8958_micd_rate *rates; |
117 | int num_rates; | 115 | int num_rates; |
118 | 116 | ||
119 | if (wm8994->jack_cb != wm8958_default_micdet) | ||
120 | return; | ||
121 | |||
122 | idle = !wm8994->jack_mic; | 117 | idle = !wm8994->jack_mic; |
123 | 118 | ||
124 | sysclk = snd_soc_read(codec, WM8994_CLOCKING_1); | 119 | sysclk = snd_soc_read(codec, WM8994_CLOCKING_1); |
@@ -740,7 +735,7 @@ static void wm1811_jackdet_set_mode(struct snd_soc_codec *codec, u16 mode) | |||
740 | { | 735 | { |
741 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 736 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
742 | 737 | ||
743 | if (!wm8994->jackdet || !wm8994->jack_cb) | 738 | if (!wm8994->jackdet || !wm8994->micdet[0].jack) |
744 | return; | 739 | return; |
745 | 740 | ||
746 | if (wm8994->active_refcount) | 741 | if (wm8994->active_refcount) |
@@ -3409,16 +3404,37 @@ static void wm1811_micd_stop(struct snd_soc_codec *codec) | |||
3409 | "MICBIAS2"); | 3404 | "MICBIAS2"); |
3410 | } | 3405 | } |
3411 | 3406 | ||
3412 | /* Default microphone detection handler for WM8958 - the user can | 3407 | static void wm8958_button_det(struct snd_soc_codec *codec, u16 status) |
3413 | * override this if they wish. | ||
3414 | */ | ||
3415 | static void wm8958_default_micdet(u16 status, void *data) | ||
3416 | { | 3408 | { |
3417 | struct snd_soc_codec *codec = data; | ||
3418 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 3409 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
3419 | int report; | 3410 | int report; |
3420 | 3411 | ||
3421 | dev_dbg(codec->dev, "MICDET %x\n", status); | 3412 | report = 0; |
3413 | if (status & 0x4) | ||
3414 | report |= SND_JACK_BTN_0; | ||
3415 | |||
3416 | if (status & 0x8) | ||
3417 | report |= SND_JACK_BTN_1; | ||
3418 | |||
3419 | if (status & 0x10) | ||
3420 | report |= SND_JACK_BTN_2; | ||
3421 | |||
3422 | if (status & 0x20) | ||
3423 | report |= SND_JACK_BTN_3; | ||
3424 | |||
3425 | if (status & 0x40) | ||
3426 | report |= SND_JACK_BTN_4; | ||
3427 | |||
3428 | if (status & 0x80) | ||
3429 | report |= SND_JACK_BTN_5; | ||
3430 | |||
3431 | snd_soc_jack_report(wm8994->micdet[0].jack, report, | ||
3432 | wm8994->btn_mask); | ||
3433 | } | ||
3434 | |||
3435 | static void wm8958_mic_id(struct snd_soc_codec *codec, u16 status) | ||
3436 | { | ||
3437 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | ||
3422 | 3438 | ||
3423 | /* Either nothing present or just starting detection */ | 3439 | /* Either nothing present or just starting detection */ |
3424 | if (!(status & WM8958_MICD_STS)) { | 3440 | if (!(status & WM8958_MICD_STS)) { |
@@ -3440,7 +3456,7 @@ static void wm8958_default_micdet(u16 status, void *data) | |||
3440 | /* If the measurement is showing a high impedence we've got a | 3456 | /* If the measurement is showing a high impedence we've got a |
3441 | * microphone. | 3457 | * microphone. |
3442 | */ | 3458 | */ |
3443 | if (wm8994->mic_detecting && (status & 0x600)) { | 3459 | if (status & 0x600) { |
3444 | dev_dbg(codec->dev, "Detected microphone\n"); | 3460 | dev_dbg(codec->dev, "Detected microphone\n"); |
3445 | 3461 | ||
3446 | wm8994->mic_detecting = false; | 3462 | wm8994->mic_detecting = false; |
@@ -3453,7 +3469,7 @@ static void wm8958_default_micdet(u16 status, void *data) | |||
3453 | } | 3469 | } |
3454 | 3470 | ||
3455 | 3471 | ||
3456 | if (wm8994->mic_detecting && status & 0xfc) { | 3472 | if (status & 0xfc) { |
3457 | dev_dbg(codec->dev, "Detected headphone\n"); | 3473 | dev_dbg(codec->dev, "Detected headphone\n"); |
3458 | wm8994->mic_detecting = false; | 3474 | wm8994->mic_detecting = false; |
3459 | 3475 | ||
@@ -3465,31 +3481,6 @@ static void wm8958_default_micdet(u16 status, void *data) | |||
3465 | snd_soc_jack_report(wm8994->micdet[0].jack, SND_JACK_HEADPHONE, | 3481 | snd_soc_jack_report(wm8994->micdet[0].jack, SND_JACK_HEADPHONE, |
3466 | SND_JACK_HEADSET); | 3482 | SND_JACK_HEADSET); |
3467 | } | 3483 | } |
3468 | |||
3469 | /* Report short circuit as a button */ | ||
3470 | if (wm8994->jack_mic) { | ||
3471 | report = 0; | ||
3472 | if (status & 0x4) | ||
3473 | report |= SND_JACK_BTN_0; | ||
3474 | |||
3475 | if (status & 0x8) | ||
3476 | report |= SND_JACK_BTN_1; | ||
3477 | |||
3478 | if (status & 0x10) | ||
3479 | report |= SND_JACK_BTN_2; | ||
3480 | |||
3481 | if (status & 0x20) | ||
3482 | report |= SND_JACK_BTN_3; | ||
3483 | |||
3484 | if (status & 0x40) | ||
3485 | report |= SND_JACK_BTN_4; | ||
3486 | |||
3487 | if (status & 0x80) | ||
3488 | report |= SND_JACK_BTN_5; | ||
3489 | |||
3490 | snd_soc_jack_report(wm8994->micdet[0].jack, report, | ||
3491 | wm8994->btn_mask); | ||
3492 | } | ||
3493 | } | 3484 | } |
3494 | 3485 | ||
3495 | /* Deferred mic detection to allow for extra settling time */ | 3486 | /* Deferred mic detection to allow for extra settling time */ |
@@ -3648,18 +3639,14 @@ int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | |||
3648 | } | 3639 | } |
3649 | 3640 | ||
3650 | if (jack) { | 3641 | if (jack) { |
3651 | if (!cb) { | 3642 | /* No longer supported */ |
3652 | dev_dbg(codec->dev, "Using default micdet callback\n"); | 3643 | if (cb) |
3653 | cb = wm8958_default_micdet; | 3644 | return -EINVAL; |
3654 | cb_data = codec; | ||
3655 | } | ||
3656 | 3645 | ||
3657 | snd_soc_dapm_force_enable_pin(&codec->dapm, "CLK_SYS"); | 3646 | snd_soc_dapm_force_enable_pin(&codec->dapm, "CLK_SYS"); |
3658 | snd_soc_dapm_sync(&codec->dapm); | 3647 | snd_soc_dapm_sync(&codec->dapm); |
3659 | 3648 | ||
3660 | wm8994->micdet[0].jack = jack; | 3649 | wm8994->micdet[0].jack = jack; |
3661 | wm8994->jack_cb = cb; | ||
3662 | wm8994->jack_cb_data = cb_data; | ||
3663 | 3650 | ||
3664 | wm8994->mic_detecting = true; | 3651 | wm8994->mic_detecting = true; |
3665 | wm8994->jack_mic = false; | 3652 | wm8994->jack_mic = false; |
@@ -3762,10 +3749,10 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data) | |||
3762 | trace_snd_soc_jack_irq(dev_name(codec->dev)); | 3749 | trace_snd_soc_jack_irq(dev_name(codec->dev)); |
3763 | #endif | 3750 | #endif |
3764 | 3751 | ||
3765 | if (wm8994->jack_cb) | 3752 | if (wm8994->mic_detecting) |
3766 | wm8994->jack_cb(reg, wm8994->jack_cb_data); | 3753 | wm8958_mic_id(codec, reg); |
3767 | else | 3754 | else |
3768 | dev_warn(codec->dev, "Accessory detection with no callback\n"); | 3755 | wm8958_button_det(codec, reg); |
3769 | 3756 | ||
3770 | out: | 3757 | out: |
3771 | pm_runtime_put(codec->dev); | 3758 | pm_runtime_put(codec->dev); |
@@ -4296,7 +4283,7 @@ static int wm8994_resume(struct device *dev) | |||
4296 | { | 4283 | { |
4297 | struct wm8994_priv *wm8994 = dev_get_drvdata(dev); | 4284 | struct wm8994_priv *wm8994 = dev_get_drvdata(dev); |
4298 | 4285 | ||
4299 | if (wm8994->jackdet && wm8994->jack_cb) | 4286 | if (wm8994->jackdet && wm8994->jackdet_mode) |
4300 | regmap_update_bits(wm8994->wm8994->regmap, WM8994_ANTIPOP_2, | 4287 | regmap_update_bits(wm8994->wm8994->regmap, WM8994_ANTIPOP_2, |
4301 | WM1811_JACKDET_MODE_MASK, | 4288 | WM1811_JACKDET_MODE_MASK, |
4302 | WM1811_JACKDET_MODE_AUDIO); | 4289 | WM1811_JACKDET_MODE_AUDIO); |
diff --git a/sound/soc/codecs/wm8994.h b/sound/soc/codecs/wm8994.h index f618d16e1a12..f5546f242ab1 100644 --- a/sound/soc/codecs/wm8994.h +++ b/sound/soc/codecs/wm8994.h | |||
@@ -137,8 +137,6 @@ struct wm8994_priv { | |||
137 | int jackdet_mode; | 137 | int jackdet_mode; |
138 | struct delayed_work jackdet_bootstrap; | 138 | struct delayed_work jackdet_bootstrap; |
139 | 139 | ||
140 | wm8958_micdet_cb jack_cb; | ||
141 | void *jack_cb_data; | ||
142 | int micdet_irq; | 140 | int micdet_irq; |
143 | 141 | ||
144 | int revision; | 142 | int revision; |