static int msm8k_audio_dev_ctrl_ioctl(struct inode *inode, struct file *f, unsigned int cmd, unsigned long arg) { int rc; u32 uparam; struct msm_mute_info m; struct msm_vol_info v; D("%s\n", __func__); switch (cmd) { case AUDIO_SWITCH_DEVICE: if (copy_from_user(&uparam, (void *)arg, sizeof(uparam))) return CAD_RES_FAILURE; rc = audio_switch_device(uparam); break; case AUDIO_SET_VOLUME: if (copy_from_user(&uparam, (void *)arg, sizeof(uparam))) return CAD_RES_FAILURE; rc = audio_set_device_volume(uparam); break; case AUDIO_SET_VOLUME_PATH: if (copy_from_user(&v, (void *)arg, sizeof(struct msm_vol_info))) return CAD_RES_FAILURE; rc = audio_set_device_volume_path(&v); break; case AUDIO_SET_MUTE: rc = copy_from_user(&m, (void *)arg, sizeof(struct msm_mute_info)); if (rc) { pr_err("AUDIO_SET_MUTE copy from user failed\n"); break; } rc = audio_set_device_mute(&m); break; case AUDIO_SET_MAX_VOL_ALL: rc = volume_set_max_vol_all(); break; default: rc = -EINVAL; } return rc; }
static int snd_mute_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; rc = audio_set_device_mute(ucontrol->value.integer.value[0]); if (rc) printk(KERN_ERR "audio_set_device_mute failed\n"); else qsd_glb_ctl.mute = ucontrol->value.integer.value[0]; return rc; }
int audio_switch_device(int new_device) { int rc; struct msm8k_audio_dev_ctrl *ctrl = &g_ctrl; struct cad_device_struct_type cad_dev; int prev_force_spkr_mode = get_force_speaker_mode(); int prev_fm_mode = get_fm_mode(); D("%s\n", __func__); memset(&cad_dev, 0, sizeof(struct cad_device_struct_type)); switch (new_device) { case HANDSET_MIC: cad_dev.device = CAD_HW_DEVICE_ID_HANDSET_MIC; cad_dev.reserved = CAD_TX_DEVICE; break; case HANDSET_SPKR: cad_dev.device = CAD_HW_DEVICE_ID_HANDSET_SPKR; cad_dev.reserved = CAD_RX_DEVICE; break; case HEADSET_MIC: cad_dev.device = CAD_HW_DEVICE_ID_HEADSET_MIC; cad_dev.reserved = CAD_TX_DEVICE; break; case HEADSET_SPKR_MONO: cad_dev.device = CAD_HW_DEVICE_ID_HEADSET_SPKR_MONO; cad_dev.reserved = CAD_RX_DEVICE; break; case HEADSET_SPKR_STEREO: cad_dev.device = CAD_HW_DEVICE_ID_HEADSET_SPKR_STEREO; cad_dev.reserved = CAD_RX_DEVICE; break; case SPKR_PHONE_MIC: cad_dev.device = CAD_HW_DEVICE_ID_SPKR_PHONE_MIC; cad_dev.reserved = CAD_TX_DEVICE; break; case SPKR_PHONE_MONO: cad_dev.device = CAD_HW_DEVICE_ID_SPKR_PHONE_MONO; cad_dev.reserved = CAD_RX_DEVICE; break; case SPKR_PHONE_STEREO: cad_dev.device = CAD_HW_DEVICE_ID_SPKR_PHONE_STEREO; cad_dev.reserved = CAD_RX_DEVICE; break; case BT_SCO_MIC: cad_dev.device = CAD_HW_DEVICE_ID_BT_SCO_MIC; cad_dev.reserved = CAD_TX_DEVICE; break; case BT_SCO_SPKR: cad_dev.device = CAD_HW_DEVICE_ID_BT_SCO_SPKR; cad_dev.reserved = CAD_RX_DEVICE; break; case BT_A2DP_SPKR: cad_dev.device = CAD_HW_DEVICE_ID_BT_A2DP_SPKR; cad_dev.reserved = CAD_RX_DEVICE; break; case TTY_HEADSET_MIC: cad_dev.device = CAD_HW_DEVICE_ID_TTY_HEADSET_MIC; cad_dev.reserved = CAD_TX_DEVICE; break; case TTY_HEADSET_SPKR: cad_dev.device = CAD_HW_DEVICE_ID_TTY_HEADSET_SPKR; cad_dev.reserved = CAD_RX_DEVICE; break; case HEADSET_MONO_PLUS_SPKR_MONO_RX: cad_dev.device = CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_MONO_RX; cad_dev.reserved = CAD_RX_DEVICE; break; case HEADSET_MONO_PLUS_SPKR_STEREO_RX: cad_dev.device = CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_STEREO_RX; cad_dev.reserved = CAD_RX_DEVICE; break; case HEADSET_STEREO_PLUS_SPKR_MONO_RX: cad_dev.device = CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_MONO_RX; cad_dev.reserved = CAD_RX_DEVICE; break; case HEADSET_STEREO_PLUS_SPKR_STEREO_RX: cad_dev.device = CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_STEREO_RX; cad_dev.reserved = CAD_RX_DEVICE; break; case I2S_RX: cad_dev.device = CAD_HW_DEVICE_ID_I2S_RX; cad_dev.reserved = CAD_RX_DEVICE; break; case I2S_TX: cad_dev.device = CAD_HW_DEVICE_ID_I2S_TX; cad_dev.reserved = CAD_TX_DEVICE; break; case SPKR_PHONE_HEADSET_STEREO: cad_dev.device = CAD_HW_DEVICE_ID_HEADSET_SPKR_STEREO; cad_dev.reserved = CAD_RX_DEVICE; break; case FM_HEADSET: cad_dev.device = CAD_HW_DEVICE_ID_HEADSET_SPKR_STEREO; cad_dev.reserved = CAD_RX_DEVICE; break; case FM_SPKR: cad_dev.device = CAD_HW_DEVICE_ID_SPKR_PHONE_STEREO; cad_dev.reserved = CAD_RX_DEVICE; break; default: return -ENODEV; } /* Set and check if force_speaker_mode is changed */ if (cad_dev.reserved == CAD_RX_DEVICE) { if (new_device == SPKR_PHONE_HEADSET_STEREO) set_force_speaker_mode(1); else set_force_speaker_mode(0); if (new_device == FM_HEADSET) set_fm_mode(1); else if (new_device == FM_SPKR) set_fm_mode(2); else set_fm_mode(0); } if (prev_force_spkr_mode != get_force_speaker_mode() || prev_fm_mode != get_fm_mode()) cad_dev.force_update = 1; pr_info("SWITCH DEVICE %d\n", cad_dev.device); rc = cad_ioctl(ctrl->cad_ctrl_handle, CAD_IOCTL_CMD_DEVICE_SET_GLOBAL_DEFAULT, &cad_dev, sizeof(struct cad_device_struct_type)); if (rc) { pr_err("cad_ioctl() SET_GLOBAL_DEFAULT failed\n"); return rc; } if (cad_dev.reserved == CAD_RX_DEVICE) ctrl->current_rx_device = cad_dev.device; else ctrl->current_tx_device = cad_dev.device; #if 1 if (cad_dev.reserved == CAD_TX_DEVICE) { struct msm_mute_info info; info.path = 1; info.mute = 0; pr_info("UNMUTE DEVICE %d\n", cad_dev.device); audio_set_device_mute(&info); } #else if (cad_dev.reserved == CAD_TX_DEVICE && atomic_read(&tx_mute)) { /* keep tx mute status if path is changed. */ struct msm_mute_info info; info.path = info.mute = 1; pr_info("MUTE DEVICE %d\n", cad_dev.device); audio_set_device_mute(&info); } #endif return rc; }