rk3026: add clock_data support

This commit is contained in:
chenxing
2013-07-18 10:32:02 +08:00
parent 30af6f70b9
commit 27b62b9917
2 changed files with 3430 additions and 0 deletions

2869
arch/arm/mach-rk3026/clock_data.c Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,561 @@
#ifndef __MACH_CRU_H
#define __MACH_CRU_H
enum rk_plls_id {
APLL_ID = 0,
DPLL_ID,
CPLL_ID,
GPLL_ID,
END_PLL_ID,
};
/*****cru reg offset*****/
#define CRU_MODE_CON 0x40
#define CRU_CLKSEL_CON 0x44
#define CRU_CLKGATE_CON 0xd0
#define CRU_GLB_SRST_FST 0x100
#define CRU_GLB_SRST_SND 0x104
#define CRU_SOFTRST_CON 0x110
#define PLL_CONS(id, i) ((id) * 0x10 + ((i) * 4))
#define CRU_CLKSELS_CON_CNT (35)
#define CRU_CLKSELS_CON(i) (CRU_CLKSEL_CON + ((i) * 4))
#define CRU_CLKGATES_CON_CNT (10)
#define CRU_CLKGATES_CON(i) (CRU_CLKGATE_CON + ((i) * 4))
#define CRU_SOFTRSTS_CON_CNT (9)
#define CRU_SOFTRSTS_CON(i) (CRU_SOFTRST_CON + ((i) * 4))
#define CRU_MISC_CON (0x134)
#define CRU_GLB_CNT_TH (0x140)
/*PLL_CON 0,1,2*/
#define PLL_PWR_ON (0)
#define PLL_PWR_DN (1)
#define PLL_BYPASS (1 << 15)
#define PLL_NO_BYPASS (0 << 15)
//con0
#define PLL_BYPASS_SHIFT (15)
#define PLL_POSTDIV1_MASK (0x7)
#define PLL_POSTDIV1_SHIFT (12)
#define PLL_FBDIV_MASK (0xfff)
#define PLL_FBDIV_SHIFT (0)
//con1
#define PLL_RSTMODE_SHIFT (15)
#define PLL_RST_SHIFT (14)
#define PLL_PWR_DN_SHIFT (13)
#define PLL_DSMPD_SHIFT (12)
#define PLL_LOCK_SHIFT (10)
#define PLL_POSTDIV2_MASK (0x7)
#define PLL_POSTDIV2_SHIFT (6)
#define PLL_REFDIV_MASK (0x3f)
#define PLL_REFDIV_SHIFT (0)
//con2
#define PLL_FOUT4PHASE_PWR_DN_SHIFT (27)
#define PLL_FOUTVCO_PWR_DN_SHIFT (26)
#define PLL_FOUTPOSTDIV_PWR_DN_SHIFT (25)
#define PLL_DAC_PWR_DN_SHIFT (24)
#define PLL_FRAC_MASK (0xffffff)
#define PLL_FRAC_SHIFT (0)
/********************************************************************/
#define CRU_GET_REG_BIT_VAL(reg, bits_shift) (((reg) >> (bits_shift)) & (0x1))
#define CRU_GET_REG_BITS_VAL(reg, bits_shift, msk) (((reg) >> (bits_shift)) & (msk))
#define CRU_SET_BIT(val, bits_shift) (((val) & (0x1)) << (bits_shift))
#define CRU_SET_BITS(val, bits_shift, msk) (((val) & (msk)) << (bits_shift))
#define CRU_W_MSK(bits_shift, msk) ((msk) << ((bits_shift) + 16))
#define CRU_W_MSK_SETBITS(val, bits_shift, msk) (CRU_W_MSK(bits_shift, msk) \
| CRU_SET_BITS(val, bits_shift, msk))
#define CRU_W_MSK_SETBIT(val, bits_shift) (CRU_W_MSK(bits_shift, 0x1) \
| CRU_SET_BIT(val, bits_shift))
#define PLL_SET_REFDIV(val) CRU_W_MSK_SETBITS(val, PLL_REFDIV_SHIFT, PLL_REFDIV_MASK)
#define PLL_SET_FBDIV(val) CRU_W_MSK_SETBITS(val, PLL_FBDIV_SHIFT, PLL_FBDIV_MASK)
#define PLL_SET_POSTDIV1(val) CRU_W_MSK_SETBITS(val, PLL_POSTDIV1_SHIFT, PLL_POSTDIV1_MASK)
#define PLL_SET_POSTDIV2(val) CRU_W_MSK_SETBITS(val, PLL_POSTDIV2_SHIFT, PLL_POSTDIV2_MASK)
#define PLL_SET_FRAC(val) CRU_SET_BITS(val, PLL_FRAC_SHIFT, PLL_FRAC_MASK)
#define PLL_GET_REFDIV(reg) CRU_GET_REG_BITS_VAL(reg, PLL_REFDIV_SHIFT, PLL_REFDIV_MASK)
#define PLL_GET_FBDIV(reg) CRU_GET_REG_BITS_VAL(reg, PLL_FBDIV_SHIFT, PLL_FBDIV_MASK)
#define PLL_GET_POSTDIV1(reg) CRU_GET_REG_BITS_VAL(reg, PLL_POSTDIV1_SHIFT, PLL_POSTDIV1_MASK)
#define PLL_GET_POSTDIV2(reg) CRU_GET_REG_BITS_VAL(reg, PLL_POSTDIV2_SHIFT, PLL_POSTDIV2_MASK)
#define PLL_GET_FRAC(reg) CRU_GET_REG_BITS_VAL(reg, PLL_FRAC_SHIFT, PLL_FRAC_MASK)
//#define APLL_SET_BYPASS(val) CRU_SET_BIT(val, PLL_BYPASS_SHIFT)
#define PLL_SET_DSMPD(val) CRU_W_MSK_SETBIT(val, PLL_DSMPD_SHIFT)
#define PLL_GET_DSMPD(reg) CRU_GET_REG_BIT_VAL(reg, PLL_DSMPD_SHIFT)
/*******************MODE BITS***************************/
#define PLL_MODE_MSK(id) (0x1 << ((id) * 4))
#define PLL_MODE_SHIFT(id) ((id) * 4)
#define PLL_MODE_SLOW(id) (CRU_W_MSK_SETBIT(0x0, PLL_MODE_SHIFT(id)))
#define PLL_MODE_NORM(id) (CRU_W_MSK_SETBIT(0x1, PLL_MODE_SHIFT(id)))
/*******************CLKSEL0 BITS***************************/
#define CLK_SET_DIV_CON_SUB1(val, bits_shift, msk) CRU_W_MSK_SETBITS((val - 1), bits_shift, msk)
#define CPU_CLK_PLL_SEL_SHIFT (13)
#define CORE_CLK_PLL_SEL_SHIFT (7)
#define SEL_APLL (0)
#define SEL_GPLL (1)
#define CPU_SEL_PLL(plls) CRU_W_MSK_SETBIT(plls, CPU_CLK_PLL_SEL_SHIFT)
#define CORE_SEL_PLL(plls) CRU_W_MSK_SETBIT(plls, CORE_CLK_PLL_SEL_SHIFT)
#define ACLK_CPU_DIV_MASK (0x1f)
#define ACLK_CPU_DIV_SHIFT (8)
#define A9_CORE_DIV_MASK (0x1f)
#define A9_CORE_DIV_SHIFT (0)
#define RATIO_11 (1)
#define RATIO_21 (2)
#define RATIO_41 (4)
#define RATIO_81 (8)
#define ACLK_CPU_DIV(val) CLK_SET_DIV_CON_SUB1(val, ACLK_CPU_DIV_SHIFT, ACLK_CPU_DIV_MASK)
#define CLK_CORE_DIV(val) CLK_SET_DIV_CON_SUB1(val, A9_CORE_DIV_SHIFT, A9_CORE_DIV_MASK)
/*******************CLKSEL1 BITS***************************/
#define PCLK_CPU_DIV_MASK (0x7)
#define PCLK_CPU_DIV_SHIFT (12)
#define HCLK_CPU_DIV_MASK (0x3)
#define HCLK_CPU_DIV_SHIFT (8)
#define ACLK_CORE_DIV_MASK (0x7)
#define ACLK_CORE_DIV_SHIFT (4)
#define CORE_PERIPH_DIV_MASK (0xf)
#define CORE_PERIPH_DIV_SHIFT (0)
#define PCLK_CPU_DIV(val) CLK_SET_DIV_CON_SUB1(val, PCLK_CPU_DIV_SHIFT, PCLK_CPU_DIV_MASK)
#define HCLK_CPU_DIV(val) CLK_SET_DIV_CON_SUB1(val, HCLK_CPU_DIV_SHIFT, HCLK_CPU_DIV_MASK)
#define ACLK_CORE_DIV(val) CLK_SET_DIV_CON_SUB1(val, ACLK_CORE_DIV_SHIFT, ACLK_CORE_DIV_MASK)
#define CLK_CORE_PERI_DIV(val) CLK_SET_DIV_CON_SUB1(val, CORE_PERIPH_DIV_SHIFT, CORE_PERIPH_DIV_MASK)
/*******************clksel10***************************/
#define PERI_PLL_SEL_SHIFT 15
#define PERI_PCLK_DIV_MASK (0x3)
#define PERI_PCLK_DIV_SHIFT (12)
#define PERI_HCLK_DIV_MASK (0x3)
#define PERI_HCLK_DIV_SHIFT (8)
#define PERI_ACLK_DIV_MASK (0x1f)
#define PERI_ACLK_DIV_SHIFT (0)
#define SEL_2PLL_GPLL (0)
#define SEL_2PLL_CPLL (1)
#define PERI_CLK_SEL_PLL(plls) CRU_W_MSK_SETBIT(plls, PERI_PLL_SEL_SHIFT)
#define PERI_SET_ACLK_DIV(val) CLK_SET_DIV_CON_SUB1(val, PERI_ACLK_DIV_SHIFT, PERI_ACLK_DIV_MASK)
/*******************gate BITS***************************/
#define CLK_GATE_CLKID_CONS(i) CRU_CLKGATES_CON((i) / 16)
#define CLK_GATE(i) (1 << ((i)%16))
#define CLK_UN_GATE(i) (0)
#define CLK_GATE_W_MSK(i) (1 << (((i) % 16) + 16))
#define CLK_GATE_CLKID(i) (16 * (i))
enum cru_clk_gate {
/* SCU CLK GATE 0 CON */
CLK_GATE_CORE_PERIPH = CLK_GATE_CLKID(0),
CLK_GATE_CPU_GPLL,
CLK_GATE_DDRPHY_SRC,
CLK_GATE_ACLK_CPU,
CLK_GATE_HCLK_CPU,
CLK_GATE_PCLK_CPU,
CLK_GATE_CORE_GPLL,
CLK_GATE_ACLK_CORE,
CLK_GATE_DDRPHY_GPLL_SRC,
CLK_GATE_I2S_SRC,
CLK_GATE_I2S_FRAC_SRC,
CLK_GATE_HCLK_DISP,
CLK_GATE_CRYPTO,
CLK_GATE_0RES13,
CLK_GATE_0RES14,
CLK_GATE_TESTCLK,
CLK_GATE_TIMER0 = CLK_GATE_CLKID(1),
CLK_GATE_TIMER1,
CLK_GATE_1RES2,
CLK_GATE_JTAG,
CLK_GATE_ACLK_LCDC1_SRC,
CLK_GATE_OTGPHY0,
CLK_GATE_OTGPHY1,
CLK_GATE_DLL_DDR,
CLK_GATE_UART0_SRC,
CLK_GATE_UART0_FRAC_SRC,
CLK_GATE_UART1_SRC,
CLK_GATE_UART1_FRAC_SRC,
CLK_GATE_UART2_SRC,
CLK_GATE_UART2_FRAC_SRC,
CLK_GATE_DLL_GPU,
CLK_GATE_DLL_CORE,
CLK_GATE_PERIPH_SRC = CLK_GATE_CLKID(2),
CLK_GATE_ACLK_PERIPH,
CLK_GATE_HCLK_PERIPH,
CLK_GATE_PCLK_PERIPH,
CLK_GATE_2RES4,
CLK_GATE_2RES5,
CLK_GATE_2RES6,
CLK_GATE_2RES7,
CLK_GATE_SARADC_SRC,
CLK_GATE_SPI0_SRC,
CLK_GATE_2RES10,
CLK_GATE_MMC0_SRC,
CLK_GATE_2RES12,
CLK_GATE_SDIO_SRC,
CLK_GATE_EMMC_SRC,
CLK_GATE_2RES15,
CLK_GATE_ACLK_LCDC0_SRC = CLK_GATE_CLKID(3),
CLK_GATE_DCLK_LCDC0_SRC,
CLK_GATE_DCLK_LCDC1_SRC,
CLK_GATE_PCLKIN_CIF,
CLK_GATE_DCLK_EBC_SRC,
CLK_GATE_HCLK_CRYPTO,
CLK_GATE_HCLK_EMEM_PERI,
CLK_GATE_CIF_OUT_SRC,
CLK_GATE_PCLK_HDMI,
CLK_GATE_ACLK_VEPU_SRC,
CLK_GATE_3RES10,
CLK_GATE_ACLK_VDPU_SRC,
CLK_GATE_HCLK_VDPU,
CLK_GATE_GPU_PRE,
CLK_GATE_ACLK_GPS,
CLK_GATE_3RES15,
CLK_GATE_HCLK_PERI_AXI_MATRIX = CLK_GATE_CLKID(4),
CLK_GATE_PCLK_PERI_AXI_MATRIX,
CLK_GATE_ACLK_CPU_PERI,
CLK_GATE_ACLK_PERI_AXI_MATRIX,
CLK_GATE_4RES4,
CLK_GATE_4RES5,
CLK_GATE_4RES6,
CLK_GATE_4RES7,
CLK_GATE_4RES8,
CLK_GATE_4RES9,
CLK_GATE_ACLK_STRC_SYS,
CLK_GATE_4RES11,
CLK_GATE_ACLK_INTMEM,
CLK_GATE_4RES13,
CLK_GATE_4RES14,
CLK_GATE_4RES15,
CLK_GATE_5RES0 = CLK_GATE_CLKID(5),
CLK_GATE_ACLK_DMAC2,
CLK_GATE_PCLK_EFUSE,
CLK_GATE_5RES3,
CLK_GATE_PCLK_GRF,
CLK_GATE_5RES5,
CLK_GATE_HCLK_ROM,
CLK_GATE_PCLK_DDRUPCTL,
CLK_GATE_5RES8,
CLK_GATE_HCLK_NANDC,
CLK_GATE_HCLK_SDMMC0,
CLK_GATE_HCLK_SDIO,
CLK_GATE_5RES12,
CLK_GATE_HCLK_OTG0,
CLK_GATE_PCLK_ACODEC,
CLK_GATE_5RES15,
CLK_GATE_ACLK_LCDC0 = CLK_GATE_CLKID(6),
CLK_GATE_HCLK_LCDC0,
CLK_GATE_6RES2,
CLK_GATE_6RES3,
CLK_GATE_HCLK_CIF,
CLK_GATE_ACLK_CIF,
CLK_GATE_6RES6,
CLK_GATE_6RES7,
CLK_GATE_6RES8,
CLK_GATE_6RES9,
CLK_GATE_HCLK_RGA,
CLK_GATE_ACLK_RGA,
CLK_GATE_HCLK_VIO_BUS,
CLK_GATE_ACLK_VIO0,
CLK_GATE_6RES14,
CLK_GATE_6RES15,
CLK_GATE_HCLK_EMMC = CLK_GATE_CLKID(7),
CLK_GATE_7RES1,
CLK_GATE_HCLK_I2S,
CLK_GATE_HCLK_OTG1,
CLK_GATE_7RES4,
CLK_GATE_7RES5,
CLK_GATE_7RES6,
CLK_GATE_PCLK_TIMER0,
CLK_GATE_PCLK_TIMER1,
CLK_GATE_7RES9,
CLK_GATE_PCLK_PWM01,
CLK_GATE_7RES11,
CLK_GATE_PCLK_SPI0,
CLK_GATE_7RES13,
CLK_GATE_PCLK_SARADC,
CLK_GATE_PCLK_WDT,
CLK_GATE_PCLK_UART0 = CLK_GATE_CLKID(8),
CLK_GATE_PCLK_UART1,
CLK_GATE_PCLK_UART2,
CLK_GATE_8RES3,
CLK_GATE_PCLK_I2C0,
CLK_GATE_PCLK_I2C1,
CLK_GATE_PCLK_I2C2,
CLK_GATE_PCLK_I2C3,
CLK_GATE_8RES8,
CLK_GATE_PCLK_GPIO0,
CLK_GATE_PCLK_GPIO1,
CLK_GATE_PCLK_GPIO2,
CLK_GATE_PCLK_GPIO3,
CLK_GATE_8RES13,
CLK_GATE_8RES14,
CLK_GATE_8RES15,
CLK_GATE_CLK_CORE_DBG = CLK_GATE_CLKID(9),
CLK_GATE_PCLK_DBG,
CLK_GATE_9RES2,
CLK_GATE_9RES3,
CLK_GATE_CLK_L2C,
CLK_GATE_HCLK_LCDC1,
CLK_GATE_ACLK_LCDC1,
CLK_GATE_HCLK_IEP,
CLK_GATE_ACLK_IEP,
CLK_GATE_HCLK_EBC,
CLK_GATE_ACLK_VIO1,
CLK_GATE_9RES11,
CLK_GATE_9RES12,
CLK_GATE_HCLK_USB_PERI,
CLK_GATE_HCLK_PERI_ARBI,
CLK_GATE_ACLK_PERI_NIU,
CLK_GATE_MAX,
};
#define SOFT_RST_ID(i) (16 * (i))
enum cru_soft_reset {
SOFT_RST_CORE_SRST_WDT_SEL = SOFT_RST_ID(0),
SOFT_RST_0RES1,
SOFT_RST_MCORE,
SOFT_RST_CORE0,
SOFT_RST_CORE1,
SOFT_RST_0RES5,
SOFT_RST_0RES6,
SOFT_RST_MCORE_DBG,
SOFT_RST_CORE0_DBG,
SOFT_RST_CORE1_DBG,
SOFT_RST_CORE0_WDT,
SOFT_RST_CORE1_WDT,
SOFT_RST_0RES12,
SOFT_RST_ACLK_CORE,
SOFT_RST_STRC_SYS_AXI,
SOFT_RST_L2C,
SOFT_RST_1RES0 = SOFT_RST_ID(1),
SOFT_RST_CPUSYS_AHB,
SOFT_RST_L2MEM_CON_AXI,
SOFT_RST_AHB2APB,
SOFT_RST_1RES4,
SOFT_RST_INTMEM,
SOFT_RST_ROM,
SOFT_RST_PERI_NIU,
SOFT_RST_I2S,
SOFT_RST_DDR_DLL,
SOFT_RST_GPU_DLL,
SOFT_RST_TIMER0,
SOFT_RST_TIMER1,
SOFT_RST_CORE_DLL,
SOFT_RST_EFUSE_APB,
SOFT_RST_ACODEC,
SOFT_RST_GPIO0 = SOFT_RST_ID(2),
SOFT_RST_GPIO1,
SOFT_RST_GPIO2,
SOFT_RST_GPIO3,
SOFT_RST_2RES4,
SOFT_RST_2RES5,
SOFT_RST_2RES6,
SOFT_RST_UART0,
SOFT_RST_UART1,
SOFT_RST_UART2,
SOFT_RST_2RES10,
SOFT_RST_I2C0,
SOFT_RST_I2C1,
SOFT_RST_I2C2,
SOFT_RST_I2C3,
SOFT_RST_2RES15,
SOFT_RST_PWM0 = SOFT_RST_ID(3),
SOFT_RST_PWM1,
SOFT_RST_DAP_PO,
SOFT_RST_DAP,
SOFT_RST_DAP_SYS,
SOFT_RST_CRYPTO,
SOFT_RST_3RES6,
SOFT_RST_GRF,
SOFT_RST_3RES8,
SOFT_RST_PERIPHSYS_AXI,
SOFT_RST_PERIPHSYS_AHB,
SOFT_RST_PERIPHSYS_APB,
SOFT_RST_PWM2,
SOFT_RST_CPU_PERI,
SOFT_RST_EMEM_PERI,
SOFT_RST_USB_PERI,
SOFT_RST_DMA2 = SOFT_RST_ID(4),
SOFT_RST_4RES1,
SOFT_RST_4RES2,
SOFT_RST_GPS,
SOFT_RST_NANDC,
SOFT_RST_USBOTG0,
SOFT_RST_4RES6,
SOFT_RST_OTGC0,
SOFT_RST_USBOTG1,
SOFT_RST_4RES9,
SOFT_RST_OTGC1,
SOFT_RST_4RES11,
SOFT_RST_4RES12,
SOFT_RST_4RES13,
SOFT_RST_4RES14,
SOFT_RST_DDRMSCH,
SOFT_RST_5RES0 = SOFT_RST_ID(5),
SOFT_RST_MMC0,
SOFT_RST_SDIO,
SOFT_RST_EMMC,
SOFT_RST_SPI0,
SOFT_RST_5RES5,
SOFT_RST_WDT,
SOFT_RST_SARADC,
SOFT_RST_DDRPHY,
SOFT_RST_DDRPHY_APB,
SOFT_RST_DDRCTRL,
SOFT_RST_DDRCTRL_APB,
SOFT_RST_5RES12,
SOFT_RST_5RES13,
SOFT_RST_5RES14,
SOFT_RST_5RES15,
SOFT_RST_HDMI_PCLK = SOFT_RST_ID(6),
SOFT_RST_VIO_ARBI_AHB,
SOFT_RST_VIO0_AXI,
SOFT_RST_VIO_BUS_AHB,
SOFT_RST_LCDC0_AXI,
SOFT_RST_LCDC0_AHB,
SOFT_RST_LCDC0_DCLK,
SOFT_RST_UTMI0,
SOFT_RST_UTMI1,
SOFT_RST_USBPOR,
SOFT_RST_IEP_AXI,
SOFT_RST_IEP_AHB,
SOFT_RST_RGA_AXI,
SOFT_RST_RGA_AHB,
SOFT_RST_CIF0,
SOFT_RST_6RES15,
SOFT_RST_VCODEC_AXI = SOFT_RST_ID(7),
SOFT_RST_VCODEC_AHB,
SOFT_RST_VIO1_AXI,
SOFT_RST_7RES3,
SOFT_RST_VCODEC_NIU_AXI,
SOFT_RST_LCDC1_AXI,
SOFT_RST_LCDC1_AHB,
SOFT_RST_LCDC1_DCLK,
SOFT_RST_GPU,
SOFT_RST_7RES9,
SOFT_RST_GPU_NIU_AXI,
SOFT_RST_EBC_AXI,
SOFT_RST_EBC_AHB,
SOFT_RST_7RES13,
SOFT_RST_7RES14,
SOFT_RST_7RES15,
SOFT_RST_8RES0 = SOFT_RST_ID(8),
SOFT_RST_8RES1,
SOFT_RST_CORE_DBG,
SOFT_RST_DBG_APB,
SOFT_RST_8RES4,
SOFT_RST_8RES5,
SOFT_RST_8RES6,
SOFT_RST_8RES7,
SOFT_RST_8RES8,
SOFT_RST_8RES9,
SOFT_RST_8RES10,
SOFT_RST_8RES11,
SOFT_RST_8RES12,
SOFT_RST_8RES13,
SOFT_RST_8RES14,
SOFT_RST_8RES15,
SOFT_RST_MAX,
};
/*****cru reg end*****/
static inline void cru_set_soft_reset(enum cru_soft_reset idx, bool on)
{
const void __iomem *reg = RK2928_CRU_BASE + CRU_SOFTRSTS_CON(idx >> 4);
u32 val = on ? 0x10001U << (idx & 0xf) : 0x10000U << (idx & 0xf);
writel_relaxed(val, reg);
dsb();
}
#endif