Exemplo n.º 1
0
static void cpcap_audio_configure_input(
	struct cpcap_audio_state *state,
	struct cpcap_audio_state *previous_state) {
	static unsigned int prev_input_data = 0x0;
	struct cpcap_regacc reg_changes = { 0 };

	if (state->microphone != previous_state->microphone ||
		CODEC_LOOPBACK_CHANGED()) {

		if (state->codec_mode == CPCAP_AUDIO_CODEC_LOOPBACK)
			reg_changes.value |= CPCAP_BIT_DLM;

		if ((state->microphone & CPCAP_AUDIO_IN_DUAL_EXTERNAL) != 0) {
			reg_changes.value |= CPCAP_BIT_RX_R_ENCODE
				| CPCAP_BIT_RX_L_ENCODE;
		} else {
			/*HANDSET and HEADSET mics are mutually exclusive.
			 *if both are selected, HANDSET will win
			 */
			if ((state->microphone & CPCAP_AUDIO_IN_HANDSET) != 0) {
				reg_changes.value |= CPCAP_BIT_MB_ON1R
						| CPCAP_BIT_MIC1_MUX |
						CPCAP_BIT_MIC1_PGA_EN;
			} else if ((state->microphone &
					CPCAP_AUDIO_IN_HEADSET) != 0) {
				reg_changes.value |= CPCAP_BIT_HS_MIC_MUX
						| CPCAP_BIT_MIC1_PGA_EN;
			}

			/*NOTE an implementation quirk: SECONDARY and TERTIARY
			 * are equivalent on 2-mic hardware.
			 * This is unintentional but harmless */
			if (needs_cpcap_mic2(state->microphone)) {
				reg_changes.value |= CPCAP_BIT_MB_ON1L
						| CPCAP_BIT_MIC2_MUX |
						CPCAP_BIT_MIC2_PGA_EN;
			}
		}

		reg_changes.mask = reg_changes.value | prev_input_data;
		prev_input_data = reg_changes.value;

		logged_cpcap_write(state->cpcap, CPCAP_REG_TXI,
					reg_changes.value, reg_changes.mask);
	}
}
Exemplo n.º 2
0
static void cpcap_audio_configure_input(
	struct cpcap_audio_state *state,
	struct cpcap_audio_state *previous_state) {
	static unsigned int prev_input_data = 0x0;
	struct cpcap_regacc reg_changes = { 0 };

	if (state->microphone != previous_state->microphone ||
		CODEC_LOOPBACK_CHANGED()) {

		if (state->codec_mode == CPCAP_AUDIO_CODEC_LOOPBACK)
			reg_changes.value |= CPCAP_BIT_DLM;

#if !defined(CONFIG_MACH_SHOLEST)
		if (previous_state->microphone
		    == CPCAP_AUDIO_IN_HEADSET) {
			logged_cpcap_write(state->cpcap, CPCAP_REG_GPIO4,
				     0, CPCAP_BIT_GPIO4DRV);
		}
#endif /* !CONFIG_MACH_SHOLEST */

		switch (state->microphone) {
		case CPCAP_AUDIO_IN_HANDSET:
			reg_changes.value |= CPCAP_BIT_MB_ON1R
				| CPCAP_BIT_MIC1_MUX | CPCAP_BIT_MIC1_PGA_EN;
			break;

		case CPCAP_AUDIO_IN_HEADSET:
			reg_changes.value |= CPCAP_BIT_HS_MIC_MUX
				| CPCAP_BIT_MIC1_PGA_EN;

#if !defined(CONFIG_MACH_SHOLEST)
			logged_cpcap_write(state->cpcap, CPCAP_REG_GPIO4,
					   CPCAP_BIT_GPIO4DRV,
					   CPCAP_BIT_GPIO4DRV);
#endif /* !CONFIG_MACH_SHOLEST */
			break;

		case CPCAP_AUDIO_IN_EXT_BUS:
			reg_changes.value |=  CPCAP_BIT_EMU_MIC_MUX
				| CPCAP_BIT_MIC1_PGA_EN;
			break;

		case CPCAP_AUDIO_IN_AUX_INTERNAL:
			reg_changes.value |= CPCAP_BIT_MB_ON1L
				| CPCAP_BIT_MIC2_MUX | CPCAP_BIT_MIC2_PGA_EN;
			break;

		case CPCAP_AUDIO_IN_DUAL_INTERNAL:
			reg_changes.value |= CPCAP_BIT_MB_ON1R
				| CPCAP_BIT_MIC1_MUX | CPCAP_BIT_MIC1_PGA_EN
				| CPCAP_BIT_MB_ON1L | CPCAP_BIT_MIC2_MUX
				| CPCAP_BIT_MIC2_PGA_EN;
			break;

		case CPCAP_AUDIO_IN_DUAL_EXTERNAL:
			reg_changes.value |= CPCAP_BIT_RX_R_ENCODE
				| CPCAP_BIT_RX_L_ENCODE;
			break;

		case CPCAP_AUDIO_IN_BT_MONO:
		default:
			reg_changes.value = 0;
			break;
		}

		reg_changes.mask = reg_changes.value | prev_input_data;
		prev_input_data = reg_changes.value;

		logged_cpcap_write(state->cpcap, CPCAP_REG_TXI,
			reg_changes.value, reg_changes.mask);
	}
}