blob: 1d0be98092e8f424dc1824ac94a22d85b4972980 [file] [log] [blame]
Matt Wagantalle9b715a2012-01-04 18:16:14 -08001/*
2 * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#ifndef __ARCH_ARM_MACH_MSM_ACPUCLOCK_KRAIT_H
15#define __ARCH_ARM_MACH_MSM_ACPUCLOCK_KRAIT_H
16
Matt Wagantall600ea502012-06-08 18:49:53 -070017#define L2(x) (x)
Matt Wagantalle9b715a2012-01-04 18:16:14 -080018#define BW_MBPS(_bw) \
19 { \
20 .vectors = (struct msm_bus_vectors[]){ \
21 {\
22 .src = MSM_BUS_MASTER_AMPSS_M0, \
23 .dst = MSM_BUS_SLAVE_EBI_CH0, \
24 .ib = (_bw) * 1000000UL, \
25 }, \
26 { \
27 .src = MSM_BUS_MASTER_AMPSS_M1, \
28 .dst = MSM_BUS_SLAVE_EBI_CH0, \
29 .ib = (_bw) * 1000000UL, \
30 }, \
31 }, \
32 .num_paths = 2, \
33 }
34
35/**
36 * src_id - Clock source IDs.
37 */
38enum src_id {
39 PLL_0 = 0,
40 HFPLL,
Matt Wagantall06e4a1f2012-06-07 18:38:13 -070041 PLL_8,
Matt Wagantalle9b715a2012-01-04 18:16:14 -080042};
43
44/**
45 * enum pvs - IDs to distinguish between CPU frequency tables.
46 */
47enum pvs {
48 PVS_SLOW = 0,
49 PVS_NOMINAL,
50 PVS_FAST,
Matt Wagantallf5cc3892012-06-07 19:47:02 -070051 PVS_FASTER,
Matt Wagantalle9b715a2012-01-04 18:16:14 -080052 PVS_UNKNOWN,
53 NUM_PVS
54};
55
56/**
57 * enum scalables - IDs of frequency scalable hardware blocks.
58 */
59enum scalables {
60 CPU0 = 0,
61 CPU1,
62 CPU2,
63 CPU3,
64 L2,
65};
66
67
68/**
69 * enum hfpll_vdd_level - IDs of HFPLL voltage levels.
70 */
71enum hfpll_vdd_levels {
72 HFPLL_VDD_NONE,
73 HFPLL_VDD_LOW,
74 HFPLL_VDD_NOM,
Matt Wagantall87465f52012-07-23 22:03:06 -070075 HFPLL_VDD_HIGH,
Matt Wagantalle9b715a2012-01-04 18:16:14 -080076 NUM_HFPLL_VDD
77};
78
79/**
80 * enum vregs - IDs of voltage regulators.
81 */
82enum vregs {
83 VREG_CORE,
84 VREG_MEM,
85 VREG_DIG,
86 VREG_HFPLL_A,
87 VREG_HFPLL_B,
88 NUM_VREG
89};
90
91/**
92 * struct vreg - Voltage regulator data.
93 * @name: Name of requlator.
94 * @max_vdd: Limit the maximum-settable voltage.
Matt Wagantalle9b715a2012-01-04 18:16:14 -080095 * @reg: Regulator handle.
Matt Wagantall75473eb2012-05-31 15:23:22 -070096 * @rpm_reg: RPM Regulator handle.
Matt Wagantalle9b715a2012-01-04 18:16:14 -080097 * @cur_vdd: Last-set voltage in uV.
Matt Wagantall6d9c4162012-07-16 18:58:16 -070098 * @cur_ua: Last-set current in uA.
Matt Wagantalle9b715a2012-01-04 18:16:14 -080099 */
100struct vreg {
Matt Wagantall75473eb2012-05-31 15:23:22 -0700101 const char *name;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800102 const int max_vdd;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800103 struct regulator *reg;
Matt Wagantall75473eb2012-05-31 15:23:22 -0700104 struct rpm_regulator *rpm_reg;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800105 int cur_vdd;
Matt Wagantall6d9c4162012-07-16 18:58:16 -0700106 int cur_ua;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800107};
108
109/**
110 * struct core_speed - Clock tree and configuration parameters.
111 * @khz: Clock rate in KHz.
112 * @src: Clock source ID.
113 * @pri_src_sel: Input to select on the primary MUX.
114 * @sec_src_sel: Input to select on the secondary MUX.
115 * @pll_l_val: HFPLL "L" value to be applied when an HFPLL source is selected.
116 */
117struct core_speed {
Matt Wagantall9c8cb6e2012-07-13 19:39:15 -0700118 unsigned long khz;
119 int src;
120 u32 pri_src_sel;
121 u32 sec_src_sel;
122 u32 pll_l_val;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800123};
124
125/**
126 * struct l2_level - L2 clock rate and associated voltage and b/w requirements.
127 * @speed: L2 clock configuration.
128 * @vdd_dig: vdd_dig voltage in uV.
129 * @vdd_mem: vdd_mem voltage in uV.
130 * @bw_level: Bandwidth performance level number.
131 */
132struct l2_level {
133 const struct core_speed speed;
134 const int vdd_dig;
135 const int vdd_mem;
136 const unsigned int bw_level;
137};
138
139/**
140 * struct acpu_level - CPU clock rate and L2 rate and voltage requirements.
141 * @use_for_scaling: Flag indicating whether or not the level should be used.
142 * @speed: CPU clock configuration.
143 * @l2_level: L2 configuration to use.
144 * @vdd_core: CPU core voltage in uV.
Matt Wagantall6d9c4162012-07-16 18:58:16 -0700145 * @ua_core: CPU core current consumption in uA.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800146 */
147struct acpu_level {
148 const int use_for_scaling;
149 const struct core_speed speed;
Matt Wagantall600ea502012-06-08 18:49:53 -0700150 const unsigned int l2_level;
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700151 int vdd_core;
Matt Wagantall6d9c4162012-07-16 18:58:16 -0700152 int ua_core;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800153};
154
155/**
156 * struct hfpll_data - Descriptive data of HFPLL hardware.
157 * @mode_offset: Mode register offset from base address.
158 * @l_offset: "L" value register offset from base address.
159 * @m_offset: "M" value register offset from base address.
160 * @n_offset: "N" value register offset from base address.
161 * @config_offset: Configuration register offset from base address.
162 * @config_val: Value to initialize the @config_offset register to.
Matt Wagantalla77b7f32012-07-18 16:32:01 -0700163 * @has_user_reg: Indicates the presence of an addition config register.
164 * @user_offset: User register offset from base address, if applicable.
165 * @user_val: Value to initialize the @user_offset register to.
166 * @user_vco_mask: Bit in the @user_offset to enable high-frequency VCO mode.
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700167 * @has_droop_ctl: Indicates the presence of a voltage droop controller.
168 * @droop_offset: Droop controller register offset from base address.
169 * @droop_val: Value to initialize the @config_offset register to.
170 * @low_vdd_l_max: Maximum "L" value supported at HFPLL_VDD_LOW.
Matt Wagantall87465f52012-07-23 22:03:06 -0700171 * @nom_vdd_l_max: Maximum "L" value supported at HFPLL_VDD_NOM.
Matt Wagantalla77b7f32012-07-18 16:32:01 -0700172 * @low_vco_l_max: Maximum "L" value supported in low-frequency VCO mode.
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700173 * @vdd: voltage requirements for each VDD level for the L2 PLL.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800174 */
175struct hfpll_data {
176 const u32 mode_offset;
177 const u32 l_offset;
178 const u32 m_offset;
179 const u32 n_offset;
180 const u32 config_offset;
181 const u32 config_val;
Matt Wagantalla77b7f32012-07-18 16:32:01 -0700182 const bool has_user_reg;
183 const u32 user_offset;
184 const u32 user_val;
185 const u32 user_vco_mask;
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700186 const bool has_droop_ctl;
187 const u32 droop_offset;
188 const u32 droop_val;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800189 const u32 low_vdd_l_max;
Matt Wagantall87465f52012-07-23 22:03:06 -0700190 const u32 nom_vdd_l_max;
Matt Wagantalla77b7f32012-07-18 16:32:01 -0700191 const u32 low_vco_l_max;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800192 const int vdd[NUM_HFPLL_VDD];
193};
194
195/**
196 * struct scalable - Register locations and state associated with a scalable HW.
197 * @hfpll_phys_base: Physical base address of HFPLL register.
198 * @hfpll_base: Virtual base address of HFPLL registers.
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700199 * @aux_clk_sel_phys: Physical address of auxiliary MUX.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800200 * @aux_clk_sel: Auxiliary mux input to select at boot.
201 * @l2cpmr_iaddr: Indirect address of the CPMR MUX/divider CP15 register.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800202 * @cur_speed: Pointer to currently-set speed.
203 * @l2_vote: L2 performance level vote associate with the current CPU speed.
204 * @vreg: Array of voltage regulators needed by the scalable.
Matt Wagantall754ee272012-06-18 13:40:26 -0700205 * @initialized: Flag set to true when per_cpu_init() has been called.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800206 */
207struct scalable {
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700208 const phys_addr_t hfpll_phys_base;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800209 void __iomem *hfpll_base;
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700210 const phys_addr_t aux_clk_sel_phys;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800211 const u32 aux_clk_sel;
212 const u32 l2cpmr_iaddr;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800213 const struct core_speed *cur_speed;
Matt Wagantall600ea502012-06-08 18:49:53 -0700214 unsigned int l2_vote;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800215 struct vreg vreg[NUM_VREG];
Matt Wagantall754ee272012-06-18 13:40:26 -0700216 bool initialized;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800217};
218
219/**
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700220 * struct pvs_table - CPU performance level table and size.
221 * @table: CPU performance level table
222 * @size: sizeof(@table)
Matt Wagantall9515bc22012-07-19 18:13:40 -0700223 * @boost_uv: Voltage boost amount
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700224 */
225struct pvs_table {
226 struct acpu_level *table;
227 size_t size;
Matt Wagantall9515bc22012-07-19 18:13:40 -0700228 int boost_uv;
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700229};
230
231/**
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800232 * struct acpuclk_krait_params - SoC specific driver parameters.
233 * @scalable: Array of scalables.
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700234 * @scalable_size: Size of @scalable.
235 * @hfpll_data: HFPLL configuration data.
236 * @pvs_tables: CPU frequency tables.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800237 * @l2_freq_tbl: L2 frequency table.
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700238 * @l2_freq_tbl_size: Size of @l2_freq_tbl.
Matt Wagantallee2b4372012-09-17 17:51:06 -0700239 * @pte_efuse_phys: Physical address of PTE EFUSE.
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700240 * @bus_scale: MSM bus driver parameters.
Matt Wagantallb7c231b2012-07-24 18:40:17 -0700241 * @stby_khz: KHz value corresponding to an always-on clock source.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800242 */
243struct acpuclk_krait_params {
244 struct scalable *scalable;
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700245 size_t scalable_size;
246 struct hfpll_data *hfpll_data;
247 struct pvs_table *pvs_tables;
248 struct l2_level *l2_freq_tbl;
249 size_t l2_freq_tbl_size;
Matt Wagantallee2b4372012-09-17 17:51:06 -0700250 phys_addr_t pte_efuse_phys;
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700251 struct msm_bus_scale_pdata *bus_scale;
Matt Wagantallb7c231b2012-07-24 18:40:17 -0700252 unsigned long stby_khz;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800253};
254
255/**
Patrick Daly037d4912012-08-28 13:36:31 -0700256 * struct acpuclk_platform_data - PMIC configuration data.
257 * @uses_pm8917: Boolean indicates presence of pm8917.
258 */
259struct acpuclk_platform_data {
260 bool uses_pm8917;
261};
262
263/**
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800264 * acpuclk_krait_init - Initialize the Krait CPU clock driver give SoC params.
265 */
266extern int acpuclk_krait_init(struct device *dev,
267 const struct acpuclk_krait_params *params);
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800268#endif