blob: f92aaf3421f3a0100682e2b1c6d0da74bb70823d [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
17#define STBY_KHZ 1
Matt Wagantall600ea502012-06-08 18:49:53 -070018#define L2(x) (x)
Matt Wagantalle9b715a2012-01-04 18:16:14 -080019#define BW_MBPS(_bw) \
20 { \
21 .vectors = (struct msm_bus_vectors[]){ \
22 {\
23 .src = MSM_BUS_MASTER_AMPSS_M0, \
24 .dst = MSM_BUS_SLAVE_EBI_CH0, \
25 .ib = (_bw) * 1000000UL, \
26 }, \
27 { \
28 .src = MSM_BUS_MASTER_AMPSS_M1, \
29 .dst = MSM_BUS_SLAVE_EBI_CH0, \
30 .ib = (_bw) * 1000000UL, \
31 }, \
32 }, \
33 .num_paths = 2, \
34 }
35
36/**
37 * src_id - Clock source IDs.
38 */
39enum src_id {
40 PLL_0 = 0,
41 HFPLL,
42 QSB,
Matt Wagantall06e4a1f2012-06-07 18:38:13 -070043 PLL_8,
Matt Wagantalle9b715a2012-01-04 18:16:14 -080044};
45
46/**
47 * enum pvs - IDs to distinguish between CPU frequency tables.
48 */
49enum pvs {
50 PVS_SLOW = 0,
51 PVS_NOMINAL,
52 PVS_FAST,
Matt Wagantallf5cc3892012-06-07 19:47:02 -070053 PVS_FASTER,
Matt Wagantalle9b715a2012-01-04 18:16:14 -080054 PVS_UNKNOWN,
55 NUM_PVS
56};
57
58/**
59 * enum scalables - IDs of frequency scalable hardware blocks.
60 */
61enum scalables {
62 CPU0 = 0,
63 CPU1,
64 CPU2,
65 CPU3,
66 L2,
67};
68
69
70/**
71 * enum hfpll_vdd_level - IDs of HFPLL voltage levels.
72 */
73enum hfpll_vdd_levels {
74 HFPLL_VDD_NONE,
75 HFPLL_VDD_LOW,
76 HFPLL_VDD_NOM,
77 NUM_HFPLL_VDD
78};
79
80/**
81 * enum vregs - IDs of voltage regulators.
82 */
83enum vregs {
84 VREG_CORE,
85 VREG_MEM,
86 VREG_DIG,
87 VREG_HFPLL_A,
88 VREG_HFPLL_B,
89 NUM_VREG
90};
91
92/**
93 * struct vreg - Voltage regulator data.
94 * @name: Name of requlator.
95 * @max_vdd: Limit the maximum-settable voltage.
Matt Wagantalle9b715a2012-01-04 18:16:14 -080096 * @reg: Regulator handle.
Matt Wagantall75473eb2012-05-31 15:23:22 -070097 * @rpm_reg: RPM Regulator handle.
Matt Wagantalle9b715a2012-01-04 18:16:14 -080098 * @cur_vdd: Last-set voltage in uV.
99 * @peak_ua: Maximum current draw expected in uA.
100 */
101struct vreg {
Matt Wagantall75473eb2012-05-31 15:23:22 -0700102 const char *name;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800103 const int max_vdd;
104 const int peak_ua;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800105 struct regulator *reg;
Matt Wagantall75473eb2012-05-31 15:23:22 -0700106 struct rpm_regulator *rpm_reg;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800107 int cur_vdd;
108};
109
110/**
111 * struct core_speed - Clock tree and configuration parameters.
112 * @khz: Clock rate in KHz.
113 * @src: Clock source ID.
114 * @pri_src_sel: Input to select on the primary MUX.
115 * @sec_src_sel: Input to select on the secondary MUX.
116 * @pll_l_val: HFPLL "L" value to be applied when an HFPLL source is selected.
117 */
118struct core_speed {
119 const unsigned long khz;
120 const int src;
121 const u32 pri_src_sel;
122 const u32 sec_src_sel;
123 const u32 pll_l_val;
124};
125
126/**
127 * struct l2_level - L2 clock rate and associated voltage and b/w requirements.
128 * @speed: L2 clock configuration.
129 * @vdd_dig: vdd_dig voltage in uV.
130 * @vdd_mem: vdd_mem voltage in uV.
131 * @bw_level: Bandwidth performance level number.
132 */
133struct l2_level {
134 const struct core_speed speed;
135 const int vdd_dig;
136 const int vdd_mem;
137 const unsigned int bw_level;
138};
139
140/**
141 * struct acpu_level - CPU clock rate and L2 rate and voltage requirements.
142 * @use_for_scaling: Flag indicating whether or not the level should be used.
143 * @speed: CPU clock configuration.
144 * @l2_level: L2 configuration to use.
145 * @vdd_core: CPU core voltage in uV.
146 */
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 Wagantalle9b715a2012-01-04 18:16:14 -0800152};
153
154/**
155 * struct hfpll_data - Descriptive data of HFPLL hardware.
156 * @mode_offset: Mode register offset from base address.
157 * @l_offset: "L" value register offset from base address.
158 * @m_offset: "M" value register offset from base address.
159 * @n_offset: "N" value register offset from base address.
160 * @config_offset: Configuration register offset from base address.
161 * @config_val: Value to initialize the @config_offset register to.
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700162 * @has_droop_ctl: Indicates the presence of a voltage droop controller.
163 * @droop_offset: Droop controller register offset from base address.
164 * @droop_val: Value to initialize the @config_offset register to.
165 * @low_vdd_l_max: Maximum "L" value supported at HFPLL_VDD_LOW.
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700166 * @vdd: voltage requirements for each VDD level for the L2 PLL.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800167 */
168struct hfpll_data {
169 const u32 mode_offset;
170 const u32 l_offset;
171 const u32 m_offset;
172 const u32 n_offset;
173 const u32 config_offset;
174 const u32 config_val;
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700175 const bool has_droop_ctl;
176 const u32 droop_offset;
177 const u32 droop_val;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800178 const u32 low_vdd_l_max;
179 const int vdd[NUM_HFPLL_VDD];
180};
181
182/**
183 * struct scalable - Register locations and state associated with a scalable HW.
184 * @hfpll_phys_base: Physical base address of HFPLL register.
185 * @hfpll_base: Virtual base address of HFPLL registers.
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700186 * @aux_clk_sel_phys: Physical address of auxiliary MUX.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800187 * @aux_clk_sel: Auxiliary mux input to select at boot.
188 * @l2cpmr_iaddr: Indirect address of the CPMR MUX/divider CP15 register.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800189 * @cur_speed: Pointer to currently-set speed.
190 * @l2_vote: L2 performance level vote associate with the current CPU speed.
191 * @vreg: Array of voltage regulators needed by the scalable.
Matt Wagantall754ee272012-06-18 13:40:26 -0700192 * @initialized: Flag set to true when per_cpu_init() has been called.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800193 */
194struct scalable {
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700195 const phys_addr_t hfpll_phys_base;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800196 void __iomem *hfpll_base;
Matt Wagantall06e4a1f2012-06-07 18:38:13 -0700197 const phys_addr_t aux_clk_sel_phys;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800198 const u32 aux_clk_sel;
199 const u32 l2cpmr_iaddr;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800200 const struct core_speed *cur_speed;
Matt Wagantall600ea502012-06-08 18:49:53 -0700201 unsigned int l2_vote;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800202 struct vreg vreg[NUM_VREG];
Matt Wagantall754ee272012-06-18 13:40:26 -0700203 bool initialized;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800204};
205
206/**
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700207 * struct pvs_table - CPU performance level table and size.
208 * @table: CPU performance level table
209 * @size: sizeof(@table)
210 */
211struct pvs_table {
212 struct acpu_level *table;
213 size_t size;
214};
215
216/**
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800217 * struct acpuclk_krait_params - SoC specific driver parameters.
218 * @scalable: Array of scalables.
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700219 * @scalable_size: Size of @scalable.
220 * @hfpll_data: HFPLL configuration data.
221 * @pvs_tables: CPU frequency tables.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800222 * @l2_freq_tbl: L2 frequency table.
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700223 * @l2_freq_tbl_size: Size of @l2_freq_tbl.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800224 * @qfprom_phys_base: Physical base address of QFPROM.
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700225 * @bus_scale: MSM bus driver parameters.
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800226 */
227struct acpuclk_krait_params {
228 struct scalable *scalable;
Matt Wagantall1f3762d2012-06-08 19:08:48 -0700229 size_t scalable_size;
230 struct hfpll_data *hfpll_data;
231 struct pvs_table *pvs_tables;
232 struct l2_level *l2_freq_tbl;
233 size_t l2_freq_tbl_size;
234 phys_addr_t qfprom_phys_base;
235 struct msm_bus_scale_pdata *bus_scale;
Matt Wagantalle9b715a2012-01-04 18:16:14 -0800236};
237
238/**
239 * acpuclk_krait_init - Initialize the Krait CPU clock driver give SoC params.
240 */
241extern int acpuclk_krait_init(struct device *dev,
242 const struct acpuclk_krait_params *params);
243
244#endif