ARM: tegra: clock: Update LP-cluster related interfaces
Alex Frid [Wed, 29 Dec 2010 19:30:52 +0000 (11:30 -0800)]
Original-Change-Id: Ifde476a05bd01cdce8c3f4802b268a193a832a1b
Reviewed-on: http://git-master/r/14584
Reviewed-by: Aleksandr Frid <afrid@nvidia.com>
Tested-by: Aleksandr Frid <afrid@nvidia.com>
Reviewed-by: Scott Williams <scwilliams@nvidia.com>
Original-Change-Id: I41204d17c5d8092b1a24b3138efe12cfbd16d7e7

Rebase-Id: R9754ff5e07ecabd945edfccdbc0f9d9586be6e23

arch/arm/mach-tegra/clock.c
arch/arm/mach-tegra/pm-t3.c
arch/arm/mach-tegra/pm.h

index 49f3dfc..920b731 100644 (file)
@@ -119,6 +119,14 @@ static unsigned long clk_predict_rate_from_parent(struct clk *c, struct clk *p)
        return rate;
 }
 
+static unsigned long clk_get_max_rate(struct clk *c)
+{
+       if (c->ops && c->ops->get_max_rate)
+               return c->ops->get_max_rate(c);
+       else
+               return c->max_rate;
+}
+
 /* Must be called with clk_lock(c) held */
 unsigned long clk_get_rate_locked(struct clk *c)
 {
@@ -323,9 +331,7 @@ int clk_set_rate_locked(struct clk *c, unsigned long rate)
 
        old_rate = clk_get_rate_locked(c);
 
-       max_rate = c->max_rate;
-       if (c->ops && c->ops->get_max_rate)
-               max_rate = c->ops->get_max_rate(c);
+       max_rate = clk_get_max_rate(c);
        if (rate > max_rate)
                rate = max_rate;
 
@@ -412,9 +418,7 @@ long clk_round_rate(struct clk *c, unsigned long rate)
                goto out;
        }
 
-       max_rate = c->max_rate;
-       if (c->ops && c->ops->get_max_rate)
-               max_rate = c->ops->get_max_rate(c);
+       max_rate = clk_get_max_rate(c);
        if (rate > max_rate)
                rate = max_rate;
 
@@ -696,10 +700,7 @@ static void clock_tree_show_one(struct seq_file *s, struct clk *c, int level)
        const char *state = "uninit";
        char div[8] = {0};
        unsigned long rate = clk_get_rate_all_locked(c);
-       unsigned long max_rate = c->max_rate;
-
-       if (c->ops && c->ops->get_max_rate)
-               max_rate = c->ops->get_max_rate(c);
+       unsigned long max_rate = clk_get_max_rate(c);;
 
        if (c->state == ON)
                state = "on";
index 4492ac2..5798c09 100644 (file)
@@ -174,9 +174,10 @@ static int cluster_switch_prolog_clock(unsigned int flags)
 
                        struct clk *c = tegra_get_clock_by_name("cpu");
                        unsigned long cur_rate = clk_get_rate(c);
-                       unsigned long max_rate = clk_get_rate(c); /* !!!FIXME!!! clk_alt_max_rate(c); */
+                       unsigned long max_rate = tegra_get_lpcpu_max_rate();
                        int err;
 
+                       BUG_ON(max_rate == 0);
                        if (cur_rate/2 > max_rate) {
                                /* PLLX is running too fast for the LP CPU.
                                   Reduce it to LP maximum rate which must
index e892d9f..f1164ad 100644 (file)
@@ -76,11 +76,14 @@ static inline int tegra_cluster_control(unsigned int us, unsigned int flags)
 #define tegra_cluster_switch_epilog(flags) do {} while(0)
 static inline unsigned int is_lp_cluster(void)
 { return 0; }
+static inline unsigned long tegra_get_lpcpu_max_rate(void)
+{ return 0; }
 #else
 int tegra_cluster_control(unsigned int us, unsigned int flags);
 void tegra_cluster_switch_prolog(unsigned int flags);
 void tegra_cluster_switch_epilog(unsigned int flags);
 unsigned int is_lp_cluster(void);
+unsigned long tegra_get_lpcpu_max_rate(void);
 #endif
 
 #endif /* _MACH_TEGRA_SUSPEND_H_ */