]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
S5P: add set_mmc_clk for external clock control
authorJaehoon Chung <jh80.chung@samsung.com>
Tue, 17 May 2011 21:19:17 +0000 (21:19 +0000)
committerMinkyu Kang <mk7.kang@samsung.com>
Thu, 26 May 2011 10:33:09 +0000 (19:33 +0900)
This patch added set_mmc_clk for external clock control.

c210 didn't support host clock control.
So We need external_clock_control function for c210.

Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
arch/arm/cpu/armv7/s5pc1xx/clock.c
arch/arm/cpu/armv7/s5pc2xx/clock.c
arch/arm/include/asm/arch-s5pc1xx/clk.h
arch/arm/include/asm/arch-s5pc1xx/mmc.h
arch/arm/include/asm/arch-s5pc2xx/clk.h
arch/arm/include/asm/arch-s5pc2xx/mmc.h
drivers/mmc/s5p_mmc.c

index e92647cdfc0d22efd36e2f98ce900098ba035e7f..1c87e8f8cd666e082e6aa8062aa90c1b9f33022a 100644 (file)
@@ -336,3 +336,8 @@ unsigned long get_uart_clk(int dev_index)
 {
        return s5pc1xx_get_uart_clk(dev_index);
 }
 {
        return s5pc1xx_get_uart_clk(dev_index);
 }
+
+void set_mmc_clk(int dev_index, unsigned int div)
+{
+       /* Do NOTHING */
+}
index 450a6304860ef8baba8ec6b1010c7393f76b1238..624de6257c268d753156353f8a60d9b8b63939e0 100644 (file)
@@ -199,6 +199,33 @@ static unsigned long s5pc210_get_uart_clk(int dev_index)
        return uclk;
 }
 
        return uclk;
 }
 
+/* s5pc210: set the mmc clock */
+static void s5pc210_set_mmc_clk(int dev_index, unsigned int div)
+{
+       struct s5pc210_clock *clk =
+               (struct s5pc210_clock *)samsung_get_base_clock();
+       unsigned int addr;
+       unsigned int val;
+
+       /*
+        * CLK_DIV_FSYS1
+        * MMC0_PRE_RATIO [15:8], MMC1_PRE_RATIO [31:24]
+        * CLK_DIV_FSYS2
+        * MMC2_PRE_RATIO [15:8], MMC3_PRE_RATIO [31:24]
+        */
+       if (dev_index < 2) {
+               addr = (unsigned int)&clk->div_fsys1;
+       } else {
+               addr = (unsigned int)&clk->div_fsys2;
+               dev_index -= 2;
+       }
+
+       val = readl(addr);
+       val &= ~(0xff << ((dev_index << 4) + 8));
+       val |= (div & 0xff) << ((dev_index << 4) + 8);
+       writel(val, addr);
+}
+
 unsigned long get_pll_clk(int pllreg)
 {
        return s5pc210_get_pll_clk(pllreg);
 unsigned long get_pll_clk(int pllreg)
 {
        return s5pc210_get_pll_clk(pllreg);
@@ -218,3 +245,8 @@ unsigned long get_uart_clk(int dev_index)
 {
        return s5pc210_get_uart_clk(dev_index);
 }
 {
        return s5pc210_get_uart_clk(dev_index);
 }
+
+void set_mmc_clk(int dev_index, unsigned int div)
+{
+       s5pc210_set_mmc_clk(dev_index, div);
+}
index 4c389c1fc536a336daaecf496580c4151d827647..692dfe0633d031be349933431fe57db254dcd75f 100644 (file)
@@ -33,5 +33,6 @@ unsigned long get_pll_clk(int pllreg);
 unsigned long get_arm_clk(void);
 unsigned long get_pwm_clk(void);
 unsigned long get_uart_clk(int dev_index);
 unsigned long get_arm_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);
 
 #endif
 
 #endif
index d458d3bb8ef230e823fd2e522640d8df7922f776..adef4ee21dbd9eb08e3da470a5b37b3b74d3adc2 100644 (file)
@@ -64,6 +64,7 @@ struct mmc_host {
        struct s5p_mmc *reg;
        unsigned int version;   /* SDHCI spec. version */
        unsigned int clock;     /* Current clock (MHz) */
        struct s5p_mmc *reg;
        unsigned int version;   /* SDHCI spec. version */
        unsigned int clock;     /* Current clock (MHz) */
+       int dev_index;
 };
 
 int s5p_mmc_init(int dev_index, int bus_width);
 };
 
 int s5p_mmc_init(int dev_index, int bus_width);
index 5a1cdf15104464a9bc99a605fabdaf14e12d4210..ff0f6415d8b4082d9b0d5b8f9de3cd92fcdffe80 100644 (file)
@@ -32,5 +32,6 @@ unsigned long get_pll_clk(int pllreg);
 unsigned long get_arm_clk(void);
 unsigned long get_pwm_clk(void);
 unsigned long get_uart_clk(int dev_index);
 unsigned long get_arm_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);
 
 #endif
 
 #endif
index 04827cad759550b6490aa301e4992047645fd2b4..30f82b8aaf6370051e135e719ee661d63961babd 100644 (file)
@@ -64,6 +64,7 @@ struct mmc_host {
        struct s5p_mmc *reg;
        unsigned int version;   /* SDHCI spec. version */
        unsigned int clock;     /* Current clock (MHz) */
        struct s5p_mmc *reg;
        unsigned int version;   /* SDHCI spec. version */
        unsigned int clock;     /* Current clock (MHz) */
+       int dev_index;
 };
 
 int s5p_mmc_init(int dev_index, int bus_width);
 };
 
 int s5p_mmc_init(int dev_index, int bus_width);
index 86447e05bd833708d7ac43d212440b796053cbe1..280738fbf4eb191e2fe4ae29239c053214bda451 100644 (file)
@@ -22,6 +22,7 @@
 #include <mmc.h>
 #include <asm/io.h>
 #include <asm/arch/mmc.h>
 #include <mmc.h>
 #include <asm/io.h>
 #include <asm/arch/mmc.h>
+#include <asm/arch/clk.h>
 
 /* support 4 mmc hosts */
 struct mmc mmc_dev[4];
 
 /* support 4 mmc hosts */
 struct mmc mmc_dev[4];
@@ -291,6 +292,8 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
        clk = (div << 8) | (1 << 0);
        writew(clk, &host->reg->clkcon);
 
        clk = (div << 8) | (1 << 0);
        writew(clk, &host->reg->clkcon);
 
+       set_mmc_clk(host->dev_index, div);
+
        /* Wait max 10 ms */
        timeout = 10;
        while (!(readw(&host->reg->clkcon) & (1 << 1))) {
        /* Wait max 10 ms */
        timeout = 10;
        while (!(readw(&host->reg->clkcon) & (1 << 1))) {
@@ -464,6 +467,7 @@ static int s5p_mmc_initialize(int dev_index, int bus_width)
        mmc->f_min = 400000;
        mmc->f_max = 52000000;
 
        mmc->f_min = 400000;
        mmc->f_max = 52000000;
 
+       mmc_host[dev_index].dev_index = dev_index;
        mmc_host[dev_index].clock = 0;
        mmc_host[dev_index].reg = s5p_get_base_mmc(dev_index);
        mmc->b_max = 0;
        mmc_host[dev_index].clock = 0;
        mmc_host[dev_index].reg = s5p_get_base_mmc(dev_index);
        mmc->b_max = 0;