static int msm_dai_q6_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); int rc = 0; /* Start/stop port without waiting for Q6 AFE response. Need to have * native q6 AFE driver propagates AFE response in order to handle * port start/stop command error properly if error does arise. */ mutex_lock(&dai_data->dai_lock); pr_info("%s:port:%d cmd:%d dai_data->status_mask = %ld", __func__, dai->id, cmd, *dai_data->status_mask); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { switch (dai->id) { case VOICE_PLAYBACK_TX: case VOICE_RECORD_TX: case VOICE_RECORD_RX: afe_pseudo_port_start_nowait(dai->id); break; default: afe_port_start_nowait(dai->id, &dai_data->port_config, dai_data->rate); break; } set_bit(STATUS_PORT_STARTED, dai_data->status_mask); } break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { switch (dai->id) { case VOICE_PLAYBACK_TX: case VOICE_RECORD_TX: case VOICE_RECORD_RX: afe_pseudo_port_stop_nowait(dai->id); break; default: afe_port_stop_nowait(dai->id); break; } clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); } break; default: rc = -EINVAL; } mutex_unlock(&dai_data->dai_lock); return rc; }
static int msm_dai_q6_auxpcm_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); int rc = 0; pr_debug("%s:port:%d cmd:%d dai_data->status_mask = %ld", __func__, dai->id, cmd, *dai_data->status_mask); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: /* afe_open will be called from prepare */ return 0; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { clk_disable(pcm_clk); afe_port_stop_nowait(dai->id); clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); afe_port_stop_nowait(PCM_TX); } break; default: rc = -EINVAL; } return rc; }
static int msm_dai_q6_mi2s_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = dev_get_drvdata(dai->dev); struct msm_dai_q6_dai_data *dai_data = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? &mi2s_dai_data->rx_dai : &mi2s_dai_data->tx_dai); u16 port_id = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? MI2S_RX : MI2S_TX); int rc = 0; dev_dbg(dai->dev, "%s: cmd:%d dai_data->status_mask = %ld", __func__, cmd, *dai_data->status_mask); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { afe_port_start_nowait(port_id, &dai_data->port_config, dai_data->rate); set_bit(STATUS_PORT_STARTED, dai_data->status_mask); } break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { afe_port_stop_nowait(port_id); clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); } break; default: rc = -EINVAL; } return rc; }
static int msm_dai_q6_hdmi_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); /* Start/stop port without waiting for Q6 AFE response. Need to have * native q6 AFE driver propagates AFE response in order to handle * port start/stop command error properly if error does arise. */ pr_debug("%s:port:%d cmd:%d dai_data->status_mask = %ld", __func__, dai->id, cmd, *dai_data->status_mask); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { afe_port_start_nowait(dai->id, &dai_data->port_config, dai_data->rate); set_bit(STATUS_PORT_STARTED, dai_data->status_mask); } break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { afe_port_stop_nowait(dai->id); clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); } break; default: dev_err(dai->dev, "invalid Trigger command = %d\n", cmd); return -EINVAL; } return 0; }