Blame view

drivers/regulator/max1586.c 7.31 KB
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  /*
   * max1586.c  --  Voltage and current regulation for the Maxim 1586
   *
   * Copyright (C) 2008 Robert Jarzmik
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  #include <linux/module.h>
  #include <linux/err.h>
  #include <linux/i2c.h>
  #include <linux/platform_device.h>
  #include <linux/regulator/driver.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
25
  #include <linux/slab.h>
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
26
27
28
29
30
31
32
  #include <linux/regulator/max1586.h>
  
  #define MAX1586_V3_MAX_VSEL 31
  #define MAX1586_V6_MAX_VSEL 3
  
  #define MAX1586_V3_MIN_UV   700000
  #define MAX1586_V3_MAX_UV  1475000
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
33
34
35
36
37
38
  
  #define MAX1586_V6_MIN_UV        0
  #define MAX1586_V6_MAX_UV  3000000
  
  #define I2C_V3_SELECT (0 << 5)
  #define I2C_V6_SELECT (1 << 5)
b110a8fb2   Philipp Zabel   regulator/max1586...
39
40
41
42
  struct max1586_data {
  	struct i2c_client *client;
  
  	/* min/max V3 voltage */
c8f1e5025   Philipp Zabel   regulator/max1586...
43
44
  	unsigned int min_uV;
  	unsigned int max_uV;
b110a8fb2   Philipp Zabel   regulator/max1586...
45
46
47
  
  	struct regulator_dev *rdev[0];
  };
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
48
49
50
51
  /*
   * V3 voltage
   * On I2C bus, sending a "x" byte to the max1586 means :
   *   set V3 to 0.700V + (x & 0x1f) * 0.025V
b110a8fb2   Philipp Zabel   regulator/max1586...
52
53
54
   * This voltage can be increased by external resistors
   * R24 and R25=100kOhm as described in the data sheet.
   * The gain is approximately: 1 + R24/R25 + R24/185.5kOhm
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
55
   */
b110a8fb2   Philipp Zabel   regulator/max1586...
56
57
  static int max1586_v3_calc_voltage(struct max1586_data *max1586,
  	unsigned selector)
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
58
  {
b110a8fb2   Philipp Zabel   regulator/max1586...
59
60
61
  	unsigned range_uV = max1586->max_uV - max1586->min_uV;
  
  	return max1586->min_uV + (selector * range_uV / MAX1586_V3_MAX_VSEL);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
62
  }
3a93f2a9f   Mark Brown   regulator: Report...
63
64
  static int max1586_v3_set(struct regulator_dev *rdev, int min_uV, int max_uV,
  			  unsigned *selector)
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
65
  {
b110a8fb2   Philipp Zabel   regulator/max1586...
66
67
68
  	struct max1586_data *max1586 = rdev_get_drvdata(rdev);
  	struct i2c_client *client = max1586->client;
  	unsigned range_uV = max1586->max_uV - max1586->min_uV;
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
69
  	u8 v3_prog;
b110a8fb2   Philipp Zabel   regulator/max1586...
70
  	if (min_uV > max1586->max_uV || max_uV < max1586->min_uV)
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
71
  		return -EINVAL;
b110a8fb2   Philipp Zabel   regulator/max1586...
72
73
  	if (min_uV < max1586->min_uV)
  		min_uV = max1586->min_uV;
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
74

3a93f2a9f   Mark Brown   regulator: Report...
75
  	*selector = ((min_uV - max1586->min_uV) * MAX1586_V3_MAX_VSEL +
b110a8fb2   Philipp Zabel   regulator/max1586...
76
  			range_uV - 1) / range_uV;
3a93f2a9f   Mark Brown   regulator: Report...
77
  	if (max1586_v3_calc_voltage(max1586, *selector) > max_uV)
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
78
79
80
81
  		return -EINVAL;
  
  	dev_dbg(&client->dev, "changing voltage v3 to %dmv
  ",
3a93f2a9f   Mark Brown   regulator: Report...
82
  		max1586_v3_calc_voltage(max1586, *selector) / 1000);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
83

3a93f2a9f   Mark Brown   regulator: Report...
84
  	v3_prog = I2C_V3_SELECT | (u8) *selector;
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
85
86
87
88
89
  	return i2c_smbus_write_byte(client, v3_prog);
  }
  
  static int max1586_v3_list(struct regulator_dev *rdev, unsigned selector)
  {
b110a8fb2   Philipp Zabel   regulator/max1586...
90
  	struct max1586_data *max1586 = rdev_get_drvdata(rdev);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
91
92
  	if (selector > MAX1586_V3_MAX_VSEL)
  		return -EINVAL;
b110a8fb2   Philipp Zabel   regulator/max1586...
93
  	return max1586_v3_calc_voltage(max1586, selector);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  }
  
  /*
   * V6 voltage
   * On I2C bus, sending a "x" byte to the max1586 means :
   *   set V6 to either 0V, 1.8V, 2.5V, 3V depending on (x & 0x3)
   * As regulator framework doesn't accept voltages to be 0V, we use 1uV.
   */
  static int max1586_v6_calc_voltage(unsigned selector)
  {
  	static int voltages_uv[] = { 1, 1800000, 2500000, 3000000 };
  
  	return voltages_uv[selector];
  }
