/*
 * Copyright (C) 2010-2014, 2016 ARM Limited. All rights reserved.
 * 
 * This program is free software and is provided to you under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
 * 
 * A copy of the licence is included with the program, and can also be obtained from Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

/**
 * @file mali_osk_timers.c
 * Implementation of the OS abstraction layer for the kernel device driver
 */

#include <linux/timer.h>
#include <linux/slab.h>
#include "mali_osk.h"
#include "mali_kernel_common.h"

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
typedef void (*timer_timeout_function_t)(struct timer_list *);
#else
typedef void (*timer_timeout_function_t)(unsigned long);
#endif

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
_mali_osk_timer_t *_mali_osk_timer_init(_mali_osk_timer_callback_t callback)
#else
_mali_osk_timer_t *_mali_osk_timer_init(void)
#endif
{
	_mali_osk_timer_t *t = (_mali_osk_timer_t *)kmalloc(sizeof(_mali_osk_timer_t), GFP_KERNEL);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
	if (NULL != t) timer_setup(&t->timer, (timer_timeout_function_t)callback, 0);
	t->data = (unsigned long)0;
#else
	if (NULL != t) init_timer(&t->timer);
#endif
	return t;
}

void _mali_osk_timer_add(_mali_osk_timer_t *tim, unsigned long ticks_to_expire)
{
	MALI_DEBUG_ASSERT_POINTER(tim);
	tim->timer.expires = jiffies + ticks_to_expire;
	add_timer(&(tim->timer));
}

void _mali_osk_timer_mod(_mali_osk_timer_t *tim, unsigned long ticks_to_expire)
{
	MALI_DEBUG_ASSERT_POINTER(tim);
	mod_timer(&(tim->timer), jiffies + ticks_to_expire);
}

void _mali_osk_timer_del(_mali_osk_timer_t *tim)
{
	MALI_DEBUG_ASSERT_POINTER(tim);
	del_timer_sync(&(tim->timer));
}

void _mali_osk_timer_del_async(_mali_osk_timer_t *tim)
{
	MALI_DEBUG_ASSERT_POINTER(tim);
	del_timer(&(tim->timer));
}

mali_bool _mali_osk_timer_pending(_mali_osk_timer_t *tim)
{
	MALI_DEBUG_ASSERT_POINTER(tim);
	return 1 == timer_pending(&(tim->timer));
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
void _mali_osk_timer_setcallback_data(_mali_osk_timer_t *tim,  void *data)
#else
void _mali_osk_timer_setcallback(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback, void *data)
#endif
{
	MALI_DEBUG_ASSERT_POINTER(tim);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
	tim->data = (unsigned long)data;
#else
	tim->timer.data = (unsigned long)data;
	tim->timer.function = (timer_timeout_function_t)callback;
#endif
}

void _mali_osk_timer_term(_mali_osk_timer_t *tim)
{
	MALI_DEBUG_ASSERT_POINTER(tim);
	kfree(tim);
}
