|
@@ -137,6 +137,80 @@ static void skl_set_suspend_active(struct snd_pcm_substream *substream,
|
|
|
skl->supend_active--;
|
|
|
}
|
|
|
|
|
|
+int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params)
|
|
|
+{
|
|
|
+ struct hdac_ext_bus *ebus = dev_get_drvdata(dev);
|
|
|
+ struct hdac_bus *bus = ebus_to_hbus(ebus);
|
|
|
+ unsigned int format_val;
|
|
|
+ struct hdac_stream *hstream;
|
|
|
+ struct hdac_ext_stream *stream;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ hstream = snd_hdac_get_stream(bus, params->stream,
|
|
|
+ params->host_dma_id + 1);
|
|
|
+ if (!hstream)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ stream = stream_to_hdac_ext_stream(hstream);
|
|
|
+ snd_hdac_ext_stream_decouple(ebus, stream, true);
|
|
|
+
|
|
|
+ format_val = snd_hdac_calc_stream_format(params->s_freq,
|
|
|
+ params->ch, params->format, 32, 0);
|
|
|
+
|
|
|
+ dev_dbg(dev, "format_val=%d, rate=%d, ch=%d, format=%d\n",
|
|
|
+ format_val, params->s_freq, params->ch, params->format);
|
|
|
+
|
|
|
+ snd_hdac_stream_reset(hdac_stream(stream));
|
|
|
+ err = snd_hdac_stream_set_params(hdac_stream(stream), format_val);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ err = snd_hdac_stream_setup(hdac_stream(stream));
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ hdac_stream(stream)->prepared = 1;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
|
|
|
+{
|
|
|
+ struct hdac_ext_bus *ebus = dev_get_drvdata(dev);
|
|
|
+ struct hdac_bus *bus = ebus_to_hbus(ebus);
|
|
|
+ unsigned int format_val;
|
|
|
+ struct hdac_stream *hstream;
|
|
|
+ struct hdac_ext_stream *stream;
|
|
|
+ struct hdac_ext_link *link;
|
|
|
+
|
|
|
+ hstream = snd_hdac_get_stream(bus, params->stream,
|
|
|
+ params->link_dma_id + 1);
|
|
|
+ if (!hstream)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ stream = stream_to_hdac_ext_stream(hstream);
|
|
|
+ snd_hdac_ext_stream_decouple(ebus, stream, true);
|
|
|
+ format_val = snd_hdac_calc_stream_format(params->s_freq,
|
|
|
+ params->ch, params->format, 24, 0);
|
|
|
+
|
|
|
+ dev_dbg(dev, "format_val=%d, rate=%d, ch=%d, format=%d\n",
|
|
|
+ format_val, params->s_freq, params->ch, params->format);
|
|
|
+
|
|
|
+ snd_hdac_ext_link_stream_reset(stream);
|
|
|
+
|
|
|
+ snd_hdac_ext_link_stream_setup(stream, format_val);
|
|
|
+
|
|
|
+ list_for_each_entry(link, &ebus->hlink_list, list) {
|
|
|
+ if (link->index == params->link_index)
|
|
|
+ snd_hdac_ext_link_set_stream_id(link,
|
|
|
+ hstream->stream_tag);
|
|
|
+ }
|
|
|
+
|
|
|
+ stream->link_prepared = 1;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int skl_pcm_open(struct snd_pcm_substream *substream,
|
|
|
struct snd_soc_dai *dai)
|
|
|
{
|