blob: 7c1ca1b78ab80cbc520db1b7d13c3c2f0c5bceef [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
#include <linux/delay.h>
#include <linux/ktime.h>
#include <linux/timekeeping.h>
#include "proslic_sys.h"
/*****************************************************************************************************/
static int proslic_sys_delay(void *hTimer, int timeInMsec)
{
if(likely(timeInMsec < SILABS_MIN_MSLEEP_TIME))
{
mdelay(timeInMsec);
}
else
{
msleep((timeInMsec-SILABS_MSLEEP_SLOP));
}
return PROSLIC_SPI_OK;
}
/*****************************************************************************************************/
/* Code assumes time value has been allocated */
static int proslic_sys_getTime(void *hTimer, void *time)
{
if(time != NULL)
{
ktime_get_coarse_real_ts64(&((proslic_timeStamp *)time)->timerObj);
return PROSLIC_SPI_OK;
}
else
{
return PROSLIC_TIMER_ERROR;
}
}
/*****************************************************************************************************/
static int proslic_sys_timeElapsed(void *hTimer, void *startTime, int *timeInMsec)
{
if( (startTime != NULL) && (timeInMsec != NULL) )
{
struct timespec64 now;
struct timespec64 ts_delta;
ktime_get_coarse_real_ts64(&now);
ts_delta = timespec64_sub(now, (((proslic_timeStamp *) startTime)->timerObj));
*timeInMsec = (int)( (ts_delta.tv_sec *1000) + (ts_delta.tv_nsec / NSEC_PER_MSEC) );
return PROSLIC_SPI_OK;
}
else
{
return PROSLIC_TIMER_ERROR;
}
}
proslic_timer_fptrs_t proslic_timer_if =
{
proslic_sys_delay,
proslic_sys_timeElapsed,
proslic_sys_getTime
};