[U-Boot] [PATCH 1/4] EXYNOS: MSHCI: Add clock for EXYNOS5
Rajeshwari Shinde
rajeshwari.s at samsung.com
Fri May 25 13:53:15 CEST 2012
Add apis to set and get divider clock ratio for FSYS_BLK
on EXYNOS5.
Signed-off-by: Terry Lambert <tlambert at chromium.org>
Signed-off-by: Alim Akhtar <alim.akhtar at samsung.com>
Signed-off-by: Rajeshwari Shinde <rajeshwari.s at samsung.com>
---
arch/arm/cpu/armv7/exynos/clock.c | 96 ++++++++++++++++++++++++++++++++
arch/arm/include/asm/arch-exynos/clk.h | 4 +
2 files changed, 100 insertions(+), 0 deletions(-)
diff --git a/arch/arm/cpu/armv7/exynos/clock.c b/arch/arm/cpu/armv7/exynos/clock.c
index 3b86b0c..3af1aac 100644
--- a/arch/arm/cpu/armv7/exynos/clock.c
+++ b/arch/arm/cpu/armv7/exynos/clock.c
@@ -414,6 +414,90 @@ static void exynos5_set_mmc_clk(int dev_index, unsigned int div)
writel(val, addr);
}
+static unsigned long exynos5_get_mshci_clk_div(enum periph_id peripheral)
+{
+ struct exynos5_clock *clk =
+ (struct exynos5_clock *)samsung_get_base_clock();
+ u32 *addr;
+ unsigned int div_mmc, div_mmc_pre;
+ unsigned int mpll_clock, sclk_mmc;
+
+ mpll_clock = get_pll_clk(MPLL);
+
+ /*
+ * CLK_DIV_FSYS1
+ * MMC0_PRE_RATIO [15:8], MMC0_RATIO [3:0]
+ * CLK_DIV_FSYS2
+ * MMC2_PRE_RATIO [15:8], MMC2_RATIO [3:0]
+ * CLK_DIV_FSYS3
+ * MMC4_PRE_RATIO [15:8], MMC4_RATIO [3:0]
+ */
+ switch (peripheral) {
+ case PERIPH_ID_SDMMC0:
+ addr = &clk->div_fsys1;
+ break;
+ case PERIPH_ID_SDMMC2:
+ addr = &clk->div_fsys2;
+ break;
+ case PERIPH_ID_SDMMC4:
+ addr = &clk->div_fsys3;
+ break;
+ default:
+ debug("invalid peripheral\n");
+ return -1;
+ }
+
+ div_mmc = (readl(addr) & 0xf) + 1;
+ div_mmc_pre = ((readl(addr) & 0xff00) >> 8) + 1;
+ sclk_mmc = (mpll_clock / div_mmc) / div_mmc_pre;
+
+ return sclk_mmc;
+}
+
+static int exynos5_set_mshci_clk_div(enum periph_id peripheral)
+{
+ struct exynos5_clock *clk =
+ (struct exynos5_clock *)samsung_get_base_clock();
+ u32 *addr;
+ unsigned int clock;
+ unsigned int tmp;
+ unsigned int i;
+
+ /* get mpll clock */
+ clock = get_pll_clk(MPLL) / 1000000;
+
+ /*
+ * CLK_DIV_FSYS1
+ * MMC0_PRE_RATIO [15:8], MMC0_RATIO [3:0]
+ * CLK_DIV_FSYS2
+ * MMC2_PRE_RATIO [15:8], MMC2_RATIO [3:0]
+ * CLK_DIV_FSYS3
+ * MMC4_PRE_RATIO [15:8], MMC4_RATIO [3:0]
+ */
+ switch (peripheral) {
+ case PERIPH_ID_SDMMC0:
+ addr = &clk->div_fsys1;
+ break;
+ case PERIPH_ID_SDMMC2:
+ addr = &clk->div_fsys2;
+ break;
+ case PERIPH_ID_SDMMC4:
+ addr = &clk->div_fsys3;
+ break;
+ default:
+ debug("invalid peripheral\n");
+ return -1;
+ }
+ tmp = readl(addr) & ~0xff0f;
+ for (i = 0; i <= 0xf; i++) {
+ if ((clock / (i + 1)) <= 400) {
+ writel(tmp | i << 0, addr);
+ break;
+ }
+ }
+ return 0;
+}
+
/* get_lcd_clk: return lcd clock frequency */
static unsigned long exynos4_get_lcd_clk(void)
{
@@ -651,6 +735,18 @@ void set_mmc_clk(int dev_index, unsigned int div)
exynos4_set_mmc_clk(dev_index, div);
}
+unsigned long get_mshci_clk_div(enum periph_id peripheral)
+{
+ if (cpu_is_exynos5())
+ return exynos5_get_mshci_clk_div(peripheral);
+}
+
+int set_mshci_clk_div(enum periph_id peripheral)
+{
+ if (cpu_is_exynos5())
+ return exynos5_set_mshci_clk_div(peripheral);
+}
+
unsigned long get_lcd_clk(void)
{
if (cpu_is_exynos4())
diff --git a/arch/arm/include/asm/arch-exynos/clk.h b/arch/arm/include/asm/arch-exynos/clk.h
index 72dc655..4a6fa90 100644
--- a/arch/arm/include/asm/arch-exynos/clk.h
+++ b/arch/arm/include/asm/arch-exynos/clk.h
@@ -22,6 +22,8 @@
#ifndef __ASM_ARM_ARCH_CLK_H_
#define __ASM_ARM_ARCH_CLK_H_
+#include <asm/arch/pinmux.h>
+
#define APLL 0
#define MPLL 1
#define EPLL 2
@@ -34,6 +36,8 @@ unsigned long get_i2c_clk(void);
unsigned long get_pwm_clk(void);
unsigned long get_uart_clk(int dev_index);
void set_mmc_clk(int dev_index, unsigned int div);
+unsigned long get_mshci_clk_div(enum periph_id peripheral);
+int set_mshci_clk_div(enum periph_id peripheral);
unsigned long get_lcd_clk(void);
void set_lcd_clk(void);
void set_mipi_clk(void);
--
1.7.4.4
More information about the U-Boot
mailing list