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;
}
Exemple #4
0
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;
}