diff options
author | Alex Frid <afrid@nvidia.com> | 2012-12-08 22:39:09 -0800 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-12-18 05:32:58 -0800 |
commit | 2c01ded0b761aa1a5438e63adae1e9e7b947add9 (patch) | |
tree | a03416928a75bcdef3f863ab6be44fb369103c79 /arch/arm/mach-tegra/tegra11_emc.c | |
parent | 6befd012cb0e3fdb42e9a89b0bdfcc415dc594ba (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.c | 21 |
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) |