159fb659bSPaul Walmsley /*
259fb659bSPaul Walmsley  * OMAP2/3 Clock Management (CM) register definitions
359fb659bSPaul Walmsley  *
459fb659bSPaul Walmsley  * Copyright (C) 2007-2009 Texas Instruments, Inc.
559fb659bSPaul Walmsley  * Copyright (C) 2007-2010 Nokia Corporation
659fb659bSPaul Walmsley  * Paul Walmsley
759fb659bSPaul Walmsley  *
859fb659bSPaul Walmsley  * This program is free software; you can redistribute it and/or modify
959fb659bSPaul Walmsley  * it under the terms of the GNU General Public License version 2 as
1059fb659bSPaul Walmsley  * published by the Free Software Foundation.
1159fb659bSPaul Walmsley  *
1259fb659bSPaul Walmsley  * The CM hardware modules on the OMAP2/3 are quite similar to each
1359fb659bSPaul Walmsley  * other.  The CM modules/instances on OMAP4 are quite different, so
1459fb659bSPaul Walmsley  * they are handled in a separate file.
1559fb659bSPaul Walmsley  */
1659fb659bSPaul Walmsley #ifndef __ARCH_ASM_MACH_OMAP2_CM2XXX_3XXX_H
1759fb659bSPaul Walmsley #define __ARCH_ASM_MACH_OMAP2_CM2XXX_3XXX_H
1859fb659bSPaul Walmsley 
19d9a16f9aSPaul Walmsley #include "cm.h"
2059fb659bSPaul Walmsley 
2159fb659bSPaul Walmsley /*
2259fb659bSPaul Walmsley  * Module specific CM register offsets from CM_BASE + domain offset
2359fb659bSPaul Walmsley  * Use cm_{read,write}_mod_reg() with these registers.
2459fb659bSPaul Walmsley  * These register offsets generally appear in more than one PRCM submodule.
2559fb659bSPaul Walmsley  */
2659fb659bSPaul Walmsley 
2759fb659bSPaul Walmsley /* Common between OMAP2 and OMAP3 */
2859fb659bSPaul Walmsley 
2959fb659bSPaul Walmsley #define CM_FCLKEN					0x0000
3059fb659bSPaul Walmsley #define CM_FCLKEN1					CM_FCLKEN
3159fb659bSPaul Walmsley #define CM_CLKEN					CM_FCLKEN
3259fb659bSPaul Walmsley #define CM_ICLKEN					0x0010
3359fb659bSPaul Walmsley #define CM_ICLKEN1					CM_ICLKEN
3459fb659bSPaul Walmsley #define CM_ICLKEN2					0x0014
3559fb659bSPaul Walmsley #define CM_ICLKEN3					0x0018
3659fb659bSPaul Walmsley #define CM_IDLEST					0x0020
3759fb659bSPaul Walmsley #define CM_IDLEST1					CM_IDLEST
3859fb659bSPaul Walmsley #define CM_IDLEST2					0x0024
39ff4ae5d9SPaul Walmsley #define OMAP2430_CM_IDLEST3				0x0028
4059fb659bSPaul Walmsley #define CM_AUTOIDLE					0x0030
4159fb659bSPaul Walmsley #define CM_AUTOIDLE1					CM_AUTOIDLE
4259fb659bSPaul Walmsley #define CM_AUTOIDLE2					0x0034
4359fb659bSPaul Walmsley #define CM_AUTOIDLE3					0x0038
4459fb659bSPaul Walmsley #define CM_CLKSEL					0x0040
4559fb659bSPaul Walmsley #define CM_CLKSEL1					CM_CLKSEL
4659fb659bSPaul Walmsley #define CM_CLKSEL2					0x0044
4759fb659bSPaul Walmsley #define OMAP2_CM_CLKSTCTRL				0x0048
4859fb659bSPaul Walmsley 
4959fb659bSPaul Walmsley #ifndef __ASSEMBLER__
5059fb659bSPaul Walmsley 
51ff4ae5d9SPaul Walmsley #include <linux/io.h>
5259fb659bSPaul Walmsley 
53ff4ae5d9SPaul Walmsley static inline u32 omap2_cm_read_mod_reg(s16 module, u16 idx)
54ff4ae5d9SPaul Walmsley {
55ff4ae5d9SPaul Walmsley 	return __raw_readl(cm_base + module + idx);
56ff4ae5d9SPaul Walmsley }
5759fb659bSPaul Walmsley 
58ff4ae5d9SPaul Walmsley static inline void omap2_cm_write_mod_reg(u32 val, s16 module, u16 idx)
59ff4ae5d9SPaul Walmsley {
60ff4ae5d9SPaul Walmsley 	__raw_writel(val, cm_base + module + idx);
61ff4ae5d9SPaul Walmsley }
6255ae3507SPaul Walmsley 
63ff4ae5d9SPaul Walmsley /* Read-modify-write a register in a CM module. Caller must lock */
64ff4ae5d9SPaul Walmsley static inline u32 omap2_cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module,
65ff4ae5d9SPaul Walmsley 					    s16 idx)
66ff4ae5d9SPaul Walmsley {
67ff4ae5d9SPaul Walmsley 	u32 v;
6855ae3507SPaul Walmsley 
69ff4ae5d9SPaul Walmsley 	v = omap2_cm_read_mod_reg(module, idx);
70ff4ae5d9SPaul Walmsley 	v &= ~mask;
71ff4ae5d9SPaul Walmsley 	v |= bits;
72ff4ae5d9SPaul Walmsley 	omap2_cm_write_mod_reg(v, module, idx);
730fd0c21bSPaul Walmsley 
74ff4ae5d9SPaul Walmsley 	return v;
75ff4ae5d9SPaul Walmsley }
76ff4ae5d9SPaul Walmsley 
774bd5259eSPaul Walmsley /* Read a CM register, AND it, and shift the result down to bit 0 */
784bd5259eSPaul Walmsley static inline u32 omap2_cm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask)
794bd5259eSPaul Walmsley {
804bd5259eSPaul Walmsley 	u32 v;
814bd5259eSPaul Walmsley 
824bd5259eSPaul Walmsley 	v = omap2_cm_read_mod_reg(domain, idx);
834bd5259eSPaul Walmsley 	v &= mask;
844bd5259eSPaul Walmsley 	v >>= __ffs(mask);
854bd5259eSPaul Walmsley 
864bd5259eSPaul Walmsley 	return v;
874bd5259eSPaul Walmsley }
884bd5259eSPaul Walmsley 
89ff4ae5d9SPaul Walmsley static inline u32 omap2_cm_set_mod_reg_bits(u32 bits, s16 module, s16 idx)
90ff4ae5d9SPaul Walmsley {
91ff4ae5d9SPaul Walmsley 	return omap2_cm_rmw_mod_reg_bits(bits, bits, module, idx);
92ff4ae5d9SPaul Walmsley }
93ff4ae5d9SPaul Walmsley 
94ff4ae5d9SPaul Walmsley static inline u32 omap2_cm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)
95ff4ae5d9SPaul Walmsley {
96ff4ae5d9SPaul Walmsley 	return omap2_cm_rmw_mod_reg_bits(bits, 0x0, module, idx);
97ff4ae5d9SPaul Walmsley }
9892618ff8SPaul Walmsley 
99b6ffa050SPaul Walmsley extern int omap2xxx_cm_apll54_enable(void);
100b6ffa050SPaul Walmsley extern void omap2xxx_cm_apll54_disable(void);
101b6ffa050SPaul Walmsley extern int omap2xxx_cm_apll96_enable(void);
102b6ffa050SPaul Walmsley extern void omap2xxx_cm_apll96_disable(void);
103b6ffa050SPaul Walmsley 
10459fb659bSPaul Walmsley #endif
10559fb659bSPaul Walmsley 
10659fb659bSPaul Walmsley /* CM register bits shared between 24XX and 3430 */
10759fb659bSPaul Walmsley 
10859fb659bSPaul Walmsley /* CM_CLKSEL_GFX */
10959fb659bSPaul Walmsley #define OMAP_CLKSEL_GFX_SHIFT				0
11059fb659bSPaul Walmsley #define OMAP_CLKSEL_GFX_MASK				(0x7 << 0)
11199e7938dSRajendra Nayak #define OMAP_CLKSEL_GFX_WIDTH				3
11259fb659bSPaul Walmsley 
11359fb659bSPaul Walmsley /* CM_ICLKEN_GFX */
11459fb659bSPaul Walmsley #define OMAP_EN_GFX_SHIFT				0
11559fb659bSPaul Walmsley #define OMAP_EN_GFX_MASK				(1 << 0)
11659fb659bSPaul Walmsley 
11759fb659bSPaul Walmsley /* CM_IDLEST_GFX */
11859fb659bSPaul Walmsley #define OMAP_ST_GFX_MASK				(1 << 0)
11959fb659bSPaul Walmsley 
12059fb659bSPaul Walmsley #endif
121