|
@@ -1026,51 +1026,11 @@ static int skl_platform_pcm_trigger(struct snd_pcm_substream *substream,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-/* calculate runtime delay from LPIB */
|
|
|
|
-static int skl_get_delay_from_lpib(struct hdac_ext_bus *ebus,
|
|
|
|
- struct hdac_ext_stream *sstream,
|
|
|
|
- unsigned int pos)
|
|
|
|
-{
|
|
|
|
- struct hdac_bus *bus = ebus_to_hbus(ebus);
|
|
|
|
- struct hdac_stream *hstream = hdac_stream(sstream);
|
|
|
|
- struct snd_pcm_substream *substream = hstream->substream;
|
|
|
|
- int stream = substream->stream;
|
|
|
|
- unsigned int lpib_pos = snd_hdac_stream_get_pos_lpib(hstream);
|
|
|
|
- int delay;
|
|
|
|
-
|
|
|
|
- if (stream == SNDRV_PCM_STREAM_PLAYBACK)
|
|
|
|
- delay = pos - lpib_pos;
|
|
|
|
- else
|
|
|
|
- delay = lpib_pos - pos;
|
|
|
|
-
|
|
|
|
- if (delay < 0) {
|
|
|
|
- if (delay >= hstream->delay_negative_threshold)
|
|
|
|
- delay = 0;
|
|
|
|
- else
|
|
|
|
- delay += hstream->bufsize;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (hstream->bufsize == delay)
|
|
|
|
- delay = 0;
|
|
|
|
-
|
|
|
|
- if (delay >= hstream->period_bytes) {
|
|
|
|
- dev_info(bus->dev,
|
|
|
|
- "Unstable LPIB (%d >= %d); disabling LPIB delay counting\n",
|
|
|
|
- delay, hstream->period_bytes);
|
|
|
|
- delay = 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return bytes_to_frames(substream->runtime, delay);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static unsigned int skl_get_position(struct hdac_ext_stream *hstream,
|
|
|
|
- int codec_delay)
|
|
|
|
|
|
+static snd_pcm_uframes_t skl_platform_pcm_pointer
|
|
|
|
+ (struct snd_pcm_substream *substream)
|
|
{
|
|
{
|
|
- struct hdac_stream *hstr = hdac_stream(hstream);
|
|
|
|
- struct snd_pcm_substream *substream = hstr->substream;
|
|
|
|
- struct hdac_ext_bus *ebus;
|
|
|
|
|
|
+ struct hdac_ext_stream *hstream = get_hdac_ext_stream(substream);
|
|
unsigned int pos;
|
|
unsigned int pos;
|
|
- int delay;
|
|
|
|
|
|
|
|
/* use the position buffer as default */
|
|
/* use the position buffer as default */
|
|
pos = snd_hdac_stream_get_pos_posbuf(hdac_stream(hstream));
|
|
pos = snd_hdac_stream_get_pos_posbuf(hdac_stream(hstream));
|
|
@@ -1078,23 +1038,7 @@ static unsigned int skl_get_position(struct hdac_ext_stream *hstream,
|
|
if (pos >= hdac_stream(hstream)->bufsize)
|
|
if (pos >= hdac_stream(hstream)->bufsize)
|
|
pos = 0;
|
|
pos = 0;
|
|
|
|
|
|
- if (substream->runtime) {
|
|
|
|
- ebus = get_bus_ctx(substream);
|
|
|
|
- delay = skl_get_delay_from_lpib(ebus, hstream, pos)
|
|
|
|
- + codec_delay;
|
|
|
|
- substream->runtime->delay += delay;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return pos;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static snd_pcm_uframes_t skl_platform_pcm_pointer
|
|
|
|
- (struct snd_pcm_substream *substream)
|
|
|
|
-{
|
|
|
|
- struct hdac_ext_stream *hstream = get_hdac_ext_stream(substream);
|
|
|
|
-
|
|
|
|
- return bytes_to_frames(substream->runtime,
|
|
|
|
- skl_get_position(hstream, 0));
|
|
|
|
|
|
+ return bytes_to_frames(substream->runtime, pos);
|
|
}
|
|
}
|
|
|
|
|
|
static u64 skl_adjust_codec_delay(struct snd_pcm_substream *substream,
|
|
static u64 skl_adjust_codec_delay(struct snd_pcm_substream *substream,
|