Re: [U-Boot] [PATCH 3/4] EXYNOS: additional Exynos4 SoC series support
Dear Jeong-Hyeon Kim, On 29 August 2012 12:28, wrote: > From: Jeong-Hyeon Kim > > - Fixed MPLL register address > It's different between Exynos4210 and Exynos4412. > > - Added pinmux functions for Exynos4 > > - Added extended gpios for Exynos4412 > Exynos4412 has more gpios than Exynos4210. > > Signed-off-by: Jeong-Hyeon Kim > --- > arch/arm/cpu/armv7/exynos/clock.c| 67 > arch/arm/cpu/armv7/exynos/pinmux.c | 241 > ++ > arch/arm/include/asm/arch-exynos/clock.h | 240 + > arch/arm/include/asm/arch-exynos/cpu.h | 14 ++- > arch/arm/include/asm/arch-exynos/gpio.h | 21 +++- > 5 files changed, 578 insertions(+), 5 deletions(-) > > Chander posted similar patch for support the exynos4x12. So, please kindly check his patch and update your patch. http://patchwork.ozlabs.org/patch/188437/ http://patchwork.ozlabs.org/patch/188438/ http://patchwork.ozlabs.org/patch/188511/ http://patchwork.ozlabs.org/patch/188512/ http://patchwork.ozlabs.org/patch/188513/ http://patchwork.ozlabs.org/patch/189809/ Thanks. Minkyu Kang. -- from. prom. www.promsoft.net ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH 3/4] EXYNOS: additional Exynos4 SoC series support
From: Jeong-Hyeon Kim - Fixed MPLL register address It's different between Exynos4210 and Exynos4412. - Added pinmux functions for Exynos4 - Added extended gpios for Exynos4412 Exynos4412 has more gpios than Exynos4210. Signed-off-by: Jeong-Hyeon Kim --- arch/arm/cpu/armv7/exynos/clock.c| 67 arch/arm/cpu/armv7/exynos/pinmux.c | 241 ++ arch/arm/include/asm/arch-exynos/clock.h | 240 + arch/arm/include/asm/arch-exynos/cpu.h | 14 ++- arch/arm/include/asm/arch-exynos/gpio.h | 21 +++- 5 files changed, 578 insertions(+), 5 deletions(-) diff --git a/arch/arm/cpu/armv7/exynos/clock.c b/arch/arm/cpu/armv7/exynos/clock.c index 680aeeb..002a493 100644 --- a/arch/arm/cpu/armv7/exynos/clock.c +++ b/arch/arm/cpu/armv7/exynos/clock.c @@ -92,6 +92,70 @@ static unsigned long exynos4_get_pll_clk(int pllreg) return fout; } +/* exynos4: return pll clock frequency */ +static unsigned long exynos4412_get_pll_clk(int pllreg) +{ + struct exynos4412_clock *clk = + (struct exynos4412_clock *)samsung_get_base_clock(); + unsigned long r, m, p, s, k = 0, mask, fout; + unsigned int freq; + + switch (pllreg) { + case APLL: + r = readl(&clk->apll_con0); + break; + case MPLL: + r = readl(&clk->mpll_con0); + break; + case EPLL: + r = readl(&clk->epll_con0); + k = readl(&clk->epll_con1); + break; + case VPLL: + r = readl(&clk->vpll_con0); + k = readl(&clk->vpll_con1); + break; + default: + printf("Unsupported PLL (%d)\n", pllreg); + return 0; + } + + /* +* APLL_CON: MIDV [25:16] +* MPLL_CON: MIDV [25:16] +* EPLL_CON: MIDV [24:16] +* VPLL_CON: MIDV [24:16] +*/ + if (pllreg == APLL || pllreg == MPLL) + mask = 0x3ff; + else + mask = 0x1ff; + + m = (r >> 16) & mask; + + /* PDIV [13:8] */ + p = (r >> 8) & 0x3f; + /* SDIV [2:0] */ + s = r & 0x7; + + freq = CONFIG_SYS_CLK_FREQ; + + if (pllreg == EPLL) { + k = k & 0x; + /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */ + fout = (m + k / 65536) * (freq / (p * (1 << s))); + } else if (pllreg == VPLL) { + k = k & 0x; + /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */ + fout = (m + k / 65536) * (freq / (p * (1 << s))); + } else { + /* FOUT = MDIV * FIN / (PDIV * 2^SDIV) */ + fout = m * (freq / (p * (1 << s))); + } + + return fout; +} + /* exynos5: return pll clock frequency */ static unsigned long exynos5_get_pll_clk(int pllreg) { @@ -745,6 +809,9 @@ unsigned long get_pll_clk(int pllreg) if (cpu_is_exynos5()) return exynos5_get_pll_clk(pllreg); else + if (cpu_is_exynos4412()) + return exynos4412_get_pll_clk(pllreg); + else return exynos4_get_pll_clk(pllreg); } diff --git a/arch/arm/cpu/armv7/exynos/pinmux.c b/arch/arm/cpu/armv7/exynos/pinmux.c index 7776add..0746878 100644 --- a/arch/arm/cpu/armv7/exynos/pinmux.c +++ b/arch/arm/cpu/armv7/exynos/pinmux.c @@ -26,6 +26,245 @@ #include #include +static void exynos4_uart_config(int peripheral) +{ + struct exynos4_gpio_part1 *gpio1 = + (struct exynos4_gpio_part1 *) samsung_get_base_gpio_part1(); + struct s5p_gpio_bank *bank; + int i, start, count; + + switch (peripheral) { + case PERIPH_ID_UART0: + bank = &gpio1->a0; + start = 0; + count = 4; + break; + case PERIPH_ID_UART1: + bank = &gpio1->a0; + start = 4; + count = 4; + break; + case PERIPH_ID_UART2: + bank = &gpio1->a1; + start = 0; + count = 4; + break; + case PERIPH_ID_UART3: + bank = &gpio1->a1; + start = 4; + count = 2; + break; + } + for (i = start; i < start + count; i++) { + s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE); + s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); + } +} + +static int exynos4_mmc_config(int peripheral, int flags) +{ + struct exynos4_gpio_part2 *gpio2 = + (struct exynos4_gpio_part2 *) samsung_get_base_gpio_part2(); + struct s5p_gpio_bank *bank, *bank_ext; + int i, start = 0, gpio_func = 0; + + switch (peripheral) { + case PERIPH_ID_SDMMC0: + bank = &gpio2->k0; + bank_ext = &gpio2->k1; + start = 3; + gpio_func = GPIO_FUNC(0x2); +
Re: [U-Boot] [PATCH 3/4] EXYNOS: additional Exynos4 SoC series support
On 29 August 2012 09:23, Kyungmin Park wrote: > Hi, > > On 8/28/12, snow.jh...@gmail.com wrote: >> From: Jeong-Hyeon Kim >> >> - Fixed MPLL register address >> It's different between Exynos4210 and Exynos4412. >> >> - Added pinmux functions for Exynos4 >> >> - Added extended gpios for Exynos4412 >> Exynos4412 has more gpios than Exynos4210. >> >> Signed-off-by: Jeong-Hyeon Kim >> --- >> arch/arm/cpu/armv7/exynos/clock.c| 11 ++ >> arch/arm/cpu/armv7/exynos/pinmux.c | 241 >> ++ >> arch/arm/include/asm/arch-exynos/clock.h | 27 >> arch/arm/include/asm/arch-exynos/cpu.h |4 + >> arch/arm/include/asm/arch-exynos/gpio.h | 21 +++- >> 5 files changed, 303 insertions(+), 1 deletions(-) >> >> diff --git a/arch/arm/cpu/armv7/exynos/clock.c >> b/arch/arm/cpu/armv7/exynos/clock.c >> index 680aeeb..84a6725 100644 >> --- a/arch/arm/cpu/armv7/exynos/clock.c >> +++ b/arch/arm/cpu/armv7/exynos/clock.c >> @@ -79,14 +79,25 @@ static unsigned long exynos4_get_pll_clk(int pllreg) >> /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */ >> fout = (m + k / 65536) * (freq / (p * (1 << s))); >> } else if (pllreg == VPLL) { >> +#ifdef CONFIG_EXYNOS4210 > we don't like the ifdefy at here. How about to check soc_is_4210 and > soc_is_4412? >> k = k & 0xfff; >> /* FOUT = (MDIV + K / 1024) * FIN / (PDIV * 2^SDIV) */ >> fout = (m + k / 1024) * (freq / (p * (1 << s))); >> +#else >> + k = k & 0x; >> + /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */ >> + fout = (m + k / 65536) * (freq / (p * (1 << s))); >> +#endif >> } else { >> +#ifdef CONFIG_EXYNOS4210 > ditto >> if (s < 1) >> s = 1; >> /* FOUT = MDIV * FIN / (PDIV * 2^(SDIV - 1)) */ >> fout = m * (freq / (p * (1 << (s - 1; >> +#else >> + /* FOUT = MDIV * FIN / (PDIV * 2^SDIV) */ >> + fout = m * (freq / (p * (1 << s))); >> +#endif >> } >> >> return fout; >> diff --git a/arch/arm/cpu/armv7/exynos/pinmux.c >> b/arch/arm/cpu/armv7/exynos/pinmux.c >> index 7776add..0746878 100644 >> --- a/arch/arm/cpu/armv7/exynos/pinmux.c >> +++ b/arch/arm/cpu/armv7/exynos/pinmux.c >> @@ -26,6 +26,245 @@ >> #include >> #include >> >> +static void exynos4_uart_config(int peripheral) >> +{ >> + struct exynos4_gpio_part1 *gpio1 = >> + (struct exynos4_gpio_part1 *) samsung_get_base_gpio_part1(); >> + struct s5p_gpio_bank *bank; >> + int i, start, count; >> + >> + switch (peripheral) { >> + case PERIPH_ID_UART0: >> + bank = &gpio1->a0; >> + start = 0; >> + count = 4; >> + break; >> + case PERIPH_ID_UART1: >> + bank = &gpio1->a0; >> + start = 4; >> + count = 4; >> + break; >> + case PERIPH_ID_UART2: >> + bank = &gpio1->a1; >> + start = 0; >> + count = 4; >> + break; >> + case PERIPH_ID_UART3: >> + bank = &gpio1->a1; >> + start = 4; >> + count = 2; >> + break; >> + } >> + for (i = start; i < start + count; i++) { >> + s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE); >> + s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); >> + } >> +} >> + >> +static int exynos4_mmc_config(int peripheral, int flags) >> +{ >> + struct exynos4_gpio_part2 *gpio2 = >> + (struct exynos4_gpio_part2 *) samsung_get_base_gpio_part2(); >> + struct s5p_gpio_bank *bank, *bank_ext; >> + int i, start = 0, gpio_func = 0; >> + >> + switch (peripheral) { >> + case PERIPH_ID_SDMMC0: >> + bank = &gpio2->k0; >> + bank_ext = &gpio2->k1; >> + start = 3; >> + gpio_func = GPIO_FUNC(0x2); >> + break; >> + case PERIPH_ID_SDMMC1: >> + bank = &gpio2->k1; >> + bank_ext = NULL; >> + break; >> + case PERIPH_ID_SDMMC2: >> + bank = &gpio2->k2; >> + bank_ext = &gpio2->k3; >> + start = 3; >> + gpio_func = GPIO_FUNC(0x3); >> + break; >> + case PERIPH_ID_SDMMC3: >> + bank = &gpio2->k3; >> + bank_ext = NULL; >> + break; >> + } >> + if ((flags & PINMUX_FLAG_8BIT_MODE) && !bank_ext) { >> + debug("SDMMC device %d does not support 8bit mode", >> + peripheral); >> + return -1; >> + } >> + if (flags & PINMUX_FLAG_8BIT_MODE) { >> + for (i = start; i <= (start + 3); i++) { >> + s5p_gpio_cfg_pin(bank_ext, i, gpio_func); >> + s5p_gpio_set_pull(bank_ext, i, GPIO_PULL_UP); >> + s5p_gpio_set_drv(bank_ext, i, GPIO_DRV_4X); >> + } >> + } >>
Re: [U-Boot] [PATCH 3/4] EXYNOS: additional Exynos4 SoC series support
Hi, On 8/28/12, snow.jh...@gmail.com wrote: > From: Jeong-Hyeon Kim > > - Fixed MPLL register address > It's different between Exynos4210 and Exynos4412. > > - Added pinmux functions for Exynos4 > > - Added extended gpios for Exynos4412 > Exynos4412 has more gpios than Exynos4210. > > Signed-off-by: Jeong-Hyeon Kim > --- > arch/arm/cpu/armv7/exynos/clock.c| 11 ++ > arch/arm/cpu/armv7/exynos/pinmux.c | 241 > ++ > arch/arm/include/asm/arch-exynos/clock.h | 27 > arch/arm/include/asm/arch-exynos/cpu.h |4 + > arch/arm/include/asm/arch-exynos/gpio.h | 21 +++- > 5 files changed, 303 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/cpu/armv7/exynos/clock.c > b/arch/arm/cpu/armv7/exynos/clock.c > index 680aeeb..84a6725 100644 > --- a/arch/arm/cpu/armv7/exynos/clock.c > +++ b/arch/arm/cpu/armv7/exynos/clock.c > @@ -79,14 +79,25 @@ static unsigned long exynos4_get_pll_clk(int pllreg) > /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */ > fout = (m + k / 65536) * (freq / (p * (1 << s))); > } else if (pllreg == VPLL) { > +#ifdef CONFIG_EXYNOS4210 we don't like the ifdefy at here. How about to check soc_is_4210 and soc_is_4412? > k = k & 0xfff; > /* FOUT = (MDIV + K / 1024) * FIN / (PDIV * 2^SDIV) */ > fout = (m + k / 1024) * (freq / (p * (1 << s))); > +#else > + k = k & 0x; > + /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */ > + fout = (m + k / 65536) * (freq / (p * (1 << s))); > +#endif > } else { > +#ifdef CONFIG_EXYNOS4210 ditto > if (s < 1) > s = 1; > /* FOUT = MDIV * FIN / (PDIV * 2^(SDIV - 1)) */ > fout = m * (freq / (p * (1 << (s - 1; > +#else > + /* FOUT = MDIV * FIN / (PDIV * 2^SDIV) */ > + fout = m * (freq / (p * (1 << s))); > +#endif > } > > return fout; > diff --git a/arch/arm/cpu/armv7/exynos/pinmux.c > b/arch/arm/cpu/armv7/exynos/pinmux.c > index 7776add..0746878 100644 > --- a/arch/arm/cpu/armv7/exynos/pinmux.c > +++ b/arch/arm/cpu/armv7/exynos/pinmux.c > @@ -26,6 +26,245 @@ > #include > #include > > +static void exynos4_uart_config(int peripheral) > +{ > + struct exynos4_gpio_part1 *gpio1 = > + (struct exynos4_gpio_part1 *) samsung_get_base_gpio_part1(); > + struct s5p_gpio_bank *bank; > + int i, start, count; > + > + switch (peripheral) { > + case PERIPH_ID_UART0: > + bank = &gpio1->a0; > + start = 0; > + count = 4; > + break; > + case PERIPH_ID_UART1: > + bank = &gpio1->a0; > + start = 4; > + count = 4; > + break; > + case PERIPH_ID_UART2: > + bank = &gpio1->a1; > + start = 0; > + count = 4; > + break; > + case PERIPH_ID_UART3: > + bank = &gpio1->a1; > + start = 4; > + count = 2; > + break; > + } > + for (i = start; i < start + count; i++) { > + s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE); > + s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); > + } > +} > + > +static int exynos4_mmc_config(int peripheral, int flags) > +{ > + struct exynos4_gpio_part2 *gpio2 = > + (struct exynos4_gpio_part2 *) samsung_get_base_gpio_part2(); > + struct s5p_gpio_bank *bank, *bank_ext; > + int i, start = 0, gpio_func = 0; > + > + switch (peripheral) { > + case PERIPH_ID_SDMMC0: > + bank = &gpio2->k0; > + bank_ext = &gpio2->k1; > + start = 3; > + gpio_func = GPIO_FUNC(0x2); > + break; > + case PERIPH_ID_SDMMC1: > + bank = &gpio2->k1; > + bank_ext = NULL; > + break; > + case PERIPH_ID_SDMMC2: > + bank = &gpio2->k2; > + bank_ext = &gpio2->k3; > + start = 3; > + gpio_func = GPIO_FUNC(0x3); > + break; > + case PERIPH_ID_SDMMC3: > + bank = &gpio2->k3; > + bank_ext = NULL; > + break; > + } > + if ((flags & PINMUX_FLAG_8BIT_MODE) && !bank_ext) { > + debug("SDMMC device %d does not support 8bit mode", > + peripheral); > + return -1; > + } > + if (flags & PINMUX_FLAG_8BIT_MODE) { > + for (i = start; i <= (start + 3); i++) { > + s5p_gpio_cfg_pin(bank_ext, i, gpio_func); > + s5p_gpio_set_pull(bank_ext, i, GPIO_PULL_UP); > + s5p_gpio_set_drv(bank_ext, i, GPIO_DRV_4X); > + } > + } > + for (i = 0; i < 2; i++) { > + s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); > + s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE); > + s5p_gpio_set_drv(bank, i, G
[U-Boot] [PATCH 3/4] EXYNOS: additional Exynos4 SoC series support
From: Jeong-Hyeon Kim - Fixed MPLL register address It's different between Exynos4210 and Exynos4412. - Added pinmux functions for Exynos4 - Added extended gpios for Exynos4412 Exynos4412 has more gpios than Exynos4210. Signed-off-by: Jeong-Hyeon Kim --- arch/arm/cpu/armv7/exynos/clock.c| 11 ++ arch/arm/cpu/armv7/exynos/pinmux.c | 241 ++ arch/arm/include/asm/arch-exynos/clock.h | 27 arch/arm/include/asm/arch-exynos/cpu.h |4 + arch/arm/include/asm/arch-exynos/gpio.h | 21 +++- 5 files changed, 303 insertions(+), 1 deletions(-) diff --git a/arch/arm/cpu/armv7/exynos/clock.c b/arch/arm/cpu/armv7/exynos/clock.c index 680aeeb..84a6725 100644 --- a/arch/arm/cpu/armv7/exynos/clock.c +++ b/arch/arm/cpu/armv7/exynos/clock.c @@ -79,14 +79,25 @@ static unsigned long exynos4_get_pll_clk(int pllreg) /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */ fout = (m + k / 65536) * (freq / (p * (1 << s))); } else if (pllreg == VPLL) { +#ifdef CONFIG_EXYNOS4210 k = k & 0xfff; /* FOUT = (MDIV + K / 1024) * FIN / (PDIV * 2^SDIV) */ fout = (m + k / 1024) * (freq / (p * (1 << s))); +#else + k = k & 0x; + /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */ + fout = (m + k / 65536) * (freq / (p * (1 << s))); +#endif } else { +#ifdef CONFIG_EXYNOS4210 if (s < 1) s = 1; /* FOUT = MDIV * FIN / (PDIV * 2^(SDIV - 1)) */ fout = m * (freq / (p * (1 << (s - 1; +#else + /* FOUT = MDIV * FIN / (PDIV * 2^SDIV) */ + fout = m * (freq / (p * (1 << s))); +#endif } return fout; diff --git a/arch/arm/cpu/armv7/exynos/pinmux.c b/arch/arm/cpu/armv7/exynos/pinmux.c index 7776add..0746878 100644 --- a/arch/arm/cpu/armv7/exynos/pinmux.c +++ b/arch/arm/cpu/armv7/exynos/pinmux.c @@ -26,6 +26,245 @@ #include #include +static void exynos4_uart_config(int peripheral) +{ + struct exynos4_gpio_part1 *gpio1 = + (struct exynos4_gpio_part1 *) samsung_get_base_gpio_part1(); + struct s5p_gpio_bank *bank; + int i, start, count; + + switch (peripheral) { + case PERIPH_ID_UART0: + bank = &gpio1->a0; + start = 0; + count = 4; + break; + case PERIPH_ID_UART1: + bank = &gpio1->a0; + start = 4; + count = 4; + break; + case PERIPH_ID_UART2: + bank = &gpio1->a1; + start = 0; + count = 4; + break; + case PERIPH_ID_UART3: + bank = &gpio1->a1; + start = 4; + count = 2; + break; + } + for (i = start; i < start + count; i++) { + s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE); + s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); + } +} + +static int exynos4_mmc_config(int peripheral, int flags) +{ + struct exynos4_gpio_part2 *gpio2 = + (struct exynos4_gpio_part2 *) samsung_get_base_gpio_part2(); + struct s5p_gpio_bank *bank, *bank_ext; + int i, start = 0, gpio_func = 0; + + switch (peripheral) { + case PERIPH_ID_SDMMC0: + bank = &gpio2->k0; + bank_ext = &gpio2->k1; + start = 3; + gpio_func = GPIO_FUNC(0x2); + break; + case PERIPH_ID_SDMMC1: + bank = &gpio2->k1; + bank_ext = NULL; + break; + case PERIPH_ID_SDMMC2: + bank = &gpio2->k2; + bank_ext = &gpio2->k3; + start = 3; + gpio_func = GPIO_FUNC(0x3); + break; + case PERIPH_ID_SDMMC3: + bank = &gpio2->k3; + bank_ext = NULL; + break; + } + if ((flags & PINMUX_FLAG_8BIT_MODE) && !bank_ext) { + debug("SDMMC device %d does not support 8bit mode", + peripheral); + return -1; + } + if (flags & PINMUX_FLAG_8BIT_MODE) { + for (i = start; i <= (start + 3); i++) { + s5p_gpio_cfg_pin(bank_ext, i, gpio_func); + s5p_gpio_set_pull(bank_ext, i, GPIO_PULL_UP); + s5p_gpio_set_drv(bank_ext, i, GPIO_DRV_4X); + } + } + for (i = 0; i < 2; i++) { + s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); + s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE); + s5p_gpio_set_drv(bank, i, GPIO_DRV_4X); + } + for (i = 3; i <= 6; i++) { + s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); + s5p_gpio_set_pull(bank, i, GPIO_PULL_UP); + s5p_gpio_set_drv(bank, i, GPIO_D