|
@@ -19,6 +19,7 @@
|
|
#include <linux/syscore_ops.h>
|
|
#include <linux/syscore_ops.h>
|
|
|
|
|
|
#include "clk.h"
|
|
#include "clk.h"
|
|
|
|
+#include "clk-cpu.h"
|
|
|
|
|
|
/* Exynos4 clock controller register offsets */
|
|
/* Exynos4 clock controller register offsets */
|
|
#define SRC_LEFTBUS 0x4200
|
|
#define SRC_LEFTBUS 0x4200
|
|
@@ -534,7 +535,8 @@ static struct samsung_fixed_factor_clock exynos4x12_fixed_factor_clks[] __initda
|
|
/* list of mux clocks supported in all exynos4 soc's */
|
|
/* list of mux clocks supported in all exynos4 soc's */
|
|
static struct samsung_mux_clock exynos4_mux_clks[] __initdata = {
|
|
static struct samsung_mux_clock exynos4_mux_clks[] __initdata = {
|
|
MUX_FA(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1,
|
|
MUX_FA(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1,
|
|
- CLK_SET_RATE_PARENT, 0, "mout_apll"),
|
|
|
|
|
|
+ CLK_SET_RATE_PARENT | CLK_RECALC_NEW_RATES, 0,
|
|
|
|
+ "mout_apll"),
|
|
MUX(CLK_MOUT_HDMI, "mout_hdmi", mout_hdmi_p, SRC_TV, 0, 1),
|
|
MUX(CLK_MOUT_HDMI, "mout_hdmi", mout_hdmi_p, SRC_TV, 0, 1),
|
|
MUX(0, "mout_mfc1", sclk_evpll_p, SRC_MFC, 4, 1),
|
|
MUX(0, "mout_mfc1", sclk_evpll_p, SRC_MFC, 4, 1),
|
|
MUX(0, "mout_mfc", mout_mfc_p, SRC_MFC, 8, 1),
|
|
MUX(0, "mout_mfc", mout_mfc_p, SRC_MFC, 8, 1),
|
|
@@ -1378,6 +1380,22 @@ static void __init exynos4x12_core_down_clock(void)
|
|
__raw_writel(0x0, reg_base + E4X12_PWR_CTRL2);
|
|
__raw_writel(0x0, reg_base + E4X12_PWR_CTRL2);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#define E4210_CPU_DIV0(apll, pclk_dbg, atb, periph, corem1, corem0) \
|
|
|
|
+ (((apll) << 24) | ((pclk_dbg) << 20) | ((atb) << 16) | \
|
|
|
|
+ ((periph) << 12) | ((corem1) << 8) | ((corem0) << 4))
|
|
|
|
+#define E4210_CPU_DIV1(hpm, copy) \
|
|
|
|
+ (((hpm) << 4) | ((copy) << 0))
|
|
|
|
+
|
|
|
|
+static const struct exynos_cpuclk_cfg_data e4210_armclk_d[] __initconst = {
|
|
|
|
+ { 1200000, E4210_CPU_DIV0(7, 1, 4, 3, 7, 3), E4210_CPU_DIV1(0, 5), },
|
|
|
|
+ { 1000000, E4210_CPU_DIV0(7, 1, 4, 3, 7, 3), E4210_CPU_DIV1(0, 4), },
|
|
|
|
+ { 800000, E4210_CPU_DIV0(7, 1, 3, 3, 7, 3), E4210_CPU_DIV1(0, 3), },
|
|
|
|
+ { 500000, E4210_CPU_DIV0(7, 1, 3, 3, 7, 3), E4210_CPU_DIV1(0, 3), },
|
|
|
|
+ { 400000, E4210_CPU_DIV0(7, 1, 3, 3, 7, 3), E4210_CPU_DIV1(0, 3), },
|
|
|
|
+ { 200000, E4210_CPU_DIV0(0, 1, 1, 1, 3, 1), E4210_CPU_DIV1(0, 3), },
|
|
|
|
+ { 0 },
|
|
|
|
+};
|
|
|
|
+
|
|
/* register exynos4 clocks */
|
|
/* register exynos4 clocks */
|
|
static void __init exynos4_clk_init(struct device_node *np,
|
|
static void __init exynos4_clk_init(struct device_node *np,
|
|
enum exynos4_soc soc)
|
|
enum exynos4_soc soc)
|
|
@@ -1455,6 +1473,10 @@ static void __init exynos4_clk_init(struct device_node *np,
|
|
samsung_clk_register_fixed_factor(ctx,
|
|
samsung_clk_register_fixed_factor(ctx,
|
|
exynos4210_fixed_factor_clks,
|
|
exynos4210_fixed_factor_clks,
|
|
ARRAY_SIZE(exynos4210_fixed_factor_clks));
|
|
ARRAY_SIZE(exynos4210_fixed_factor_clks));
|
|
|
|
+ exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk",
|
|
|
|
+ mout_core_p4210[0], mout_core_p4210[1], 0x14200,
|
|
|
|
+ e4210_armclk_d, ARRAY_SIZE(e4210_armclk_d),
|
|
|
|
+ CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1);
|
|
} else {
|
|
} else {
|
|
samsung_clk_register_mux(ctx, exynos4x12_mux_clks,
|
|
samsung_clk_register_mux(ctx, exynos4x12_mux_clks,
|
|
ARRAY_SIZE(exynos4x12_mux_clks));
|
|
ARRAY_SIZE(exynos4x12_mux_clks));
|