2019-06-04 11:11:33 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2010-12-22 01:30:55 +03:00
/*
* OMAP2 / 3 Clock Management ( CM ) register definitions
*
* Copyright ( C ) 2007 - 2009 Texas Instruments , Inc .
* Copyright ( C ) 2007 - 2010 Nokia Corporation
* Paul Walmsley
*
* The CM hardware modules on the OMAP2 / 3 are quite similar to each
* other . The CM modules / instances on OMAP4 are quite different , so
* they are handled in a separate file .
*/
# ifndef __ARCH_ASM_MACH_OMAP2_CM2XXX_3XXX_H
# define __ARCH_ASM_MACH_OMAP2_CM2XXX_3XXX_H
2012-10-30 06:57:39 +04:00
# include "cm.h"
2010-12-22 01:30:55 +03:00
/*
* Module specific CM register offsets from CM_BASE + domain offset
* Use cm_ { read , write } _mod_reg ( ) with these registers .
* These register offsets generally appear in more than one PRCM submodule .
*/
/* Common between OMAP2 and OMAP3 */
# define CM_FCLKEN 0x0000
# define CM_FCLKEN1 CM_FCLKEN
# define CM_CLKEN CM_FCLKEN
# define CM_ICLKEN 0x0010
# define CM_ICLKEN1 CM_ICLKEN
# define CM_ICLKEN2 0x0014
# define CM_ICLKEN3 0x0018
# define CM_IDLEST 0x0020
# define CM_IDLEST1 CM_IDLEST
# define CM_IDLEST2 0x0024
2012-10-21 11:01:11 +04:00
# define OMAP2430_CM_IDLEST3 0x0028
2010-12-22 01:30:55 +03:00
# define CM_AUTOIDLE 0x0030
# define CM_AUTOIDLE1 CM_AUTOIDLE
# define CM_AUTOIDLE2 0x0034
# define CM_AUTOIDLE3 0x0038
# define CM_CLKSEL 0x0040
# define CM_CLKSEL1 CM_CLKSEL
# define CM_CLKSEL2 0x0044
# define OMAP2_CM_CLKSTCTRL 0x0048
2012-10-21 11:01:11 +04:00
# ifndef __ASSEMBLER__
2010-12-22 01:30:55 +03:00
2012-10-21 11:01:11 +04:00
# include <linux/io.h>
2010-12-22 01:30:55 +03:00
2012-10-21 11:01:11 +04:00
static inline u32 omap2_cm_read_mod_reg ( s16 module , u16 idx )
{
2017-05-31 18:00:00 +03:00
return readl_relaxed ( cm_base . va + module + idx ) ;
2012-10-21 11:01:11 +04:00
}
2010-12-22 01:30:55 +03:00
2012-10-21 11:01:11 +04:00
static inline void omap2_cm_write_mod_reg ( u32 val , s16 module , u16 idx )
{
2017-05-31 18:00:00 +03:00
writel_relaxed ( val , cm_base . va + module + idx ) ;
2012-10-21 11:01:11 +04:00
}
2010-12-22 01:30:55 +03:00
2012-10-21 11:01:11 +04:00
/* Read-modify-write a register in a CM module. Caller must lock */
static inline u32 omap2_cm_rmw_mod_reg_bits ( u32 mask , u32 bits , s16 module ,
s16 idx )
{
u32 v ;
2010-12-22 01:30:55 +03:00
2012-10-21 11:01:11 +04:00
v = omap2_cm_read_mod_reg ( module , idx ) ;
v & = ~ mask ;
v | = bits ;
omap2_cm_write_mod_reg ( v , module , idx ) ;
2010-12-22 01:30:55 +03:00
2012-10-21 11:01:11 +04:00
return v ;
}
2010-12-22 07:05:15 +03:00
2012-10-21 11:01:11 +04:00
/* Read a CM register, AND it, and shift the result down to bit 0 */
static inline u32 omap2_cm_read_mod_bits_shift ( s16 domain , s16 idx , u32 mask )
{
u32 v ;
v = omap2_cm_read_mod_reg ( domain , idx ) ;
v & = mask ;
v > > = __ffs ( mask ) ;
return v ;
}
2012-10-21 11:01:11 +04:00
static inline u32 omap2_cm_set_mod_reg_bits ( u32 bits , s16 module , s16 idx )
{
return omap2_cm_rmw_mod_reg_bits ( bits , bits , module , idx ) ;
}
2010-12-22 07:05:15 +03:00
2012-10-21 11:01:11 +04:00
static inline u32 omap2_cm_clear_mod_reg_bits ( u32 bits , s16 module , s16 idx )
{
return omap2_cm_rmw_mod_reg_bits ( bits , 0x0 , module , idx ) ;
}
2011-02-26 01:39:27 +03:00
2012-10-30 06:56:17 +04:00
extern int omap2xxx_cm_apll54_enable ( void ) ;
extern void omap2xxx_cm_apll54_disable ( void ) ;
extern int omap2xxx_cm_apll96_enable ( void ) ;
extern void omap2xxx_cm_apll96_disable ( void ) ;
2010-12-22 01:30:55 +03:00
# endif
/* CM register bits shared between 24XX and 3430 */
/* CM_CLKSEL_GFX */
# define OMAP_CLKSEL_GFX_SHIFT 0
# define OMAP_CLKSEL_GFX_MASK (0x7 << 0)
2012-11-02 15:02:58 +04:00
# define OMAP_CLKSEL_GFX_WIDTH 3
2010-12-22 01:30:55 +03:00
/* CM_ICLKEN_GFX */
# define OMAP_EN_GFX_SHIFT 0
# define OMAP_EN_GFX_MASK (1 << 0)
/* CM_IDLEST_GFX */
# define OMAP_ST_GFX_MASK (1 << 0)
# endif