/* SPDX-License-Identifier: GPL-2.0 */
/**
Support for Intel Camera Imaging ISP subsystem.
Copyright (c) 2010 - 2015, Intel Corporation.

This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.

This program is distributed in the hope it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
more details.
*/

#ifndef __IA_CSS_TIMER_H
#define __IA_CSS_TIMER_H

/* @file
 * Timer interface definitions
 */
#include <type_support.h>		/* for uint32_t */
#include "ia_css_err.h"

/* @brief timer reading definition */
typedef u32 clock_value_t;

/* @brief 32 bit clock tick,(timestamp based on timer-value of CSS-internal timer)*/
struct ia_css_clock_tick {
	clock_value_t ticks; /** measured time in ticks.*/
};

/* @brief TIMER event codes */
enum ia_css_tm_event {
	IA_CSS_TM_EVENT_AFTER_INIT,
	/** Timer Event after Initialization */
	IA_CSS_TM_EVENT_MAIN_END,
	/** Timer Event after end of Main */
	IA_CSS_TM_EVENT_THREAD_START,
	/** Timer Event after thread start */
	IA_CSS_TM_EVENT_FRAME_PROC_START,
	/** Timer Event after Frame Process Start */
	IA_CSS_TM_EVENT_FRAME_PROC_END
	/** Timer Event after Frame Process End */
};

/* @brief code measurement common struct */
struct ia_css_time_meas {
	clock_value_t	start_timer_value;	/** measured time in ticks */
	clock_value_t	end_timer_value;	/** measured time in ticks */
};

/**@brief SIZE_OF_IA_CSS_CLOCK_TICK_STRUCT checks to ensure correct alignment for struct ia_css_clock_tick. */
#define SIZE_OF_IA_CSS_CLOCK_TICK_STRUCT sizeof(clock_value_t)
/* @brief checks to ensure correct alignment for ia_css_time_meas. */
#define SIZE_OF_IA_CSS_TIME_MEAS_STRUCT (sizeof(clock_value_t) \
					+ sizeof(clock_value_t))

/* @brief API to fetch timer count directly
*
* @param curr_ts [out] measured count value
* @return 0 if success
*
*/
int
ia_css_timer_get_current_tick(
    struct ia_css_clock_tick *curr_ts);

#endif  /* __IA_CSS_TIMER_H */