ARM: tegra: clock: Update emc monitor preset mechanism
Alex Frid [Tue, 9 Apr 2013 05:07:24 +0000 (22:07 -0700)]
- Allowed per-SoC code to select emc monitor preset rate.
For now, rounded down boot rate is used as monitor preset rate
(round down to not over-clock on boot).

- Skipped emc clock update when monitor preset rate is set, but not
yet enabled (to avoid temporary dip in EMC rate). EMC rate is updated
only when monitor preset is enabled.

- Preset EMC monitor rate after iso usage table is initialized.

Change-Id: I3a1407b8523596a7823a7c5398f5c1a03b4c3206
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/219504
(cherry picked from commit 9279fd450cba7c8012a405755d483dfc9b502941)
Reviewed-on: http://git-master/r/241242
Reviewed-by: Harshada Kale <hkale@nvidia.com>
Tested-by: Harshada Kale <hkale@nvidia.com>

arch/arm/mach-tegra/clock.c
arch/arm/mach-tegra/clock.h
arch/arm/mach-tegra/tegra11_emc.c

index 8c1c4bf..7e0428d 100644 (file)
@@ -858,12 +858,12 @@ void tegra_init_max_rate(struct clk *c, unsigned long max_rate)
 }
 
 /* Use boot rate as emc monitor output until actual monitoring starts */
-void __init tegra_clk_preset_emc_monitor(void)
+void __init tegra_clk_preset_emc_monitor(unsigned long rate)
 {
        struct clk *c = tegra_get_clock_by_name("mon.emc");
 
        if (c) {
-               clk_set_rate(c, c->boot_rate);
+               c->u.shared_bus_user.rate = rate;
                clk_enable(c);
        }
 }
index a6bf248..d4dcbb8 100644 (file)
@@ -275,7 +275,7 @@ void tegra11x_init_clocks(void);
 void tegra11x_clk_init_la(void);
 void tegra_common_init_clock(void);
 void tegra_init_max_rate(struct clk *c, unsigned long max_rate);
-void tegra_clk_preset_emc_monitor(void);
+void tegra_clk_preset_emc_monitor(unsigned long rate);
 void tegra_clk_verify_parents(void);
 void clk_init(struct clk *clk);
 struct clk *tegra_get_clock_by_name(const char *name);
index 4649346..c8a007b 100644 (file)
@@ -1494,7 +1494,6 @@ int __init tegra11_emc_init(void)
 {
        int ret = platform_driver_register(&tegra11_emc_driver);
        if (!ret) {
-               tegra_clk_preset_emc_monitor();
                if (dram_type == DRAM_TYPE_LPDDR2)
                        tegra_emc_iso_usage_table_init(
                                tegra11_lpddr3_emc_iso_usage,
@@ -1503,6 +1502,13 @@ int __init tegra11_emc_init(void)
                        tegra_emc_iso_usage_table_init(
                                tegra11_ddr3_emc_iso_usage,
                                ARRAY_SIZE(tegra11_ddr3_emc_iso_usage));
+
+               if (emc_enable) {
+                       unsigned long rate = tegra_emc_round_rate_updown(
+                               emc->boot_rate, false);
+                       if (!IS_ERR_VALUE(rate))
+                               tegra_clk_preset_emc_monitor(rate);
+               }
        }
        return ret;
 }