blob: d7d630dea535d3215c23c08c3f6d079c51b8d817 [file] [log] [blame]
David Collins00b31e62011-08-31 20:00:10 -07001/*
2 * Copyright (c) 2011, 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#include <linux/regulator/pm8018-regulator.h>
David Collinsbea297a2011-09-28 13:11:14 -070015#include <mach/rpm-regulator.h>
David Collins00b31e62011-08-31 20:00:10 -070016
17#include "board-9615.h"
18
19#define VREG_CONSUMERS(_id) \
20 static struct regulator_consumer_supply vreg_consumers_##_id[]
21
22/*
23 * Consumer specific regulator names:
24 * regulator name consumer dev_name
25 */
26VREG_CONSUMERS(L2) = {
27 REGULATOR_SUPPLY("8018_l2", NULL),
Amit Blayf8b609e2011-09-02 20:42:53 +030028 REGULATOR_SUPPLY("HSUSB_1p8", "msm_otg"),
David Collins00b31e62011-08-31 20:00:10 -070029};
30VREG_CONSUMERS(L3) = {
31 REGULATOR_SUPPLY("8018_l3", NULL),
32};
33VREG_CONSUMERS(L4) = {
34 REGULATOR_SUPPLY("8018_l4", NULL),
Amit Blayf8b609e2011-09-02 20:42:53 +030035 REGULATOR_SUPPLY("HSUSB_3p3", "msm_otg"),
David Collins00b31e62011-08-31 20:00:10 -070036};
37VREG_CONSUMERS(L5) = {
38 REGULATOR_SUPPLY("8018_l5", NULL),
39};
40VREG_CONSUMERS(L6) = {
41 REGULATOR_SUPPLY("8018_l6", NULL),
42};
43VREG_CONSUMERS(L7) = {
44 REGULATOR_SUPPLY("8018_l7", NULL),
45};
46VREG_CONSUMERS(L8) = {
47 REGULATOR_SUPPLY("8018_l8", NULL),
48};
49VREG_CONSUMERS(L9) = {
50 REGULATOR_SUPPLY("8018_l9", NULL),
51};
52VREG_CONSUMERS(L10) = {
53 REGULATOR_SUPPLY("8018_l10", NULL),
54};
55VREG_CONSUMERS(L11) = {
56 REGULATOR_SUPPLY("8018_l11", NULL),
57};
58VREG_CONSUMERS(L12) = {
59 REGULATOR_SUPPLY("8018_l12", NULL),
60};
61VREG_CONSUMERS(L13) = {
62 REGULATOR_SUPPLY("8018_l13", NULL),
63};
64VREG_CONSUMERS(L14) = {
65 REGULATOR_SUPPLY("8018_l14", NULL),
66};
67VREG_CONSUMERS(S1) = {
68 REGULATOR_SUPPLY("8018_s1", NULL),
Amit Blayf8b609e2011-09-02 20:42:53 +030069 REGULATOR_SUPPLY("HSUSB_VDDCX", "msm_otg"),
David Collins00b31e62011-08-31 20:00:10 -070070};
71VREG_CONSUMERS(S2) = {
72 REGULATOR_SUPPLY("8018_s2", NULL),
73};
74VREG_CONSUMERS(S3) = {
75 REGULATOR_SUPPLY("8018_s3", NULL),
76};
77VREG_CONSUMERS(S4) = {
78 REGULATOR_SUPPLY("8018_s4", NULL),
79};
80VREG_CONSUMERS(S5) = {
81 REGULATOR_SUPPLY("8018_s5", NULL),
82};
83VREG_CONSUMERS(LVS1) = {
84 REGULATOR_SUPPLY("8018_lvs1", NULL),
85};
86
87#define PM8018_VREG_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, \
88 _pull_down, _always_on, _supply_regulator, \
89 _system_uA, _enable_time) \
90 { \
91 .init_data = { \
92 .constraints = { \
93 .valid_modes_mask = _modes, \
94 .valid_ops_mask = _ops, \
95 .min_uV = _min_uV, \
96 .max_uV = _max_uV, \
97 .input_uV = _max_uV, \
98 .apply_uV = _apply_uV, \
99 .always_on = _always_on, \
100 }, \
101 .num_consumer_supplies = \
102 ARRAY_SIZE(vreg_consumers_##_id), \
103 .consumer_supplies = vreg_consumers_##_id, \
104 .supply_regulator = _supply_regulator, \
105 }, \
106 .id = PM8018_VREG_ID_##_id, \
107 .pull_down_enable = _pull_down, \
108 .system_uA = _system_uA, \
109 .enable_time = _enable_time, \
110 }
111
112#define PM8018_VREG_INIT_LDO(_id, _always_on, _pull_down, _min_uV, _max_uV, \
113 _enable_time, _supply_regulator, _system_uA) \
114 PM8018_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \
115 | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \
116 REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \
117 REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \
118 _supply_regulator, _system_uA, _enable_time)
119
120#define PM8018_VREG_INIT_NLDO1200(_id, _always_on, _pull_down, _min_uV, \
121 _max_uV, _enable_time, _supply_regulator, _system_uA) \
122 PM8018_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \
123 | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \
124 REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \
125 REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \
126 _supply_regulator, _system_uA, _enable_time)
127
128#define PM8018_VREG_INIT_SMPS(_id, _always_on, _pull_down, _min_uV, _max_uV, \
129 _enable_time, _supply_regulator, _system_uA) \
130 PM8018_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \
131 | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \
132 REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \
133 REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \
134 _supply_regulator, _system_uA, _enable_time)
135
136#define PM8018_VREG_INIT_VS(_id, _always_on, _pull_down, _enable_time, \
137 _supply_regulator) \
138 PM8018_VREG_INIT(_id, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, _pull_down, \
139 _always_on, _supply_regulator, 0, _enable_time)
140
141/* Pin control initialization */
142#define PM8018_PC_INIT(_id, _always_on, _pin_fn, _pin_ctrl, _supply_regulator) \
143 { \
144 .init_data = { \
145 .constraints = { \
146 .valid_ops_mask = REGULATOR_CHANGE_STATUS, \
147 .always_on = _always_on, \
148 }, \
149 .num_consumer_supplies = \
150 ARRAY_SIZE(vreg_consumers_##_id##_PC), \
151 .consumer_supplies = vreg_consumers_##_id##_PC, \
152 .supply_regulator = _supply_regulator, \
153 }, \
154 .id = PM8018_VREG_ID_##_id##_PC, \
155 .pin_fn = PM8018_VREG_PIN_FN_##_pin_fn, \
156 .pin_ctrl = _pin_ctrl, \
157 }
158
David Collinsbea297a2011-09-28 13:11:14 -0700159#define RPM_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, _default_uV, \
160 _peak_uA, _avg_uA, _pull_down, _pin_ctrl, _freq, _pin_fn, \
161 _force_mode, _power_mode, _state, _sleep_selectable, \
162 _always_on, _supply_regulator, _system_uA) \
163 { \
164 .init_data = { \
165 .constraints = { \
166 .valid_modes_mask = _modes, \
167 .valid_ops_mask = _ops, \
168 .min_uV = _min_uV, \
169 .max_uV = _max_uV, \
170 .input_uV = _min_uV, \
171 .apply_uV = _apply_uV, \
172 .always_on = _always_on, \
173 }, \
174 .num_consumer_supplies = \
175 ARRAY_SIZE(vreg_consumers_##_id), \
176 .consumer_supplies = vreg_consumers_##_id, \
177 .supply_regulator = _supply_regulator, \
178 }, \
179 .id = RPM_VREG_ID_PM8018_##_id, \
180 .default_uV = _default_uV, \
181 .peak_uA = _peak_uA, \
182 .avg_uA = _avg_uA, \
183 .pull_down_enable = _pull_down, \
184 .pin_ctrl = _pin_ctrl, \
185 .freq = RPM_VREG_FREQ_##_freq, \
186 .pin_fn = _pin_fn, \
187 .force_mode = _force_mode, \
188 .power_mode = _power_mode, \
189 .state = _state, \
190 .sleep_selectable = _sleep_selectable, \
191 .system_uA = _system_uA, \
192 }
193
194#define RPM_LDO(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \
195 _supply_regulator, _system_uA, _init_peak_uA) \
196 RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \
197 | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \
198 | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \
199 | REGULATOR_CHANGE_DRMS, 0, _max_uV, _init_peak_uA, 0, _pd, \
200 RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_9615_NONE, \
201 RPM_VREG_FORCE_MODE_9615_NONE, RPM_VREG_POWER_MODE_9615_PWM, \
202 RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \
203 _supply_regulator, _system_uA)
204
205#define RPM_SMPS(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \
206 _supply_regulator, _system_uA, _freq) \
207 RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \
208 | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \
209 | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \
210 | REGULATOR_CHANGE_DRMS, 0, _max_uV, _system_uA, 0, _pd, \
211 RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_9615_NONE, \
212 RPM_VREG_FORCE_MODE_9615_NONE, RPM_VREG_POWER_MODE_9615_PWM, \
213 RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \
214 _supply_regulator, _system_uA)
215
216#define RPM_VS(_id, _always_on, _pd, _sleep_selectable, _supply_regulator) \
217 RPM_INIT(_id, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, 0, 1000, 1000, _pd, \
218 RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_9615_NONE, \
219 RPM_VREG_FORCE_MODE_9615_NONE, RPM_VREG_POWER_MODE_9615_PWM, \
220 RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \
221 _supply_regulator, 0)
222
223/* Pin control initialization */
224#define RPM_PC_INIT(_id, _always_on, _pin_fn, _pin_ctrl, _supply_regulator) \
225 { \
226 .init_data = { \
227 .constraints = { \
228 .valid_ops_mask = REGULATOR_CHANGE_STATUS, \
229 .always_on = _always_on, \
230 }, \
231 .num_consumer_supplies = \
232 ARRAY_SIZE(vreg_consumers_##_id##_PC), \
233 .consumer_supplies = vreg_consumers_##_id##_PC, \
234 .supply_regulator = _supply_regulator, \
235 }, \
236 .id = RPM_VREG_ID_PM8018_##_id##_PC, \
237 .pin_fn = RPM_VREG_PIN_FN_9615_##_pin_fn, \
238 .pin_ctrl = _pin_ctrl, \
239 }
240
241
David Collins00b31e62011-08-31 20:00:10 -0700242/* PM8018 regulator constraints */
243struct pm8018_regulator_platform_data
244msm_pm8018_regulator_pdata[] __devinitdata = {
David Collinsbea297a2011-09-28 13:11:14 -0700245};
David Collins00b31e62011-08-31 20:00:10 -0700246
David Collinsbea297a2011-09-28 13:11:14 -0700247static struct rpm_regulator_init_data
248msm_rpm_regulator_init_data[] __devinitdata = {
249 /* ID a_on pd ss min_uV max_uV supply sys_uA freq */
250 RPM_SMPS(S1, 1, 1, 1, 1150000, 1150000, NULL, 100000, 1p60),
251 RPM_SMPS(S2, 0, 1, 0, 1225000, 1300000, NULL, 0, 1p60),
252 RPM_SMPS(S3, 1, 1, 0, 1800000, 1800000, NULL, 100000, 1p60),
253 RPM_SMPS(S4, 0, 1, 0, 2100000, 2200000, NULL, 0, 1p60),
254 RPM_SMPS(S5, 1, 1, 0, 1350000, 1350000, NULL, 100000, 1p60),
David Collins00b31e62011-08-31 20:00:10 -0700255
David Collinsbea297a2011-09-28 13:11:14 -0700256 /* ID a_on pd ss min_uV max_uV supply sys_uA init_ip */
257 RPM_LDO(L2, 1, 1, 0, 1800000, 1800000, NULL, 0, 10000),
258 RPM_LDO(L3, 0, 1, 0, 1800000, 1800000, NULL, 0, 0),
259 RPM_LDO(L4, 0, 1, 0, 3075000, 3075000, NULL, 0, 0),
260 RPM_LDO(L5, 0, 1, 0, 2850000, 2850000, NULL, 0, 0),
261 RPM_LDO(L6, 0, 1, 0, 1800000, 2850000, NULL, 0, 0),
262 RPM_LDO(L7, 0, 1, 0, 1850000, 1900000, "8018_s4", 0, 0),
263 RPM_LDO(L8, 0, 1, 0, 1200000, 1200000, "8018_s3", 0, 0),
264 RPM_LDO(L9, 1, 1, 1, 1150000, 1150000, "8018_s5", 10000, 10000),
265 RPM_LDO(L10, 0, 1, 0, 1050000, 1050000, "8018_s5", 0, 0),
266 RPM_LDO(L11, 0, 1, 0, 1050000, 1050000, "8018_s5", 0, 0),
267 RPM_LDO(L12, 0, 1, 0, 1050000, 1050000, "8018_s5", 0, 0),
268 RPM_LDO(L13, 0, 1, 0, 2950000, 2950000, NULL, 0, 0),
269 RPM_LDO(L14, 0, 1, 0, 2850000, 2850000, NULL, 0, 0),
270
271 /* ID a_on pd ss supply */
272 RPM_VS(LVS1, 0, 1, 0, "8018_s3"),
David Collins00b31e62011-08-31 20:00:10 -0700273};
274
275int msm_pm8018_regulator_pdata_len __devinitdata =
276 ARRAY_SIZE(msm_pm8018_regulator_pdata);
David Collinsbea297a2011-09-28 13:11:14 -0700277
278struct rpm_regulator_platform_data
279msm_rpm_regulator_9615_pdata __devinitdata = {
280 .init_data = msm_rpm_regulator_init_data,
281 .num_regulators = ARRAY_SIZE(msm_rpm_regulator_init_data),
282 .version = RPM_VREG_VERSION_9615,
283 .vreg_id_vdd_mem = RPM_VREG_ID_PM8018_L9,
284 .vreg_id_vdd_dig = RPM_VREG_ID_PM8018_S1,
285};