/*
 * 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_RESERVED_1,
	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__ */
