blob: 16983fab17d6231eea300bb3f3415b995bb984c9 [file] [log] [blame]
/*
* 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__ */