3a93f2a9f   Mark Brown   regulator: Report...
108
109
  static int max1586_v6_set(struct regulator_dev *rdev, int min_uV, int max_uV,
  			  unsigned int *selector)
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
110
111
  {
  	struct i2c_client *client = rdev_get_drvdata(rdev);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
112
113
114
115
116
117
  	u8 v6_prog;
  
  	if (min_uV < MAX1586_V6_MIN_UV || min_uV > MAX1586_V6_MAX_UV)
  		return -EINVAL;
  	if (max_uV < MAX1586_V6_MIN_UV || max_uV > MAX1586_V6_MAX_UV)
  		return -EINVAL;
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
118
  	if (min_uV < 1800000)
3a93f2a9f   Mark Brown   regulator: Report...
119
  		*selector = 0;
3e352f9e0   Axel Lin   regulator: max158...
120
  	else if (min_uV < 2500000)
3a93f2a9f   Mark Brown   regulator: Report...
121
  		*selector = 1;
3e352f9e0   Axel Lin   regulator: max158...
122
  	else if (min_uV < 3000000)
3a93f2a9f   Mark Brown   regulator: Report...
123
  		*selector = 2;
3e352f9e0   Axel Lin   regulator: max158...
124
  	else if (min_uV >= 3000000)
3a93f2a9f   Mark Brown   regulator: Report...
125
  		*selector = 3;
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
126

3a93f2a9f   Mark Brown   regulator: Report...
127
  	if (max1586_v6_calc_voltage(*selector) > max_uV)
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
128
129
130
131
  		return -EINVAL;
  
  	dev_dbg(&client->dev, "changing voltage v6 to %dmv
  ",
3a93f2a9f   Mark Brown   regulator: Report...
132
  		max1586_v6_calc_voltage(*selector) / 1000);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
133

3a93f2a9f   Mark Brown   regulator: Report...
134
  	v6_prog = I2C_V6_SELECT | (u8) *selector;
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
  	return i2c_smbus_write_byte(client, v6_prog);
  }
  
  static int max1586_v6_list(struct regulator_dev *rdev, unsigned selector)
  {
  	if (selector > MAX1586_V6_MAX_VSEL)
  		return -EINVAL;
  	return max1586_v6_calc_voltage(selector);
  }
  
  /*
   * The Maxim 1586 controls V3 and V6 voltages, but offers no way of reading back
   * the set up value.
   */
  static struct regulator_ops max1586_v3_ops = {
  	.set_voltage = max1586_v3_set,
  	.list_voltage = max1586_v3_list,
  };
  
  static struct regulator_ops max1586_v6_ops = {
  	.set_voltage = max1586_v6_set,
  	.list_voltage = max1586_v6_list,
  };
  
  static struct regulator_desc max1586_reg[] = {
  	{
  		.name = "Output_V3",
  		.id = MAX1586_V3,
  		.ops = &max1586_v3_ops,
  		.type = REGULATOR_VOLTAGE,
  		.n_voltages = MAX1586_V3_MAX_VSEL + 1,
  		.owner = THIS_MODULE,
  	},
  	{
  		.name = "Output_V6",
  		.id = MAX1586_V6,
  		.ops = &max1586_v6_ops,
  		.type = REGULATOR_VOLTAGE,
  		.n_voltages = MAX1586_V6_MAX_VSEL + 1,
  		.owner = THIS_MODULE,
  	},
  };
