115 lines
3.7 KiB
C
115 lines
3.7 KiB
C
/*****************************************************************************
|
|
* Copyright 2003 - 2008 Broadcom Corporation. All rights reserved.
|
|
*
|
|
* Unless you and Broadcom execute a separate written software license
|
|
* agreement governing use of this software, this software is licensed to you
|
|
* under the terms of the GNU General Public License version 2, available at
|
|
* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
|
|
*
|
|
* Notwithstanding the above, under no circumstances may you combine this
|
|
* software in any way with any other Broadcom software provided under a
|
|
* license other than the GPL, without Broadcom's express prior written
|
|
* consent.
|
|
*****************************************************************************/
|
|
|
|
/****************************************************************************/
|
|
/**
|
|
* @file reg.h
|
|
*
|
|
* @brief Generic register defintions used in CSP
|
|
*/
|
|
/****************************************************************************/
|
|
|
|
#ifndef CSP_REG_H
|
|
#define CSP_REG_H
|
|
|
|
/* ---- Include Files ---------------------------------------------------- */
|
|
|
|
#include <csp/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)))
|
|
|
|
/* Macros used to define a sequence of reserved registers. The start / end */
|
|
/* are byte offsets in the particular register definition, with the "end" */
|
|
/* being the offset of the next un-reserved register. E.g. if offsets */
|
|
/* 0x10 through to 0x1f are reserved, then this reserved area could be */
|
|
/* specified as follows. */
|
|
/* typedef struct */
|
|
/* { */
|
|
/* uint32_t reg1; offset 0x00 */
|
|
/* uint32_t reg2; offset 0x04 */
|
|
/* uint32_t reg3; offset 0x08 */
|
|
/* uint32_t reg4; offset 0x0c */
|
|
/* REG32_RSVD(0x10, 0x20); */
|
|
/* uint32_t reg5; offset 0x20 */
|
|
/* ... */
|
|
/* } EXAMPLE_REG_t; */
|
|
#define REG8_RSVD(start, end) uint8_t rsvd_##start[(end - start) / sizeof(uint8_t)]
|
|
#define REG16_RSVD(start, end) uint16_t rsvd_##start[(end - start) / sizeof(uint16_t)]
|
|
#define REG32_RSVD(start, end) uint32_t rsvd_##start[(end - start) / sizeof(uint32_t)]
|
|
|
|
/* ---- Public Variable Externs ------------------------------------------ */
|
|
/* ---- Public Function Prototypes --------------------------------------- */
|
|
|
|
/* Note: When protecting multiple statements, the REG_LOCAL_IRQ_SAVE and */
|
|
/* REG_LOCAL_IRQ_RESTORE must be enclosed in { } to allow the */
|
|
/* flags variable to be declared locally. */
|
|
/* e.g. */
|
|
/* statement1; */
|
|
/* { */
|
|
/* REG_LOCAL_IRQ_SAVE; */
|
|
/* <multiple statements here> */
|
|
/* REG_LOCAL_IRQ_RESTORE; */
|
|
/* } */
|
|
/* statement2; */
|
|
/* */
|
|
|
|
#if defined(__KERNEL__) && !defined(STANDALONE)
|
|
#include <mach/hardware.h>
|
|
#include <linux/interrupt.h>
|
|
|
|
#define REG_LOCAL_IRQ_SAVE HW_DECLARE_SPINLOCK(reg32) \
|
|
unsigned long flags; HW_IRQ_SAVE(reg32, flags)
|
|
|
|
#define REG_LOCAL_IRQ_RESTORE HW_IRQ_RESTORE(reg32, flags)
|
|
|
|
#else
|
|
|
|
#define REG_LOCAL_IRQ_SAVE
|
|
#define REG_LOCAL_IRQ_RESTORE
|
|
|
|
#endif
|
|
|
|
static inline void reg32_modify_and(volatile uint32_t *reg, uint32_t value)
|
|
{
|
|
REG_LOCAL_IRQ_SAVE;
|
|
*reg &= value;
|
|
REG_LOCAL_IRQ_RESTORE;
|
|
}
|
|
|
|
static inline void reg32_modify_or(volatile uint32_t *reg, uint32_t value)
|
|
{
|
|
REG_LOCAL_IRQ_SAVE;
|
|
*reg |= value;
|
|
REG_LOCAL_IRQ_RESTORE;
|
|
}
|
|
|
|
static inline void reg32_modify_mask(volatile uint32_t *reg, uint32_t mask,
|
|
uint32_t value)
|
|
{
|
|
REG_LOCAL_IRQ_SAVE;
|
|
*reg = (*reg & mask) | value;
|
|
REG_LOCAL_IRQ_RESTORE;
|
|
}
|
|
|
|
static inline void reg32_write(volatile uint32_t *reg, uint32_t value)
|
|
{
|
|
*reg = value;
|
|
}
|
|
|
|
#endif /* CSP_REG_H */
|