Loading sound/soc/codecs/msm8x16-wcd-tables.c +4 −0 Original line number Diff line number Diff line Loading @@ -544,6 +544,10 @@ const u8 msm8x16_wcd_reset_reg_defaults[MSM8X16_WCD_CACHE_SIZE] = { MSM8X16_WCD_A_ANALOG_RX_HPH_STATUS__POR, [MSM8X16_WCD_A_ANALOG_RX_EAR_STATUS] = MSM8X16_WCD_A_ANALOG_RX_EAR_STATUS__POR, [MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL] = MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL__POR, [MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL] = MSM8X16_WCD_A_ANALOG_RX_RX_LO_EN_CTL__POR, [MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL] = MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL__POR, [MSM8X16_WCD_A_ANALOG_SPKR_DRV_CLIP_DET] = Loading sound/soc/codecs/msm8x16-wcd.c +64 −0 Original line number Diff line number Diff line Loading @@ -2935,6 +2935,17 @@ static const struct snd_kcontrol_new spkr_switch[] = { MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL, 7, 1, 0) }; static const char * const lo_text[] = { "ZERO", "Switch", }; static const struct soc_enum lo_enum = SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(hph_text), hph_text); static const struct snd_kcontrol_new lo_mux[] = { SOC_DAPM_ENUM("LINE_OUT", lo_enum) }; static void msm8x16_wcd_codec_enable_adc_block(struct snd_soc_codec *codec, int enable) { Loading Loading @@ -3939,6 +3950,41 @@ static int msm8x16_wcd_hphl_dac_event(struct snd_soc_dapm_widget *w, return 0; } static int msm8x16_wcd_lo_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { struct snd_soc_codec *codec = w->codec; dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); switch (event) { case SND_SOC_DAPM_PRE_PMU: snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x80, 0x80); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x08, 0x08); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x40, 0x40); break; case SND_SOC_DAPM_POST_PMU: snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x80, 0x80); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x08, 0x08); break; case SND_SOC_DAPM_POST_PMD: usleep_range(20000, 20100); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x80, 0x00); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x40, 0x00); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x80, 0x00); break; } return 0; } static int msm8x16_wcd_hphr_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { Loading Loading @@ -4110,6 +4156,10 @@ static const struct snd_soc_dapm_route audio_map[] = { {"SPK PA", NULL, "SPK_RX_BIAS"}, {"SPK PA", NULL, "SPK DAC"}, {"SPK DAC", "Switch", "RX3 CHAIN"}, {"LINE_OUT", "Switch", "LINEOUT DAC"}, {"LINEOUT DAC", NULL, "RX3 CHAIN"}, {"LINEOUT PA", NULL, "LINEOUT DAC"}, {"LINEOUT", NULL, "LINEOUT PA"}, {"SPK DAC", NULL, "VDD_SPKDRV"}, {"RX1 CHAIN", NULL, "RX1 CLK"}, Loading Loading @@ -4668,14 +4718,28 @@ static const struct snd_soc_dapm_widget msm8x16_wcd_dapm_widgets[] = { SND_SOC_DAPM_MIXER("SPK DAC", SND_SOC_NOPM, 0, 0, spkr_switch, ARRAY_SIZE(spkr_switch)), SND_SOC_DAPM_MUX("LINE_OUT", SND_SOC_NOPM, 0, 0, lo_mux), SND_SOC_DAPM_DAC_E("LINEOUT DAC", NULL, SND_SOC_NOPM, 0, 0, msm8x16_wcd_lo_dac_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), /* Speaker */ SND_SOC_DAPM_OUTPUT("SPK_OUT"), /* Lineout */ SND_SOC_DAPM_OUTPUT("LINEOUT"), SND_SOC_DAPM_PGA_E("SPK PA", MSM8X16_WCD_A_ANALOG_SPKR_DRV_CTL, 6, 0 , NULL, 0, msm8x16_wcd_codec_enable_spk_pa, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_PGA_E("LINEOUT PA", MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 4, 0 , NULL, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("VDD_SPKDRV", SND_SOC_NOPM, 0, 0, msm89xx_wcd_codec_enable_vdd_spkr, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), Loading sound/soc/codecs/msm8x16_wcd_registers.h +4 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,10 @@ #define MSM8X16_WCD_A_ANALOG_RX_HPH_STATUS__POR (0x0C) #define MSM8X16_WCD_A_ANALOG_RX_EAR_STATUS (0x1A1) #define MSM8X16_WCD_A_ANALOG_RX_EAR_STATUS__POR (0x00) #define MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL (0x1AC) #define MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL__POR (0x00) #define MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL (0x1AD) #define MSM8X16_WCD_A_ANALOG_RX_RX_LO_EN_CTL__POR (0x00) #define MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL (0x1B0) #define MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL__POR (0x83) #define MSM8X16_WCD_A_ANALOG_SPKR_DRV_CLIP_DET (0x1B1) Loading Loading
sound/soc/codecs/msm8x16-wcd-tables.c +4 −0 Original line number Diff line number Diff line Loading @@ -544,6 +544,10 @@ const u8 msm8x16_wcd_reset_reg_defaults[MSM8X16_WCD_CACHE_SIZE] = { MSM8X16_WCD_A_ANALOG_RX_HPH_STATUS__POR, [MSM8X16_WCD_A_ANALOG_RX_EAR_STATUS] = MSM8X16_WCD_A_ANALOG_RX_EAR_STATUS__POR, [MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL] = MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL__POR, [MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL] = MSM8X16_WCD_A_ANALOG_RX_RX_LO_EN_CTL__POR, [MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL] = MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL__POR, [MSM8X16_WCD_A_ANALOG_SPKR_DRV_CLIP_DET] = Loading
sound/soc/codecs/msm8x16-wcd.c +64 −0 Original line number Diff line number Diff line Loading @@ -2935,6 +2935,17 @@ static const struct snd_kcontrol_new spkr_switch[] = { MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL, 7, 1, 0) }; static const char * const lo_text[] = { "ZERO", "Switch", }; static const struct soc_enum lo_enum = SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(hph_text), hph_text); static const struct snd_kcontrol_new lo_mux[] = { SOC_DAPM_ENUM("LINE_OUT", lo_enum) }; static void msm8x16_wcd_codec_enable_adc_block(struct snd_soc_codec *codec, int enable) { Loading Loading @@ -3939,6 +3950,41 @@ static int msm8x16_wcd_hphl_dac_event(struct snd_soc_dapm_widget *w, return 0; } static int msm8x16_wcd_lo_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { struct snd_soc_codec *codec = w->codec; dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); switch (event) { case SND_SOC_DAPM_PRE_PMU: snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x80, 0x80); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x08, 0x08); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x40, 0x40); break; case SND_SOC_DAPM_POST_PMU: snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x80, 0x80); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x08, 0x08); break; case SND_SOC_DAPM_POST_PMD: usleep_range(20000, 20100); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x80, 0x00); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x40, 0x00); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x80, 0x00); break; } return 0; } static int msm8x16_wcd_hphr_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { Loading Loading @@ -4110,6 +4156,10 @@ static const struct snd_soc_dapm_route audio_map[] = { {"SPK PA", NULL, "SPK_RX_BIAS"}, {"SPK PA", NULL, "SPK DAC"}, {"SPK DAC", "Switch", "RX3 CHAIN"}, {"LINE_OUT", "Switch", "LINEOUT DAC"}, {"LINEOUT DAC", NULL, "RX3 CHAIN"}, {"LINEOUT PA", NULL, "LINEOUT DAC"}, {"LINEOUT", NULL, "LINEOUT PA"}, {"SPK DAC", NULL, "VDD_SPKDRV"}, {"RX1 CHAIN", NULL, "RX1 CLK"}, Loading Loading @@ -4668,14 +4718,28 @@ static const struct snd_soc_dapm_widget msm8x16_wcd_dapm_widgets[] = { SND_SOC_DAPM_MIXER("SPK DAC", SND_SOC_NOPM, 0, 0, spkr_switch, ARRAY_SIZE(spkr_switch)), SND_SOC_DAPM_MUX("LINE_OUT", SND_SOC_NOPM, 0, 0, lo_mux), SND_SOC_DAPM_DAC_E("LINEOUT DAC", NULL, SND_SOC_NOPM, 0, 0, msm8x16_wcd_lo_dac_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), /* Speaker */ SND_SOC_DAPM_OUTPUT("SPK_OUT"), /* Lineout */ SND_SOC_DAPM_OUTPUT("LINEOUT"), SND_SOC_DAPM_PGA_E("SPK PA", MSM8X16_WCD_A_ANALOG_SPKR_DRV_CTL, 6, 0 , NULL, 0, msm8x16_wcd_codec_enable_spk_pa, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_PGA_E("LINEOUT PA", MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 4, 0 , NULL, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("VDD_SPKDRV", SND_SOC_NOPM, 0, 0, msm89xx_wcd_codec_enable_vdd_spkr, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), Loading
sound/soc/codecs/msm8x16_wcd_registers.h +4 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,10 @@ #define MSM8X16_WCD_A_ANALOG_RX_HPH_STATUS__POR (0x0C) #define MSM8X16_WCD_A_ANALOG_RX_EAR_STATUS (0x1A1) #define MSM8X16_WCD_A_ANALOG_RX_EAR_STATUS__POR (0x00) #define MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL (0x1AC) #define MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL__POR (0x00) #define MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL (0x1AD) #define MSM8X16_WCD_A_ANALOG_RX_RX_LO_EN_CTL__POR (0x00) #define MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL (0x1B0) #define MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL__POR (0x83) #define MSM8X16_WCD_A_ANALOG_SPKR_DRV_CLIP_DET (0x1B1) Loading