static void vfe_7x_release(struct platform_device *dev) { mutex_lock(&vfe_lock); vfe_inuse = 0; vfe_syncdata = NULL; mutex_unlock(&vfe_lock); if (!vfestopped) { CDBG("%s:%d:Calling vfe_7x_stop()\n", __func__, __LINE__); vfe_7x_stop(); } else vfestopped = 0; msm_adsp_disable(qcam_mod); msm_adsp_disable(vfe_mod); msm_adsp_put(qcam_mod); msm_adsp_put(vfe_mod); msm_camio_disable(dev); kfree(extdata); extlen = 0; }
static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct msm_audio *prtd = runtime->private_data; struct audmgr_config cfg; int rc; prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); prtd->pcm_count = snd_pcm_lib_period_bytes(substream); prtd->pcm_irq_pos = 0; prtd->pcm_buf_pos = 0; /* rate and channels are sent to audio driver */ prtd->samp_rate = convert_samp_rate(runtime->rate); prtd->samp_rate_index = convert_dsp_samp_index(runtime->rate); prtd->channel_mode = (runtime->channels - 1); prtd->buffer_size = prtd->channel_mode ? STEREO_DATA_SIZE : \ MONO_DATA_SIZE; if (prtd->enabled == 1) return 0; prtd->type = AUDREC_CMD_TYPE_0_INDEX_WAV; cfg.tx_rate = convert_samp_rate(runtime->rate); cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; cfg.def_method = RPC_AUD_DEF_METHOD_RECORD; cfg.codec = RPC_AUD_DEF_CODEC_PCM; cfg.snd_method = RPC_SND_METHOD_MIDI; rc = audmgr_enable(&prtd->audmgr, &cfg); if (rc < 0) return rc; if (msm_adsp_enable(prtd->audpre)) { audmgr_disable(&prtd->audmgr); return -ENODEV; } if (msm_adsp_enable(prtd->audrec)) { msm_adsp_disable(prtd->audpre); audmgr_disable(&prtd->audmgr); return -ENODEV; } prtd->enabled = 1; alsa_rec_dsp_enable(prtd, 1); return 0; }
static int audpcm_in_disable(struct audio_in *audio) { if (audio->enabled) { audio->enabled = 0; audpcm_in_dsp_enable(audio, 0); audio->stopped = 1; wake_up(&audio->wait); msm_adsp_disable(audio->audrec); audpreproc_disable(audio->enc_id, audio); audio->session_info.sampling_freq = 0; audpreproc_update_audrec_info(&audio->session_info); audmgr_disable(&audio->audmgr); } return 0; }
/* must be called with audio->lock held */ static int audaac_in_enable(struct audio_aac_in *audio) { struct audmgr_config cfg; int rc; if (audio->enabled) return 0; cfg.tx_rate = audio->samp_rate; cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; cfg.def_method = RPC_AUD_DEF_METHOD_RECORD; cfg.codec = RPC_AUD_DEF_CODEC_AAC; cfg.snd_method = RPC_SND_METHOD_MIDI; if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { rc = audmgr_enable(&audio->audmgr, &cfg); if (rc < 0) return rc; if (msm_adsp_enable(audio->audpre)) { audmgr_disable(&audio->audmgr); MM_ERR("msm_adsp_enable(audpre) failed\n"); return -ENODEV; } } if (msm_adsp_enable(audio->audrec)) { if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { audmgr_disable(&audio->audmgr); msm_adsp_disable(audio->audpre); } MM_ERR("msm_adsp_enable(audrec) failed\n"); return -ENODEV; } audio->enabled = 1; audaac_in_dsp_enable(audio, 1); return 0; }
/* must be called with audio->lock held */ static int audamrnb_in_disable(struct audio_amrnb_in *audio) { if (audio->enabled) { audio->enabled = 0; audamrnb_in_dsp_enable(audio, 0); wake_up(&audio->wait); wait_event_interruptible_timeout(audio->wait_enable, audio->running == 0, 1*HZ); msm_adsp_disable(audio->audrec); if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { /*reset the sampling frequency information at audpreproc layer*/ audio->session_info.sampling_freq = 0; audpreproc_update_audrec_info(&audio->session_info); audpreproc_disable(audio->enc_id, audio); audmgr_disable(&audio->audmgr); } } return 0; }
/* must be called with audio->lock held */ static int audio_disable(struct audio *audio) { if (audio->enabled) { pr_info("audio_mp3_disable()\n"); audio->enabled = 0; auddec_dsp_config(audio, 0); wake_up(&audio->wait); audpp_disable(audio->dec_id, audio); msm_adsp_disable(audio->audplay); msm_adsp_put(audio->audplay); audmgr_disable(&audio->audmgr); atomic_set(&audio->image_swap, 0); audio->sent_bytes = 0; audio->consumed_bytes = 0; audio->total_consumed_bytes = 0; audio->out_needed = 0; audio->paused = 0; audio_allow_sleep(audio); htc_pwrsink_audio_set(PWRSINK_AUDIO_MP3, 0); } return 0; }
/* must be called with audio->lock held */ static int audpcm_in_disable(struct audio_in *audio) { int rc; if (audio->enabled) { audio->enabled = 0; audpcm_in_dsp_enable(audio, 0); audio->stopped = 1; wake_up(&audio->wait); msm_adsp_disable(audio->audrec); audpreproc_disable(audio->enc_id, audio); /*reset the sampling frequency information at audpreproc layer*/ audio->session_info.sampling_freq = 0; audpreproc_update_audrec_info(&audio->session_info); rc = audmgr_disable(&audio->audmgr); if (rc < 0) msm_adsp_dump(audio->audrec); } return 0; }
int afe_disable(u8 path_id) { struct msm_afe_state *afe = &the_afe_state; int rc; if (path_id < AFE_HW_PATH_CODEC_RX || path_id > AFE_HW_PATH_MI2S_TX) { MM_AUD_ERR("invalid path id %d\n", path_id); return -EINVAL; } mutex_lock(&afe->lock); BUG_ON(!afe->in_use); MM_AUD_INFO("%s() path_id:%d codec state:%d\n", __func__, path_id, afe->codec_config[GETDEVICEID(path_id)]); afe_dsp_codec_config(afe, path_id, 0, NULL); rc = wait_event_timeout(afe->wait, !afe->codec_config[GETDEVICEID(path_id)], msecs_to_jiffies(AFE_MAX_TIMEOUT)); if (!rc) { MM_AUD_ERR("AFE failed to respond within %d ms\n", AFE_MAX_TIMEOUT); rc = -1; } else rc = 0; afe->in_use--; MM_AUD_INFO("%s() in_use:%d \n", __func__, afe->in_use); if (!afe->in_use) { msm_adsp_disable(afe->mod); msm_adsp_put(afe->mod); afe->aux_conf_flag = 0; } mutex_unlock(&afe->lock); return rc; }
/* must be called with audio->lock held */ static int audio_enable(struct audio *audio) { struct audmgr_config cfg; int rc; pr_info("audio_aac_enable()\n"); if (audio->enabled) return 0; audio->out_tail = 0; audio->out_needed = 0; cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; cfg.codec = RPC_AUD_DEF_CODEC_AAC; cfg.snd_method = RPC_SND_METHOD_MIDI; audio_prevent_sleep(audio); audio->audmgr.cb = audio_aac_audmgr_cb; rc = audmgr_enable(&audio->audmgr, &cfg); if (rc < 0) { pr_err("audio_aac: audmgr_enable() failed\n"); audio_allow_sleep(audio); return rc; } rc = msm_adsp_get("AUDPLAY0TASK", &audio->audplay, &audplay_aac_adsp_ops, audio); if (rc) { pr_err("audio_aac:" " failed to get audplay0 dsp module\n"); goto err_get_adsp; } if (msm_adsp_enable(audio->audplay)) { pr_err("audio_aac:" " msm_adsp_enable(audplay) failed\n"); goto err_enable_adsp; } if (audpp_enable(audio->dec_id, audio_dsp_event, audio_modem_event, audio)) { pr_err("audio_aac: audpp_enable() failed\n"); goto err_enable_audpp; } atomic_set(&audio->image_swap, 0); audio->enabled = 1; htc_pwrsink_audio_set(PWRSINK_AUDIO_AAC, 100); return 0; err_enable_audpp: msm_adsp_disable(audio->audplay); err_enable_adsp: msm_adsp_put(audio->audplay); err_get_adsp: audmgr_disable(&audio->audmgr); audio_allow_sleep(audio); return -ENODEV; }