123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- /*
- * Freescale STMP37XX/STMP378X SoC register access interfaces
- *
- * The SoC registers may be accessed via:
- *
- * - single 32 bit address, or
- * - four 32 bit addresses - general purpose, set, clear and toggle bits
- *
- * Multiple IP blocks (e.g. SSP, UART) provide identical register sets per
- * each module
- *
- * Embedded Alley Solutions, Inc <source@embeddedalley.com>
- *
- * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright 2008 Embedded Alley Solutions, Inc All Rights Reserved.
- */
- /*
- * The code contained herein is licensed under the GNU General Public
- * License. You may obtain a copy of the GNU General Public License
- * Version 2 or later at the following locations:
- *
- * http://www.opensource.org/licenses/gpl-license.html
- * http://www.gnu.org/copyleft/gpl.html
- */
- #ifndef __ASM_PLAT_STMP3XXX_REGS_H
- #define __ASM_PLAT_STMP3XXX_REGS_H
- #ifndef __ASSEMBLER__
- #include <linux/io.h>
- #endif
- #include "platform.h"
- #define REGS_BASE STMP3XXX_REGS_BASE
- #define HW_STMP3xxx_SET 0x04
- #define HW_STMP3xxx_CLR 0x08
- #define HW_STMP3xxx_TOG 0x0c
- #ifndef __ASSEMBLER__
- #define HW_REGISTER_FUNCS(id, base, offset, regset, rd, wr) \
- static const u32 id##_OFFSET = offset; \
- static inline u32 id##_RD_NB(const void __iomem *regbase) { \
- if (!rd) \
- printk(KERN_ERR"%s: cannot READ at %p+%x\n", \
- #id, regbase, offset); \
- return __raw_readl(regbase + offset); \
- } \
- static inline void id##_WR_NB(void __iomem *regbase, u32 v) { \
- if (!wr) \
- printk(KERN_ERR"%s: cannot WRITE at %p+%x\n", \
- #id, regbase, offset); \
- __raw_writel(v, regbase + offset); \
- } \
- static inline void id##_SET_NB(void __iomem *regbase, u32 v) { \
- if (!wr) \
- printk(KERN_ERR"%s: cannot SET at %p+%x\n", \
- #id, regbase, offset); \
- if (regset) \
- __raw_writel(v, regbase + \
- offset + HW_STMP3xxx_SET); \
- else \
- __raw_writel(v | __raw_readl(regbase + offset), \
- regbase + offset); \
- } \
- static inline void id##_CLR_NB(void __iomem *regbase, u32 v) { \
- if (!wr) \
- printk(KERN_ERR"%s: cannot CLR at %p+%x\n", \
- #id, regbase, offset); \
- if (regset) \
- __raw_writel(v, regbase + \
- offset + HW_STMP3xxx_CLR); \
- else \
- __raw_writel( \
- ~v & __raw_readl(regbase + offset), \
- regbase + offset); \
- } \
- static inline void id##_TOG_NB(void __iomem *regbase, u32 v) { \
- if (!wr) \
- printk(KERN_ERR"%s: cannot TOG at %p+%x\n", \
- #id, regbase, offset); \
- if (regset) \
- __raw_writel(v, regbase + \
- offset + HW_STMP3xxx_TOG); \
- else \
- __raw_writel(v ^ __raw_readl(regbase + offset), \
- regbase + offset); \
- } \
- static inline u32 id##_RD(void) { return id##_RD_NB(base); } \
- static inline void id##_WR(u32 v) { id##_WR_NB(base, v); } \
- static inline void id##_SET(u32 v) { id##_SET_NB(base, v); } \
- static inline void id##_CLR(u32 v) { id##_CLR_NB(base, v); } \
- static inline void id##_TOG(u32 v) { id##_TOG_NB(base, v); }
- #define HW_REGISTER_FUNCS_INDEXED(id, base, offset, regset, rd, wr, step)\
- static inline u32 id##_OFFSET(int i) { \
- return offset + i * step; \
- } \
- static inline u32 id##_RD_NB(const void __iomem *regbase, int i) {\
- if (!rd) \
- printk(KERN_ERR"%s(%d): can't READ at %p+%x\n", \
- #id, i, regbase, offset + i * step); \
- return __raw_readl(regbase + offset + i * step); \
- } \
- static inline void id##_WR_NB(void __iomem *regbase, int i, u32 v) {\
- if (!wr) \
- printk(KERN_ERR"%s(%d): can't WRITE at %p+%x\n",\
- #id, i, regbase, offset + i * step); \
- __raw_writel(v, regbase + offset + i * step); \
- } \
- static inline void id##_SET_NB(void __iomem *regbase, int i, u32 v) {\
- if (!wr) \
- printk(KERN_ERR"%s(%d): can't SET at %p+%x\n", \
- #id, i, regbase, offset + i * step); \
- if (regset) \
- __raw_writel(v, regbase + offset + \
- i * step + HW_STMP3xxx_SET); \
- else \
- __raw_writel(v | __raw_readl(regbase + \
- offset + i * step), \
- regbase + offset + i * step); \
- } \
- static inline void id##_CLR_NB(void __iomem *regbase, int i, u32 v) {\
- if (!wr) \
- printk(KERN_ERR"%s(%d): cannot CLR at %p+%x\n", \
- #id, i, regbase, offset + i * step); \
- if (regset) \
- __raw_writel(v, regbase + offset + \
- i * step + HW_STMP3xxx_CLR); \
- else \
- __raw_writel(~v & __raw_readl(regbase + \
- offset + i * step), \
- regbase + offset + i * step); \
- } \
- static inline void id##_TOG_NB(void __iomem *regbase, int i, u32 v) {\
- if (!wr) \
- printk(KERN_ERR"%s(%d): cannot TOG at %p+%x\n", \
- #id, i, regbase, offset + i * step); \
- if (regset) \
- __raw_writel(v, regbase + offset + \
- i * step + HW_STMP3xxx_TOG); \
- else \
- __raw_writel(v ^ __raw_readl(regbase + offset \
- + i * step), \
- regbase + offset + i * step); \
- } \
- static inline u32 id##_RD(int i) \
- { \
- return id##_RD_NB(base, i); \
- } \
- static inline void id##_WR(int i, u32 v) \
- { \
- id##_WR_NB(base, i, v); \
- } \
- static inline void id##_SET(int i, u32 v) \
- { \
- id##_SET_NB(base, i, v); \
- } \
- static inline void id##_CLR(int i, u32 v) \
- { \
- id##_CLR_NB(base, i, v); \
- } \
- static inline void id##_TOG(int i, u32 v) \
- { \
- id##_TOG_NB(base, i, v); \
- }
- #define HW_REGISTER_WO(id, base, offset)\
- HW_REGISTER_FUNCS(id, base, offset, 1, 0, 1)
- #define HW_REGISTER_RO(id, base, offset)\
- HW_REGISTER_FUNCS(id, base, offset, 1, 1, 0)
- #define HW_REGISTER(id, base, offset) \
- HW_REGISTER_FUNCS(id, base, offset, 1, 1, 1)
- #define HW_REGISTER_0(id, base, offset) \
- HW_REGISTER_FUNCS(id, base, offset, 0, 1, 1)
- #define HW_REGISTER_INDEXED(id, base, offset, step) \
- HW_REGISTER_FUNCS_INDEXED(id, base, offset, 1, 1, 1, step)
- #define HW_REGISTER_RO_INDEXED(id, base, offset, step) \
- HW_REGISTER_FUNCS_INDEXED(id, base, offset, 1, 1, 0, step)
- #define HW_REGISTER_0_INDEXED(id, base, offset, step) \
- HW_REGISTER_FUNCS_INDEXED(id, base, offset, 0, 1, 1, step)
- #else /* __ASSEMBLER__ */
- #define HW_REGISTER_FUNCS(id, base, offset, regset, rd, wr)
- #define HW_REGISTER_FUNCS_INDEXED(id, base, offset, regset, rd, wr, step)
- #define HW_REGISTER_WO(id, base, offset)
- #define HW_REGISTER_RO(id, base, offset)
- #define HW_REGISTER(id, base, offset)
- #define HW_REGISTER_0(id, base, offset)
- #define HW_REGISTER_INDEXED(id, base, offset, step)
- #define HW_REGISTER_RO_INDEXED(id, base, offset, step)
- #define HW_REGISTER_0_INDEXED(id, base, offset, step)
- #endif /* __ASSEMBLER__ */
- #endif /* __ASM_PLAT_STMP3XXX_REGS_H */
|