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:
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user