ARM: tegra: powermon: Fix copyrights from GPLv3 to GPLv2
[linux-3.10.git] / arch / arm / mach-tegra / mc.c
1 /*
2  * arch/arm/mach-tegra/mc.c
3  *
4  * Copyright (C) 2010 Google, Inc.
5  * Copyright (C) 2011-2012 NVIDIA Corporation
6  *
7  * Author:
8  *      Erik Gilling <konkers@google.com>
9  *
10  * This software is licensed under the terms of the GNU General Public
11  * License version 2, as published by the Free Software Foundation, and
12  * may be copied, distributed, and modified under those terms.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  */
20
21 #include <linux/export.h>
22 #include <linux/io.h>
23 #include <linux/spinlock.h>
24
25 #include <mach/mc.h>
26
27 #include "iomap.h"
28
29 #if defined(CONFIG_ARCH_TEGRA_2x_SOC)
30 static DEFINE_SPINLOCK(tegra_mc_lock);
31
32 void tegra_mc_set_priority(unsigned long client, unsigned long prio)
33 {
34         void __iomem *mc_base = (void __iomem *)IO_TO_VIRT(TEGRA_MC_BASE);
35         unsigned long reg = client >> 8;
36         int field = client & 0xff;
37         unsigned long val;
38         unsigned long flags;
39
40         spin_lock_irqsave(&tegra_mc_lock, flags);
41         val = readl(mc_base + reg);
42         val &= ~(TEGRA_MC_PRIO_MASK << field);
43         val |= prio << field;
44         writel(val, mc_base + reg);
45         spin_unlock_irqrestore(&tegra_mc_lock, flags);
46
47 }
48
49 int tegra_mc_get_tiled_memory_bandwidth_multiplier(void)
50 {
51         return 1;
52 }
53
54 #else
55         /* !!!FIXME!!! IMPLEMENT tegra_mc_set_priority() */
56
57 #include "tegra3_emc.h"
58
59 /*
60  * If using T30/DDR3, the 2nd 16 bytes part of DDR3 atom is 2nd line and is
61  * discarded in tiling mode.
62  */
63 int tegra_mc_get_tiled_memory_bandwidth_multiplier(void)
64 {
65         int type;
66
67         type = tegra_emc_get_dram_type();
68         /*WARN_ONCE(type == -1, "unknown type DRAM because DVFS is disabled\n");*/
69
70         if (type == DRAM_TYPE_DDR3)
71                 return 2;
72         else
73                 return 1;
74 }
75 #endif
76
77 /* API to get EMC freq to be requested, for Bandwidth.
78  * bw_kbps: BandWidth passed is in KBps.
79  * returns freq in KHz
80  */
81 unsigned int tegra_emc_bw_to_freq_req(unsigned int bw_kbps)
82 {
83         unsigned int freq;
84         unsigned int bytes_per_emc_clk;
85
86         bytes_per_emc_clk = tegra_mc_get_effective_bytes_width() * 2;
87         freq = (bw_kbps + bytes_per_emc_clk - 1) / bytes_per_emc_clk *
88                 CONFIG_TEGRA_EMC_TO_DDR_CLOCK;
89         return freq;
90 }
91 EXPORT_SYMBOL_GPL(tegra_emc_bw_to_freq_req);
92
93 /* API to get EMC bandwidth, for freq that can be requested.
94  * freq_khz: Frequency passed is in KHz.
95  * returns bandwidth in KBps
96  */
97 unsigned int tegra_emc_freq_req_to_bw(unsigned int freq_khz)
98 {
99         unsigned int bw;
100         unsigned int bytes_per_emc_clk;
101
102         bytes_per_emc_clk = tegra_mc_get_effective_bytes_width() * 2;
103         bw = freq_khz * bytes_per_emc_clk / CONFIG_TEGRA_EMC_TO_DDR_CLOCK;
104         return bw;
105 }
106 EXPORT_SYMBOL_GPL(tegra_emc_freq_req_to_bw);