blob: e2766135379b5d689484da2f28afa60aed64d0f3 [file] [log] [blame]
/*
* Copyright (C) 2015 Broadcom Corporation
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
*
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
* kind, whether express or implied; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __SOC_BROADCOM_CYGNUS_REG_UTILS__
#define __SOC_BROADCOM_CYGNUS_REG_UTILS__
/* ---- Include Files ---------------------------------------------------- */
#include <stdint.h>
/* ---- Public Constants and Types --------------------------------------- */
#define __REG32(x) (*((volatile uint32_t *)(x)))
#define __REG16(x) (*((volatile uint16_t *)(x)))
#define __REG8(x) (*((volatile uint8_t *) (x)))
/* ---- Public Variable Externs ------------------------------------------ */
/* ---- Public Function Prototypes --------------------------------------- */
/****************************************************************************/
/*
* 32-bit register access functions
*/
/****************************************************************************/
extern uint32_t reg_debug;
#define REG_DEBUG(val) (reg_debug = val)
static inline void
reg32_clear_bits(volatile uint32_t *reg, uint32_t value)
{
#ifdef DEBUG_REG
if (reg_debug)
printf("%s reg (0x%x): 0x%x 0x%x\n", __FUNCTION__, (uint32_t)reg, *reg, (*reg & ~(value)));
#endif
*reg &= ~(value);
}
static inline void
reg32_set_bits(volatile uint32_t *reg, uint32_t value)
{
#ifdef DEBUG_REG
if (reg_debug)
printf("%s reg (0x%x): 0x%x 0x%x\n", __FUNCTION__, (uint32_t)reg, *reg, (*reg | value));
#endif
*reg |= value;
}
static inline void
reg32_toggle_bits(volatile uint32_t *reg, uint32_t value)
{
#ifdef DEBUG_REG
if (reg_debug)
printf("%s reg (0x%x): 0x%x 0x%x\n", __FUNCTION__, (uint32_t)reg, *reg, (*reg ^ value));
#endif
*reg ^= value;
}
static inline void
reg32_write_masked(volatile uint32_t *reg, uint32_t mask, uint32_t value)
{
#ifdef DEBUG_REG
if (reg_debug)
printf("%s reg (0x%x): 0x%x 0x%x\n", __FUNCTION__, (uint32_t)reg, *reg, (*reg & (~mask)) | (value & mask));
#endif
*reg = (*reg & (~mask)) | (value & mask);
}
static inline void reg32_write(volatile uint32_t *reg, uint32_t value)
{
#ifdef DEBUG_REG
if (reg_debug)
printf("%s reg (0x%x, 0x%x)\n", __FUNCTION__, (uint32_t)reg, value);
#endif
*reg = value;
}
static inline uint32_t
reg32_read(volatile uint32_t *reg)
{
#ifdef DEBUG_REG
if (reg_debug)
printf("%s reg (0x%x): 0x%x\n", __FUNCTION__, (uint32_t)reg, *reg);
#endif
return *reg;
}
/****************************************************************************/
/*
* 16-bit register access functions
*/
/****************************************************************************/
static inline void
reg16_clear_bits(volatile uint16_t *reg, uint16_t value)
{
*reg &= ~(value);
}
static inline void
reg16_set_bits(volatile uint16_t *reg, uint16_t value)
{
*reg |= value;
}
static inline void
reg16_toggle_bits(volatile uint16_t *reg, uint16_t value)
{
*reg ^= value;
}
static inline void
reg16_write_masked(volatile uint16_t *reg, uint16_t mask, uint16_t value)
{
*reg = (*reg & (~mask)) | (value & mask);
}
static inline void
reg16_write(volatile uint16_t *reg, uint16_t value)
{
*reg = value;
}
static inline uint16_t
reg16_read(volatile uint16_t *reg)
{
return *reg;
}
/****************************************************************************/
/*
* 8-bit register access functions
*/
/****************************************************************************/
static inline void
reg8_clear_bits(volatile uint8_t *reg, uint8_t value)
{
*reg &= ~(value);
}
static inline void
reg8_set_bits(volatile uint8_t *reg, uint8_t value)
{
*reg |= value;
}
static inline void
reg8_toggle_bits(volatile uint8_t *reg, uint8_t value)
{
*reg ^= value;
}
static inline void
reg8_write_masked(volatile uint8_t *reg, uint8_t mask, uint8_t value)
{
*reg = (*reg & (~mask)) | (value & mask);
}
static inline void
reg8_write(volatile uint8_t *reg, uint8_t value)
{
*reg = value;
}
static inline uint8_t
reg8_read(volatile uint8_t *reg)
{
return *reg;
}
#endif /* __SOC_BROADCOM_CYGNUS_REG_UTILS__ */