162306a36Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1+
262306a36Sopenharmony_ci// Copyright (C) 2022, Linaro Ltd - Daniel Lezcano <daniel.lezcano@linaro.org>
362306a36Sopenharmony_ci#include <stdio.h>
462306a36Sopenharmony_ci#include <sys/time.h>
562306a36Sopenharmony_ci#include <linux/sysinfo.h>
662306a36Sopenharmony_ci#include "thermal-tools.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistatic unsigned long __offset;
962306a36Sopenharmony_cistatic struct timeval __tv;
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciint uptimeofday_init(void)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	struct sysinfo info;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	if (sysinfo(&info))
1662306a36Sopenharmony_ci		return -1;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	gettimeofday(&__tv, NULL);
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	__offset = __tv.tv_sec - info.uptime;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	return 0;
2362306a36Sopenharmony_ci}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ciunsigned long getuptimeofday_ms(void)
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	gettimeofday(&__tv, NULL);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	return ((__tv.tv_sec - __offset) * 1000) + (__tv.tv_usec / 1000);
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistruct timespec msec_to_timespec(int msec)
3362306a36Sopenharmony_ci{
3462306a36Sopenharmony_ci	struct timespec tv = {
3562306a36Sopenharmony_ci		.tv_sec = (msec / 1000),
3662306a36Sopenharmony_ci		.tv_nsec = (msec % 1000) * 1000000,
3762306a36Sopenharmony_ci	};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	return tv;
4062306a36Sopenharmony_ci}
41