Exemple #1
0
void cpcap_audio_init(struct cpcap_audio_state *state)
{
	CPCAP_AUDIO_DEBUG_LOG("%s() called\n", __func__);

	logged_cpcap_write(state->cpcap, CPCAP_REG_CC, 0, 0xFFFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_CDI, 0, 0xBFFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_SDAC, 0, 0xFFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_SDACDI, 0, 0x3FFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_TXI, 0, 0xFDF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_TXMP, 0, 0xFFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA, 0, 0x1FF);
	/* logged_cpcap_write(state->cpcap, CPCAP_REG_RXVC, 0, 0xFFF); */
	logged_cpcap_write(state->cpcap, CPCAP_REG_RXCOA, 0, 0x7FF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_RXSDOA, 0, 0x1FFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_RXEPOA, 0, 0x7FFF);

		/* Use free running clock for amplifiers */
		logged_cpcap_write(state->cpcap, CPCAP_REG_A2LA,
			CPCAP_BIT_A2_FREE_RUN, CPCAP_BIT_A2_FREE_RUN);

	audio_reg = regulator_get(NULL, "vaudio");

	if (IS_ERR(audio_reg))
		CPCAP_AUDIO_ERROR_LOG("could not get regulator for audio\n");
}
Exemple #2
0
static void cpcap_audio_configure_power(int power)
{
	static int previous_power = -1;

	CPCAP_AUDIO_DEBUG_LOG("%s() called with power= %d\n", __func__, power);

	if (power != previous_power) {

		if (IS_ERR(audio_reg)) {
			CPCAP_AUDIO_ERROR_LOG("audio_reg not valid for"
							"regulator setup\n");
			return;
		}

		if (power) {
			regulator_enable(audio_reg);
			regulator_set_mode(audio_reg, REGULATOR_MODE_NORMAL);
		} else {
			printk(KERN_DEBUG "turning off regulator\n");
			regulator_set_mode(audio_reg, REGULATOR_MODE_STANDBY);
			regulator_disable(audio_reg);
		}

		previous_power = power;

		if (power)
			mdelay(SLEEP_ACTIVATE_POWER);
	}
}
Exemple #3
0
void cpcap_audio_init(struct cpcap_audio_state *state)
{
	CPCAP_AUDIO_DEBUG_LOG("%s() called\n", __func__);

	logged_cpcap_write(state->cpcap, CPCAP_REG_CC, 0, 0xFFFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_CDI, 0, 0xBFFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_SDAC, 0, 0xFFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_SDACDI, 0, 0x3FFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_TXI, 0, 0xFDF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_TXMP, 0, 0xFFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA, 0, 0x1FF);
	/* logged_cpcap_write(state->cpcap, CPCAP_REG_RXVC, 0, 0xFFF); */
	logged_cpcap_write(state->cpcap, CPCAP_REG_RXCOA, 0, 0x7FF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_RXSDOA, 0, 0x1FFF);
	logged_cpcap_write(state->cpcap, CPCAP_REG_RXEPOA, 0, 0x7FFF);

	/* 	The problem which speaker noise generated
		when phone enter the suspend mode is fixed.
	*/
	logged_cpcap_write(state->cpcap, CPCAP_REG_A2LA,
		CPCAP_BIT_A2_FREE_RUN, CPCAP_BIT_A2_FREE_RUN);

#if !defined(CONFIG_MACH_SHOLEST)
	logged_cpcap_write(state->cpcap, CPCAP_REG_GPIO4,
			   CPCAP_BIT_GPIO4DIR, CPCAP_BIT_GPIO4DIR);
#endif /* !CONFIG_MACH_SHOLEST */
	audio_reg = regulator_get(NULL, "vaudio");

	if (IS_ERR(audio_reg))
		CPCAP_AUDIO_ERROR_LOG("could not get regulator for audio\n");
}
Exemple #4
0
void cpcap_audio_init(struct cpcap_audio_state *state)
{
    CPCAP_AUDIO_DEBUG_LOG("%s() called\n", __func__);

    printk("%s() level 1\n",__func__);
    logged_cpcap_write(state->cpcap, CPCAP_REG_CC, 0, 0xFFFF);
    logged_cpcap_write(state->cpcap, CPCAP_REG_CDI, 0, 0xBFFF);
    logged_cpcap_write(state->cpcap, CPCAP_REG_SDAC, 0, 0xFFF);
    logged_cpcap_write(state->cpcap, CPCAP_REG_SDACDI, 0, 0x3FFF);
    logged_cpcap_write(state->cpcap, CPCAP_REG_TXI, 0, 0xFDF);
    logged_cpcap_write(state->cpcap, CPCAP_REG_TXMP, 0, 0xFFF);
    logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA, 0, 0x1FF);
    /* logged_cpcap_write(state->cpcap, CPCAP_REG_RXVC, 0, 0xFFF); */
    logged_cpcap_write(state->cpcap, CPCAP_REG_RXCOA, 0, 0x7FF);
    logged_cpcap_write(state->cpcap, CPCAP_REG_RXSDOA, 0, 0x1FFF);
    logged_cpcap_write(state->cpcap, CPCAP_REG_RXEPOA, 0, 0x7FFF);

    printk("%s() level 2\n",__func__);

    if (cpcap_audio_hw_has_hs_driver() || cpcap_audio_hw_has_mic3_switch())
        logged_cpcap_write(state->cpcap, CPCAP_REG_GPIO4,
                           CPCAP_BIT_GPIO4DIR, CPCAP_BIT_GPIO4DIR);
    /*hack*/
    printk("%s() level 3\n",__func__);
    logged_cpcap_write(state->cpcap, CPCAP_REG_RXCOA,0x1e02,0x1FFF );
    audio_regu = regulator_get(NULL, "vaudio");
    printk("%s() level 4\n",__func__);
    if (IS_ERR(audio_regu))
        CPCAP_AUDIO_ERROR_LOG("could not get regulator for audio\n");
}
Exemple #5
0
static unsigned short int cpcap_audio_get_ext_output_amp_switches(
						int speaker,
						int balance)
{
	unsigned short int value = 0;
	CPCAP_AUDIO_DEBUG_LOG("%s() called with speaker %d\n", __func__,
								speaker);

	switch (speaker) {
	case CPCAP_AUDIO_OUT_HANDSET:
		value |= CPCAP_BIT_A1_EAR_EXT_SW | CPCAP_BIT_PGA_EXT_R_EN;
		break;

	case CPCAP_AUDIO_OUT_MONO_HEADSET:
	case CPCAP_AUDIO_OUT_STEREO_HEADSET:
		if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
			value |= CPCAP_BIT_ARIGHT_HS_EXT_SW |
				CPCAP_BIT_PGA_EXT_R_EN;
		if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
			value |= CPCAP_BIT_ALEFT_HS_EXT_SW |
				CPCAP_BIT_PGA_EXT_L_EN;
		break;

	case CPCAP_AUDIO_OUT_LOUDSPEAKER:
		value |= CPCAP_BIT_A2_LDSP_L_EXT_SW | CPCAP_BIT_PGA_EXT_L_EN;
		break;

	case CPCAP_AUDIO_OUT_LINEOUT:
		value |= CPCAP_BIT_A4_LINEOUT_R_EXT_SW |
			CPCAP_BIT_A4_LINEOUT_L_EXT_SW |
			CPCAP_BIT_PGA_EXT_L_EN | CPCAP_BIT_PGA_EXT_R_EN;
		break;

	case CPCAP_AUDIO_OUT_BT_MONO:
	default:
		value = 0;
		break;
	}

	CPCAP_AUDIO_DEBUG_LOG("Exiting %s() with return value = %d\n", __func__,
			  value);
	return value;
}
Exemple #6
0
static bool cpcap_audio_set_bits_for_speaker(int speaker, int balance,
						unsigned short int *message)
{
	CPCAP_AUDIO_DEBUG_LOG("%s() called with speaker = %d\n", __func__,
			  speaker);

	/* Get the data required to enable each possible path */
	switch (speaker) {
	case CPCAP_AUDIO_OUT_HANDSET:
		(*message) |= CPCAP_BIT_A1_EAR_EN;
		break;

	case CPCAP_AUDIO_OUT_MONO_HEADSET:
	case CPCAP_AUDIO_OUT_STEREO_HEADSET:
		if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
			(*message) |= CPCAP_BIT_HS_L_EN;
		if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
			(*message) |= CPCAP_BIT_HS_R_EN;
		break;

	case CPCAP_AUDIO_OUT_LOUDSPEAKER:
		(*message) |= CPCAP_BIT_A2_LDSP_L_EN;
		break;

	case CPCAP_AUDIO_OUT_LINEOUT:
		(*message) |= CPCAP_BIT_A4_LINEOUT_R_EN |
				CPCAP_BIT_A4_LINEOUT_L_EN;
		break;

	case CPCAP_AUDIO_OUT_BT_MONO:
	default:
		(*message) |= 0;
		break;
	}

	return false; /* There is no external loudspeaker on this product */
}
Exemple #7
0
static void cpcap_audio_configure_codec(struct cpcap_audio_state *state,
				struct cpcap_audio_state *previous_state) {
	const unsigned int CODEC_FREQ_MASK = CPCAP_BIT_CDC_CLK0
		| CPCAP_BIT_CDC_CLK1 | CPCAP_BIT_CDC_CLK2;
	const unsigned int CODEC_RESET_FREQ_MASK = CODEC_FREQ_MASK
		| CPCAP_BIT_CDC_CLOCK_TREE_RESET;

	static unsigned int prev_codec_data = 0x0, prev_cdai_data = 0x0;

	if (is_codec_changed(state, previous_state)) {
		unsigned int temp_codec_rate = state->codec_rate;
		struct cpcap_regacc cdai_changes = { 0 };
		struct cpcap_regacc codec_changes = { 0 };
		int codec_freq_config = 0;

		if (state->rat_type == CPCAP_AUDIO_RAT_CDMA)
			codec_freq_config = (CPCAP_BIT_CDC_CLK0
					| CPCAP_BIT_CDC_CLK1) ; /* 19.2Mhz */
		else
			codec_freq_config = CPCAP_BIT_CDC_CLK2 ; /* 26Mhz */

		/* If a codec is already in use, reset codec to initial state */
		if (previous_state->codec_mode != CPCAP_AUDIO_CODEC_OFF) {
			codec_changes.mask = prev_codec_data
				| CPCAP_BIT_DF_RESET
				| CPCAP_BIT_CDC_CLOCK_TREE_RESET;

			logged_cpcap_write(state->cpcap, CPCAP_REG_CC,
				codec_changes.value, codec_changes.mask);

			prev_codec_data = 0;
			previous_state->codec_mode = CPCAP_AUDIO_CODEC_OFF;
		}

		temp_codec_rate &= 0x0000000F;
		temp_codec_rate = temp_codec_rate << 9;

		switch (state->codec_mode) {
		case CPCAP_AUDIO_CODEC_LOOPBACK:
		case CPCAP_AUDIO_CODEC_ON:
			if (state->codec_primary_speaker !=
					CPCAP_AUDIO_OUT_NONE &&
				state->dai_config ==
					CPCAP_AUDIO_DAI_CONFIG_NORMAL) {
				codec_changes.value |= CPCAP_BIT_CDC_EN_RX;
			}

			if (needs_cpcap_mic1(state->microphone))
				codec_changes.value |= CPCAP_BIT_MIC1_CDC_EN;

			if (needs_cpcap_mic2(state->microphone))
				codec_changes.value |= CPCAP_BIT_MIC2_CDC_EN;

			/* use input HPF if either mic is enabled */
			if ((codec_changes.value &
					(CPCAP_BIT_MIC1_CDC_EN |
						CPCAP_BIT_MIC2_CDC_EN)) != 0)
				codec_changes.value |= CPCAP_BIT_AUDIHPF_0 |
				CPCAP_BIT_AUDIHPF_1;

			if(state->mic_mute == CPCAP_AUDIO_MIC_MUTE)
			{
				codec_changes.value &= ~(CPCAP_BIT_MIC1_CDC_EN | CPCAP_BIT_MIC2_CDC_EN);
				CPCAP_AUDIO_DEBUG_LOG("Mic Muted\n");
			}

		/* falling through intentionally */
		case CPCAP_AUDIO_CODEC_CLOCK_ONLY:
			codec_changes.value |=
				(codec_freq_config | temp_codec_rate |
				CPCAP_BIT_DF_RESET);
			cdai_changes.value |= CPCAP_BIT_CDC_CLK_EN;
			break;

		case CPCAP_AUDIO_CODEC_OFF:
			cdai_changes.value |= CPCAP_BIT_SMB_CDC;
			break;

		default:
			break;
		}

		/* Multimedia uses CLK_IN0, incall uses CLK_IN1 */
		if (state->rat_type != CPCAP_AUDIO_RAT_NONE)
			cdai_changes.value |= CPCAP_BIT_CLK_IN_SEL;

		/* Bus bus config: Codec is always master*/
		cdai_changes.value |= CPCAP_BIT_CDC_DIG_AUD_FS0;

		/*Codec uses independent PLL in normal operation*/
		if (state->dai_config == CPCAP_AUDIO_DAI_CONFIG_NORMAL)
			cdai_changes.value |= CPCAP_BIT_CDC_PLL_SEL;

		if (state->rat_type == CPCAP_AUDIO_RAT_CDMA &&
			state->codec_primary_speaker !=
				CPCAP_AUDIO_OUT_BT_MONO) {
			/* CDMA BP requires I2S mode if not Bluetooth*/
			cdai_changes.value |= CPCAP_BIT_CDC_DIG_AUD_FS1 |
							CPCAP_BIT_CLK_INV;
		} else if (state->rat_type != CPCAP_AUDIO_RAT_NONE) {
			/* CDMA BT and all UMTS requires network mode */
			cdai_changes.value |= CPCAP_BIT_MIC2_TIMESLOT0;
		} else {
			if (state->dai_config ==
					CPCAP_AUDIO_DAI_CONFIG_HIFI_DUPLEX_1) {
				/* duplex I2S operation on DAI1 (untested) */
				cdai_changes.value |= CPCAP_BIT_DIG_AUD_IN |
					CPCAP_BIT_CDC_DIG_AUD_FS1 |
					CPCAP_BIT_CLK_INV;
			}
			if (needs_outboard_adc(state->microphone)) {
				/*if we're using the outboard ADC, then it
				 * has slots 0 and 1 so cpcap must be on
				 * 2 and 3. */
				cdai_changes.value |=
						CPCAP_BIT_MIC1_RX_TIMESLOT1 |
						CPCAP_BIT_MIC2_TIMESLOT0 |
						CPCAP_BIT_MIC2_TIMESLOT1;
			} else {
				if (needs_cpcap_mic2(state->microphone) &&
					!needs_cpcap_mic1(state->microphone)) {
					/*if we're using *only* cpcap mic2,
					 * put it on slot0 for mono capture.
					 * This requires mic1 be on a slot other
					 * than 0 due to cpcap contention logic.
					 */
					cdai_changes.value |=
						CPCAP_BIT_MIC1_RX_TIMESLOT0;
				} else {
					/*otherwise put MIC1 on slot0 and MIC2
					 * on slot 1 for either MIC1 mono or
					 * MIC1+MIC2 stereo configurations
					 */
					cdai_changes.value |=
						CPCAP_BIT_MIC2_TIMESLOT0;
				}
			}
		}

		/* FIRST, make sure the frequency config is right... */
		logged_cpcap_write(state->cpcap, CPCAP_REG_CC,
					codec_freq_config, CODEC_FREQ_MASK);

		/* Next, write the CDAI if it's changed */
		if (prev_cdai_data != cdai_changes.value) {
			cdai_changes.mask = cdai_changes.value
				| prev_cdai_data;
			prev_cdai_data = cdai_changes.value;

			logged_cpcap_write(state->cpcap, CPCAP_REG_CDI,
					cdai_changes.value, cdai_changes.mask);

			/* Clock tree change -- reset and wait */
			codec_freq_config |= CPCAP_BIT_CDC_CLOCK_TREE_RESET;

			logged_cpcap_write(state->cpcap, CPCAP_REG_CC,
				codec_freq_config, CODEC_RESET_FREQ_MASK);

			/* Wait for clock tree reset to complete */
			mdelay(CLOCK_TREE_RESET_TIME);
		}

		/* Clear old settings */
		codec_changes.mask = codec_changes.value | prev_codec_data;
		prev_codec_data    = codec_changes.value;

		logged_cpcap_write(state->cpcap, CPCAP_REG_CC,
				codec_changes.value, codec_changes.mask);
	}
}
Exemple #8
0
static void
audioic_state_dump
(
	struct cpcap_audio_state *state
)
{
	CPCAP_AUDIO_DEBUG_LOG("***************************************\n");
	CPCAP_AUDIO_DEBUG_LOG("state->mode = %d\n",  state->mode);
	CPCAP_AUDIO_DEBUG_LOG("state->codec_mode = %d\n", state->codec_mode);
	CPCAP_AUDIO_DEBUG_LOG("state->codec_rate = %d\n", state->codec_rate);
	CPCAP_AUDIO_DEBUG_LOG("state->codec_mute = %d\n", state->codec_mute);
	CPCAP_AUDIO_DEBUG_LOG("state->stdac_mode = %d\n", state->stdac_mode);
	CPCAP_AUDIO_DEBUG_LOG("state->stdac_rate = %d\n", state->stdac_rate);
	CPCAP_AUDIO_DEBUG_LOG("state->stdac_mute = %d\n", state->stdac_mute);
	CPCAP_AUDIO_DEBUG_LOG("state->analog_source = %d\n",
						state->analog_source);
	CPCAP_AUDIO_DEBUG_LOG("state->codec_primary_speaker = %d\n",
						state->codec_primary_speaker);
	CPCAP_AUDIO_DEBUG_LOG("state->stdac_primary_speaker = %d\n",
						state->stdac_primary_speaker);
	CPCAP_AUDIO_DEBUG_LOG("state->ext_primary_speaker = %d\n",
						state->ext_primary_speaker);
	CPCAP_AUDIO_DEBUG_LOG("state->codec_secondary_speaker = %d\n",
						state->codec_secondary_speaker);
	CPCAP_AUDIO_DEBUG_LOG("state->stdac_secondary_speaker = %d\n",
						state->stdac_secondary_speaker);
	CPCAP_AUDIO_DEBUG_LOG("state->ext_secondary_speaker   = %d\n",
						state->ext_secondary_speaker);
	CPCAP_AUDIO_DEBUG_LOG("state->stdac_primary_balance   = %d\n",
						state->stdac_primary_balance);
	CPCAP_AUDIO_DEBUG_LOG("state->ext_primary_balance     = %d\n",
						state->ext_primary_balance);
	CPCAP_AUDIO_DEBUG_LOG("state->output_gain             = %d\n",
						state->output_gain);
	CPCAP_AUDIO_DEBUG_LOG("state->microphone              = %d\n",
						state->microphone);
	CPCAP_AUDIO_DEBUG_LOG("state->input_gain              = %d\n",
						state->input_gain);
	CPCAP_AUDIO_DEBUG_LOG("state->rat_type                = %d\n",
						state->rat_type);
        CPCAP_AUDIO_DEBUG_LOG("state->mic_mute                = %d\n",
						state->mic_mute);
	CPCAP_AUDIO_DEBUG_LOG("***************************************\n");
}