blob: 00817c0556a7d2ef97ea2a3bf9a205ef3e2f43fa [file] [log] [blame]
David Collins037d6482013-03-14 16:53:33 -07001/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#define pr_fmt(fmt) "%s: " fmt, __func__
14
15#include <linux/delay.h>
16#include <linux/err.h>
17#include <linux/init.h>
18#include <linux/kernel.h>
19#include <linux/module.h>
20#include <linux/of.h>
21#include <linux/of_device.h>
22#include <linux/slab.h>
23#include <linux/spmi.h>
24#include <linux/regulator/driver.h>
25#include <linux/regulator/machine.h>
26#include <linux/regulator/of_regulator.h>
27
28#include "spm.h"
29#include "spm-regulator.h"
30
31#define SPM_REGULATOR_DRIVER_NAME "qcom,spm-regulator"
32
33struct voltage_range {
34 int min_uV;
35 int set_point_min_uV;
36 int max_uV;
37 int step_uV;
38};
39
40/* Properties for FTS2 type QPNP PMIC regulators. */
41
42static const struct voltage_range fts2_range0 = {0, 350000, 1275000, 5000};
43static const struct voltage_range fts2_range1 = {0, 700000, 2040000, 10000};
44
45/* Specifies the PMIC internal slew rate in uV/us. */
46#define QPNP_FTS2_SLEW_RATE 6000
47
48#define QPNP_FTS2_REG_TYPE 0x04
49#define QPNP_FTS2_REG_SUBTYPE 0x05
50#define QPNP_FTS2_REG_VOLTAGE_RANGE 0x40
51#define QPNP_FTS2_REG_VOLTAGE_SETPOINT 0x41
52
53#define QPNP_FTS2_TYPE 0x1C
54#define QPNP_FTS2_SUBTYPE 0x08
55
56struct spm_vreg {
57 struct regulator_desc rdesc;
58 struct regulator_dev *rdev;
59 struct spmi_device *spmi_dev;
60 const struct voltage_range *range;
61 int uV;
62 int last_set_uV;
63 unsigned vlevel;
64 unsigned last_set_vlevel;
65 bool online;
66 u16 spmi_base_addr;
67};
68
69static int _spm_regulator_set_voltage(struct regulator_dev *rdev)
70{
71 struct spm_vreg *vreg = rdev_get_drvdata(rdev);
72 int rc;
73
74 if (vreg->vlevel == vreg->last_set_vlevel)
75 return 0;
76
77 rc = msm_spm_apcs_set_vdd(vreg->vlevel);
78 if (rc) {
79 pr_err("%s: msm_spm_set_vdd failed %d\n", vreg->rdesc.name, rc);
80 return rc;
81 }
82
83 if (vreg->uV > vreg->last_set_uV) {
84 /* Wait for voltage to stabalize. */
85 udelay(DIV_ROUND_UP(vreg->uV - vreg->last_set_uV,
86 QPNP_FTS2_SLEW_RATE));
87 }
88 vreg->last_set_uV = vreg->uV;
89 vreg->last_set_vlevel = vreg->vlevel;
90
91 return rc;
92}
93
94static int spm_regulator_set_voltage(struct regulator_dev *rdev, int min_uV,
95 int max_uV, unsigned *selector)
96{
97 struct spm_vreg *vreg = rdev_get_drvdata(rdev);
98 const struct voltage_range *range = vreg->range;
99 int uV = min_uV;
100 unsigned vlevel;
101
102 if (uV < range->set_point_min_uV && max_uV >= range->set_point_min_uV)
103 uV = range->set_point_min_uV;
104
105 if (uV < range->set_point_min_uV || uV > range->max_uV) {
106 pr_err("%s: request v=[%d, %d] is outside possible v=[%d, %d]\n",
107 vreg->rdesc.name, min_uV, max_uV,
108 range->set_point_min_uV, range->max_uV);
109 return -EINVAL;
110 }
111
112 vlevel = DIV_ROUND_UP(uV - range->min_uV, range->step_uV);
113 uV = vlevel * range->step_uV + range->min_uV;
114
115 if (uV > max_uV) {
116 pr_err("%s: request v=[%d, %d] cannot be met by any set point\n",
117 vreg->rdesc.name, min_uV, max_uV);
118 return -EINVAL;
119 }
120
121 vreg->vlevel = vlevel;
122 vreg->uV = uV;
123 *selector = vlevel -
124 (vreg->range->set_point_min_uV - vreg->range->min_uV)
125 / vreg->range->step_uV;
126
127 if (!vreg->online)
128 return 0;
129
130 return _spm_regulator_set_voltage(rdev);
131}
132
133static int spm_regulator_get_voltage(struct regulator_dev *rdev)
134{
135 struct spm_vreg *vreg = rdev_get_drvdata(rdev);
136
137 return vreg->uV;
138}
139
140static int spm_regulator_list_voltage(struct regulator_dev *rdev,
141 unsigned selector)
142{
143 struct spm_vreg *vreg = rdev_get_drvdata(rdev);
144
145 if (selector >= vreg->rdesc.n_voltages)
146 return 0;
147
148 return selector * vreg->range->step_uV + vreg->range->set_point_min_uV;
149}
150
151static int spm_regulator_enable(struct regulator_dev *rdev)
152{
153 struct spm_vreg *vreg = rdev_get_drvdata(rdev);
154 int rc;
155
156 rc = _spm_regulator_set_voltage(rdev);
157
158 if (!rc)
159 vreg->online = true;
160
161 return rc;
162}
163
164static int spm_regulator_disable(struct regulator_dev *rdev)
165{
166 struct spm_vreg *vreg = rdev_get_drvdata(rdev);
167
168 vreg->online = false;
169
170 return 0;
171}
172
173static int spm_regulator_is_enabled(struct regulator_dev *rdev)
174{
175 struct spm_vreg *vreg = rdev_get_drvdata(rdev);
176
177 return vreg->online;
178}
179
180static struct regulator_ops spm_regulator_ops = {
181 .get_voltage = spm_regulator_get_voltage,
182 .set_voltage = spm_regulator_set_voltage,
183 .list_voltage = spm_regulator_list_voltage,
184 .enable = spm_regulator_enable,
185 .disable = spm_regulator_disable,
186 .is_enabled = spm_regulator_is_enabled,
187};
188
189static int qpnp_fts2_check_type(struct spm_vreg *vreg)
190{
191 int rc;
192 u8 type[2];
193
194 rc = spmi_ext_register_readl(vreg->spmi_dev->ctrl, vreg->spmi_dev->sid,
195 vreg->spmi_base_addr + QPNP_FTS2_REG_TYPE, type, 2);
196 if (rc) {
197 dev_err(&vreg->spmi_dev->dev, "%s: could not read type register, rc=%d\n",
198 __func__, rc);
199 return rc;
200 }
201
202 if (type[0] != QPNP_FTS2_TYPE || type[1] != QPNP_FTS2_SUBTYPE) {
203 dev_err(&vreg->spmi_dev->dev, "%s: invalid type=0x%02X or subtype=0x%02X register value\n",
204 __func__, type[0], type[1]);
205 return -ENODEV;
206 }
207
208 return rc;
209}
210
211static int qpnp_fts2_init_range(struct spm_vreg *vreg)
212{
213 int rc;
214 u8 reg = 0;
215
216 rc = spmi_ext_register_readl(vreg->spmi_dev->ctrl, vreg->spmi_dev->sid,
217 vreg->spmi_base_addr + QPNP_FTS2_REG_VOLTAGE_RANGE, &reg, 1);
218 if (rc) {
219 dev_err(&vreg->spmi_dev->dev, "%s: could not read voltage range register, rc=%d\n",
220 __func__, rc);
221 return rc;
222 }
223
224 if (reg == 0x00) {
225 vreg->range = &fts2_range0;
226 } else if (reg == 0x01) {
227 vreg->range = &fts2_range1;
228 } else {
229 dev_err(&vreg->spmi_dev->dev, "%s: voltage range=%d is invalid\n",
230 __func__, reg);
231 rc = -EINVAL;
232 }
233
234 return rc;
235}
236
237static int qpnp_fts2_init_voltage(struct spm_vreg *vreg)
238{
239 int rc;
240 u8 reg = 0;
241
242 rc = spmi_ext_register_readl(vreg->spmi_dev->ctrl, vreg->spmi_dev->sid,
243 vreg->spmi_base_addr + QPNP_FTS2_REG_VOLTAGE_SETPOINT, &reg, 1);
244 if (rc) {
245 dev_err(&vreg->spmi_dev->dev, "%s: could not read voltage setpoint register, rc=%d\n",
246 __func__, rc);
247 return rc;
248 }
249
250 vreg->vlevel = reg;
251 vreg->uV = vreg->vlevel * vreg->range->step_uV + vreg->range->min_uV;
252 vreg->last_set_uV = vreg->uV;
253
254 return rc;
255}
256
257static int __devinit spm_regulator_probe(struct spmi_device *spmi)
258{
259 struct device_node *node = spmi->dev.of_node;
260 struct regulator_init_data *init_data;
261 struct spm_vreg *vreg;
262 struct resource *res;
263 int rc;
264
265 if (!node) {
266 dev_err(&spmi->dev, "%s: device node missing\n", __func__);
267 return -ENODEV;
268 }
269
270 vreg = devm_kzalloc(&spmi->dev, sizeof(*vreg), GFP_KERNEL);
271 if (!vreg) {
272 pr_err("allocation failed.\n");
273 return -ENOMEM;
274 }
275 vreg->spmi_dev = spmi;
276
277 res = spmi_get_resource(spmi, NULL, IORESOURCE_MEM, 0);
278 if (!res) {
279 dev_err(&spmi->dev, "%s: node is missing base address\n",
280 __func__);
281 return -EINVAL;
282 }
283 vreg->spmi_base_addr = res->start;
284
285 rc = qpnp_fts2_check_type(vreg);
286 if (rc)
287 return rc;
288
289 /*
290 * The FTS2 regulator must be initialized to range 0 or range 1 during
291 * PMIC power on sequence. Once it is set, it cannot be changed
292 * dynamically.
293 */
294 rc = qpnp_fts2_init_range(vreg);
295 if (rc)
296 return rc;
297
298 rc = qpnp_fts2_init_voltage(vreg);
299 if (rc)
300 return rc;
301
302 init_data = of_get_regulator_init_data(&spmi->dev, node);
303 if (!init_data) {
304 dev_err(&spmi->dev, "%s: unable to allocate memory\n",
305 __func__);
306 return -ENOMEM;
307 }
308 init_data->constraints.input_uV = init_data->constraints.max_uV;
309 init_data->constraints.valid_ops_mask |= REGULATOR_CHANGE_STATUS
310 | REGULATOR_CHANGE_VOLTAGE;
311
312 if (!init_data->constraints.name) {
313 dev_err(&spmi->dev, "%s: node is missing regulator name\n",
314 __func__);
315 return -EINVAL;
316 }
317
318 vreg->rdesc.name = init_data->constraints.name;
319 vreg->rdesc.type = REGULATOR_VOLTAGE;
320 vreg->rdesc.owner = THIS_MODULE;
321 vreg->rdesc.ops = &spm_regulator_ops;
322 vreg->rdesc.n_voltages
323 = (vreg->range->max_uV - vreg->range->set_point_min_uV)
324 / vreg->range->step_uV + 1;
325
326 vreg->rdev = regulator_register(&vreg->rdesc, &spmi->dev,
327 init_data, vreg, node);
328 if (IS_ERR(vreg->rdev)) {
329 rc = PTR_ERR(vreg->rdev);
330 dev_err(&spmi->dev, "%s: regulator_register failed, rc=%d\n",
331 __func__, rc);
332 return rc;
333 }
334
335 dev_set_drvdata(&spmi->dev, vreg);
336
337 pr_info("name=%s, range=%d\n", vreg->rdesc.name,
338 (vreg->range == &fts2_range0) ? 0 : 1);
339
340 return rc;
341}
342
343static int __devexit spm_regulator_remove(struct spmi_device *spmi)
344{
345 struct spm_vreg *vreg = dev_get_drvdata(&spmi->dev);
346
347 regulator_unregister(vreg->rdev);
348
349 return 0;
350}
351
352static struct of_device_id spm_regulator_match_table[] = {
353 { .compatible = SPM_REGULATOR_DRIVER_NAME, },
354 {}
355};
356
357static const struct spmi_device_id spm_regulator_id[] = {
358 { SPM_REGULATOR_DRIVER_NAME, 0 },
359 {}
360};
361MODULE_DEVICE_TABLE(spmi, spm_regulator_id);
362
363static struct spmi_driver spm_regulator_driver = {
364 .driver = {
365 .name = SPM_REGULATOR_DRIVER_NAME,
366 .of_match_table = spm_regulator_match_table,
367 .owner = THIS_MODULE,
368 },
369 .probe = spm_regulator_probe,
370 .remove = __devexit_p(spm_regulator_remove),
371 .id_table = spm_regulator_id,
372};
373
374/**
375 * spm_regulator_init() - register spmi driver for spm-regulator
376 *
377 * This initialization function should be called in systems in which driver
378 * registration ordering must be controlled precisely.
379 *
380 * Returns 0 on success or errno on failure.
381 */
382int __init spm_regulator_init(void)
383{
384 static bool has_registered;
385
386 if (has_registered)
387 return 0;
388 else
389 has_registered = true;
390
391 return spmi_driver_register(&spm_regulator_driver);
392}
393EXPORT_SYMBOL(spm_regulator_init);
394
395static void __exit spm_regulator_exit(void)
396{
397 spmi_driver_unregister(&spm_regulator_driver);
398}
399
400arch_initcall(spm_regulator_init);
401module_exit(spm_regulator_exit);
402
403MODULE_LICENSE("GPL v2");
404MODULE_DESCRIPTION("SPM regulator driver");
405MODULE_ALIAS("platform:spm-regulator");