static void cpcap_audio_configure_output( struct cpcap_audio_state *state, struct cpcap_audio_state *previous_state) { static unsigned int prev_aud_out_data; if (is_output_changed(previous_state, state) || is_codec_changed(previous_state, state) || is_stdac_changed(previous_state, state)) { bool activate_ext_loudspeaker = false; struct cpcap_regacc reg_changes = { 0 }; cpcap_audio_set_output_amp_switches(state); activate_ext_loudspeaker = cpcap_audio_set_bits_for_speaker( state->codec_primary_speaker, state->codec_primary_balance, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->codec_secondary_speaker, CPCAP_AUDIO_BALANCE_NEUTRAL, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->stdac_primary_speaker, state->stdac_primary_balance, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->stdac_secondary_speaker, CPCAP_AUDIO_BALANCE_NEUTRAL, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->ext_primary_speaker, state->ext_primary_balance, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->ext_secondary_speaker, CPCAP_AUDIO_BALANCE_NEUTRAL, &(reg_changes.value)); reg_changes.mask = reg_changes.value | prev_aud_out_data; prev_aud_out_data = reg_changes.value; logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA, reg_changes.value, reg_changes.mask); } }
static void cpcap_audio_configure_output( struct cpcap_audio_state *state, struct cpcap_audio_state *prev) { static unsigned int prev_aud_out_data; bool activate_ext_loudspeaker = false; struct cpcap_regacc reg_changes = { 0 }; if (!is_output_changed(prev, state) && !is_codec_changed(prev, state) && !is_stdac_changed(prev, state)) return; cpcap_audio_set_output_amp_switches(state); activate_ext_loudspeaker = cpcap_audio_set_bits_for_speaker( state->codec_primary_speaker, state->codec_primary_balance, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->codec_secondary_speaker, CPCAP_AUDIO_BALANCE_NEUTRAL, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->stdac_primary_speaker, state->stdac_primary_balance, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->stdac_secondary_speaker, CPCAP_AUDIO_BALANCE_NEUTRAL, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->ext_primary_speaker, state->ext_primary_balance, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->ext_secondary_speaker, CPCAP_AUDIO_BALANCE_NEUTRAL, &(reg_changes.value)); reg_changes.mask = reg_changes.value | prev_aud_out_data; prev_aud_out_data = reg_changes.value; /* Sleep for 300ms if we are getting into a call to allow the switch to * settle. If we don't do this, it causes a loud pop at the beginning * of the call. */ if (state->rat_type == CPCAP_AUDIO_RAT_CDMA && state->ext_primary_speaker != CPCAP_AUDIO_OUT_NONE && prev->ext_primary_speaker == CPCAP_AUDIO_OUT_NONE) msleep(300); logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA, reg_changes.value, reg_changes.mask); }
static void cpcap_audio_configure_output( struct cpcap_audio_state *state, struct cpcap_audio_state *previous_state) { static unsigned int prev_aud_out_data; if (is_output_changed(previous_state, state) || is_codec_changed(previous_state, state) || is_stdac_changed(previous_state, state)) { bool activate_ext_loudspeaker = false; struct cpcap_regacc reg_changes = { 0 }; if (is_output_headset(state) && !is_output_headset(previous_state)) { /* Charge pump should be enabled first * and wait a minimum of 750 uSec * to allow for settling of the negative supply. */ logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA, CPCAP_BIT_ST_HS_CP_EN, CPCAP_BIT_ST_HS_CP_EN); /* HS plug-in noise */ /*mdelay(1);*/ mdelay(200); } cpcap_audio_set_output_amp_switches(state); activate_ext_loudspeaker = cpcap_audio_set_bits_for_speaker( state->codec_primary_speaker, state->codec_primary_balance, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->codec_secondary_speaker, CPCAP_AUDIO_BALANCE_NEUTRAL, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->stdac_primary_speaker, state->stdac_primary_balance, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->stdac_secondary_speaker, CPCAP_AUDIO_BALANCE_NEUTRAL, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->ext_primary_speaker, state->ext_primary_balance, &(reg_changes.value)); activate_ext_loudspeaker = activate_ext_loudspeaker || cpcap_audio_set_bits_for_speaker( state->ext_secondary_speaker, CPCAP_AUDIO_BALANCE_NEUTRAL, &(reg_changes.value)); reg_changes.mask = reg_changes.value | prev_aud_out_data; prev_aud_out_data = reg_changes.value; logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA, reg_changes.value, reg_changes.mask); if (!is_output_headset(state) && is_output_headset(previous_state)) { /* When disabling HS output amp, * HS_CP should be turned off after output * amp goes down. */ mdelay(1); logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA, 0, CPCAP_BIT_ST_HS_CP_EN); } } }