提交 9e94df3a 编写于 作者: P Pierre-Louis Bossart 提交者: Takashi Iwai

ALSA: hda: replace .wallclock by .get_time_info

No real functional change, only take wall clock and system time
in same routine and add accuracy report.
Signed-off-by: NPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 3179f620
...@@ -732,17 +732,32 @@ static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream) ...@@ -732,17 +732,32 @@ static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
azx_get_position(chip, azx_dev)); azx_get_position(chip, azx_dev));
} }
static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream, static int azx_get_time_info(struct snd_pcm_substream *substream,
struct timespec *ts) struct timespec *system_ts, struct timespec *audio_ts,
struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
struct snd_pcm_audio_tstamp_report *audio_tstamp_report)
{ {
struct azx_dev *azx_dev = get_azx_dev(substream); struct azx_dev *azx_dev = get_azx_dev(substream);
u64 nsec; u64 nsec;
nsec = timecounter_read(&azx_dev->azx_tc); if ((substream->runtime->hw.info & SNDRV_PCM_INFO_HAS_LINK_ATIME) &&
nsec = div_u64(nsec, 3); /* can be optimized */ (audio_tstamp_config->type_requested == SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK)) {
nsec = azx_adjust_codec_delay(substream, nsec);
*ts = ns_to_timespec(nsec); snd_pcm_gettime(substream->runtime, system_ts);
nsec = timecounter_read(&azx_dev->azx_tc);
nsec = div_u64(nsec, 3); /* can be optimized */
if (audio_tstamp_config->report_delay)
nsec = azx_adjust_codec_delay(substream, nsec);
*audio_ts = ns_to_timespec(nsec);
audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK;
audio_tstamp_report->accuracy_report = 1; /* rest of structure is valid */
audio_tstamp_report->accuracy = 42; /* 24 MHz WallClock == 42ns resolution */
} else
audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT;
return 0; return 0;
} }
...@@ -756,7 +771,8 @@ static struct snd_pcm_hardware azx_pcm_hw = { ...@@ -756,7 +771,8 @@ static struct snd_pcm_hardware azx_pcm_hw = {
/* SNDRV_PCM_INFO_RESUME |*/ /* SNDRV_PCM_INFO_RESUME |*/
SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_PAUSE |
SNDRV_PCM_INFO_SYNC_START | SNDRV_PCM_INFO_SYNC_START |
SNDRV_PCM_INFO_HAS_WALL_CLOCK | SNDRV_PCM_INFO_HAS_WALL_CLOCK | /* legacy */
SNDRV_PCM_INFO_HAS_LINK_ATIME |
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP), SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
.formats = SNDRV_PCM_FMTBIT_S16_LE, .formats = SNDRV_PCM_FMTBIT_S16_LE,
.rates = SNDRV_PCM_RATE_48000, .rates = SNDRV_PCM_RATE_48000,
...@@ -842,10 +858,12 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) ...@@ -842,10 +858,12 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
return -EINVAL; return -EINVAL;
} }
/* disable WALLCLOCK timestamps for capture streams /* disable LINK_ATIME timestamps for capture streams
until we figure out how to handle digital inputs */ until we figure out how to handle digital inputs */
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK; runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK; /* legacy */
runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_LINK_ATIME;
}
spin_lock_irqsave(&chip->reg_lock, flags); spin_lock_irqsave(&chip->reg_lock, flags);
azx_dev->substream = substream; azx_dev->substream = substream;
...@@ -877,7 +895,7 @@ static struct snd_pcm_ops azx_pcm_ops = { ...@@ -877,7 +895,7 @@ static struct snd_pcm_ops azx_pcm_ops = {
.prepare = azx_pcm_prepare, .prepare = azx_pcm_prepare,
.trigger = azx_pcm_trigger, .trigger = azx_pcm_trigger,
.pointer = azx_pcm_pointer, .pointer = azx_pcm_pointer,
.wall_clock = azx_get_wallclock_tstamp, .get_time_info = azx_get_time_info,
.mmap = azx_pcm_mmap, .mmap = azx_pcm_mmap,
.page = snd_pcm_sgbuf_ops_page, .page = snd_pcm_sgbuf_ops_page,
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册