audio-kernel: add support to query presentation position from DSP

Add support to query presentation position from DSP
in system time domain.

Change-Id: I42b4d234ddc256f93c01defbe2c74872a2a2cf3e
Signed-off-by: Surendar Karka <skarka@codeaurora.org>
This commit is contained in:
Surendar Karka
2019-03-29 18:08:07 +05:30
parent ae8957e9b4
commit 38d66474e1
7 changed files with 258 additions and 26 deletions

View File

@@ -309,6 +309,61 @@ int avcs_core_query_timer(uint64_t *avtimer_tick)
}
EXPORT_SYMBOL(avcs_core_query_timer);
/*
* avcs_core_query_timer_offset:
* derive offset between system clock & avtimer clock
*
* @ avoffset: offset between system clock & avtimer clock
* @ clock_id: clock id to get the system time
*
*/
int avcs_core_query_timer_offset(int64_t *av_offset, int32_t clock_id)
{
uint32_t avtimer_msw = 0, avtimer_lsw = 0;
uint64_t avtimer_tick_temp, avtimer_tick, sys_time = 0;
struct timespec ts;
if ((avtimer.p_avtimer_lsw == NULL) ||
(avtimer.p_avtimer_msw == NULL)) {
return -EINVAL;
}
memset(&ts, 0, sizeof(struct timespec));
avtimer_lsw = ioread32(avtimer.p_avtimer_lsw);
avtimer_msw = ioread32(avtimer.p_avtimer_msw);
switch (clock_id) {
case CLOCK_MONOTONIC_RAW:
getrawmonotonic(&ts);
break;
case CLOCK_BOOTTIME:
get_monotonic_boottime(&ts);
break;
case CLOCK_MONOTONIC:
ktime_get_ts(&ts);
break;
case CLOCK_REALTIME:
ktime_get_real_ts(&ts);
break;
default:
pr_debug("%s: unsupported clock id %d\n", __func__, clock_id);
return -EINVAL;
}
sys_time = ts.tv_sec * 1000000LL + div64_u64(ts.tv_nsec, 1000);
avtimer_tick_temp = (uint64_t)((uint64_t)avtimer_msw << 32) |
avtimer_lsw;
avtimer_tick = mul_u64_u32_div(avtimer_tick_temp, avtimer.clk_mult,
avtimer.clk_div);
*av_offset = sys_time - avtimer_tick;
pr_debug("%s: sys_time: %llu, offset %lld, avtimer tick %lld\n",
__func__, sys_time, *av_offset, avtimer_tick);
return 0;
}
EXPORT_SYMBOL(avcs_core_query_timer_offset);
#if IS_ENABLED(CONFIG_AVTIMER_LEGACY)
static void avcs_set_isp_fptr(bool enable)
{