summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/tegra11_emc.c
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2012-12-08 22:39:09 -0800
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-12-18 05:32:58 -0800
commit2c01ded0b761aa1a5438e63adae1e9e7b947add9 (patch)
treea03416928a75bcdef3f863ab6be44fb369103c79 /arch/arm/mach-tegra/tegra11_emc.c
parent6befd012cb0e3fdb42e9a89b0bdfcc415dc594ba (diff)
ARM: tegra11: clock: Optimize traversing EMC DFS table
Used last rounded EMC DFS table index to skip unnecessary looping through the table. Bug 1188643 Change-Id: I0dad723f2f6f58258fd79e33d95d7502ff0abf67 Signed-off-by: Alex Frid <afrid@nvidia.com> Reviewed-on: http://git-master/r/170605 (cherry picked from commit 2bf683002839bbeab704e72601956eccf09f4a05) Reviewed-on: http://git-master/r/171626 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/tegra11_emc.c')
-rw-r--r--arch/arm/mach-tegra/tegra11_emc.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/arch/arm/mach-tegra/tegra11_emc.c b/arch/arm/mach-tegra/tegra11_emc.c
index 9d095bdca982..726bca92c726 100644
--- a/arch/arm/mach-tegra/tegra11_emc.c
+++ b/arch/arm/mach-tegra/tegra11_emc.c
@@ -315,6 +315,14 @@ static inline void ccfifo_writel(u32 val, unsigned long addr)
writel(addr, (u32)emc_base + EMC_CCFIFO_ADDR);
}
+static int last_round_idx;
+static inline int get_start_idx(unsigned long rate)
+{
+ if (tegra_emc_table[last_round_idx].rate == rate)
+ return last_round_idx;
+ return 0;
+}
+
static void emc_last_stats_update(int last_sel)
{
unsigned long flags;
@@ -689,7 +697,8 @@ int tegra_emc_set_rate(unsigned long rate)
/* Table entries specify rate in kHz */
rate = rate / 1000;
- for (i = 0; i < tegra_emc_table_size; i++) {
+ i = get_start_idx(rate);
+ for (; i < tegra_emc_table_size; i++) {
if (tegra_emc_clk_sel[i].input == NULL)
continue; /* invalid entry */
@@ -743,13 +752,15 @@ long tegra_emc_round_rate(unsigned long rate)
/* Table entries specify rate in kHz */
rate = rate / 1000;
- for (i = 0; i < tegra_emc_table_size; i++) {
+ i = get_start_idx(rate);
+ for (; i < tegra_emc_table_size; i++) {
if (tegra_emc_clk_sel[i].input == NULL)
continue; /* invalid entry */
if (tegra_emc_table[i].rate >= rate) {
pr_debug("%s: using %lu\n",
__func__, tegra_emc_table[i].rate);
+ last_round_idx = i;
return tegra_emc_table[i].rate * 1000;
}
}
@@ -774,7 +785,8 @@ struct clk *tegra_emc_predict_parent(unsigned long rate, u32 *div_value)
/* Table entries specify rate in kHz */
rate = rate / 1000;
- for (i = 0; i < tegra_emc_table_size; i++) {
+ i = get_start_idx(rate);
+ for (; i < tegra_emc_table_size; i++) {
if (tegra_emc_table[i].rate == rate) {
struct clk *p = tegra_emc_clk_sel[i].input;
@@ -805,7 +817,8 @@ bool tegra_emc_is_parent_ready(unsigned long rate, struct clk **parent,
/* Table entries specify rate in kHz */
rate = rate / 1000;
- for (i = 0; i < tegra_emc_table_size; i++) {
+ i = get_start_idx(rate);
+ for (; i < tegra_emc_table_size; i++) {
if (tegra_emc_table[i].rate == rate) {
p = tegra_emc_clk_sel[i].input;
if (!p)