patch_cs8409.c (c16c8bfa09d5f318c1bd65698d058d3739970c24) | patch_cs8409.c (9cd827381310e9947ea0ed7fb69b6491419549f2) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * HD audio interface patch for Cirrus Logic CS8409 HDA bridge chip 4 * 5 * Copyright (C) 2021 Cirrus Logic, Inc. and 6 * Cirrus Logic International Semiconductor Ltd. 7 */ 8 --- 467 unchanged lines hidden (view full) --- 476} 477 478static void cs42l42_mute(struct sub_codec *cs42l42, int vol_type, 479 unsigned int chs, bool mute) 480{ 481 if (mute) { 482 if (vol_type == CS42L42_VOL_DAC) { 483 if (chs & BIT(0)) | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * HD audio interface patch for Cirrus Logic CS8409 HDA bridge chip 4 * 5 * Copyright (C) 2021 Cirrus Logic, Inc. and 6 * Cirrus Logic International Semiconductor Ltd. 7 */ 8 --- 467 unchanged lines hidden (view full) --- 476} 477 478static void cs42l42_mute(struct sub_codec *cs42l42, int vol_type, 479 unsigned int chs, bool mute) 480{ 481 if (mute) { 482 if (vol_type == CS42L42_VOL_DAC) { 483 if (chs & BIT(0)) |
484 cs8409_i2c_write(cs42l42, CS42L42_REG_HS_VOL_CHA, 0x3f); | 484 cs8409_i2c_write(cs42l42, CS42L42_MIXER_CHA_VOL, 0x3f); |
485 if (chs & BIT(1)) | 485 if (chs & BIT(1)) |
486 cs8409_i2c_write(cs42l42, CS42L42_REG_HS_VOL_CHB, 0x3f); | 486 cs8409_i2c_write(cs42l42, CS42L42_MIXER_CHB_VOL, 0x3f); |
487 } else if (vol_type == CS42L42_VOL_ADC) { 488 if (chs & BIT(0)) | 487 } else if (vol_type == CS42L42_VOL_ADC) { 488 if (chs & BIT(0)) |
489 cs8409_i2c_write(cs42l42, CS42L42_REG_AMIC_VOL, 0x9f); | 489 cs8409_i2c_write(cs42l42, CS42L42_ADC_VOLUME, 0x9f); |
490 } 491 } else { 492 if (vol_type == CS42L42_VOL_DAC) { 493 if (chs & BIT(0)) | 490 } 491 } else { 492 if (vol_type == CS42L42_VOL_DAC) { 493 if (chs & BIT(0)) |
494 cs8409_i2c_write(cs42l42, CS42L42_REG_HS_VOL_CHA, | 494 cs8409_i2c_write(cs42l42, CS42L42_MIXER_CHA_VOL, |
495 -(cs42l42->vol[CS42L42_DAC_CH0_VOL_OFFSET]) | 495 -(cs42l42->vol[CS42L42_DAC_CH0_VOL_OFFSET]) |
496 & CS42L42_REG_HS_VOL_MASK); | 496 & CS42L42_MIXER_CH_VOL_MASK); |
497 if (chs & BIT(1)) | 497 if (chs & BIT(1)) |
498 cs8409_i2c_write(cs42l42, CS42L42_REG_HS_VOL_CHB, | 498 cs8409_i2c_write(cs42l42, CS42L42_MIXER_CHB_VOL, |
499 -(cs42l42->vol[CS42L42_DAC_CH1_VOL_OFFSET]) | 499 -(cs42l42->vol[CS42L42_DAC_CH1_VOL_OFFSET]) |
500 & CS42L42_REG_HS_VOL_MASK); | 500 & CS42L42_MIXER_CH_VOL_MASK); |
501 } else if (vol_type == CS42L42_VOL_ADC) { 502 if (chs & BIT(0)) | 501 } else if (vol_type == CS42L42_VOL_ADC) { 502 if (chs & BIT(0)) |
503 cs8409_i2c_write(cs42l42, CS42L42_REG_AMIC_VOL, | 503 cs8409_i2c_write(cs42l42, CS42L42_ADC_VOLUME, |
504 cs42l42->vol[CS42L42_ADC_VOL_OFFSET] 505 & CS42L42_REG_AMIC_VOL_MASK); 506 } 507 } 508} 509 510int cs42l42_volume_put(struct snd_kcontrol *kctrl, struct snd_ctl_elem_value *uctrl) 511{ --- 84 unchanged lines hidden (view full) --- 596 cs42l42 = spec->scodecs[i]; 597 cs42l42_mute(cs42l42, CS42L42_VOL_ADC, 0x3, mute); 598 } 599} 600 601/* Configure CS42L42 slave codec for jack autodetect */ 602static void cs42l42_enable_jack_detect(struct sub_codec *cs42l42) 603{ | 504 cs42l42->vol[CS42L42_ADC_VOL_OFFSET] 505 & CS42L42_REG_AMIC_VOL_MASK); 506 } 507 } 508} 509 510int cs42l42_volume_put(struct snd_kcontrol *kctrl, struct snd_ctl_elem_value *uctrl) 511{ --- 84 unchanged lines hidden (view full) --- 596 cs42l42 = spec->scodecs[i]; 597 cs42l42_mute(cs42l42, CS42L42_VOL_ADC, 0x3, mute); 598 } 599} 600 601/* Configure CS42L42 slave codec for jack autodetect */ 602static void cs42l42_enable_jack_detect(struct sub_codec *cs42l42) 603{ |
604 cs8409_i2c_write(cs42l42, 0x1b70, cs42l42->hsbias_hiz); | 604 cs8409_i2c_write(cs42l42, CS42L42_HSBIAS_SC_AUTOCTL, cs42l42->hsbias_hiz); |
605 /* Clear WAKE# */ | 605 /* Clear WAKE# */ |
606 cs8409_i2c_write(cs42l42, 0x1b71, 0x00C1); | 606 cs8409_i2c_write(cs42l42, CS42L42_WAKE_CTL, 0x00C1); |
607 /* Wait ~2.5ms */ 608 usleep_range(2500, 3000); 609 /* Set mode WAKE# output follows the combination logic directly */ | 607 /* Wait ~2.5ms */ 608 usleep_range(2500, 3000); 609 /* Set mode WAKE# output follows the combination logic directly */ |
610 cs8409_i2c_write(cs42l42, 0x1b71, 0x00C0); | 610 cs8409_i2c_write(cs42l42, CS42L42_WAKE_CTL, 0x00C0); |
611 /* Clear interrupts status */ | 611 /* Clear interrupts status */ |
612 cs8409_i2c_read(cs42l42, 0x130f); | 612 cs8409_i2c_read(cs42l42, CS42L42_TSRS_PLUG_STATUS); |
613 /* Enable interrupt */ | 613 /* Enable interrupt */ |
614 cs8409_i2c_write(cs42l42, 0x1320, 0xF3); | 614 cs8409_i2c_write(cs42l42, CS42L42_TSRS_PLUG_INT_MASK, 0xF3); |
615} 616 617/* Enable and run CS42L42 slave codec jack auto detect */ 618static void cs42l42_run_jack_detect(struct sub_codec *cs42l42) 619{ 620 /* Clear interrupts */ | 615} 616 617/* Enable and run CS42L42 slave codec jack auto detect */ 618static void cs42l42_run_jack_detect(struct sub_codec *cs42l42) 619{ 620 /* Clear interrupts */ |
621 cs8409_i2c_read(cs42l42, 0x1308); 622 cs8409_i2c_read(cs42l42, 0x1b77); 623 cs8409_i2c_write(cs42l42, 0x1320, 0xFF); 624 cs8409_i2c_read(cs42l42, 0x130f); | 621 cs8409_i2c_read(cs42l42, CS42L42_CODEC_STATUS); 622 cs8409_i2c_read(cs42l42, CS42L42_DET_STATUS1); 623 cs8409_i2c_write(cs42l42, CS42L42_TSRS_PLUG_INT_MASK, 0xFF); 624 cs8409_i2c_read(cs42l42, CS42L42_TSRS_PLUG_STATUS); |
625 | 625 |
626 cs8409_i2c_write(cs42l42, 0x1102, 0x87); 627 cs8409_i2c_write(cs42l42, 0x1f06, 0x86); 628 cs8409_i2c_write(cs42l42, 0x1b74, 0x07); 629 cs8409_i2c_write(cs42l42, 0x131b, 0xFD); 630 cs8409_i2c_write(cs42l42, 0x1120, 0x80); | 626 cs8409_i2c_write(cs42l42, CS42L42_PWR_CTL2, 0x87); 627 cs8409_i2c_write(cs42l42, CS42L42_DAC_CTL2, 0x86); 628 cs8409_i2c_write(cs42l42, CS42L42_MISC_DET_CTL, 0x07); 629 cs8409_i2c_write(cs42l42, CS42L42_CODEC_INT_MASK, 0xFD); 630 cs8409_i2c_write(cs42l42, CS42L42_HSDET_CTL2, 0x80); |
631 /* Wait ~20ms*/ 632 usleep_range(20000, 25000); | 631 /* Wait ~20ms*/ 632 usleep_range(20000, 25000); |
633 cs8409_i2c_write(cs42l42, 0x111f, 0x77); 634 cs8409_i2c_write(cs42l42, 0x1120, 0xc0); | 633 cs8409_i2c_write(cs42l42, CS42L42_HSDET_CTL1, 0x77); 634 cs8409_i2c_write(cs42l42, CS42L42_HSDET_CTL2, 0xc0); |
635} 636 637static int cs42l42_handle_tip_sense(struct sub_codec *cs42l42, unsigned int reg_ts_status) 638{ 639 int status_changed = cs42l42->force_status_change; 640 641 cs42l42->force_status_change = 0; 642 643 /* TIP_SENSE INSERT/REMOVE */ 644 switch (reg_ts_status) { | 635} 636 637static int cs42l42_handle_tip_sense(struct sub_codec *cs42l42, unsigned int reg_ts_status) 638{ 639 int status_changed = cs42l42->force_status_change; 640 641 cs42l42->force_status_change = 0; 642 643 /* TIP_SENSE INSERT/REMOVE */ 644 switch (reg_ts_status) { |
645 case CS42L42_JACK_INSERTED: | 645 case CS42L42_TS_PLUG: |
646 if (!cs42l42->hp_jack_in) { 647 if (cs42l42->no_type_dect) { 648 status_changed = 1; 649 cs42l42->hp_jack_in = 1; 650 cs42l42->mic_jack_in = 0; 651 } else { 652 cs42l42_run_jack_detect(cs42l42); 653 } 654 } 655 break; 656 | 646 if (!cs42l42->hp_jack_in) { 647 if (cs42l42->no_type_dect) { 648 status_changed = 1; 649 cs42l42->hp_jack_in = 1; 650 cs42l42->mic_jack_in = 0; 651 } else { 652 cs42l42_run_jack_detect(cs42l42); 653 } 654 } 655 break; 656 |
657 case CS42L42_JACK_REMOVED: | 657 case CS42L42_TS_UNPLUG: |
658 if (cs42l42->hp_jack_in || cs42l42->mic_jack_in) { 659 status_changed = 1; 660 cs42l42->hp_jack_in = 0; 661 cs42l42->mic_jack_in = 0; 662 } 663 break; 664 default: 665 /* jack in transition */ 666 break; 667 } 668 669 return status_changed; 670} 671 672static int cs42l42_jack_unsol_event(struct sub_codec *cs42l42) 673{ | 658 if (cs42l42->hp_jack_in || cs42l42->mic_jack_in) { 659 status_changed = 1; 660 cs42l42->hp_jack_in = 0; 661 cs42l42->mic_jack_in = 0; 662 } 663 break; 664 default: 665 /* jack in transition */ 666 break; 667 } 668 669 return status_changed; 670} 671 672static int cs42l42_jack_unsol_event(struct sub_codec *cs42l42) 673{ |
674 int current_plug_status; |
|
674 int status_changed = 0; 675 int reg_cdc_status; 676 int reg_hs_status; 677 int reg_ts_status; 678 int type; 679 680 /* Read jack detect status registers */ | 675 int status_changed = 0; 676 int reg_cdc_status; 677 int reg_hs_status; 678 int reg_ts_status; 679 int type; 680 681 /* Read jack detect status registers */ |
681 reg_cdc_status = cs8409_i2c_read(cs42l42, 0x1308); 682 reg_hs_status = cs8409_i2c_read(cs42l42, 0x1124); 683 reg_ts_status = cs8409_i2c_read(cs42l42, 0x130f); | 682 reg_cdc_status = cs8409_i2c_read(cs42l42, CS42L42_CODEC_STATUS); 683 reg_hs_status = cs8409_i2c_read(cs42l42, CS42L42_HS_DET_STATUS); 684 reg_ts_status = cs8409_i2c_read(cs42l42, CS42L42_TSRS_PLUG_STATUS); |
684 685 /* If status values are < 0, read error has occurred. */ 686 if (reg_cdc_status < 0 || reg_hs_status < 0 || reg_ts_status < 0) 687 return -EIO; 688 | 685 686 /* If status values are < 0, read error has occurred. */ 687 if (reg_cdc_status < 0 || reg_hs_status < 0 || reg_ts_status < 0) 688 return -EIO; 689 |
690 current_plug_status = (reg_ts_status & (CS42L42_TS_PLUG_MASK | CS42L42_TS_UNPLUG_MASK)) 691 >> CS42L42_TS_PLUG_SHIFT; 692 |
|
689 /* HSDET_AUTO_DONE */ | 693 /* HSDET_AUTO_DONE */ |
690 if (reg_cdc_status & CS42L42_HSDET_AUTO_DONE) { | 694 if (reg_cdc_status & CS42L42_HSDET_AUTO_DONE_MASK) { |
691 692 /* Disable HSDET_AUTO_DONE */ | 695 696 /* Disable HSDET_AUTO_DONE */ |
693 cs8409_i2c_write(cs42l42, 0x131b, 0xFF); | 697 cs8409_i2c_write(cs42l42, CS42L42_CODEC_INT_MASK, 0xFF); |
694 | 698 |
695 type = ((reg_hs_status & CS42L42_HSTYPE_MASK) + 1); | 699 type = (reg_hs_status & CS42L42_HSDET_TYPE_MASK) >> CS42L42_HSDET_TYPE_SHIFT; |
696 697 if (cs42l42->no_type_dect) { | 700 701 if (cs42l42->no_type_dect) { |
698 status_changed = cs42l42_handle_tip_sense(cs42l42, reg_ts_status); 699 } else if (type == 4) { 700 /* Type 4 not supported */ 701 status_changed = cs42l42_handle_tip_sense(cs42l42, CS42L42_JACK_REMOVED); | 702 status_changed = cs42l42_handle_tip_sense(cs42l42, current_plug_status); 703 } else if (type == CS42L42_PLUG_INVALID) { 704 /* Type CS42L42_PLUG_INVALID not supported */ 705 status_changed = cs42l42_handle_tip_sense(cs42l42, CS42L42_TS_UNPLUG); |
702 } else { 703 if (!cs42l42->hp_jack_in) { 704 status_changed = 1; 705 cs42l42->hp_jack_in = 1; 706 } | 706 } else { 707 if (!cs42l42->hp_jack_in) { 708 status_changed = 1; 709 cs42l42->hp_jack_in = 1; 710 } |
707 /* type = 3 has no mic */ 708 if ((!cs42l42->mic_jack_in) && (type != 3)) { | 711 /* type = CS42L42_PLUG_HEADPHONE has no mic */ 712 if ((!cs42l42->mic_jack_in) && (type != CS42L42_PLUG_HEADPHONE)) { |
709 status_changed = 1; 710 cs42l42->mic_jack_in = 1; 711 } 712 } 713 /* Configure the HSDET mode. */ | 713 status_changed = 1; 714 cs42l42->mic_jack_in = 1; 715 } 716 } 717 /* Configure the HSDET mode. */ |
714 cs8409_i2c_write(cs42l42, 0x1120, 0x80); | 718 cs8409_i2c_write(cs42l42, CS42L42_HSDET_CTL2, 0x80); |
715 /* Enable the HPOUT ground clamp and configure the HP pull-down */ | 719 /* Enable the HPOUT ground clamp and configure the HP pull-down */ |
716 cs8409_i2c_write(cs42l42, 0x1F06, 0x02); | 720 cs8409_i2c_write(cs42l42, CS42L42_DAC_CTL2, 0x02); |
717 /* Re-Enable Tip Sense Interrupt */ | 721 /* Re-Enable Tip Sense Interrupt */ |
718 cs8409_i2c_write(cs42l42, 0x1320, 0xF3); | 722 cs8409_i2c_write(cs42l42, CS42L42_TSRS_PLUG_INT_MASK, 0xF3); |
719 } else { | 723 } else { |
720 status_changed = cs42l42_handle_tip_sense(cs42l42, reg_ts_status); | 724 status_changed = cs42l42_handle_tip_sense(cs42l42, current_plug_status); |
721 } 722 723 return status_changed; 724} 725 726static void cs42l42_resume(struct sub_codec *cs42l42) 727{ 728 struct hda_codec *codec = cs42l42->codec; 729 unsigned int gpio_data; 730 struct cs8409_i2c_param irq_regs[] = { | 725 } 726 727 return status_changed; 728} 729 730static void cs42l42_resume(struct sub_codec *cs42l42) 731{ 732 struct hda_codec *codec = cs42l42->codec; 733 unsigned int gpio_data; 734 struct cs8409_i2c_param irq_regs[] = { |
731 { 0x1308, 0x00 }, 732 { 0x1309, 0x00 }, 733 { 0x130A, 0x00 }, 734 { 0x130F, 0x00 }, | 735 { CS42L42_CODEC_STATUS, 0x00 }, 736 { CS42L42_DET_INT_STATUS1, 0x00 }, 737 { CS42L42_DET_INT_STATUS2, 0x00 }, 738 { CS42L42_TSRS_PLUG_STATUS, 0x00 }, |
735 }; 736 int fsv_old, fsv_new; 737 738 /* Bring CS42L42 out of Reset */ 739 gpio_data = snd_hda_codec_read(codec, CS8409_PIN_AFG, 0, AC_VERB_GET_GPIO_DATA, 0); 740 gpio_data |= cs42l42->reset_gpio; 741 snd_hda_codec_write(codec, CS8409_PIN_AFG, 0, AC_VERB_SET_GPIO_DATA, gpio_data); 742 usleep_range(10000, 15000); 743 744 cs42l42->suspended = 0; 745 746 /* Initialize CS42L42 companion codec */ 747 cs8409_i2c_bulk_write(cs42l42, cs42l42->init_seq, cs42l42->init_seq_num); 748 usleep_range(20000, 25000); 749 750 /* Clear interrupts, by reading interrupt status registers */ 751 cs8409_i2c_bulk_read(cs42l42, irq_regs, ARRAY_SIZE(irq_regs)); 752 | 739 }; 740 int fsv_old, fsv_new; 741 742 /* Bring CS42L42 out of Reset */ 743 gpio_data = snd_hda_codec_read(codec, CS8409_PIN_AFG, 0, AC_VERB_GET_GPIO_DATA, 0); 744 gpio_data |= cs42l42->reset_gpio; 745 snd_hda_codec_write(codec, CS8409_PIN_AFG, 0, AC_VERB_SET_GPIO_DATA, gpio_data); 746 usleep_range(10000, 15000); 747 748 cs42l42->suspended = 0; 749 750 /* Initialize CS42L42 companion codec */ 751 cs8409_i2c_bulk_write(cs42l42, cs42l42->init_seq, cs42l42->init_seq_num); 752 usleep_range(20000, 25000); 753 754 /* Clear interrupts, by reading interrupt status registers */ 755 cs8409_i2c_bulk_read(cs42l42, irq_regs, ARRAY_SIZE(irq_regs)); 756 |
753 fsv_old = cs8409_i2c_read(cs42l42, 0x2001); | 757 fsv_old = cs8409_i2c_read(cs42l42, CS42L42_HP_CTL); |
754 if (cs42l42->full_scale_vol == CS42L42_FULL_SCALE_VOL_0DB) 755 fsv_new = fsv_old & ~CS42L42_FULL_SCALE_VOL_MASK; 756 else 757 fsv_new = fsv_old & CS42L42_FULL_SCALE_VOL_MASK; 758 if (fsv_new != fsv_old) | 758 if (cs42l42->full_scale_vol == CS42L42_FULL_SCALE_VOL_0DB) 759 fsv_new = fsv_old & ~CS42L42_FULL_SCALE_VOL_MASK; 760 else 761 fsv_new = fsv_old & CS42L42_FULL_SCALE_VOL_MASK; 762 if (fsv_new != fsv_old) |
759 cs8409_i2c_write(cs42l42, 0x2001, fsv_new); | 763 cs8409_i2c_write(cs42l42, CS42L42_HP_CTL, fsv_new); |
760 761 /* we have to explicitly allow unsol event handling even during the 762 * resume phase so that the jack event is processed properly 763 */ 764 snd_hda_codec_allow_unsol_events(cs42l42->codec); 765 766 cs42l42_enable_jack_detect(cs42l42); 767} 768 769#ifdef CONFIG_PM 770static void cs42l42_suspend(struct sub_codec *cs42l42) 771{ 772 struct hda_codec *codec = cs42l42->codec; 773 unsigned int gpio_data; 774 int reg_cdc_status = 0; 775 const struct cs8409_i2c_param cs42l42_pwr_down_seq[] = { | 764 765 /* we have to explicitly allow unsol event handling even during the 766 * resume phase so that the jack event is processed properly 767 */ 768 snd_hda_codec_allow_unsol_events(cs42l42->codec); 769 770 cs42l42_enable_jack_detect(cs42l42); 771} 772 773#ifdef CONFIG_PM 774static void cs42l42_suspend(struct sub_codec *cs42l42) 775{ 776 struct hda_codec *codec = cs42l42->codec; 777 unsigned int gpio_data; 778 int reg_cdc_status = 0; 779 const struct cs8409_i2c_param cs42l42_pwr_down_seq[] = { |
776 { 0x1F06, 0x02 }, 777 { 0x1129, 0x00 }, 778 { 0x2301, 0x3F }, 779 { 0x2302, 0x3F }, 780 { 0x2303, 0x3F }, 781 { 0x2001, 0x0F }, 782 { 0x2A01, 0x00 }, 783 { 0x1207, 0x00 }, 784 { 0x1101, 0xFE }, 785 { 0x1102, 0x8C }, 786 { 0x1101, 0xFF }, | 780 { CS42L42_DAC_CTL2, 0x02 }, 781 { CS42L42_HS_CLAMP_DISABLE, 0x00 }, 782 { CS42L42_MIXER_CHA_VOL, 0x3F }, 783 { CS42L42_MIXER_ADC_VOL, 0x3F }, 784 { CS42L42_MIXER_CHB_VOL, 0x3F }, 785 { CS42L42_HP_CTL, 0x0F }, 786 { CS42L42_ASP_RX_DAI0_EN, 0x00 }, 787 { CS42L42_ASP_CLK_CFG, 0x00 }, 788 { CS42L42_PWR_CTL1, 0xFE }, 789 { CS42L42_PWR_CTL2, 0x8C }, 790 { CS42L42_PWR_CTL1, 0xFF }, |
787 }; 788 789 cs8409_i2c_bulk_write(cs42l42, cs42l42_pwr_down_seq, ARRAY_SIZE(cs42l42_pwr_down_seq)); 790 791 if (read_poll_timeout(cs8409_i2c_read, reg_cdc_status, 792 (reg_cdc_status & 0x1), CS42L42_PDN_SLEEP_US, CS42L42_PDN_TIMEOUT_US, | 791 }; 792 793 cs8409_i2c_bulk_write(cs42l42, cs42l42_pwr_down_seq, ARRAY_SIZE(cs42l42_pwr_down_seq)); 794 795 if (read_poll_timeout(cs8409_i2c_read, reg_cdc_status, 796 (reg_cdc_status & 0x1), CS42L42_PDN_SLEEP_US, CS42L42_PDN_TIMEOUT_US, |
793 true, cs42l42, 0x1308) < 0) | 797 true, cs42l42, CS42L42_CODEC_STATUS) < 0) |
794 codec_warn(codec, "Timeout waiting for PDN_DONE for CS42L42\n"); 795 796 /* Power down CS42L42 ASP/EQ/MIX/HP */ | 798 codec_warn(codec, "Timeout waiting for PDN_DONE for CS42L42\n"); 799 800 /* Power down CS42L42 ASP/EQ/MIX/HP */ |
797 cs8409_i2c_write(cs42l42, 0x1102, 0x9C); | 801 cs8409_i2c_write(cs42l42, CS42L42_PWR_CTL2, 0x9C); |
798 cs42l42->suspended = 1; 799 cs42l42->last_page = 0; 800 cs42l42->hp_jack_in = 0; 801 cs42l42->mic_jack_in = 0; 802 cs42l42->force_status_change = 1; 803 804 /* Put CS42L42 into Reset */ 805 gpio_data = snd_hda_codec_read(codec, CS8409_PIN_AFG, 0, AC_VERB_GET_GPIO_DATA, 0); --- 512 unchanged lines hidden --- | 802 cs42l42->suspended = 1; 803 cs42l42->last_page = 0; 804 cs42l42->hp_jack_in = 0; 805 cs42l42->mic_jack_in = 0; 806 cs42l42->force_status_change = 1; 807 808 /* Put CS42L42 into Reset */ 809 gpio_data = snd_hda_codec_read(codec, CS8409_PIN_AFG, 0, AC_VERB_GET_GPIO_DATA, 0); --- 512 unchanged lines hidden --- |