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;
}
示例#2
0
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;
}