diff options
Diffstat (limited to 'sound/soc/codecs/wm8962.c')
-rw-r--r-- | sound/soc/codecs/wm8962.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 7c421cc837bd..b9cb1fcf8c92 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c | |||
@@ -29,10 +29,10 @@ | |||
29 | #include <sound/pcm.h> | 29 | #include <sound/pcm.h> |
30 | #include <sound/pcm_params.h> | 30 | #include <sound/pcm_params.h> |
31 | #include <sound/soc.h> | 31 | #include <sound/soc.h> |
32 | #include <sound/soc-dapm.h> | ||
33 | #include <sound/initval.h> | 32 | #include <sound/initval.h> |
34 | #include <sound/tlv.h> | 33 | #include <sound/tlv.h> |
35 | #include <sound/wm8962.h> | 34 | #include <sound/wm8962.h> |
35 | #include <trace/events/asoc.h> | ||
36 | 36 | ||
37 | #include "wm8962.h" | 37 | #include "wm8962.h" |
38 | 38 | ||
@@ -1956,7 +1956,7 @@ static int wm8962_readable_register(unsigned int reg) | |||
1956 | 1956 | ||
1957 | static int wm8962_reset(struct snd_soc_codec *codec) | 1957 | static int wm8962_reset(struct snd_soc_codec *codec) |
1958 | { | 1958 | { |
1959 | return snd_soc_write(codec, WM8962_SOFTWARE_RESET, 0); | 1959 | return snd_soc_write(codec, WM8962_SOFTWARE_RESET, 0x6243); |
1960 | } | 1960 | } |
1961 | 1961 | ||
1962 | static const DECLARE_TLV_DB_SCALE(inpga_tlv, -2325, 75, 0); | 1962 | static const DECLARE_TLV_DB_SCALE(inpga_tlv, -2325, 75, 0); |
@@ -2677,6 +2677,7 @@ static const struct snd_soc_dapm_route wm8962_spk_stereo_intercon[] = { | |||
2677 | static int wm8962_add_widgets(struct snd_soc_codec *codec) | 2677 | static int wm8962_add_widgets(struct snd_soc_codec *codec) |
2678 | { | 2678 | { |
2679 | struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); | 2679 | struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); |
2680 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
2680 | 2681 | ||
2681 | snd_soc_add_controls(codec, wm8962_snd_controls, | 2682 | snd_soc_add_controls(codec, wm8962_snd_controls, |
2682 | ARRAY_SIZE(wm8962_snd_controls)); | 2683 | ARRAY_SIZE(wm8962_snd_controls)); |
@@ -2688,26 +2689,26 @@ static int wm8962_add_widgets(struct snd_soc_codec *codec) | |||
2688 | ARRAY_SIZE(wm8962_spk_stereo_controls)); | 2689 | ARRAY_SIZE(wm8962_spk_stereo_controls)); |
2689 | 2690 | ||
2690 | 2691 | ||
2691 | snd_soc_dapm_new_controls(codec, wm8962_dapm_widgets, | 2692 | snd_soc_dapm_new_controls(dapm, wm8962_dapm_widgets, |
2692 | ARRAY_SIZE(wm8962_dapm_widgets)); | 2693 | ARRAY_SIZE(wm8962_dapm_widgets)); |
2693 | if (pdata && pdata->spk_mono) | 2694 | if (pdata && pdata->spk_mono) |
2694 | snd_soc_dapm_new_controls(codec, wm8962_dapm_spk_mono_widgets, | 2695 | snd_soc_dapm_new_controls(dapm, wm8962_dapm_spk_mono_widgets, |
2695 | ARRAY_SIZE(wm8962_dapm_spk_mono_widgets)); | 2696 | ARRAY_SIZE(wm8962_dapm_spk_mono_widgets)); |
2696 | else | 2697 | else |
2697 | snd_soc_dapm_new_controls(codec, wm8962_dapm_spk_stereo_widgets, | 2698 | snd_soc_dapm_new_controls(dapm, wm8962_dapm_spk_stereo_widgets, |
2698 | ARRAY_SIZE(wm8962_dapm_spk_stereo_widgets)); | 2699 | ARRAY_SIZE(wm8962_dapm_spk_stereo_widgets)); |
2699 | 2700 | ||
2700 | snd_soc_dapm_add_routes(codec, wm8962_intercon, | 2701 | snd_soc_dapm_add_routes(dapm, wm8962_intercon, |
2701 | ARRAY_SIZE(wm8962_intercon)); | 2702 | ARRAY_SIZE(wm8962_intercon)); |
2702 | if (pdata && pdata->spk_mono) | 2703 | if (pdata && pdata->spk_mono) |
2703 | snd_soc_dapm_add_routes(codec, wm8962_spk_mono_intercon, | 2704 | snd_soc_dapm_add_routes(dapm, wm8962_spk_mono_intercon, |
2704 | ARRAY_SIZE(wm8962_spk_mono_intercon)); | 2705 | ARRAY_SIZE(wm8962_spk_mono_intercon)); |
2705 | else | 2706 | else |
2706 | snd_soc_dapm_add_routes(codec, wm8962_spk_stereo_intercon, | 2707 | snd_soc_dapm_add_routes(dapm, wm8962_spk_stereo_intercon, |
2707 | ARRAY_SIZE(wm8962_spk_stereo_intercon)); | 2708 | ARRAY_SIZE(wm8962_spk_stereo_intercon)); |
2708 | 2709 | ||
2709 | 2710 | ||
2710 | snd_soc_dapm_disable_pin(codec, "Beep"); | 2711 | snd_soc_dapm_disable_pin(dapm, "Beep"); |
2711 | 2712 | ||
2712 | return 0; | 2713 | return 0; |
2713 | } | 2714 | } |
@@ -2814,7 +2815,7 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec, | |||
2814 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); | 2815 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); |
2815 | int ret; | 2816 | int ret; |
2816 | 2817 | ||
2817 | if (level == codec->bias_level) | 2818 | if (level == codec->dapm.bias_level) |
2818 | return 0; | 2819 | return 0; |
2819 | 2820 | ||
2820 | switch (level) { | 2821 | switch (level) { |
@@ -2828,7 +2829,7 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec, | |||
2828 | break; | 2829 | break; |
2829 | 2830 | ||
2830 | case SND_SOC_BIAS_STANDBY: | 2831 | case SND_SOC_BIAS_STANDBY: |
2831 | if (codec->bias_level == SND_SOC_BIAS_OFF) { | 2832 | if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { |
2832 | ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), | 2833 | ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), |
2833 | wm8962->supplies); | 2834 | wm8962->supplies); |
2834 | if (ret != 0) { | 2835 | if (ret != 0) { |
@@ -2878,7 +2879,7 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec, | |||
2878 | wm8962->supplies); | 2879 | wm8962->supplies); |
2879 | break; | 2880 | break; |
2880 | } | 2881 | } |
2881 | codec->bias_level = level; | 2882 | codec->dapm.bias_level = level; |
2882 | return 0; | 2883 | return 0; |
2883 | } | 2884 | } |
2884 | 2885 | ||
@@ -3348,6 +3349,12 @@ static irqreturn_t wm8962_irq(int irq, void *data) | |||
3348 | if (active & (WM8962_MICSCD_EINT | WM8962_MICD_EINT)) { | 3349 | if (active & (WM8962_MICSCD_EINT | WM8962_MICD_EINT)) { |
3349 | dev_dbg(codec->dev, "Microphone event detected\n"); | 3350 | dev_dbg(codec->dev, "Microphone event detected\n"); |
3350 | 3351 | ||
3352 | #ifndef CONFIG_SND_SOC_WM8962_MODULE | ||
3353 | trace_snd_soc_jack_irq(dev_name(codec->dev)); | ||
3354 | #endif | ||
3355 | |||
3356 | pm_wakeup_event(codec->dev, 300); | ||
3357 | |||
3351 | schedule_delayed_work(&wm8962->mic_work, | 3358 | schedule_delayed_work(&wm8962->mic_work, |
3352 | msecs_to_jiffies(250)); | 3359 | msecs_to_jiffies(250)); |
3353 | } | 3360 | } |
@@ -3433,6 +3440,7 @@ static void wm8962_beep_work(struct work_struct *work) | |||
3433 | struct wm8962_priv *wm8962 = | 3440 | struct wm8962_priv *wm8962 = |
3434 | container_of(work, struct wm8962_priv, beep_work); | 3441 | container_of(work, struct wm8962_priv, beep_work); |
3435 | struct snd_soc_codec *codec = wm8962->codec; | 3442 | struct snd_soc_codec *codec = wm8962->codec; |
3443 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
3436 | int i; | 3444 | int i; |
3437 | int reg = 0; | 3445 | int reg = 0; |
3438 | int best = 0; | 3446 | int best = 0; |
@@ -3449,16 +3457,16 @@ static void wm8962_beep_work(struct work_struct *work) | |||
3449 | 3457 | ||
3450 | reg = WM8962_BEEP_ENA | (best << WM8962_BEEP_RATE_SHIFT); | 3458 | reg = WM8962_BEEP_ENA | (best << WM8962_BEEP_RATE_SHIFT); |
3451 | 3459 | ||
3452 | snd_soc_dapm_enable_pin(codec, "Beep"); | 3460 | snd_soc_dapm_enable_pin(dapm, "Beep"); |
3453 | } else { | 3461 | } else { |
3454 | dev_dbg(codec->dev, "Disabling beep\n"); | 3462 | dev_dbg(codec->dev, "Disabling beep\n"); |
3455 | snd_soc_dapm_disable_pin(codec, "Beep"); | 3463 | snd_soc_dapm_disable_pin(dapm, "Beep"); |
3456 | } | 3464 | } |
3457 | 3465 | ||
3458 | snd_soc_update_bits(codec, WM8962_BEEP_GENERATOR_1, | 3466 | snd_soc_update_bits(codec, WM8962_BEEP_GENERATOR_1, |
3459 | WM8962_BEEP_ENA | WM8962_BEEP_RATE_MASK, reg); | 3467 | WM8962_BEEP_ENA | WM8962_BEEP_RATE_MASK, reg); |
3460 | 3468 | ||
3461 | snd_soc_dapm_sync(codec); | 3469 | snd_soc_dapm_sync(dapm); |
3462 | } | 3470 | } |
3463 | 3471 | ||
3464 | /* For usability define a way of injecting beep events for the device - | 3472 | /* For usability define a way of injecting beep events for the device - |
@@ -3706,7 +3714,7 @@ static int wm8962_probe(struct snd_soc_codec *codec) | |||
3706 | INIT_DELAYED_WORK(&wm8962->mic_work, wm8962_mic_work); | 3714 | INIT_DELAYED_WORK(&wm8962->mic_work, wm8962_mic_work); |
3707 | 3715 | ||
3708 | codec->cache_sync = 1; | 3716 | codec->cache_sync = 1; |
3709 | codec->idle_bias_off = 1; | 3717 | codec->dapm.idle_bias_off = 1; |
3710 | 3718 | ||
3711 | ret = snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_I2C); | 3719 | ret = snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_I2C); |
3712 | if (ret != 0) { | 3720 | if (ret != 0) { |
@@ -3865,7 +3873,6 @@ err_enable: | |||
3865 | err_get: | 3873 | err_get: |
3866 | regulator_bulk_free(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); | 3874 | regulator_bulk_free(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); |
3867 | err: | 3875 | err: |
3868 | kfree(wm8962); | ||
3869 | return ret; | 3876 | return ret; |
3870 | } | 3877 | } |
3871 | 3878 | ||