/*
 * Copyright (c) 2019, The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/*********************************************************************************
 *
 * DESCRIPTION
 * - This is an extension of standard msmhwio.h to support relative addressing
 *   scheme used in SCALe auto-generated sequences.
 * - The objective of this new addressing scheme is enable the same C function
 *   definition to be applicable to multiple baseances of the same block. 
 * - Such code reuse is not feasible with the standard HWIO macros that use a
 *   absolute addressing scheme.
 * - Compared to the standard HWIO macros, the new macros defined here take an
 *   additional parameter 'baseance offset'.  So are the C functions generated
 *   by SCALe Autoseq from .seq inputs.
 * - As such, macros defined in this file must be used with 'seq_msmhwiobase.h',
 *   'seq_msmhwioreg.h', and the C codes generated from SCALe Autoseq.
 * - Macros defined in this file leverage the lower-level macros from the
 *   standard 'msmhwio.h', and the two sets of macros are compatible.
 *
 ********************************************************************************/

#ifndef __SEQ_H__
#define __SEQ_H__

#include "HALhwio.h"



/**** Register Ref Read ****/
#define SEQ_INH(base, regtype, reg) \
        SEQ_##regtype##_INH(base, reg)

/**** Masked Register Read ****/
#define SEQ_INMH(base, regtype, reg, mask) \
        SEQ_##regtype##_INMH(base, reg, mask)


/**** Ref Reg Field Read ****/
#define SEQ_INFH(base, regtype, reg, fld) \
        (SEQ_##regtype##_INMH(base, reg, HWIO_FMSK(regtype, fld)) >> HWIO_SHFT(regtype, fld))


/**** Ref Register  Write ****/
#define SEQ_OUTH(base, regtype, reg, val) \
        SEQ_##regtype##_OUTH(base, reg, val)

/**** Ref Register Masked Write ****/
#define SEQ_OUTMH(base, regtype, reg, mask, val) \
        SEQ_##regtype##_OUTMH(base, reg, mask, val)


/**** Ref Register Field Write ****/
#define SEQ_OUTFH(base, regtype, reg, fld, val) \
        SEQ_##regtype##_OUTMH(base, reg, HWIO_FMSK(regtype, fld), val << HWIO_SHFT(regtype, fld))


/**** seq_msg() ****

typedef enum {
	DEBUG,
	INFO,
	WARNING,
	ERROR,
	FATAL
} SeverityLevel ;

void seq_msg(SeverityLevel severity, unsigned int msg_id, const char *format_str, ... );

*/

/************ seq_wait() ************/

typedef enum {
    SEC,
    MS,
    US,
    NS
} SEQ_TimeUnit;

void seq_wait(uint32_t time_value, SEQ_TimeUnit time_unit);


/************ seq_poll() ************/
uint32_t seq_poll(uint32_t reg_offset, uint32_t expect_value, uint32_t value_mask, uint32_t value_shift, uint32_t max_poll_cnt);

#endif /* __SEQ_H__ */



















