/*
 * Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

#ifndef	__GALOIS_IO_H__
#define	__GALOIS_IO_H__

#include <stdint.h>

#include "com_type.h"
#include "galois_common.h"

#define	__MEMIO_DIRECT


#define	CPU_PHY_MEM(x)					((MV_U32)(x))
#define	CPU_MEMIO_CACHED_ADDR(x)			((void*)(x))
#define	CPU_MEMIO_UNCACHED_ADDR(x)			((void*)(x))

/*!
 * CPU architecture dependent 32, 16, 8 bit read/write IO addresses
 */
#define	MV_MEMIO32_WRITE(addr, data)		((*((volatile uint32_t*)((uintmax_t)addr))) = ((uint32_t)(data)))
#define	MV_MEMIO32_READ(addr)				((*((volatile uint32_t*)((uintmax_t)addr))))
#define	MV_MEMIO16_WRITE(addr, data)		((*((volatile unsigned short*)((uintmax_t)addr))) = ((unsigned short)(data)))
#define	MV_MEMIO16_READ(addr)				((*((volatile unsigned short*)((uintmax_t)addr))))
#define	MV_MEMIO08_WRITE(addr, data)		((*((volatile unsigned char*)((uintmax_t)addr))) = ((unsigned char)(data)))
#define	MV_MEMIO08_READ(addr)				((*((volatile unsigned char*)((uintmax_t)addr))))


/*!
 * No Fast Swap implementation (in assembler) for ARM
 */
#define	MV_32BIT_LE_FAST(val)				MV_32BIT_LE(val)
#define	MV_16BIT_LE_FAST(val)				MV_16BIT_LE(val)
#define	MV_32BIT_BE_FAST(val)				MV_32BIT_BE(val)
#define	MV_16BIT_BE_FAST(val)				MV_16BIT_BE(val)

/*!
 * 32 and 16 bit read/write in big/little endian mode
 */

/*!
 * 16bit write in little endian mode
 */
#define	MV_MEMIO_LE16_WRITE(addr, data)		MV_MEMIO16_WRITE(addr, MV_16BIT_LE_FAST(data))

/*!
 * 16bit read in little endian mode
 */
#define	MV_MEMIO_LE16_READ(addr)			MV_16BIT_LE_FAST((MV_U16)(MV_MEMIO16_READ((MV_U32)(addr))))

/*!
 * 32bit write in little endian mode
 */
#define	MV_MEMIO_LE32_WRITE(addr, data)		MV_MEMIO32_WRITE(addr, MV_32BIT_LE_FAST(data))

/*!
 * 32bit read in little endian mode
 */
#define	MV_MEMIO_LE32_READ(addr)			MV_32BIT_LE_FAST((MV_U32)(MV_MEMIO32_READ((MV_U32)(addr))))

/*!
 * Generate 32bit mask
 */
#define	GA_REG_MASK(bits, l_shift)			((bits) ? (((bits) < 32) ? (((1uL << (bits)) - 1) << (l_shift)) : (0xFFFFFFFFuL << (l_shift))) : 0)

/*!
 * Galois's register address translate
 */

#	ifndef	INTER_REGS_BASE
#	define	INTER_REGS_BASE				0
#	endif

#	define	REG_ADDR(offset)			((MV_U32)(INTER_REGS_BASE | (offset)))

/*!
 * Galois controller register read/write macros
 *
 * offset -- address offset (32bits)
 * holder -- pointer to the variable that will be used to store the data being read in.
 * val -- variable contains the data that will be written out.
 * bitMask -- variable contains the data (32bits) that will be written out. 
 * clearMask -- variable contains the mask (32bits) that will be used to clear the corresponding bits. 
 *
 * GA_REG_WORD32_READ(offset, holder) -- Read a Double-Word (32bits) from 'offset' to 'holder'
 * GA_REG_WORD16_READ(offset, holder) -- Read a Word (16bits) from 'offset' to 'holder'
 * GA_REG_BYTE_READ(offset, holder) -- Read a Byte (8bits) from 'offset' to 'holder'
 *
 * GA_REG_WORD32_WRITE(offset, val) -- Write a Double-Word (32bits) to 'offset'
 * GA_REG_WORD16_WRITE(offset, val) -- Write a Word (16bits) to 'offset'
 * GA_REG_BYTE_WIRTE(offset, val) -- Write a Byte (8bits) to 'offset'
 *
 * GA_REG_WORD32_BIT_SET(offset, bitMask) -- Set bits to '1b' at 'offset', 'bitMask' should only be used to set '1b' for corresponding bits. 
 * GA_REG_WORD32_BITS_SET(offset, clearMask, val) -- Clear the bits to zero for the bits in clearMask are '1b' and write 'val' to 'offset'.
 * GA_REG_WORD32_BIT_CLEAR(offset, clearMask) -- Clear the bits to zero for the bits in bitMask are '1b'
 *
 */
#	define	GA_REG_WORD32_READ(offset, holder)	(*(holder) = MV_MEMIO_LE32_READ(REG_ADDR(offset)))
#	define	GA_REG_WORD16_READ(offset, holder)	(*(holder) = MV_MEMIO_LE16_READ(REG_ADDR(offset)))
#	define	GA_REG_BYTE_READ(offset, holder)	(*(holder) = MV_MEMIO08_READ(REG_ADDR(offset)))

#	define	GA_REG_WORD32_WRITE(offset, val)	(MV_MEMIO_LE32_WRITE(REG_ADDR(offset), (MV_U32)(val)))
#	define	GA_REG_WORD16_WRITE(offset, val)	(MV_MEMIO_LE16_WRITE(REG_ADDR(offset), (MV_U16)(val)))
#	define	GA_REG_BYTE_WRITE(offset, val)		(MV_MEMIO08_WRITE(REG_ADDR(offset), (MV_U8)(val)))

#	define	GA_REG_WORD32_BIT_SET(offset, bitMask)	(MV_MEMIO32_WRITE(REG_ADDR(offset),					\
							(MV_MEMIO_LE32_READ(REG_ADDR(offset)) | MV_32BIT_LE_FAST(bitMask))))
#	define	GA_REG_WORD32_BITS_SET(offset, clearMask, val)									\
							(MV_MEMIO32_WRITE(REG_ADDR(offset),					\
							((MV_MEMIO_LE32_READ(REG_ADDR(offset)) & MV_32BIT_LE_FAST(~(clearMask)))\
							| MV_32BIT_LE_FAST(val))))
#	define	GA_REG_WORD32_BIT_CLEAR(offset, clearMask)									\
							(MV_MEMIO32_WRITE(REG_ADDR(offset),					\
							(MV_MEMIO_LE32_READ(REG_ADDR(offset)) & MV_32BIT_LE_FAST(~(clearMask)))))


#endif	/* __GALOIS_IO_H__ */
