Message ID | 1337946798-1660-2-git-send-email-rajeshwari.s@samsung.com |
---|---|
State | New |
Headers | show |
Hi Rajeshwari, On Fri, May 25, 2012 at 4:53 AM, Rajeshwari Shinde <rajeshwari.s@samsung.com > wrote: > Add apis to set and get divider clock ratio for FSYS_BLK > on EXYNOS5. > > Signed-off-by: Terry Lambert <tlambert@chromium.org> > Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com> > Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com> > Acked-by: Simon Glass <sjg@chromium.org> I have a few suggestions but I realise that most of these are things that will change as you collect more patches. So if you like it is fine with me as is. > --- > 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) > Would it be better to have a consistent clock_ prefix on all the functions here. Then people can see the function in the code and know what .h and .c file to look in. > +{ > + 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> > Do you need this here? Maybe periph.h instead? Or just 'enum periph_id' somewhere? > + > #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); > It would be nice to properly comment all these function. > +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 > > Regards, Simon
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);