bd88c9b28   Dmitry Torokhov   Regulators: max15...
177
178
  static int __devinit max1586_pmic_probe(struct i2c_client *client,
  					const struct i2c_device_id *i2c_id)
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
179
180
181
  {
  	struct regulator_dev **rdev;
  	struct max1586_platform_data *pdata = client->dev.platform_data;
b110a8fb2   Philipp Zabel   regulator/max1586...
182
183
184
185
186
187
188
189
  	struct max1586_data *max1586;
  	int i, id, ret = -ENOMEM;
  
  	max1586 = kzalloc(sizeof(struct max1586_data) +
  			sizeof(struct regulator_dev *) * (MAX1586_V6 + 1),
  			GFP_KERNEL);
  	if (!max1586)
  		goto out;
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
190

b110a8fb2   Philipp Zabel   regulator/max1586...
191
  	max1586->client = client;
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
192

b110a8fb2   Philipp Zabel   regulator/max1586...
193
194
195
196
  	if (!pdata->v3_gain) {
  		ret = -EINVAL;
  		goto out_unmap;
  	}
c8f1e5025   Philipp Zabel   regulator/max1586...
197
198
  	max1586->min_uV = MAX1586_V3_MIN_UV / 1000 * pdata->v3_gain / 1000;
  	max1586->max_uV = MAX1586_V3_MAX_UV / 1000 * pdata->v3_gain / 1000;
b110a8fb2   Philipp Zabel   regulator/max1586...
199
200
  
  	rdev = max1586->rdev;
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
201
202
203
204
205
206
207
208
209
210
211
  	for (i = 0; i < pdata->num_subdevs && i <= MAX1586_V6; i++) {
  		id = pdata->subdevs[i].id;
  		if (!pdata->subdevs[i].platform_data)
  			continue;
  		if (id < MAX1586_V3 || id > MAX1586_V6) {
  			dev_err(&client->dev, "invalid regulator id %d
  ", id);
  			goto err;
  		}
  		rdev[i] = regulator_register(&max1586_reg[id], &client->dev,
  					     pdata->subdevs[i].platform_data,
b110a8fb2   Philipp Zabel   regulator/max1586...
212
  					     max1586);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
213
214
215
216
217
218
219
220
  		if (IS_ERR(rdev[i])) {
  			ret = PTR_ERR(rdev[i]);
  			dev_err(&client->dev, "failed to register %s
  ",
  				max1586_reg[id].name);
  			goto err;
  		}
  	}
7c4c25e4b   Axel Lin   regulator: max158...
221
  	i2c_set_clientdata(client, max1586);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
222
223
224
225
226
227
228
  	dev_info(&client->dev, "Maxim 1586 regulator driver loaded
  ");
  	return 0;
  
  err:
  	while (--i >= 0)
  		regulator_unregister(rdev[i]);
b110a8fb2   Philipp Zabel   regulator/max1586...
229
230
231
  out_unmap:
  	kfree(max1586);
  out:
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
232
233
  	return ret;
  }
bd88c9b28   Dmitry Torokhov   Regulators: max15...
234
  static int __devexit max1586_pmic_remove(struct i2c_client *client)
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
235
  {
7c4c25e4b   Axel Lin   regulator: max158...
236
  	struct max1586_data *max1586 = i2c_get_clientdata(client);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
237
238
239
  	int i;
  
  	for (i = 0; i <= MAX1586_V6; i++)
7c4c25e4b   Axel Lin   regulator: max158...
240
241
242
  		if (max1586->rdev[i])
  			regulator_unregister(max1586->rdev[i]);
  	kfree(max1586);
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
243
244
245
246
247
248
249
250
251
252
253
254
  
  	return 0;
  }
  
  static const struct i2c_device_id max1586_id[] = {
  	{ "max1586", 0 },
  	{ }
  };
  MODULE_DEVICE_TABLE(i2c, max1586_id);
  
  static struct i2c_driver max1586_pmic_driver = {
  	.probe = max1586_pmic_probe,
bd88c9b28   Dmitry Torokhov   Regulators: max15...
255
  	.remove = __devexit_p(max1586_pmic_remove),
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
256
257
  	.driver		= {
  		.name	= "max1586",
bd88c9b28   Dmitry Torokhov   Regulators: max15...
258
  		.owner	= THIS_MODULE,
55f4fa4e3   Robert Jarzmik   Maxim 1586 regula...
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
  	},
  	.id_table	= max1586_id,
  };
  
  static int __init max1586_pmic_init(void)
  {
  	return i2c_add_driver(&max1586_pmic_driver);
  }
  subsys_initcall(max1586_pmic_init);
  
  static void __exit max1586_pmic_exit(void)
  {
  	i2c_del_driver(&max1586_pmic_driver);
  }
  module_exit(max1586_pmic_exit);
  
  /* Module information */
  MODULE_DESCRIPTION("MAXIM 1586 voltage regulator driver");
  MODULE_AUTHOR("Robert Jarzmik");
  MODULE_LICENSE("GPL");