static int sst_media_open(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { int ret_val = 0; struct snd_pcm_runtime *runtime = substream->runtime; struct sst_runtime_stream *stream; stream = kzalloc(sizeof(*stream), GFP_KERNEL); if (!stream) return -ENOMEM; spin_lock_init(&stream->status_lock); /* get the sst ops */ mutex_lock(&sst_dsp_lock); if (!sst_dsp || !try_module_get(sst_dsp->dev->driver->owner)) { pr_err("no device available to run\n"); ret_val = -ENODEV; goto out_ops; } stream->ops = sst_dsp->ops; mutex_unlock(&sst_dsp_lock); stream->stream_info.str_id = 0; sst_set_stream_status(stream, SST_PLATFORM_UNINIT); stream->stream_info.mad_substream = substream; runtime->private_data = stream; if (strstr(dai->name, "Power-cpu-dai")) return power_up_sst(stream); /* Make sure, that the period size is always even */ snd_pcm_hw_constraint_step(substream->runtime, 0, SNDRV_PCM_HW_PARAM_PERIODS, 2); pr_debug("buf_ptr %llu\n", stream->stream_info.buffer_ptr); return snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); out_ops: kfree(stream); mutex_unlock(&sst_dsp_lock); return ret_val; }
static int sst_media_open(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { int ret_val = 0; struct snd_pcm_runtime *runtime = substream->runtime; struct sst_runtime_stream *stream; stream = kzalloc(sizeof(*stream), GFP_KERNEL); if (!stream) return -ENOMEM; spin_lock_init(&stream->status_lock); /* get the sst ops */ mutex_lock(&sst_lock); if (!sst || !try_module_get(sst->dev->driver->owner)) { dev_err(dai->dev, "no device available to run\n"); ret_val = -ENODEV; goto out_ops; } stream->ops = sst->ops; mutex_unlock(&sst_lock); stream->stream_info.str_id = 0; stream->stream_info.arg = substream; /* allocate memory for SST API set */ runtime->private_data = stream; ret_val = power_up_sst(stream); if (ret_val < 0) return ret_val; /* Make sure, that the period size is always even */ snd_pcm_hw_constraint_step(substream->runtime, 0, SNDRV_PCM_HW_PARAM_PERIODS, 2); return snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); out_ops: kfree(stream); mutex_unlock(&sst_lock); return ret_val; }