Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9e94df3a authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Takashi Iwai
Browse files

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: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3179f620
Loading
Loading
Loading
Loading
+29 −11
Original line number Original line Diff line number Diff line
@@ -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;


	if ((substream->runtime->hw.info & SNDRV_PCM_INFO_HAS_LINK_ATIME) &&
		(audio_tstamp_config->type_requested == SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK)) {

		snd_pcm_gettime(substream->runtime, system_ts);

		nsec = timecounter_read(&azx_dev->azx_tc);
		nsec = timecounter_read(&azx_dev->azx_tc);
		nsec = div_u64(nsec, 3); /* can be optimized */
		nsec = div_u64(nsec, 3); /* can be optimized */
		if (audio_tstamp_config->report_delay)
			nsec = azx_adjust_codec_delay(substream, nsec);
			nsec = azx_adjust_codec_delay(substream, nsec);


	*ts = ns_to_timespec(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 = {
				 /* 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)
		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 = {
	.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,
};
};