static int msm_device_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; int set = 0; struct msm_audio_route_config route_cfg; struct msm_snddev_info *dev_info; int tx_freq = 0; int rx_freq = 0; u32 set_freq = 0; int retry = 3; set = ucontrol->value.integer.value[0]; route_cfg.dev_id = ucontrol->id.numid - device_index; dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { MM_AUD_ERR("pass invalid dev_id\n"); rc = PTR_ERR(dev_info); return rc; } MM_AUD_INFO("device %s set %d\n", dev_info->name, set); pr_aud_info("[ALSA] msm_en_device (dev %s, id %d, enable %d, opened %d)\n", dev_info->name, route_cfg.dev_id, set, dev_info->opened); if (set) { if (!dev_info->opened) { set_freq = dev_info->sample_rate; if (!msm_device_is_voice(route_cfg.dev_id)) { msm_get_voc_freq(&tx_freq, &rx_freq); if (dev_info->capability & SNDDEV_CAP_TX) set_freq = tx_freq; if (set_freq == 0) set_freq = dev_info->sample_rate; } else set_freq = dev_info->sample_rate; MM_AUD_INFO("device freq =%d\n", set_freq); rc = dev_info->dev_ops.set_freq(dev_info, set_freq); if (rc < 0) { MM_AUD_ERR("device freq failed!\n"); return rc; } dev_info->set_sample_rate = rc; rc = 0; do{ rc = dev_info->dev_ops.open(dev_info); retry--; } while (rc < 0 && retry); if (rc < 0) { MM_AUD_ERR("Enabling %s failed, rc=%d\n", dev_info->name, rc); return rc; } dev_info->opened = 1; pr_aud_info("set device %s opened as %d\n", dev_info->name, dev_info->opened); broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, SESSION_IGNORE); } } else { if (dev_info->opened) { broadcast_event(AUDDEV_EVT_REL_PENDING, route_cfg.dev_id, SESSION_IGNORE); rc = dev_info->dev_ops.close(dev_info); if (rc < 0) { MM_AUD_ERR("Snd device failed close!\n"); return rc; } else { dev_info->opened = 0; pr_aud_info("set device %s opened as %d\n", dev_info->name, dev_info->opened); broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, SESSION_IGNORE); } } } return rc; }
static int msm_device_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; int set = 0; struct msm_audio_route_config route_cfg; struct msm_snddev_info *dev_info; struct msm_snddev_info *dst_dev_info; struct msm_snddev_info *src_dev_info; int tx_freq = 0; int rx_freq = 0; u32 set_freq = 0; set = ucontrol->value.integer.value[0]; route_cfg.dev_id = ucontrol->id.numid - device_index; dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { pr_err("%s:pass invalid dev_id\n", __func__); rc = PTR_ERR(dev_info); return rc; } pr_info("%s:device %s(%d) set %d : opened_dev(%d,%d)\n", __func__, dev_info->name, route_cfg.dev_id, set, opened_dev1, opened_dev2); if (set) { pr_info("Device %s Opened = %d\n", dev_info->name, dev_info->opened); if (!dev_info->opened) { #if defined(CONFIG_USA_MODEL_SGH_T989 ) || defined(CONFIG_USA_MODEL_SGH_I727) \ || defined(CONFIG_USA_MODEL_SGH_I757)|| defined (CONFIG_USA_MODEL_SGH_T769)\ || defined(CONFIG_USA_MODEL_SGH_I577) if(!strcmp(dev_info->name, "dualmic_handset_ef_tx")) { pr_debug("%s : dualmic_enabled\n",__func__); dualmic_enabled = 1; } #endif set_freq = dev_info->sample_rate; if (!msm_device_is_voice(route_cfg.dev_id)) { msm_get_voc_freq(&tx_freq, &rx_freq); if (dev_info->capability & SNDDEV_CAP_TX) set_freq = tx_freq; if (set_freq == 0) set_freq = dev_info->sample_rate; } else set_freq = dev_info->sample_rate; pr_err("%s:device freq =%d\n", __func__, set_freq); rc = dev_info->dev_ops.set_freq(dev_info, set_freq); if (rc < 0) { pr_err("%s:device freq failed!\n", __func__); return rc; } dev_info->set_sample_rate = rc; rc = 0; pr_info("Device trying to open : %s\n", dev_info->name); rc = dev_info->dev_ops.open(dev_info); if (rc < 0) { /*[[Safeguard code for device open issue -START //balaji.k This fix would work incase of EBUSY error when device is being opened & previous instance of device is not closed */ if(rc == -EBUSY) { struct msm_snddev_info * last_dev_info = NULL; int closing_dev = -1; pr_err("DEV_BUSY: Ebusy Error %s : route_cfg.dev_id 1: %d\n", __func__, route_cfg.dev_id); //Closing the last active device after sending the broadcast if (dev_info->capability & SNDDEV_CAP_TX) { last_dev_info = audio_dev_ctrl_find_dev(last_active_tx_opened_dev); closing_dev = last_active_tx_opened_dev; } if (dev_info->capability & SNDDEV_CAP_RX) { last_dev_info = audio_dev_ctrl_find_dev(last_active_rx_opened_dev); closing_dev = last_active_rx_opened_dev; } // to fix exception error if (IS_ERR(last_dev_info)) { pr_err("last_dev:%s:pass invalid dev_id\n", __func__); rc = PTR_ERR(last_dev_info); return rc; } broadcast_event(AUDDEV_EVT_REL_PENDING, closing_dev, SESSION_IGNORE); pr_err("DEV_BUSY:closing Last active Open dev (%d)\n", closing_dev); rc = dev_info->dev_ops.close(last_dev_info); pr_err("DEV_BUSY: %s : route_cfg.dev_id 2: %d\n", __func__, route_cfg.dev_id); if (rc < 0) { pr_err("DEV_BUSY : %s:Snd device failed close!\n", __func__); return rc; } else { //Device close is successful, so broadcasting release event. //if(opened_dev1 == route_cfg.dev_id) // Commented these as here we are closing the previous device opened_dev1 = -1; //else if(opened_dev2 == route_cfg.dev_id) opened_dev2 = -1; last_dev_info->opened= 0; broadcast_event(AUDDEV_EVT_DEV_RLS, closing_dev, SESSION_IGNORE); } dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { pr_err("DEV_BUSY: %s:pass invalid dev_id\n", __func__); rc = PTR_ERR(dev_info); return rc; } pr_err("DEV_BUSY: Opening the Device Now %s : route_cfg.dev_id : %d\n", __func__, route_cfg.dev_id); rc = dev_info->dev_ops.open(dev_info); //Opening the intended device if(rc < 0) { pr_err("DEV_BUSY: %s, Device %d:Enabling %s failed\n", __func__, rc, dev_info->name); return rc; } else { // Maintaining the last Opened device- reqd for closing if EBUSY is encountered. if (dev_info->capability & SNDDEV_CAP_TX) last_active_tx_opened_dev = route_cfg.dev_id; else if(dev_info->capability & SNDDEV_CAP_RX) last_active_rx_opened_dev = route_cfg.dev_id; printk("Last active Open Txdev (%d) and Rxdev(%d)\n", last_active_tx_opened_dev, last_active_rx_opened_dev); } } else { pr_err("%s:Enabling %s failed\n", __func__, dev_info->name); return rc; } } else { // Maintaining the last Opened device- reqd for closing if EBUSY is encountered. if (dev_info->capability & SNDDEV_CAP_TX) last_active_tx_opened_dev = route_cfg.dev_id; else if(dev_info->capability & SNDDEV_CAP_RX) last_active_rx_opened_dev = route_cfg.dev_id; printk("Last active Open Txdev (%d) and Rxdev(%d)\n", last_active_tx_opened_dev, last_active_rx_opened_dev); } //Safeguard code for device open issue -END]] //balaji.k if(opened_dev1 == -1) opened_dev1 = route_cfg.dev_id; else opened_dev2 = route_cfg.dev_id; pr_info("%s:open done : opened_dev(%d,%d)\n", __func__, opened_dev1, opened_dev2); dev_info->opened = 1; broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, SESSION_IGNORE); if ((route_cfg.dev_id == src_dev) || (route_cfg.dev_id == dst_dev)) { dst_dev_info = audio_dev_ctrl_find_dev( dst_dev); if (IS_ERR(dst_dev_info)) { pr_err("dst_dev:%s:pass invalid" "dev_id\n", __func__); rc = PTR_ERR(dst_dev_info); return rc; } src_dev_info = audio_dev_ctrl_find_dev( src_dev); if (IS_ERR(src_dev_info)) { pr_err("src_dev:%s:pass invalid" "dev_id\n", __func__); rc = PTR_ERR(src_dev_info); return rc; } if ((dst_dev_info->opened) && (src_dev_info->opened)) { pr_debug("%d: Enable afe_loopback\n", __LINE__); afe_loopback(LOOPBACK_ENABLE, dst_dev_info->copp_id, src_dev_info->copp_id); loopback_status = 1; } } } } else { if (dev_info->opened) { #if defined(CONFIG_USA_MODEL_SGH_T989 ) || defined(CONFIG_USA_MODEL_SGH_I727) \ || defined(CONFIG_USA_MODEL_SGH_I757)|| defined (CONFIG_USA_MODEL_SGH_T769) || defined (CONFIG_USA_MODEL_SGH_I577) if((!strcmp(dev_info->name,"dualmic_handset_ef_tx"))&&(!strcmp(dev_info->name,"handset_call_rx"))) { pr_debug("%s : dualmic_disabled\n",__func__); dualmic_enabled = 0; } #endif broadcast_event(AUDDEV_EVT_REL_PENDING, route_cfg.dev_id, SESSION_IGNORE); printk("%s : Device trying to close : %s\n",__func__, dev_info->name); rc = dev_info->dev_ops.close(dev_info); if (rc < 0) { pr_err("%s:Snd device failed close!\n", __func__); return rc; } else { if(opened_dev1 == route_cfg.dev_id) opened_dev1 = -1; else if(opened_dev2 == route_cfg.dev_id) opened_dev2 = -1; pr_info("%s:close done : opened_dev(%d,%d)\n", __func__, opened_dev1, opened_dev2); dev_info->opened = 0; broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, SESSION_IGNORE); } if (loopback_status == 1) { if ((route_cfg.dev_id == src_dev) || (route_cfg.dev_id == dst_dev)) { dst_dev_info = audio_dev_ctrl_find_dev( dst_dev); if (IS_ERR(dst_dev_info)) { pr_err("dst_dev:%s:pass invalid" "dev_id\n", __func__); rc = PTR_ERR(dst_dev_info); return rc; } src_dev_info = audio_dev_ctrl_find_dev( src_dev); if (IS_ERR(src_dev_info)) { pr_err("src_dev:%s:pass invalid" "dev_id\n", __func__); rc = PTR_ERR(src_dev_info); return rc; } pr_debug("%d: Disable afe_loopback\n", __LINE__); afe_loopback(LOOPBACK_DISABLE, dst_dev_info->copp_id, src_dev_info->copp_id); loopback_status = 0; } } } } return rc; }
static int msm_device_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; int set = 0; struct msm_audio_route_config route_cfg; struct msm_snddev_info *dev_info; struct msm_snddev_info *dst_dev_info; struct msm_snddev_info *src_dev_info; int tx_freq = 0; int rx_freq = 0; u32 set_freq = 0; set = ucontrol->value.integer.value[0]; route_cfg.dev_id = ucontrol->id.numid - device_index; dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(dev_info); return rc; } MM_INFO("device %s set %d\n", dev_info->name, set); if (set) { if (!dev_info->opened) { set_freq = dev_info->sample_rate; if (!msm_device_is_voice(route_cfg.dev_id)) { msm_get_voc_freq(&tx_freq, &rx_freq); if (dev_info->capability & SNDDEV_CAP_TX) set_freq = tx_freq; if (set_freq == 0) set_freq = dev_info->sample_rate; } else set_freq = dev_info->sample_rate; MM_ERR("device freq =%d\n", set_freq); rc = dev_info->dev_ops.set_freq(dev_info, set_freq); if (rc < 0) { MM_ERR("device freq failed!\n"); return rc; } dev_info->set_sample_rate = rc; rc = 0; rc = dev_info->dev_ops.open(dev_info); if (rc < 0) { MM_ERR("Enabling %s failed", dev_info->name); return rc; } dev_info->opened = 1; broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, SESSION_IGNORE); /* Event to notify client for device info */ broadcast_event(AUDDEV_EVT_DEVICE_INFO, route_cfg.dev_id, SESSION_IGNORE); if ((route_cfg.dev_id == src_dev) || (route_cfg.dev_id == dst_dev)) { dst_dev_info = audio_dev_ctrl_find_dev( dst_dev); if (IS_ERR(dst_dev_info)) { pr_err("dst_dev:%s:pass invalid" "dev_id\n", __func__); rc = PTR_ERR(dst_dev_info); return rc; } src_dev_info = audio_dev_ctrl_find_dev( src_dev); if (IS_ERR(src_dev_info)) { pr_err("src_dev:%s:pass invalid" "dev_id\n", __func__); rc = PTR_ERR(src_dev_info); return rc; } if ((dst_dev_info->opened) && (src_dev_info->opened)) { pr_debug("%d: Enable afe_loopback\n", __LINE__); afe_ext_loopback(LOOPBACK_ENABLE, dst_dev_info->copp_id, src_dev_info->copp_id); loopback_status = 1; } } } } else { if (dev_info->opened) { broadcast_event(AUDDEV_EVT_REL_PENDING, route_cfg.dev_id, SESSION_IGNORE); rc = dev_info->dev_ops.close(dev_info); if (rc < 0) { MM_ERR("Snd device failed close!\n"); return rc; } else { dev_info->opened = 0; broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, SESSION_IGNORE); } if (loopback_status == 1) { if ((route_cfg.dev_id == src_dev) || (route_cfg.dev_id == dst_dev)) { dst_dev_info = audio_dev_ctrl_find_dev( dst_dev); if (IS_ERR(dst_dev_info)) { pr_err("dst_dev:%s:pass invalid" "dev_id\n", __func__); rc = PTR_ERR(dst_dev_info); return rc; } src_dev_info = audio_dev_ctrl_find_dev( src_dev); if (IS_ERR(src_dev_info)) { pr_err("dst_dev:%s:pass invalid" "dev_id\n", __func__); rc = PTR_ERR(src_dev_info); return rc; } pr_debug("%d: Disable afe_loopback\n", __LINE__); afe_ext_loopback(LOOPBACK_DISABLE, dst_dev_info->copp_id, src_dev_info->copp_id); loopback_status = 0; } } } } return rc; }
static int msm_device_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; int set = 0; struct msm_audio_route_config route_cfg; struct msm_snddev_info *dev_info; int tx_freq = 0; int rx_freq = 0; u32 set_freq = 0; set = ucontrol->value.integer.value[0]; route_cfg.dev_id = ucontrol->id.numid - device_index; if (sound_logging) pr_info("sound_logging: msm_device_put() route_cfg.dev_id:%d enable:%d \n", route_cfg.dev_id, set); // replace headset mic (3) with speaker phone mic (12) if (headset_mic_switch && route_cfg.dev_id == 3) route_cfg.dev_id=12; // replace speaker_dual_mic_broadside_tx dev_id:12 with speaker_mono_tx (10) /*if (speakerphone_echo_fix && route_cfg.dev_id==12) route_cfg.dev_id=10; // probably not needed by official 2.3*/ dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(dev_info); return rc; } if (set) { if (!dev_info->opened) { set_freq = dev_info->sample_rate; if (!msm_device_is_voice(route_cfg.dev_id)) { msm_get_voc_freq(&tx_freq, &rx_freq); if (dev_info->capability & SNDDEV_CAP_TX) set_freq = tx_freq; if (set_freq == 0) set_freq = dev_info->sample_rate; } else set_freq = dev_info->sample_rate; MM_ERR("device freq =%d\n", set_freq); rc = dev_info->dev_ops.set_freq(dev_info, set_freq); if (rc < 0) { MM_ERR("device freq failed!\n"); return rc; } dev_info->set_sample_rate = rc; rc = 0; rc = dev_info->dev_ops.open(dev_info); if (rc < 0) { MM_ERR("Enabling %s failed", dev_info->name); return rc; } dev_info->opened = 1; broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, SESSION_IGNORE); /* Event to notify client for device info */ broadcast_event(AUDDEV_EVT_DEVICE_INFO, route_cfg.dev_id, SESSION_IGNORE); } } else { if (dev_info->opened) { broadcast_event(AUDDEV_EVT_REL_PENDING, route_cfg.dev_id, SESSION_IGNORE); rc = dev_info->dev_ops.close(dev_info); if (rc < 0) { MM_ERR("Snd device failed close!\n"); return rc; } else { dev_info->opened = 0; broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, SESSION_IGNORE); } } } return rc; }
static int msm_device_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; int set = 0; struct msm_audio_route_config route_cfg; struct msm_snddev_info *dev_info; int tx_freq = 0; int rx_freq = 0; u32 set_freq = 0; set = ucontrol->value.integer.value[0]; route_cfg.dev_id = ucontrol->id.numid - device_index; dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(dev_info); return rc; } MM_INFO("device %s set %d\n", dev_info->name, set); if (set) { if (!dev_info->opened) { set_freq = dev_info->sample_rate; if (!msm_device_is_voice(route_cfg.dev_id)) { msm_get_voc_freq(&tx_freq, &rx_freq); if (dev_info->capability & SNDDEV_CAP_TX) set_freq = tx_freq; if (set_freq == 0) set_freq = dev_info->sample_rate; } else set_freq = dev_info->sample_rate; MM_ERR("device freq =%d\n", set_freq); rc = dev_info->dev_ops.set_freq(dev_info, set_freq); if (rc < 0) { MM_ERR("device freq failed!\n"); return rc; } dev_info->set_sample_rate = rc; rc = 0; rc = dev_info->dev_ops.open(dev_info); if (rc < 0) { MM_ERR("Enabling %s failed", dev_info->name); return rc; } dev_info->opened = 1; broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, SESSION_IGNORE); /* Event to notify client for device info */ broadcast_event(AUDDEV_EVT_DEVICE_INFO, route_cfg.dev_id, SESSION_IGNORE); } } else { if (dev_info->opened) { broadcast_event(AUDDEV_EVT_REL_PENDING, route_cfg.dev_id, SESSION_IGNORE); rc = dev_info->dev_ops.close(dev_info); if (rc < 0) { MM_ERR("Snd device failed close!\n"); return rc; } else { dev_info->opened = 0; broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, SESSION_IGNORE); } } } return rc; }
static int msm_device_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; int set = 0; struct msm_audio_route_config route_cfg; struct msm_snddev_info *dev_info; int tx_freq = 0; int rx_freq = 0; u32 set_freq = 0; set = ucontrol->value.integer.value[0]; route_cfg.dev_id = ucontrol->id.numid - device_index; if (route_cfg.dev_id == 3) { // this is needed for sure pr_info("ksatta: msm_device_put() dev_id is 3(headset mic), changing to 10(speakerphone mic)"); route_cfg.dev_id = 10; } dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(dev_info); return rc; } //pr_info("ksatta: msm_device_put() dev name:'%s' set:%d\n", dev_info->name, set); if (set) { if (!dev_info->opened) { set_freq = dev_info->sample_rate; if (!msm_device_is_voice(route_cfg.dev_id)) { msm_get_voc_freq(&tx_freq, &rx_freq); if (dev_info->capability & SNDDEV_CAP_TX) set_freq = tx_freq; if (set_freq == 0) set_freq = dev_info->sample_rate; } else set_freq = dev_info->sample_rate; MM_ERR("device freq =%d\n", set_freq); rc = dev_info->dev_ops.set_freq(dev_info, set_freq); if (rc < 0) { MM_ERR("device freq failed!\n"); return rc; } dev_info->set_sample_rate = rc; rc = 0; rc = dev_info->dev_ops.open(dev_info); if (rc < 0) { MM_ERR("Enabling %s failed", dev_info->name); return rc; } dev_info->opened = 1; broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, SESSION_IGNORE); } } else { if (dev_info->opened) { broadcast_event(AUDDEV_EVT_REL_PENDING, route_cfg.dev_id, SESSION_IGNORE); rc = dev_info->dev_ops.close(dev_info); if (rc < 0) { MM_ERR("Snd device failed close!\n"); return rc; } else { dev_info->opened = 0; broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, SESSION_IGNORE); } } } return rc; }