void update_speaker_tuning(bool with_mute) { DECLARE_WM8994(codec); if (!(is_path(SPEAKER) || (wm8994->codec_state & CALL_ACTIVE))) return; if (speaker_tuning) { // DRC settings wm8994_write(codec, WM8994_AIF1_DRC1_3, 0x0010); wm8994_write(codec, WM8994_AIF1_DRC1_4, 0x00EB); // hardware EQ wm8994_write(codec, WM8994_AIF1_DAC1_EQ_GAINS_1, 0x041D); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_GAINS_2, 0x4C00); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_1_A, 0x0FE3); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_1_B, 0x0403); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_1_PG, 0x0074); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_2_A, 0x1F03); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_2_B, 0xF0F9); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_2_C, 0x040A); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_2_PG, 0x03DA); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_3_A, 0x1ED2); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_3_B, 0xF11A); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_3_C, 0x040A); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_3_PG, 0x045D); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_4_A, 0x0E76); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_4_B, 0xFCE4); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_4_C, 0x040A); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_4_PG, 0x330D); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_5_A, 0xFC8F); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_5_B, 0x0400); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_5_PG, 0x323C); // Speaker Boost tuning wm8994_write(codec, WM8994_CLASSD, 0x0170); } else { // DRC settings wm8994_write(codec, WM8994_AIF1_DRC1_3, 0x0028); wm8994_write(codec, WM8994_AIF1_DRC1_4, 0x0186); // hardware EQ wm8994_write(codec, WM8994_AIF1_DAC1_EQ_GAINS_1, 0x0019); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_GAINS_2, 0x6280); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_1_A, 0x0FC3); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_1_B, 0x03FD); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_1_PG, 0x00F4); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_2_A, 0x1F30); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_2_B, 0xF0CD); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_2_C, 0x040A); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_2_PG, 0x032C); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_3_A, 0x1C52); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_3_B, 0xF379); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_3_C, 0x040A); wm8994_write(codec, WM8994_AIF1_DAC1_EQ_BAND_3_PG, 0x0DC1); wm8994_write(codec, WM8994_CLASSD, 0x0170); // Speaker Boost tuning wm8994_write(codec, WM8994_CLASSD, 0x0168); } }
void update_hpvol(bool with_fade) { unsigned short val; unsigned short i; short steps; int hp_level_old[2]; unsigned short hp_level_registers[2] = { WM8994_LEFT_OUTPUT_VOLUME, WM8994_RIGHT_OUTPUT_VOLUME }; DECLARE_WM8994(codec); // don't affect headphone amplifier volume // when not on heapdhones or if call is active if (!is_path(HEADPHONES) || (wm8994->codec_state & CALL_ACTIVE)) return; if (!with_fade) { bypass_write_hook = true; write_hpvol(hpvol(0), hpvol(1)); bypass_write_hook = false; return; } // read previous levels for (i = 0; i < 2; i++) { val = wm8994_read(codec, hp_level_registers[i]); val &= ~(WM8994_HPOUT1_VU_MASK); val &= ~(WM8994_HPOUT1L_ZC_MASK); val &= ~(WM8994_HPOUT1L_MUTE_N_MASK); hp_level_old[i] = val + (digital_gain / 1000); if (hp_level_old[i] < 0) hp_level_old[i] = 0; if (debug_log(LOG_INFOS)) printk("Voodoo sound: previous hp_level[%hu]: %d\n", i, hp_level_old[i]); } // calculate number of steps for volume fade steps = hp_level[0] - hp_level_old[0]; if (debug_log(LOG_INFOS)) printk("Voodoo sound: volume change steps: %hd " "start: %hu, end: %hu\n", steps, hp_level_old[0], hp_level[0]); while (steps != 0) { if (hp_level[0] < hp_level_old[0]) steps++; else steps--; if (debug_log(LOG_INFOS)) printk("Voodoo sound: volume: %hu\n", (hpvol(0) - steps)); bypass_write_hook = true; write_hpvol(hpvol(0) - steps, hpvol(1) - steps); bypass_write_hook = false; if (steps != 0) udelay(1000); } }
bool is_path(int unified_path) { DECLARE_WM8994(codec); switch (unified_path) { // speaker case SPEAKER: #ifdef GALAXY_TAB return (wm8994->cur_path == SPK || wm8994->cur_path == RING_SPK || wm8994->fmradio_path == FMR_SPK || wm8994->fmradio_path == FMR_SPK_MIX); #else #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) return (wm8994->cur_path == SPK || wm8994->cur_path == SPK_HP); #else return (wm8994->cur_path == SPK || wm8994->cur_path == RING_SPK); #endif #endif // headphones case HEADPHONES: #ifdef NEXUS_S return (wm8994->cur_path == HP || wm8994->cur_path == HP_NO_MIC); #else #ifdef GALAXY_TAB #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) return (wm8994->cur_path == HP || wm8994->cur_path == HP_NO_MIC); #else return (wm8994->cur_path == HP3P || wm8994->cur_path == HP4P || wm8994->fmradio_path == FMR_HP); #endif #else #ifdef M110S #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) return (wm8994->cur_path == HP || wm8994->cur_path == HP_NO_MIC); #else return (wm8994->cur_path == HP); #endif #else #ifdef GALAXY_TAB_TEGRA return (wm8994->cur_path == HP || wm8994->cur_path == HP_NO_MIC); #else #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) return (wm8994->cur_path == HP || wm8994->cur_path == HP_NO_MIC); #else return (wm8994->cur_path == HP || wm8994->fmradio_path == FMR_HP); #endif #endif #endif #endif #endif // FM Radio on headphones case RADIO_HEADPHONES: #ifdef NEXUS_S return false; #else #ifdef M110S return false; #else #ifdef GALAXY_TAB_TEGRA return false; #else #ifdef GALAXY_TAB return false; #endif #endif #endif #endif // Standard recording presets // for M110S Gingerbread: added check non call case MAIN_MICROPHONE: return (wm8994->codec_state & CAPTURE_ACTIVE) && (wm8994->rec_path == MAIN) && !(wm8994->codec_state & CALL_ACTIVE); } return false; }
bool is_path(int unified_path) { DECLARE_WM8994(codec); switch (unified_path) { // speaker case SPEAKER: #ifdef GALAXY_TAB return (wm8994->cur_path == SPK || wm8994->cur_path == RING_SPK || wm8994->fmradio_path == FMR_SPK || wm8994->fmradio_path == FMR_SPK_MIX); #else return (wm8994->cur_path == SPK || wm8994->cur_path == RING_SPK); #endif // headphones // FIXME: be sure dac_direct doesn't break phone calls on TAB // with these spath detection settings (HP4P) case HEADPHONES: #ifdef NEXUS_S return (wm8994->cur_path == HP || wm8994->cur_path == HP_NO_MIC); #else #ifdef GALAXY_TAB return (wm8994->cur_path == HP3P || wm8994->cur_path == HP4P || wm8994->fmradio_path == FMR_HP); #else #ifdef M110S return (wm8994->cur_path == HP); #else return (wm8994->cur_path == HP || wm8994->fmradio_path == FMR_HP); #endif #endif #endif // FM Radio on headphones case RADIO_HEADPHONES: #ifdef NEXUS_S return false; #else #ifdef M110S return false; #else #ifdef GALAXY_TAB return (wm8994->codec_state & FMRADIO_ACTIVE) && (wm8994->fmradio_path == FMR_HP); #else return (wm8994->codec_state & FMRADIO_ACTIVE) && (wm8994->fmradio_path == FMR_HP); #endif #endif #endif // headphones // FIXME: be sure dac_direct doesn't break phone calls on TAB // with these spath detection settings (HP4P) case MAIN_MICROPHONE: return (wm8994->codec_state & CAPTURE_ACTIVE) && (wm8994->rec_path == MAIN); } return false; }