Commit d4b34c6c authored by Seungwhan Youn's avatar Seungwhan Youn Committed by Kukjin Kim

ARM: S5P: Reduce duplicated EPLL control codes

S5P Samsung SoCs has a EPLL to support various PLL clock sources for other
H/W blocks. Until now, to control EPLL, each of SoCs make their own functions
in 'mach-s5pxxx/clock.c'. But some of functions, 'xxx_epll_get_rate()' and
'xxx_epll_enable()', are exactly same in all S5P SoCs, so this patch move
these duplicated codes to common EPLL functions that use platform wide.
Signed-off-by: default avatarSeungwhan Youn <sw.youn@samsung.com>
Acked-by: default avatarJassi Brar <jassi.brar@samsung.com>
Signed-off-by: default avatarKukjin Kim <kgene.kim@samsung.com>
parent 900fa019
...@@ -85,7 +85,7 @@ static int s5p6440_epll_set_rate(struct clk *clk, unsigned long rate) ...@@ -85,7 +85,7 @@ static int s5p6440_epll_set_rate(struct clk *clk, unsigned long rate)
} }
static struct clk_ops s5p6440_epll_ops = { static struct clk_ops s5p6440_epll_ops = {
.get_rate = s5p64x0_epll_get_rate, .get_rate = s5p_epll_get_rate,
.set_rate = s5p6440_epll_set_rate, .set_rate = s5p6440_epll_set_rate,
}; };
...@@ -548,7 +548,7 @@ void __init_or_cpufreq s5p6440_setup_clocks(void) ...@@ -548,7 +548,7 @@ void __init_or_cpufreq s5p6440_setup_clocks(void)
/* Set S5P6440 functions for clk_fout_epll */ /* Set S5P6440 functions for clk_fout_epll */
clk_fout_epll.enable = s5p64x0_epll_enable; clk_fout_epll.enable = s5p_epll_enable;
clk_fout_epll.ops = &s5p6440_epll_ops; clk_fout_epll.ops = &s5p6440_epll_ops;
clk_48m.enable = s5p64x0_clk48m_ctrl; clk_48m.enable = s5p64x0_clk48m_ctrl;
......
...@@ -86,7 +86,7 @@ static int s5p6450_epll_set_rate(struct clk *clk, unsigned long rate) ...@@ -86,7 +86,7 @@ static int s5p6450_epll_set_rate(struct clk *clk, unsigned long rate)
} }
static struct clk_ops s5p6450_epll_ops = { static struct clk_ops s5p6450_epll_ops = {
.get_rate = s5p64x0_epll_get_rate, .get_rate = s5p_epll_get_rate,
.set_rate = s5p6450_epll_set_rate, .set_rate = s5p6450_epll_set_rate,
}; };
...@@ -581,7 +581,7 @@ void __init_or_cpufreq s5p6450_setup_clocks(void) ...@@ -581,7 +581,7 @@ void __init_or_cpufreq s5p6450_setup_clocks(void)
/* Set S5P6450 functions for clk_fout_epll */ /* Set S5P6450 functions for clk_fout_epll */
clk_fout_epll.enable = s5p64x0_epll_enable; clk_fout_epll.enable = s5p_epll_enable;
clk_fout_epll.ops = &s5p6450_epll_ops; clk_fout_epll.ops = &s5p6450_epll_ops;
clk_48m.enable = s5p64x0_clk48m_ctrl; clk_48m.enable = s5p64x0_clk48m_ctrl;
......
...@@ -73,24 +73,6 @@ static const u32 clock_table[][3] = { ...@@ -73,24 +73,6 @@ static const u32 clock_table[][3] = {
{L2 * 1000, (3 << ARM_DIV_RATIO_SHIFT), (0 << S5P64X0_CLKDIV0_HCLK_SHIFT)}, {L2 * 1000, (3 << ARM_DIV_RATIO_SHIFT), (0 << S5P64X0_CLKDIV0_HCLK_SHIFT)},
}; };
int s5p64x0_epll_enable(struct clk *clk, int enable)
{
unsigned int ctrlbit = clk->ctrlbit;
unsigned int epll_con = __raw_readl(S5P64X0_EPLL_CON) & ~ctrlbit;
if (enable)
__raw_writel(epll_con | ctrlbit, S5P64X0_EPLL_CON);
else
__raw_writel(epll_con, S5P64X0_EPLL_CON);
return 0;
}
unsigned long s5p64x0_epll_get_rate(struct clk *clk)
{
return clk->rate;
}
unsigned long s5p64x0_armclk_get_rate(struct clk *clk) unsigned long s5p64x0_armclk_get_rate(struct clk *clk)
{ {
unsigned long rate = clk_get_rate(clk->parent); unsigned long rate = clk_get_rate(clk->parent);
......
...@@ -60,4 +60,6 @@ ...@@ -60,4 +60,6 @@
#define ARM_DIV_RATIO_SHIFT 0 #define ARM_DIV_RATIO_SHIFT 0
#define ARM_DIV_MASK (0xF << ARM_DIV_RATIO_SHIFT) #define ARM_DIV_MASK (0xF << ARM_DIV_RATIO_SHIFT)
#define S5P_EPLL_CON S5P64X0_EPLL_CON
#endif /* __ASM_ARCH_REGS_CLOCK_H */ #endif /* __ASM_ARCH_REGS_CLOCK_H */
...@@ -273,24 +273,6 @@ static struct clksrc_clk clk_div_hdmi = { ...@@ -273,24 +273,6 @@ static struct clksrc_clk clk_div_hdmi = {
.reg_div = { .reg = S5P_CLK_DIV3, .shift = 28, .size = 4 }, .reg_div = { .reg = S5P_CLK_DIV3, .shift = 28, .size = 4 },
}; };
static int s5pc100_epll_enable(struct clk *clk, int enable)
{
unsigned int ctrlbit = clk->ctrlbit;
unsigned int epll_con = __raw_readl(S5P_EPLL_CON) & ~ctrlbit;
if (enable)
__raw_writel(epll_con | ctrlbit, S5P_EPLL_CON);
else
__raw_writel(epll_con, S5P_EPLL_CON);
return 0;
}
static unsigned long s5pc100_epll_get_rate(struct clk *clk)
{
return clk->rate;
}
static u32 epll_div[][4] = { static u32 epll_div[][4] = {
{ 32750000, 131, 3, 4 }, { 32750000, 131, 3, 4 },
{ 32768000, 131, 3, 4 }, { 32768000, 131, 3, 4 },
...@@ -347,7 +329,7 @@ static int s5pc100_epll_set_rate(struct clk *clk, unsigned long rate) ...@@ -347,7 +329,7 @@ static int s5pc100_epll_set_rate(struct clk *clk, unsigned long rate)
} }
static struct clk_ops s5pc100_epll_ops = { static struct clk_ops s5pc100_epll_ops = {
.get_rate = s5pc100_epll_get_rate, .get_rate = s5p_epll_get_rate,
.set_rate = s5pc100_epll_set_rate, .set_rate = s5pc100_epll_set_rate,
}; };
...@@ -1261,7 +1243,7 @@ void __init_or_cpufreq s5pc100_setup_clocks(void) ...@@ -1261,7 +1243,7 @@ void __init_or_cpufreq s5pc100_setup_clocks(void)
unsigned int ptr; unsigned int ptr;
/* Set S5PC100 functions for clk_fout_epll */ /* Set S5PC100 functions for clk_fout_epll */
clk_fout_epll.enable = s5pc100_epll_enable; clk_fout_epll.enable = s5p_epll_enable;
clk_fout_epll.ops = &s5pc100_epll_ops; clk_fout_epll.ops = &s5pc100_epll_ops;
printk(KERN_DEBUG "%s: registering clocks\n", __func__); printk(KERN_DEBUG "%s: registering clocks\n", __func__);
......
...@@ -84,4 +84,8 @@ ...@@ -84,4 +84,8 @@
#define S5P_CLKGATE_SCLKCPU S5P_CLKREG(0x14800) #define S5P_CLKGATE_SCLKCPU S5P_CLKREG(0x14800)
/* Compatibility defines */
#define S5P_EPLL_CON S5P_EPLL_CON0
#endif /* __ASM_ARCH_REGS_CLOCK_H */ #endif /* __ASM_ARCH_REGS_CLOCK_H */
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include <linux/io.h> #include <linux/io.h>
#include <asm/div64.h> #include <asm/div64.h>
#include <mach/regs-clock.h>
#include <plat/clock.h> #include <plat/clock.h>
#include <plat/clock-clksrc.h> #include <plat/clock-clksrc.h>
#include <plat/s5p-clock.h> #include <plat/s5p-clock.h>
...@@ -148,6 +150,24 @@ int s5p_gatectrl(void __iomem *reg, struct clk *clk, int enable) ...@@ -148,6 +150,24 @@ int s5p_gatectrl(void __iomem *reg, struct clk *clk, int enable)
return 0; return 0;
} }
int s5p_epll_enable(struct clk *clk, int enable)
{
unsigned int ctrlbit = clk->ctrlbit;
unsigned int epll_con = __raw_readl(S5P_EPLL_CON) & ~ctrlbit;
if (enable)
__raw_writel(epll_con | ctrlbit, S5P_EPLL_CON);
else
__raw_writel(epll_con, S5P_EPLL_CON);
return 0;
}
unsigned long s5p_epll_get_rate(struct clk *clk)
{
return clk->rate;
}
static struct clk *s5p_clks[] __initdata = { static struct clk *s5p_clks[] __initdata = {
&clk_ext_xtal_mux, &clk_ext_xtal_mux,
&clk_48m, &clk_48m,
......
...@@ -43,4 +43,8 @@ extern struct clksrc_sources clk_src_dpll; ...@@ -43,4 +43,8 @@ extern struct clksrc_sources clk_src_dpll;
extern int s5p_gatectrl(void __iomem *reg, struct clk *clk, int enable); extern int s5p_gatectrl(void __iomem *reg, struct clk *clk, int enable);
/* Common EPLL operations for S5P platform */
extern int s5p_epll_enable(struct clk *clk, int enable);
extern unsigned long s5p_epll_get_rate(struct clk *clk);
#endif /* __ASM_PLAT_S5P_CLOCK_H */ #endif /* __ASM_PLAT_S5P_CLOCK_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment