0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef __ASM_ARM_REGS_S3C2443_CLOCK
0011 #define __ASM_ARM_REGS_S3C2443_CLOCK
0012
0013 #include <linux/delay.h>
0014 #include "map-s3c.h"
0015
0016 #define S3C2443_CLKREG(x) ((x) + S3C24XX_VA_CLKPWR)
0017
0018 #define S3C2443_PLLCON_MDIVSHIFT 16
0019 #define S3C2443_PLLCON_PDIVSHIFT 8
0020 #define S3C2443_PLLCON_SDIVSHIFT 0
0021 #define S3C2443_PLLCON_MDIVMASK ((1<<(1+(23-16)))-1)
0022 #define S3C2443_PLLCON_PDIVMASK ((1<<(1+(9-8)))-1)
0023 #define S3C2443_PLLCON_SDIVMASK (3)
0024
0025 #define S3C2443_MPLLCON S3C2443_CLKREG(0x10)
0026 #define S3C2443_EPLLCON S3C2443_CLKREG(0x18)
0027 #define S3C2443_CLKSRC S3C2443_CLKREG(0x20)
0028 #define S3C2443_CLKDIV0 S3C2443_CLKREG(0x24)
0029 #define S3C2443_CLKDIV1 S3C2443_CLKREG(0x28)
0030 #define S3C2443_HCLKCON S3C2443_CLKREG(0x30)
0031 #define S3C2443_PCLKCON S3C2443_CLKREG(0x34)
0032 #define S3C2443_SCLKCON S3C2443_CLKREG(0x38)
0033 #define S3C2443_PWRMODE S3C2443_CLKREG(0x40)
0034 #define S3C2443_SWRST S3C2443_CLKREG(0x44)
0035 #define S3C2443_BUSPRI0 S3C2443_CLKREG(0x50)
0036 #define S3C2443_SYSID S3C2443_CLKREG(0x5C)
0037 #define S3C2443_PWRCFG S3C2443_CLKREG(0x60)
0038 #define S3C2443_RSTCON S3C2443_CLKREG(0x64)
0039 #define S3C2443_PHYCTRL S3C2443_CLKREG(0x80)
0040 #define S3C2443_PHYPWR S3C2443_CLKREG(0x84)
0041 #define S3C2443_URSTCON S3C2443_CLKREG(0x88)
0042 #define S3C2443_UCLKCON S3C2443_CLKREG(0x8C)
0043
0044 #define S3C2443_PLLCON_OFF (1<<24)
0045
0046 #define S3C2443_CLKSRC_EPLLREF_XTAL (2<<7)
0047 #define S3C2443_CLKSRC_EPLLREF_EXTCLK (3<<7)
0048 #define S3C2443_CLKSRC_EPLLREF_MPLLREF (0<<7)
0049 #define S3C2443_CLKSRC_EPLLREF_MPLLREF2 (1<<7)
0050 #define S3C2443_CLKSRC_EPLLREF_MASK (3<<7)
0051
0052 #define S3C2443_CLKSRC_EXTCLK_DIV (1<<3)
0053
0054 #define S3C2443_CLKDIV0_HALF_HCLK (1<<3)
0055 #define S3C2443_CLKDIV0_HALF_PCLK (1<<2)
0056
0057 #define S3C2443_CLKDIV0_HCLKDIV_MASK (3<<0)
0058
0059 #define S3C2443_CLKDIV0_EXTDIV_MASK (3<<6)
0060 #define S3C2443_CLKDIV0_EXTDIV_SHIFT (6)
0061
0062 #define S3C2443_CLKDIV0_PREDIV_MASK (3<<4)
0063 #define S3C2443_CLKDIV0_PREDIV_SHIFT (4)
0064
0065 #define S3C2416_CLKDIV0_ARMDIV_MASK (7 << 9)
0066 #define S3C2443_CLKDIV0_ARMDIV_MASK (15<<9)
0067 #define S3C2443_CLKDIV0_ARMDIV_SHIFT (9)
0068 #define S3C2443_CLKDIV0_ARMDIV_1 (0<<9)
0069 #define S3C2443_CLKDIV0_ARMDIV_2 (8<<9)
0070 #define S3C2443_CLKDIV0_ARMDIV_3 (2<<9)
0071 #define S3C2443_CLKDIV0_ARMDIV_4 (9<<9)
0072 #define S3C2443_CLKDIV0_ARMDIV_6 (10<<9)
0073 #define S3C2443_CLKDIV0_ARMDIV_8 (11<<9)
0074 #define S3C2443_CLKDIV0_ARMDIV_12 (13<<9)
0075 #define S3C2443_CLKDIV0_ARMDIV_16 (15<<9)
0076
0077
0078
0079 #define S3C2443_CLKCON_NAND
0080
0081 #define S3C2443_HCLKCON_DMA0 (1<<0)
0082 #define S3C2443_HCLKCON_DMA1 (1<<1)
0083 #define S3C2443_HCLKCON_DMA2 (1<<2)
0084 #define S3C2443_HCLKCON_DMA3 (1<<3)
0085 #define S3C2443_HCLKCON_DMA4 (1<<4)
0086 #define S3C2443_HCLKCON_DMA5 (1<<5)
0087 #define S3C2443_HCLKCON_CAMIF (1<<8)
0088 #define S3C2443_HCLKCON_LCDC (1<<9)
0089 #define S3C2443_HCLKCON_USBH (1<<11)
0090 #define S3C2443_HCLKCON_USBD (1<<12)
0091 #define S3C2416_HCLKCON_HSMMC0 (1<<15)
0092 #define S3C2443_HCLKCON_HSMMC (1<<16)
0093 #define S3C2443_HCLKCON_CFC (1<<17)
0094 #define S3C2443_HCLKCON_SSMC (1<<18)
0095 #define S3C2443_HCLKCON_DRAMC (1<<19)
0096
0097 #define S3C2443_PCLKCON_UART0 (1<<0)
0098 #define S3C2443_PCLKCON_UART1 (1<<1)
0099 #define S3C2443_PCLKCON_UART2 (1<<2)
0100 #define S3C2443_PCLKCON_UART3 (1<<3)
0101 #define S3C2443_PCLKCON_IIC (1<<4)
0102 #define S3C2443_PCLKCON_SDI (1<<5)
0103 #define S3C2443_PCLKCON_HSSPI (1<<6)
0104 #define S3C2443_PCLKCON_ADC (1<<7)
0105 #define S3C2443_PCLKCON_AC97 (1<<8)
0106 #define S3C2443_PCLKCON_IIS (1<<9)
0107 #define S3C2443_PCLKCON_PWMT (1<<10)
0108 #define S3C2443_PCLKCON_WDT (1<<11)
0109 #define S3C2443_PCLKCON_RTC (1<<12)
0110 #define S3C2443_PCLKCON_GPIO (1<<13)
0111 #define S3C2443_PCLKCON_SPI0 (1<<14)
0112 #define S3C2443_PCLKCON_SPI1 (1<<15)
0113
0114 #define S3C2443_SCLKCON_DDRCLK (1<<16)
0115 #define S3C2443_SCLKCON_SSMCCLK (1<<15)
0116 #define S3C2443_SCLKCON_HSSPICLK (1<<14)
0117 #define S3C2443_SCLKCON_HSMMCCLK_EXT (1<<13)
0118 #define S3C2443_SCLKCON_HSMMCCLK_EPLL (1<<12)
0119 #define S3C2443_SCLKCON_CAMCLK (1<<11)
0120 #define S3C2443_SCLKCON_DISPCLK (1<<10)
0121 #define S3C2443_SCLKCON_I2SCLK (1<<9)
0122 #define S3C2443_SCLKCON_UARTCLK (1<<8)
0123 #define S3C2443_SCLKCON_USBHOST (1<<1)
0124
0125 #define S3C2443_PWRCFG_SLEEP (1<<15)
0126
0127 #define S3C2443_PWRCFG_USBPHY (1 << 4)
0128
0129 #define S3C2443_URSTCON_FUNCRST (1 << 2)
0130 #define S3C2443_URSTCON_PHYRST (1 << 0)
0131
0132 #define S3C2443_PHYCTRL_CLKSEL (1 << 3)
0133 #define S3C2443_PHYCTRL_EXTCLK (1 << 2)
0134 #define S3C2443_PHYCTRL_PLLSEL (1 << 1)
0135 #define S3C2443_PHYCTRL_DSPORT (1 << 0)
0136
0137 #define S3C2443_PHYPWR_COMMON_ON (1 << 31)
0138 #define S3C2443_PHYPWR_ANALOG_PD (1 << 4)
0139 #define S3C2443_PHYPWR_PLL_REFCLK (1 << 3)
0140 #define S3C2443_PHYPWR_XO_ON (1 << 2)
0141 #define S3C2443_PHYPWR_PLL_PWRDN (1 << 1)
0142 #define S3C2443_PHYPWR_FSUSPEND (1 << 0)
0143
0144 #define S3C2443_UCLKCON_DETECT_VBUS (1 << 31)
0145 #define S3C2443_UCLKCON_FUNC_CLKEN (1 << 2)
0146 #define S3C2443_UCLKCON_TCLKEN (1 << 0)
0147
0148 #include <asm/div64.h>
0149
0150 static inline unsigned int
0151 s3c2443_get_mpll(unsigned int pllval, unsigned int baseclk)
0152 {
0153 unsigned int mdiv, pdiv, sdiv;
0154 uint64_t fvco;
0155
0156 mdiv = pllval >> S3C2443_PLLCON_MDIVSHIFT;
0157 pdiv = pllval >> S3C2443_PLLCON_PDIVSHIFT;
0158 sdiv = pllval >> S3C2443_PLLCON_SDIVSHIFT;
0159
0160 mdiv &= S3C2443_PLLCON_MDIVMASK;
0161 pdiv &= S3C2443_PLLCON_PDIVMASK;
0162 sdiv &= S3C2443_PLLCON_SDIVMASK;
0163
0164 fvco = (uint64_t)baseclk * (2 * (mdiv + 8));
0165 do_div(fvco, pdiv << sdiv);
0166
0167 return (unsigned int)fvco;
0168 }
0169
0170 static inline unsigned int
0171 s3c2443_get_epll(unsigned int pllval, unsigned int baseclk)
0172 {
0173 unsigned int mdiv, pdiv, sdiv;
0174 uint64_t fvco;
0175
0176 mdiv = pllval >> S3C2443_PLLCON_MDIVSHIFT;
0177 pdiv = pllval >> S3C2443_PLLCON_PDIVSHIFT;
0178 sdiv = pllval >> S3C2443_PLLCON_SDIVSHIFT;
0179
0180 mdiv &= S3C2443_PLLCON_MDIVMASK;
0181 pdiv &= S3C2443_PLLCON_PDIVMASK;
0182 sdiv &= S3C2443_PLLCON_SDIVMASK;
0183
0184 fvco = (uint64_t)baseclk * (mdiv + 8);
0185 do_div(fvco, (pdiv + 2) << sdiv);
0186
0187 return (unsigned int)fvco;
0188 }
0189
0190 static inline void s3c_hsudc_init_phy(void)
0191 {
0192 u32 cfg;
0193
0194 cfg = readl(S3C2443_PWRCFG) | S3C2443_PWRCFG_USBPHY;
0195 writel(cfg, S3C2443_PWRCFG);
0196
0197 cfg = readl(S3C2443_URSTCON);
0198 cfg |= (S3C2443_URSTCON_FUNCRST | S3C2443_URSTCON_PHYRST);
0199 writel(cfg, S3C2443_URSTCON);
0200 mdelay(1);
0201
0202 cfg = readl(S3C2443_URSTCON);
0203 cfg &= ~(S3C2443_URSTCON_FUNCRST | S3C2443_URSTCON_PHYRST);
0204 writel(cfg, S3C2443_URSTCON);
0205
0206 cfg = readl(S3C2443_PHYCTRL);
0207 cfg &= ~(S3C2443_PHYCTRL_CLKSEL | S3C2443_PHYCTRL_DSPORT);
0208 cfg |= (S3C2443_PHYCTRL_EXTCLK | S3C2443_PHYCTRL_PLLSEL);
0209 writel(cfg, S3C2443_PHYCTRL);
0210
0211 cfg = readl(S3C2443_PHYPWR);
0212 cfg &= ~(S3C2443_PHYPWR_FSUSPEND | S3C2443_PHYPWR_PLL_PWRDN |
0213 S3C2443_PHYPWR_XO_ON | S3C2443_PHYPWR_PLL_REFCLK |
0214 S3C2443_PHYPWR_ANALOG_PD);
0215 cfg |= S3C2443_PHYPWR_COMMON_ON;
0216 writel(cfg, S3C2443_PHYPWR);
0217
0218 cfg = readl(S3C2443_UCLKCON);
0219 cfg |= (S3C2443_UCLKCON_DETECT_VBUS | S3C2443_UCLKCON_FUNC_CLKEN |
0220 S3C2443_UCLKCON_TCLKEN);
0221 writel(cfg, S3C2443_UCLKCON);
0222 }
0223
0224 static inline void s3c_hsudc_uninit_phy(void)
0225 {
0226 u32 cfg;
0227
0228 cfg = readl(S3C2443_PWRCFG) & ~S3C2443_PWRCFG_USBPHY;
0229 writel(cfg, S3C2443_PWRCFG);
0230
0231 writel(S3C2443_PHYPWR_FSUSPEND, S3C2443_PHYPWR);
0232
0233 cfg = readl(S3C2443_UCLKCON) & ~S3C2443_UCLKCON_FUNC_CLKEN;
0234 writel(cfg, S3C2443_UCLKCON);
0235 }
0236
0237 #endif
0238