diff options
-rw-r--r-- | include/linux/mfd/wm8994/registers.h | 115 | ||||
-rw-r--r-- | sound/soc/codecs/wm8994.c | 198 |
2 files changed, 301 insertions, 12 deletions
diff --git a/include/linux/mfd/wm8994/registers.h b/include/linux/mfd/wm8994/registers.h index 3eb70a4e7681..423b2b5c94ea 100644 --- a/include/linux/mfd/wm8994/registers.h +++ b/include/linux/mfd/wm8994/registers.h | |||
@@ -246,6 +246,15 @@ | |||
246 | #define WM8994_INTERRUPT_STATUS_2_MASK 0x739 | 246 | #define WM8994_INTERRUPT_STATUS_2_MASK 0x739 |
247 | #define WM8994_INTERRUPT_CONTROL 0x740 | 247 | #define WM8994_INTERRUPT_CONTROL 0x740 |
248 | #define WM8994_IRQ_DEBOUNCE 0x748 | 248 | #define WM8994_IRQ_DEBOUNCE 0x748 |
249 | #define WM8958_DSP2_PROGRAM 0x900 | ||
250 | #define WM8958_DSP2_CONFIG 0x901 | ||
251 | #define WM8958_DSP2_MAGICNUM 0xA00 | ||
252 | #define WM8958_DSP2_RELEASEYEAR 0xA01 | ||
253 | #define WM8958_DSP2_RELEASEMONTHDAY 0xA02 | ||
254 | #define WM8958_DSP2_RELEASETIME 0xA03 | ||
255 | #define WM8958_DSP2_VERMAJMIN 0xA04 | ||
256 | #define WM8958_DSP2_VERBUILD 0xA05 | ||
257 | #define WM8958_DSP2_EXECCONTROL 0xA0D | ||
249 | #define WM8994_WRITE_SEQUENCER_0 0x3000 | 258 | #define WM8994_WRITE_SEQUENCER_0 0x3000 |
250 | #define WM8994_WRITE_SEQUENCER_1 0x3001 | 259 | #define WM8994_WRITE_SEQUENCER_1 0x3001 |
251 | #define WM8994_WRITE_SEQUENCER_2 0x3002 | 260 | #define WM8994_WRITE_SEQUENCER_2 0x3002 |
@@ -2079,6 +2088,14 @@ | |||
2079 | /* | 2088 | /* |
2080 | * R520 (0x208) - Clocking (1) | 2089 | * R520 (0x208) - Clocking (1) |
2081 | */ | 2090 | */ |
2091 | #define WM8958_DSP2CLK_ENA 0x4000 /* DSP2CLK_ENA */ | ||
2092 | #define WM8958_DSP2CLK_ENA_MASK 0x4000 /* DSP2CLK_ENA */ | ||
2093 | #define WM8958_DSP2CLK_ENA_SHIFT 14 /* DSP2CLK_ENA */ | ||
2094 | #define WM8958_DSP2CLK_ENA_WIDTH 1 /* DSP2CLK_ENA */ | ||
2095 | #define WM8958_DSP2CLK_SRC 0x1000 /* DSP2CLK_SRC */ | ||
2096 | #define WM8958_DSP2CLK_SRC_MASK 0x1000 /* DSP2CLK_SRC */ | ||
2097 | #define WM8958_DSP2CLK_SRC_SHIFT 12 /* DSP2CLK_SRC */ | ||
2098 | #define WM8958_DSP2CLK_SRC_WIDTH 1 /* DSP2CLK_SRC */ | ||
2082 | #define WM8994_TOCLK_ENA 0x0010 /* TOCLK_ENA */ | 2099 | #define WM8994_TOCLK_ENA 0x0010 /* TOCLK_ENA */ |
2083 | #define WM8994_TOCLK_ENA_MASK 0x0010 /* TOCLK_ENA */ | 2100 | #define WM8994_TOCLK_ENA_MASK 0x0010 /* TOCLK_ENA */ |
2084 | #define WM8994_TOCLK_ENA_SHIFT 4 /* TOCLK_ENA */ | 2101 | #define WM8994_TOCLK_ENA_SHIFT 4 /* TOCLK_ENA */ |
@@ -4356,4 +4373,102 @@ | |||
4356 | #define WM8994_TEMP_SHUT_DB_SHIFT 0 /* TEMP_SHUT_DB */ | 4373 | #define WM8994_TEMP_SHUT_DB_SHIFT 0 /* TEMP_SHUT_DB */ |
4357 | #define WM8994_TEMP_SHUT_DB_WIDTH 1 /* TEMP_SHUT_DB */ | 4374 | #define WM8994_TEMP_SHUT_DB_WIDTH 1 /* TEMP_SHUT_DB */ |
4358 | 4375 | ||
4376 | /* | ||
4377 | * R2304 (0x900) - DSP2_Program | ||
4378 | */ | ||
4379 | #define WM8958_DSP2_ENA 0x0001 /* DSP2_ENA */ | ||
4380 | #define WM8958_DSP2_ENA_MASK 0x0001 /* DSP2_ENA */ | ||
4381 | #define WM8958_DSP2_ENA_SHIFT 0 /* DSP2_ENA */ | ||
4382 | #define WM8958_DSP2_ENA_WIDTH 1 /* DSP2_ENA */ | ||
4383 | |||
4384 | /* | ||
4385 | * R2305 (0x901) - DSP2_Config | ||
4386 | */ | ||
4387 | #define WM8958_MBC_SEL_MASK 0x0030 /* MBC_SEL - [5:4] */ | ||
4388 | #define WM8958_MBC_SEL_SHIFT 4 /* MBC_SEL - [5:4] */ | ||
4389 | #define WM8958_MBC_SEL_WIDTH 2 /* MBC_SEL - [5:4] */ | ||
4390 | #define WM8958_MBC_ENA 0x0001 /* MBC_ENA */ | ||
4391 | #define WM8958_MBC_ENA_MASK 0x0001 /* MBC_ENA */ | ||
4392 | #define WM8958_MBC_ENA_SHIFT 0 /* MBC_ENA */ | ||
4393 | #define WM8958_MBC_ENA_WIDTH 1 /* MBC_ENA */ | ||
4394 | |||
4395 | /* | ||
4396 | * R2560 (0xA00) - DSP2_MagicNum | ||
4397 | */ | ||
4398 | #define WM8958_DSP2_MAGIC_NUM_MASK 0xFFFF /* DSP2_MAGIC_NUM - [15:0] */ | ||
4399 | #define WM8958_DSP2_MAGIC_NUM_SHIFT 0 /* DSP2_MAGIC_NUM - [15:0] */ | ||
4400 | #define WM8958_DSP2_MAGIC_NUM_WIDTH 16 /* DSP2_MAGIC_NUM - [15:0] */ | ||
4401 | |||
4402 | /* | ||
4403 | * R2561 (0xA01) - DSP2_ReleaseYear | ||
4404 | */ | ||
4405 | #define WM8958_DSP2_RELEASE_YEAR_MASK 0xFFFF /* DSP2_RELEASE_YEAR - [15:0] */ | ||
4406 | #define WM8958_DSP2_RELEASE_YEAR_SHIFT 0 /* DSP2_RELEASE_YEAR - [15:0] */ | ||
4407 | #define WM8958_DSP2_RELEASE_YEAR_WIDTH 16 /* DSP2_RELEASE_YEAR - [15:0] */ | ||
4408 | |||
4409 | /* | ||
4410 | * R2562 (0xA02) - DSP2_ReleaseMonthDay | ||
4411 | */ | ||
4412 | #define WM8958_DSP2_RELEASE_MONTH_MASK 0xFF00 /* DSP2_RELEASE_MONTH - [15:8] */ | ||
4413 | #define WM8958_DSP2_RELEASE_MONTH_SHIFT 8 /* DSP2_RELEASE_MONTH - [15:8] */ | ||
4414 | #define WM8958_DSP2_RELEASE_MONTH_WIDTH 8 /* DSP2_RELEASE_MONTH - [15:8] */ | ||
4415 | #define WM8958_DSP2_RELEASE_DAY_MASK 0x00FF /* DSP2_RELEASE_DAY - [7:0] */ | ||
4416 | #define WM8958_DSP2_RELEASE_DAY_SHIFT 0 /* DSP2_RELEASE_DAY - [7:0] */ | ||
4417 | #define WM8958_DSP2_RELEASE_DAY_WIDTH 8 /* DSP2_RELEASE_DAY - [7:0] */ | ||
4418 | |||
4419 | /* | ||
4420 | * R2563 (0xA03) - DSP2_ReleaseTime | ||
4421 | */ | ||
4422 | #define WM8958_DSP2_RELEASE_HOURS_MASK 0xFF00 /* DSP2_RELEASE_HOURS - [15:8] */ | ||
4423 | #define WM8958_DSP2_RELEASE_HOURS_SHIFT 8 /* DSP2_RELEASE_HOURS - [15:8] */ | ||
4424 | #define WM8958_DSP2_RELEASE_HOURS_WIDTH 8 /* DSP2_RELEASE_HOURS - [15:8] */ | ||
4425 | #define WM8958_DSP2_RELEASE_MINS_MASK 0x00FF /* DSP2_RELEASE_MINS - [7:0] */ | ||
4426 | #define WM8958_DSP2_RELEASE_MINS_SHIFT 0 /* DSP2_RELEASE_MINS - [7:0] */ | ||
4427 | #define WM8958_DSP2_RELEASE_MINS_WIDTH 8 /* DSP2_RELEASE_MINS - [7:0] */ | ||
4428 | |||
4429 | /* | ||
4430 | * R2564 (0xA04) - DSP2_VerMajMin | ||
4431 | */ | ||
4432 | #define WM8958_DSP2_MAJOR_VER_MASK 0xFF00 /* DSP2_MAJOR_VER - [15:8] */ | ||
4433 | #define WM8958_DSP2_MAJOR_VER_SHIFT 8 /* DSP2_MAJOR_VER - [15:8] */ | ||
4434 | #define WM8958_DSP2_MAJOR_VER_WIDTH 8 /* DSP2_MAJOR_VER - [15:8] */ | ||
4435 | #define WM8958_DSP2_MINOR_VER_MASK 0x00FF /* DSP2_MINOR_VER - [7:0] */ | ||
4436 | #define WM8958_DSP2_MINOR_VER_SHIFT 0 /* DSP2_MINOR_VER - [7:0] */ | ||
4437 | #define WM8958_DSP2_MINOR_VER_WIDTH 8 /* DSP2_MINOR_VER - [7:0] */ | ||
4438 | |||
4439 | /* | ||
4440 | * R2565 (0xA05) - DSP2_VerBuild | ||
4441 | */ | ||
4442 | #define WM8958_DSP2_BUILD_VER_MASK 0xFFFF /* DSP2_BUILD_VER - [15:0] */ | ||
4443 | #define WM8958_DSP2_BUILD_VER_SHIFT 0 /* DSP2_BUILD_VER - [15:0] */ | ||
4444 | #define WM8958_DSP2_BUILD_VER_WIDTH 16 /* DSP2_BUILD_VER - [15:0] */ | ||
4445 | |||
4446 | /* | ||
4447 | * R2573 (0xA0D) - DSP2_ExecControl | ||
4448 | */ | ||
4449 | #define WM8958_DSP2_STOPC 0x0020 /* DSP2_STOPC */ | ||
4450 | #define WM8958_DSP2_STOPC_MASK 0x0020 /* DSP2_STOPC */ | ||
4451 | #define WM8958_DSP2_STOPC_SHIFT 5 /* DSP2_STOPC */ | ||
4452 | #define WM8958_DSP2_STOPC_WIDTH 1 /* DSP2_STOPC */ | ||
4453 | #define WM8958_DSP2_STOPS 0x0010 /* DSP2_STOPS */ | ||
4454 | #define WM8958_DSP2_STOPS_MASK 0x0010 /* DSP2_STOPS */ | ||
4455 | #define WM8958_DSP2_STOPS_SHIFT 4 /* DSP2_STOPS */ | ||
4456 | #define WM8958_DSP2_STOPS_WIDTH 1 /* DSP2_STOPS */ | ||
4457 | #define WM8958_DSP2_STOPI 0x0008 /* DSP2_STOPI */ | ||
4458 | #define WM8958_DSP2_STOPI_MASK 0x0008 /* DSP2_STOPI */ | ||
4459 | #define WM8958_DSP2_STOPI_SHIFT 3 /* DSP2_STOPI */ | ||
4460 | #define WM8958_DSP2_STOPI_WIDTH 1 /* DSP2_STOPI */ | ||
4461 | #define WM8958_DSP2_STOP 0x0004 /* DSP2_STOP */ | ||
4462 | #define WM8958_DSP2_STOP_MASK 0x0004 /* DSP2_STOP */ | ||
4463 | #define WM8958_DSP2_STOP_SHIFT 2 /* DSP2_STOP */ | ||
4464 | #define WM8958_DSP2_STOP_WIDTH 1 /* DSP2_STOP */ | ||
4465 | #define WM8958_DSP2_RUNR 0x0002 /* DSP2_RUNR */ | ||
4466 | #define WM8958_DSP2_RUNR_MASK 0x0002 /* DSP2_RUNR */ | ||
4467 | #define WM8958_DSP2_RUNR_SHIFT 1 /* DSP2_RUNR */ | ||
4468 | #define WM8958_DSP2_RUNR_WIDTH 1 /* DSP2_RUNR */ | ||
4469 | #define WM8958_DSP2_RUN 0x0001 /* DSP2_RUN */ | ||
4470 | #define WM8958_DSP2_RUN_MASK 0x0001 /* DSP2_RUN */ | ||
4471 | #define WM8958_DSP2_RUN_SHIFT 0 /* DSP2_RUN */ | ||
4472 | #define WM8958_DSP2_RUN_WIDTH 1 /* DSP2_RUN */ | ||
4473 | |||
4359 | #endif | 4474 | #endif |
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index fb0609315cd6..b30b2dd3f1f4 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
@@ -80,6 +80,8 @@ struct wm8994_priv { | |||
80 | int dac_rates[2]; | 80 | int dac_rates[2]; |
81 | int lrclk_shared[2]; | 81 | int lrclk_shared[2]; |
82 | 82 | ||
83 | int mbc_ena[3]; | ||
84 | |||
83 | /* Platform dependant DRC configuration */ | 85 | /* Platform dependant DRC configuration */ |
84 | const char **drc_texts; | 86 | const char **drc_texts; |
85 | int drc_cfg[WM8994_NUM_DRC]; | 87 | int drc_cfg[WM8994_NUM_DRC]; |
@@ -137,6 +139,7 @@ static int wm8994_volatile(unsigned int reg) | |||
137 | case WM8994_RATE_STATUS: | 139 | case WM8994_RATE_STATUS: |
138 | case WM8994_LDO_1: | 140 | case WM8994_LDO_1: |
139 | case WM8994_LDO_2: | 141 | case WM8994_LDO_2: |
142 | case WM8958_DSP2_EXECCONTROL: | ||
140 | return 1; | 143 | return 1; |
141 | default: | 144 | default: |
142 | return 0; | 145 | return 0; |
@@ -520,6 +523,168 @@ static const struct soc_enum aif2dacl_src = | |||
520 | static const struct soc_enum aif2dacr_src = | 523 | static const struct soc_enum aif2dacr_src = |
521 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 14, 2, aif_chan_src_text); | 524 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 14, 2, aif_chan_src_text); |
522 | 525 | ||
526 | static void wm8958_mbc_apply(struct snd_soc_codec *codec, int mbc, int start) | ||
527 | { | ||
528 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | ||
529 | int pwr_reg = snd_soc_read(codec, WM8994_POWER_MANAGEMENT_5); | ||
530 | int ena, reg, aif; | ||
531 | |||
532 | switch (mbc) { | ||
533 | case 0: | ||
534 | pwr_reg &= (WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA); | ||
535 | aif = 0; | ||
536 | break; | ||
537 | case 1: | ||
538 | pwr_reg &= (WM8994_AIF1DAC2L_ENA | WM8994_AIF1DAC2R_ENA); | ||
539 | aif = 0; | ||
540 | break; | ||
541 | case 2: | ||
542 | pwr_reg &= (WM8994_AIF2DACL_ENA | WM8994_AIF2DACR_ENA); | ||
543 | aif = 1; | ||
544 | break; | ||
545 | default: | ||
546 | BUG(); | ||
547 | return; | ||
548 | } | ||
549 | |||
550 | /* We can only enable the MBC if the AIF is enabled and we | ||
551 | * want it to be enabled. */ | ||
552 | ena = pwr_reg && wm8994->mbc_ena[mbc]; | ||
553 | |||
554 | reg = snd_soc_read(codec, WM8958_DSP2_PROGRAM); | ||
555 | |||
556 | dev_dbg(codec->dev, "MBC %d startup: %d, power: %x, DSP: %x\n", | ||
557 | mbc, start, pwr_reg, reg); | ||
558 | |||
559 | if (start && ena) { | ||
560 | /* If the DSP is already running then noop */ | ||
561 | if (reg & WM8958_DSP2_ENA) | ||
562 | return; | ||
563 | |||
564 | /* Switch the clock over to the appropriate AIF */ | ||
565 | snd_soc_update_bits(codec, WM8994_CLOCKING_1, | ||
566 | WM8958_DSP2CLK_SRC | WM8958_DSP2CLK_ENA, | ||
567 | aif << WM8958_DSP2CLK_SRC_SHIFT | | ||
568 | WM8958_DSP2CLK_ENA); | ||
569 | |||
570 | snd_soc_update_bits(codec, WM8958_DSP2_PROGRAM, | ||
571 | WM8958_DSP2_ENA, WM8958_DSP2_ENA); | ||
572 | |||
573 | /* TODO: Apply any user specified MBC settings */ | ||
574 | |||
575 | /* Run the DSP */ | ||
576 | snd_soc_write(codec, WM8958_DSP2_EXECCONTROL, | ||
577 | WM8958_DSP2_RUNR); | ||
578 | |||
579 | /* And we're off! */ | ||
580 | snd_soc_update_bits(codec, WM8958_DSP2_CONFIG, | ||
581 | WM8958_MBC_ENA | WM8958_MBC_SEL_MASK, | ||
582 | mbc << WM8958_MBC_SEL_SHIFT | | ||
583 | WM8958_MBC_ENA); | ||
584 | } else { | ||
585 | /* If the DSP is already stopped then noop */ | ||
586 | if (!(reg & WM8958_DSP2_ENA)) | ||
587 | return; | ||
588 | |||
589 | snd_soc_update_bits(codec, WM8958_DSP2_CONFIG, | ||
590 | WM8958_MBC_ENA, 0); | ||
591 | snd_soc_update_bits(codec, WM8958_DSP2_PROGRAM, | ||
592 | WM8958_DSP2_ENA, 0); | ||
593 | snd_soc_update_bits(codec, WM8994_CLOCKING_1, | ||
594 | WM8958_DSP2CLK_ENA, 0); | ||
595 | } | ||
596 | } | ||
597 | |||
598 | static int wm8958_aif_ev(struct snd_soc_dapm_widget *w, | ||
599 | struct snd_kcontrol *kcontrol, int event) | ||
600 | { | ||
601 | struct snd_soc_codec *codec = w->codec; | ||
602 | int mbc; | ||
603 | |||
604 | switch (w->shift) { | ||
605 | case 13: | ||
606 | case 12: | ||
607 | mbc = 2; | ||
608 | break; | ||
609 | case 11: | ||
610 | case 10: | ||
611 | mbc = 1; | ||
612 | break; | ||
613 | case 9: | ||
614 | case 8: | ||
615 | mbc = 0; | ||
616 | break; | ||
617 | default: | ||
618 | BUG(); | ||
619 | return -EINVAL; | ||
620 | } | ||
621 | |||
622 | switch (event) { | ||
623 | case SND_SOC_DAPM_POST_PMU: | ||
624 | wm8958_mbc_apply(codec, mbc, 1); | ||
625 | break; | ||
626 | case SND_SOC_DAPM_POST_PMD: | ||
627 | wm8958_mbc_apply(codec, mbc, 0); | ||
628 | break; | ||
629 | } | ||
630 | |||
631 | return 0; | ||
632 | } | ||
633 | |||
634 | static int wm8958_mbc_info(struct snd_kcontrol *kcontrol, | ||
635 | struct snd_ctl_elem_info *uinfo) | ||
636 | { | ||
637 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; | ||
638 | uinfo->count = 1; | ||
639 | uinfo->value.integer.min = 0; | ||
640 | uinfo->value.integer.max = 1; | ||
641 | return 0; | ||
642 | } | ||
643 | |||
644 | static int wm8958_mbc_get(struct snd_kcontrol *kcontrol, | ||
645 | struct snd_ctl_elem_value *ucontrol) | ||
646 | { | ||
647 | int mbc = kcontrol->private_value; | ||
648 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
649 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | ||
650 | |||
651 | ucontrol->value.integer.value[0] = wm8994->mbc_ena[mbc]; | ||
652 | |||
653 | return 0; | ||
654 | } | ||
655 | |||
656 | static int wm8958_mbc_put(struct snd_kcontrol *kcontrol, | ||
657 | struct snd_ctl_elem_value *ucontrol) | ||
658 | { | ||
659 | int mbc = kcontrol->private_value; | ||
660 | int i; | ||
661 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
662 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | ||
663 | |||
664 | if (ucontrol->value.integer.value[0] > 1) | ||
665 | return -EINVAL; | ||
666 | |||
667 | for (i = 0; i < ARRAY_SIZE(wm8994->mbc_ena); i++) { | ||
668 | if (mbc != i && wm8994->mbc_ena[i]) { | ||
669 | dev_dbg(codec->dev, "MBC %d active already\n", mbc); | ||
670 | return -EBUSY; | ||
671 | } | ||
672 | } | ||
673 | |||
674 | wm8994->mbc_ena[mbc] = ucontrol->value.integer.value[0]; | ||
675 | |||
676 | wm8958_mbc_apply(codec, mbc, wm8994->mbc_ena[mbc]); | ||
677 | |||
678 | return 0; | ||
679 | } | ||
680 | |||
681 | #define WM8958_MBC_SWITCH(xname, xval) {\ | ||
682 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ | ||
683 | .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,\ | ||
684 | .info = wm8958_mbc_info, \ | ||
685 | .get = wm8958_mbc_get, .put = wm8958_mbc_put, \ | ||
686 | .private_value = xval } | ||
687 | |||
523 | static const struct snd_kcontrol_new wm8994_snd_controls[] = { | 688 | static const struct snd_kcontrol_new wm8994_snd_controls[] = { |
524 | SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, | 689 | SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, |
525 | WM8994_AIF1_ADC1_RIGHT_VOLUME, | 690 | WM8994_AIF1_ADC1_RIGHT_VOLUME, |
@@ -649,6 +814,9 @@ SOC_SINGLE_TLV("AIF2 EQ5 Volume", WM8994_AIF2_EQ_GAINS_2, 6, 31, 0, | |||
649 | 814 | ||
650 | static const struct snd_kcontrol_new wm8958_snd_controls[] = { | 815 | static const struct snd_kcontrol_new wm8958_snd_controls[] = { |
651 | SOC_SINGLE_TLV("AIF3 Boost Volume", WM8958_AIF3_CONTROL_2, 10, 3, 0, aif_tlv), | 816 | SOC_SINGLE_TLV("AIF3 Boost Volume", WM8958_AIF3_CONTROL_2, 10, 3, 0, aif_tlv), |
817 | WM8958_MBC_SWITCH("AIF1DAC1 MBC Switch", 0), | ||
818 | WM8958_MBC_SWITCH("AIF1DAC2 MBC Switch", 1), | ||
819 | WM8958_MBC_SWITCH("AIF2DAC MBC Switch", 2), | ||
652 | }; | 820 | }; |
653 | 821 | ||
654 | static int clk_sys_event(struct snd_soc_dapm_widget *w, | 822 | static int clk_sys_event(struct snd_soc_dapm_widget *w, |
@@ -1018,19 +1186,23 @@ SND_SOC_DAPM_AIF_OUT("AIF1ADC1L", "AIF1 Capture", | |||
1018 | 0, WM8994_POWER_MANAGEMENT_4, 9, 0), | 1186 | 0, WM8994_POWER_MANAGEMENT_4, 9, 0), |
1019 | SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", "AIF1 Capture", | 1187 | SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", "AIF1 Capture", |
1020 | 0, WM8994_POWER_MANAGEMENT_4, 8, 0), | 1188 | 0, WM8994_POWER_MANAGEMENT_4, 8, 0), |
1021 | SND_SOC_DAPM_AIF_IN("AIF1DAC1L", NULL, 0, | 1189 | SND_SOC_DAPM_AIF_IN_E("AIF1DAC1L", NULL, 0, |
1022 | WM8994_POWER_MANAGEMENT_5, 9, 0), | 1190 | WM8994_POWER_MANAGEMENT_5, 9, 0, wm8958_aif_ev, |
1023 | SND_SOC_DAPM_AIF_IN("AIF1DAC1R", NULL, 0, | 1191 | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), |
1024 | WM8994_POWER_MANAGEMENT_5, 8, 0), | 1192 | SND_SOC_DAPM_AIF_IN_E("AIF1DAC1R", NULL, 0, |
1193 | WM8994_POWER_MANAGEMENT_5, 8, 0, wm8958_aif_ev, | ||
1194 | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1025 | 1195 | ||
1026 | SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", "AIF1 Capture", | 1196 | SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", "AIF1 Capture", |
1027 | 0, WM8994_POWER_MANAGEMENT_4, 11, 0), | 1197 | 0, WM8994_POWER_MANAGEMENT_4, 11, 0), |
1028 | SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", "AIF1 Capture", | 1198 | SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", "AIF1 Capture", |
1029 | 0, WM8994_POWER_MANAGEMENT_4, 10, 0), | 1199 | 0, WM8994_POWER_MANAGEMENT_4, 10, 0), |
1030 | SND_SOC_DAPM_AIF_IN("AIF1DAC2L", NULL, 0, | 1200 | SND_SOC_DAPM_AIF_IN_E("AIF1DAC2L", NULL, 0, |
1031 | WM8994_POWER_MANAGEMENT_5, 11, 0), | 1201 | WM8994_POWER_MANAGEMENT_5, 11, 0, wm8958_aif_ev, |
1032 | SND_SOC_DAPM_AIF_IN("AIF1DAC2R", NULL, 0, | 1202 | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), |
1033 | WM8994_POWER_MANAGEMENT_5, 10, 0), | 1203 | SND_SOC_DAPM_AIF_IN_E("AIF1DAC2R", NULL, 0, |
1204 | WM8994_POWER_MANAGEMENT_5, 10, 0, wm8958_aif_ev, | ||
1205 | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1034 | 1206 | ||
1035 | SND_SOC_DAPM_MIXER("AIF1ADC1L Mixer", SND_SOC_NOPM, 0, 0, | 1207 | SND_SOC_DAPM_MIXER("AIF1ADC1L Mixer", SND_SOC_NOPM, 0, 0, |
1036 | aif1adc1l_mix, ARRAY_SIZE(aif1adc1l_mix)), | 1208 | aif1adc1l_mix, ARRAY_SIZE(aif1adc1l_mix)), |
@@ -1059,10 +1231,12 @@ SND_SOC_DAPM_AIF_OUT("AIF2ADCL", NULL, 0, | |||
1059 | WM8994_POWER_MANAGEMENT_4, 13, 0), | 1231 | WM8994_POWER_MANAGEMENT_4, 13, 0), |
1060 | SND_SOC_DAPM_AIF_OUT("AIF2ADCR", NULL, 0, | 1232 | SND_SOC_DAPM_AIF_OUT("AIF2ADCR", NULL, 0, |
1061 | WM8994_POWER_MANAGEMENT_4, 12, 0), | 1233 | WM8994_POWER_MANAGEMENT_4, 12, 0), |
1062 | SND_SOC_DAPM_AIF_IN("AIF2DACL", NULL, 0, | 1234 | SND_SOC_DAPM_AIF_IN_E("AIF2DACL", NULL, 0, |
1063 | WM8994_POWER_MANAGEMENT_5, 13, 0), | 1235 | WM8994_POWER_MANAGEMENT_5, 13, 0, wm8958_aif_ev, |
1064 | SND_SOC_DAPM_AIF_IN("AIF2DACR", NULL, 0, | 1236 | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), |
1065 | WM8994_POWER_MANAGEMENT_5, 12, 0), | 1237 | SND_SOC_DAPM_AIF_IN_E("AIF2DACR", NULL, 0, |
1238 | WM8994_POWER_MANAGEMENT_5, 12, 0, wm8958_aif_ev, | ||
1239 | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1066 | 1240 | ||
1067 | SND_SOC_DAPM_AIF_IN("AIF1DACDAT", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), | 1241 | SND_SOC_DAPM_AIF_IN("AIF1DACDAT", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), |
1068 | SND_SOC_DAPM_AIF_IN("AIF2DACDAT", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0), | 1242 | SND_SOC_DAPM_AIF_IN("AIF2DACDAT", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0), |