/*
 * Copyright (c) 2010-2014, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *  * Neither the name of The Linux Foundation nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef __TIME_GENOFF_H__
#define __TIME_GENOFF_H__

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Time genoff base -- To be used by the time setter
 * Reserved bases to be supported later.
 */
typedef enum time_bases {
	ATS_RTC = 0,
	ATS_TOD,
	ATS_USER,
	ATS_SECURE,
	ATS_DRM,
	ATS_RESERVED_2,
	ATS_RESERVED_3,
	ATS_GPS,
	ATS_1X,
	ATS_RESERVED_4,
	ATS_WCDMA,
	ATS_SNTP,
	ATS_UTC,
	ATS_MODEM,
	ATS_MFLO,
	ATS_INVALID
} time_bases_type;

/* Time unit -- Unit in which time is set/get */
typedef enum time_unit {
	TIME_STAMP,		/* Not supported */
	TIME_MSEC,
	TIME_SECS,
	TIME_JULIAN,
	TIME_20MS_FRAME,	/* Not supported */
	TIME_INVALID
} time_unit_type;

/* Operation to be done */
typedef enum time_genoff_opr {
	T_SET,
	T_GET,
	T_IS_SET,
	T_DISABLE,
	T_ENABLE,
	T_MAX
} time_genoff_opr_type;

/* Structure to be passed as argument to time_genoff_operation() */
/*
 * In set/get: ts_val should be assigned memory and then passed.
 * if time_unit = TIME_MSEC, TIME_SECS then ts_val = (uint64_t *)
 * if time_unit = TIME_JULIAN then ts_val = (struct tm *)
 */
typedef struct time_genoff_info {
	time_bases_type base;		/* Genoff in consideration */
	void *ts_val;			/* Time to be set/get */
	time_unit_type unit;		/* Time unit */
	time_genoff_opr_type operation; /* Time operation to be done */
}time_genoff_info_type;

/* API to be called for time get/set operation */
int time_genoff_operation(time_genoff_info_type *pargs);

/* API to be called for logging operations */
int time_control_operations(time_genoff_info_type *pargs);

#ifdef __cplusplus
}
#endif

#endif /* __TIME_GENOFF_H__ */
