diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2012-11-18 20:28:29 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-11-19 03:03:11 -0500 |
commit | 5928f5389664fffa295c39bbe23de73069124451 (patch) | |
tree | c6da1465977951e85eb6ecc9375fbd842e020b08 /drivers/regulator | |
parent | f4a75d2eb7b1e2206094b901be09adb31ba63681 (diff) |
regulator: max8973: add regulator driver support
The MAXIM MAX8973 high-efficiency, three phase, DC-DC step-down
switching regulator delievers up to 9A of output current. Each
phase operates at a 2MHz fixed frequency with a 120 deg shift
from the adjacent phase, allowing the use of small magnetic
component.
Add regulator driver for this device.
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/regulator')
-rw-r--r-- | drivers/regulator/Kconfig | 10 | ||||
-rw-r--r-- | drivers/regulator/Makefile | 1 | ||||
-rw-r--r-- | drivers/regulator/max8973-regulator.c | 505 |
3 files changed, 516 insertions, 0 deletions
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index 67d47b59a66d..2b8031235125 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig | |||
@@ -204,6 +204,16 @@ config REGULATOR_MAX8952 | |||
204 | via I2C bus. Maxim 8952 has one voltage output and supports 4 DVS | 204 | via I2C bus. Maxim 8952 has one voltage output and supports 4 DVS |
205 | modes ranging from 0.77V to 1.40V by 0.01V steps. | 205 | modes ranging from 0.77V to 1.40V by 0.01V steps. |
206 | 206 | ||
207 | config REGULATOR_MAX8973 | ||
208 | tristate "Maxim MAX8973 voltage regulator " | ||
209 | depends on I2C | ||
210 | select REGMAP_I2C | ||
211 | help | ||
212 | The MAXIM MAX8973 high-efficiency. three phase, DC-DC step-down | ||
213 | switching regulator delievers up to 9A of output current. Each | ||
214 | phase operates at a 2MHz fixed frequency with a 120 deg shift | ||
215 | from the adjacent phase, allowing the use of small magnetic component. | ||
216 | |||
207 | config REGULATOR_MAX8997 | 217 | config REGULATOR_MAX8997 |
208 | tristate "Maxim 8997/8966 regulator" | 218 | tristate "Maxim 8997/8966 regulator" |
209 | depends on MFD_MAX8997 | 219 | depends on MFD_MAX8997 |
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index e431eed8a878..3b51e0de33da 100644 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile | |||
@@ -34,6 +34,7 @@ obj-$(CONFIG_REGULATOR_MAX8660) += max8660.o | |||
34 | obj-$(CONFIG_REGULATOR_MAX8907) += max8907-regulator.o | 34 | obj-$(CONFIG_REGULATOR_MAX8907) += max8907-regulator.o |
35 | obj-$(CONFIG_REGULATOR_MAX8925) += max8925-regulator.o | 35 | obj-$(CONFIG_REGULATOR_MAX8925) += max8925-regulator.o |
36 | obj-$(CONFIG_REGULATOR_MAX8952) += max8952.o | 36 | obj-$(CONFIG_REGULATOR_MAX8952) += max8952.o |
37 | obj-$(CONFIG_REGULATOR_MAX8973) += max8973-regulator.o | ||
37 | obj-$(CONFIG_REGULATOR_MAX8997) += max8997.o | 38 | obj-$(CONFIG_REGULATOR_MAX8997) += max8997.o |
38 | obj-$(CONFIG_REGULATOR_MAX8998) += max8998.o | 39 | obj-$(CONFIG_REGULATOR_MAX8998) += max8998.o |
39 | obj-$(CONFIG_REGULATOR_MAX77686) += max77686.o | 40 | obj-$(CONFIG_REGULATOR_MAX77686) += max77686.o |
diff --git a/drivers/regulator/max8973-regulator.c b/drivers/regulator/max8973-regulator.c new file mode 100644 index 000000000000..e6328f935767 --- /dev/null +++ b/drivers/regulator/max8973-regulator.c | |||
@@ -0,0 +1,505 @@ | |||
1 | /* | ||
2 | * max8973-regulator.c -- Maxim max8973 | ||
3 | * | ||
4 | * Regulator driver for MAXIM 8973 DC-DC step-down switching regulator. | ||
5 | * | ||
6 | * Copyright (c) 2012, NVIDIA Corporation. | ||
7 | * | ||
8 | * Author: Laxman Dewangan <ldewangan@nvidia.com> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License as | ||
12 | * published by the Free Software Foundation version 2. | ||
13 | * | ||
14 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind, | ||
15 | * whether express or implied; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
22 | * 02111-1307, USA | ||
23 | */ | ||
24 | |||
25 | #include <linux/kernel.h> | ||
26 | #include <linux/module.h> | ||
27 | #include <linux/init.h> | ||
28 | #include <linux/err.h> | ||
29 | #include <linux/platform_device.h> | ||
30 | #include <linux/regulator/driver.h> | ||
31 | #include <linux/regulator/machine.h> | ||
32 | #include <linux/regulator/max8973-regulator.h> | ||
33 | #include <linux/gpio.h> | ||
34 | #include <linux/i2c.h> | ||
35 | #include <linux/slab.h> | ||
36 | #include <linux/regmap.h> | ||
37 | |||
38 | /* Register definitions */ | ||
39 | #define MAX8973_VOUT 0x0 | ||
40 | #define MAX8973_VOUT_DVS 0x1 | ||
41 | #define MAX8973_CONTROL1 0x2 | ||
42 | #define MAX8973_CONTROL2 0x3 | ||
43 | #define MAX8973_CHIPID1 0x4 | ||
44 | #define MAX8973_CHIPID2 0x5 | ||
45 | |||
46 | #define MAX8973_MAX_VOUT_REG 2 | ||
47 | |||
48 | /* MAX8973_VOUT */ | ||
49 | #define MAX8973_VOUT_ENABLE BIT(7) | ||
50 | #define MAX8973_VOUT_MASK 0x7F | ||
51 | |||
52 | /* MAX8973_VOUT_DVS */ | ||
53 | #define MAX8973_DVS_VOUT_MASK 0x7F | ||
54 | |||
55 | /* MAX8973_CONTROL1 */ | ||
56 | #define MAX8973_SNS_ENABLE BIT(7) | ||
57 | #define MAX8973_FPWM_EN_M BIT(6) | ||
58 | #define MAX8973_NFSR_ENABLE BIT(5) | ||
59 | #define MAX8973_AD_ENABLE BIT(4) | ||
60 | #define MAX8973_BIAS_ENABLE BIT(3) | ||
61 | #define MAX8973_FREQSHIFT_9PER BIT(2) | ||
62 | |||
63 | #define MAX8973_RAMP_12mV_PER_US 0x0 | ||
64 | #define MAX8973_RAMP_25mV_PER_US 0x1 | ||
65 | #define MAX8973_RAMP_50mV_PER_US 0x2 | ||
66 | #define MAX8973_RAMP_200mV_PER_US 0x3 | ||
67 | |||
68 | /* MAX8973_CONTROL2 */ | ||
69 | #define MAX8973_WDTMR_ENABLE BIT(6) | ||
70 | #define MAX8973_DISCH_ENBABLE BIT(5) | ||
71 | #define MAX8973_FT_ENABLE BIT(4) | ||
72 | |||
73 | #define MAX8973_CKKADV_TRIP_DISABLE 0xC | ||
74 | #define MAX8973_CKKADV_TRIP_75mV_PER_US 0x0 | ||
75 | #define MAX8973_CKKADV_TRIP_150mV_PER_US 0x4 | ||
76 | #define MAX8973_CKKADV_TRIP_75mV_PER_US_HIST_DIS 0x8 | ||
77 | #define MAX8973_CONTROL_CLKADV_TRIP_MASK 0x00030000 | ||
78 | |||
79 | #define MAX8973_INDUCTOR_MIN_30_PER 0x0 | ||
80 | #define MAX8973_INDUCTOR_NOMINAL 0x1 | ||
81 | #define MAX8973_INDUCTOR_PLUS_30_PER 0x2 | ||
82 | #define MAX8973_INDUCTOR_PLUS_60_PER 0x3 | ||
83 | #define MAX8973_CONTROL_INDUCTOR_VALUE_MASK 0x00300000 | ||
84 | |||
85 | #define MAX8973_MIN_VOLATGE 606250 | ||
86 | #define MAX8973_MAX_VOLATGE 1400000 | ||
87 | #define MAX8973_VOLATGE_STEP 6250 | ||
88 | #define MAX8973_BUCK_N_VOLTAGE 0x80 | ||
89 | |||
90 | /* Maxim 8973 chip information */ | ||
91 | struct max8973_chip { | ||
92 | struct device *dev; | ||
93 | struct regulator_desc desc; | ||
94 | struct regulator_dev *rdev; | ||
95 | struct regmap *regmap; | ||
96 | bool enable_external_control; | ||
97 | int dvs_gpio; | ||
98 | int lru_index[MAX8973_MAX_VOUT_REG]; | ||
99 | int curr_vout_val[MAX8973_MAX_VOUT_REG]; | ||
100 | int curr_vout_reg; | ||
101 | int curr_gpio_val; | ||
102 | bool valid_dvs_gpio; | ||
103 | }; | ||
104 | |||
105 | /* | ||
106 | * find_voltage_set_register: Find new voltage configuration register (VOUT). | ||
107 | * The finding of the new VOUT register will be based on the LRU mechanism. | ||
108 | * Each VOUT register will have different voltage configured . This | ||
109 | * Function will look if any of the VOUT register have requested voltage set | ||
110 | * or not. | ||
111 | * - If it is already there then it will make that register as most | ||
112 | * recently used and return as found so that caller need not to set | ||
113 | * the VOUT register but need to set the proper gpios to select this | ||
114 | * VOUT register. | ||
115 | * - If requested voltage is not found then it will use the least | ||
116 | * recently mechanism to get new VOUT register for new configuration | ||
117 | * and will return not_found so that caller need to set new VOUT | ||
118 | * register and then gpios (both). | ||
119 | */ | ||
120 | static bool find_voltage_set_register(struct max8973_chip *tps, | ||
121 | int req_vsel, int *vout_reg, int *gpio_val) | ||
122 | { | ||
123 | int i; | ||
124 | bool found = false; | ||
125 | int new_vout_reg = tps->lru_index[MAX8973_MAX_VOUT_REG - 1]; | ||
126 | int found_index = MAX8973_MAX_VOUT_REG - 1; | ||
127 | |||
128 | for (i = 0; i < MAX8973_MAX_VOUT_REG; ++i) { | ||
129 | if (tps->curr_vout_val[tps->lru_index[i]] == req_vsel) { | ||
130 | new_vout_reg = tps->lru_index[i]; | ||
131 | found_index = i; | ||
132 | found = true; | ||
133 | goto update_lru_index; | ||
134 | } | ||
135 | } | ||
136 | |||
137 | update_lru_index: | ||
138 | for (i = found_index; i > 0; i--) | ||
139 | tps->lru_index[i] = tps->lru_index[i - 1]; | ||
140 | |||
141 | tps->lru_index[0] = new_vout_reg; | ||
142 | *gpio_val = new_vout_reg; | ||
143 | *vout_reg = MAX8973_VOUT + new_vout_reg; | ||
144 | return found; | ||
145 | } | ||
146 | |||
147 | static int max8973_dcdc_get_voltage_sel(struct regulator_dev *rdev) | ||
148 | { | ||
149 | struct max8973_chip *max = rdev_get_drvdata(rdev); | ||
150 | unsigned int data; | ||
151 | int ret; | ||
152 | |||
153 | ret = regmap_read(max->regmap, max->curr_vout_reg, &data); | ||
154 | if (ret < 0) { | ||
155 | dev_err(max->dev, "register %d read failed, err = %d\n", | ||
156 | max->curr_vout_reg, ret); | ||
157 | return ret; | ||
158 | } | ||
159 | return data & MAX8973_VOUT_MASK; | ||
160 | } | ||
161 | |||
162 | static int max8973_dcdc_set_voltage_sel(struct regulator_dev *rdev, | ||
163 | unsigned vsel) | ||
164 | { | ||
165 | struct max8973_chip *max = rdev_get_drvdata(rdev); | ||
166 | int ret; | ||
167 | bool found = false; | ||
168 | int vout_reg = max->curr_vout_reg; | ||
169 | int gpio_val = max->curr_gpio_val; | ||
170 | |||
171 | /* | ||
172 | * If gpios are available to select the VOUT register then least | ||
173 | * recently used register for new configuration. | ||
174 | */ | ||
175 | if (max->valid_dvs_gpio) | ||
176 | found = find_voltage_set_register(max, vsel, | ||
177 | &vout_reg, &gpio_val); | ||
178 | |||
179 | if (!found) { | ||
180 | ret = regmap_update_bits(max->regmap, vout_reg, | ||
181 | MAX8973_VOUT_MASK, vsel); | ||
182 | if (ret < 0) { | ||
183 | dev_err(max->dev, "register %d update failed, err %d\n", | ||
184 | vout_reg, ret); | ||
185 | return ret; | ||
186 | } | ||
187 | max->curr_vout_reg = vout_reg; | ||
188 | max->curr_vout_val[gpio_val] = vsel; | ||
189 | } | ||
190 | |||
191 | /* Select proper VOUT register vio gpios */ | ||
192 | if (max->valid_dvs_gpio) { | ||
193 | gpio_set_value_cansleep(max->dvs_gpio, gpio_val & 0x1); | ||
194 | max->curr_gpio_val = gpio_val; | ||
195 | } | ||
196 | return 0; | ||
197 | } | ||
198 | |||
199 | static int max8973_dcdc_set_mode(struct regulator_dev *rdev, unsigned int mode) | ||
200 | { | ||
201 | struct max8973_chip *max = rdev_get_drvdata(rdev); | ||
202 | int ret; | ||
203 | int pwm; | ||
204 | |||
205 | /* Enable force PWM mode in FAST mode only. */ | ||
206 | switch (mode) { | ||
207 | case REGULATOR_MODE_FAST: | ||
208 | pwm = MAX8973_FPWM_EN_M; | ||
209 | break; | ||
210 | |||
211 | case REGULATOR_MODE_NORMAL: | ||
212 | pwm = 0; | ||
213 | break; | ||
214 | |||
215 | default: | ||
216 | return -EINVAL; | ||
217 | } | ||
218 | |||
219 | ret = regmap_update_bits(max->regmap, MAX8973_CONTROL1, | ||
220 | MAX8973_FPWM_EN_M, pwm); | ||
221 | if (ret < 0) | ||
222 | dev_err(max->dev, "register %d update failed, err %d\n", | ||
223 | MAX8973_CONTROL1, ret); | ||
224 | return ret; | ||
225 | } | ||
226 | |||
227 | static unsigned int max8973_dcdc_get_mode(struct regulator_dev *rdev) | ||
228 | { | ||
229 | struct max8973_chip *max = rdev_get_drvdata(rdev); | ||
230 | unsigned int data; | ||
231 | int ret; | ||
232 | |||
233 | ret = regmap_read(max->regmap, MAX8973_CONTROL1, &data); | ||
234 | if (ret < 0) { | ||
235 | dev_err(max->dev, "register %d read failed, err %d\n", | ||
236 | MAX8973_CONTROL1, ret); | ||
237 | return ret; | ||
238 | } | ||
239 | return (data & MAX8973_FPWM_EN_M) ? | ||
240 | REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL; | ||
241 | } | ||
242 | |||
243 | static struct regulator_ops max8973_dcdc_ops = { | ||
244 | .get_voltage_sel = max8973_dcdc_get_voltage_sel, | ||
245 | .set_voltage_sel = max8973_dcdc_set_voltage_sel, | ||
246 | .list_voltage = regulator_list_voltage_linear, | ||
247 | .set_mode = max8973_dcdc_set_mode, | ||
248 | .get_mode = max8973_dcdc_get_mode, | ||
249 | }; | ||
250 | |||
251 | static int __devinit max8973_init_dcdc(struct max8973_chip *max, | ||
252 | struct max8973_regulator_platform_data *pdata) | ||
253 | { | ||
254 | int ret; | ||
255 | uint8_t control1 = 0; | ||
256 | uint8_t control2 = 0; | ||
257 | |||
258 | if (pdata->control_flags & MAX8973_CONTROL_REMOTE_SENSE_ENABLE) | ||
259 | control1 |= MAX8973_SNS_ENABLE; | ||
260 | |||
261 | if (!(pdata->control_flags & MAX8973_CONTROL_FALLING_SLEW_RATE_ENABLE)) | ||
262 | control1 |= MAX8973_NFSR_ENABLE; | ||
263 | |||
264 | if (pdata->control_flags & MAX8973_CONTROL_OUTPUT_ACTIVE_DISCH_ENABLE) | ||
265 | control1 |= MAX8973_AD_ENABLE; | ||
266 | |||
267 | if (pdata->control_flags & MAX8973_CONTROL_BIAS_ENABLE) | ||
268 | control1 |= MAX8973_BIAS_ENABLE; | ||
269 | |||
270 | if (pdata->control_flags & MAX8973_CONTROL_FREQ_SHIFT_9PER_ENABLE) | ||
271 | control1 |= MAX8973_FREQSHIFT_9PER; | ||
272 | |||
273 | /* Set ramp delay */ | ||
274 | if (pdata->reg_init_data && | ||
275 | pdata->reg_init_data->constraints.ramp_delay) { | ||
276 | if (pdata->reg_init_data->constraints.ramp_delay < 25000) | ||
277 | control1 = MAX8973_RAMP_12mV_PER_US; | ||
278 | else if (pdata->reg_init_data->constraints.ramp_delay < 50000) | ||
279 | control1 = MAX8973_RAMP_25mV_PER_US; | ||
280 | else if (pdata->reg_init_data->constraints.ramp_delay < 200000) | ||
281 | control1 = MAX8973_RAMP_50mV_PER_US; | ||
282 | else | ||
283 | control1 = MAX8973_RAMP_200mV_PER_US; | ||
284 | } else { | ||
285 | control1 = MAX8973_RAMP_12mV_PER_US; | ||
286 | max->desc.ramp_delay = 12500; | ||
287 | } | ||
288 | |||
289 | if (!(pdata->control_flags & MAX8973_CONTROL_PULL_DOWN_ENABLE)) | ||
290 | control2 |= MAX8973_DISCH_ENBABLE; | ||
291 | |||
292 | /* Clock advance trip configuration */ | ||
293 | switch (pdata->control_flags & MAX8973_CONTROL_CLKADV_TRIP_MASK) { | ||
294 | case MAX8973_CONTROL_CLKADV_TRIP_DISABLED: | ||
295 | control2 |= MAX8973_CKKADV_TRIP_DISABLE; | ||
296 | break; | ||
297 | |||
298 | case MAX8973_CONTROL_CLKADV_TRIP_75mV_PER_US: | ||
299 | control2 |= MAX8973_CKKADV_TRIP_75mV_PER_US; | ||
300 | break; | ||
301 | |||
302 | case MAX8973_CONTROL_CLKADV_TRIP_150mV_PER_US: | ||
303 | control2 |= MAX8973_CKKADV_TRIP_150mV_PER_US; | ||
304 | break; | ||
305 | |||
306 | case MAX8973_CONTROL_CLKADV_TRIP_75mV_PER_US_HIST_DIS: | ||
307 | control2 |= MAX8973_CKKADV_TRIP_75mV_PER_US_HIST_DIS; | ||
308 | break; | ||
309 | } | ||
310 | |||
311 | /* Configure inductor value */ | ||
312 | switch (pdata->control_flags & MAX8973_CONTROL_INDUCTOR_VALUE_MASK) { | ||
313 | case MAX8973_CONTROL_INDUCTOR_VALUE_NOMINAL: | ||
314 | control2 |= MAX8973_INDUCTOR_NOMINAL; | ||
315 | break; | ||
316 | |||
317 | case MAX8973_CONTROL_INDUCTOR_VALUE_MINUS_30_PER: | ||
318 | control2 |= MAX8973_INDUCTOR_MIN_30_PER; | ||
319 | break; | ||
320 | |||
321 | case MAX8973_CONTROL_INDUCTOR_VALUE_PLUS_30_PER: | ||
322 | control2 |= MAX8973_INDUCTOR_PLUS_30_PER; | ||
323 | break; | ||
324 | |||
325 | case MAX8973_CONTROL_INDUCTOR_VALUE_PLUS_60_PER: | ||
326 | control2 |= MAX8973_INDUCTOR_PLUS_60_PER; | ||
327 | break; | ||
328 | } | ||
329 | |||
330 | ret = regmap_write(max->regmap, MAX8973_CONTROL1, control1); | ||
331 | if (ret < 0) { | ||
332 | dev_err(max->dev, "register %d write failed, err = %d", | ||
333 | MAX8973_CONTROL1, ret); | ||
334 | return ret; | ||
335 | } | ||
336 | |||
337 | ret = regmap_write(max->regmap, MAX8973_CONTROL2, control2); | ||
338 | if (ret < 0) { | ||
339 | dev_err(max->dev, "register %d write failed, err = %d", | ||
340 | MAX8973_CONTROL2, ret); | ||
341 | return ret; | ||
342 | } | ||
343 | |||
344 | /* If external control is enabled then disable EN bit */ | ||
345 | if (max->enable_external_control) { | ||
346 | ret = regmap_update_bits(max->regmap, MAX8973_VOUT, | ||
347 | MAX8973_VOUT_ENABLE, 0); | ||
348 | if (ret < 0) | ||
349 | dev_err(max->dev, "register %d update failed, err = %d", | ||
350 | MAX8973_VOUT, ret); | ||
351 | } | ||
352 | return ret; | ||
353 | } | ||
354 | |||
355 | static const struct regmap_config max8973_regmap_config = { | ||
356 | .reg_bits = 8, | ||
357 | .val_bits = 8, | ||
358 | .max_register = MAX8973_CHIPID2, | ||
359 | .cache_type = REGCACHE_RBTREE, | ||
360 | }; | ||
361 | |||
362 | static int __devinit max8973_probe(struct i2c_client *client, | ||
363 | const struct i2c_device_id *id) | ||
364 | { | ||
365 | struct max8973_regulator_platform_data *pdata; | ||
366 | struct regulator_config config = { }; | ||
367 | struct regulator_dev *rdev; | ||
368 | struct max8973_chip *max; | ||
369 | int ret; | ||
370 | |||
371 | pdata = client->dev.platform_data; | ||
372 | if (!pdata) { | ||
373 | dev_err(&client->dev, "No Platform data"); | ||
374 | return -EIO; | ||
375 | } | ||
376 | |||
377 | max = devm_kzalloc(&client->dev, sizeof(*max), GFP_KERNEL); | ||
378 | if (!max) { | ||
379 | dev_err(&client->dev, "Memory allocation for max failed\n"); | ||
380 | return -ENOMEM; | ||
381 | } | ||
382 | |||
383 | max->regmap = devm_regmap_init_i2c(client, &max8973_regmap_config); | ||
384 | if (IS_ERR(max->regmap)) { | ||
385 | ret = PTR_ERR(max->regmap); | ||
386 | dev_err(&client->dev, "regmap init failed, err %d\n", ret); | ||
387 | return ret; | ||
388 | } | ||
389 | |||
390 | i2c_set_clientdata(client, max); | ||
391 | max->dev = &client->dev; | ||
392 | max->desc.name = id->name; | ||
393 | max->desc.id = 0; | ||
394 | max->desc.ops = &max8973_dcdc_ops; | ||
395 | max->desc.type = REGULATOR_VOLTAGE; | ||
396 | max->desc.owner = THIS_MODULE; | ||
397 | max->desc.min_uV = MAX8973_MIN_VOLATGE; | ||
398 | max->desc.uV_step = MAX8973_VOLATGE_STEP; | ||
399 | max->desc.n_voltages = MAX8973_BUCK_N_VOLTAGE; | ||
400 | |||
401 | if (pdata->enable_ext_control) { | ||
402 | max->desc.enable_reg = MAX8973_VOUT; | ||
403 | max->desc.enable_mask = MAX8973_VOUT_ENABLE; | ||
404 | max8973_dcdc_ops.enable = regulator_is_enabled_regmap; | ||
405 | max8973_dcdc_ops.disable = regulator_disable_regmap; | ||
406 | max8973_dcdc_ops.is_enabled = regulator_is_enabled_regmap; | ||
407 | } | ||
408 | |||
409 | max->enable_external_control = pdata->enable_ext_control; | ||
410 | max->dvs_gpio = pdata->dvs_gpio; | ||
411 | max->curr_gpio_val = pdata->dvs_def_state; | ||
412 | max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state; | ||
413 | max->lru_index[0] = max->curr_vout_reg; | ||
414 | max->valid_dvs_gpio = false; | ||
415 | |||
416 | if (gpio_is_valid(max->dvs_gpio)) { | ||
417 | int gpio_flags; | ||
418 | int i; | ||
419 | |||
420 | gpio_flags = (pdata->dvs_def_state) ? | ||
421 | GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; | ||
422 | ret = devm_gpio_request_one(&client->dev, max->dvs_gpio, | ||
423 | gpio_flags, "max8973-dvs"); | ||
424 | if (ret) { | ||
425 | dev_err(&client->dev, | ||
426 | "gpio_request for gpio %d failed, err = %d\n", | ||
427 | max->dvs_gpio, ret); | ||
428 | return ret; | ||
429 | } | ||
430 | max->valid_dvs_gpio = true; | ||
431 | |||
432 | /* | ||
433 | * Initialize the lru index with vout_reg id | ||
434 | * The index 0 will be most recently used and | ||
435 | * set with the max->curr_vout_reg */ | ||
436 | for (i = 0; i < MAX8973_MAX_VOUT_REG; ++i) | ||
437 | max->lru_index[i] = i; | ||
438 | max->lru_index[0] = max->curr_vout_reg; | ||
439 | max->lru_index[max->curr_vout_reg] = 0; | ||
440 | } | ||
441 | |||
442 | ret = max8973_init_dcdc(max, pdata); | ||
443 | if (ret < 0) { | ||
444 | dev_err(max->dev, "Max8973 Init failed, err = %d\n", ret); | ||
445 | return ret; | ||
446 | } | ||
447 | |||
448 | config.dev = &client->dev; | ||
449 | config.init_data = pdata->reg_init_data; | ||
450 | config.driver_data = max; | ||
451 | config.of_node = client->dev.of_node; | ||
452 | config.regmap = max->regmap; | ||
453 | |||
454 | /* Register the regulators */ | ||
455 | rdev = regulator_register(&max->desc, &config); | ||
456 | if (IS_ERR(rdev)) { | ||
457 | ret = PTR_ERR(rdev); | ||
458 | dev_err(max->dev, "regulator register failed, err %d\n", ret); | ||
459 | return ret; | ||
460 | } | ||
461 | |||
462 | max->rdev = rdev; | ||
463 | return 0; | ||
464 | } | ||
465 | |||
466 | static int __devexit max8973_remove(struct i2c_client *client) | ||
467 | { | ||
468 | struct max8973_chip *max = i2c_get_clientdata(client); | ||
469 | |||
470 | regulator_unregister(max->rdev); | ||
471 | return 0; | ||
472 | } | ||
473 | |||
474 | static const struct i2c_device_id max8973_id[] = { | ||
475 | {.name = "max8973",}, | ||
476 | {}, | ||
477 | }; | ||
478 | |||
479 | MODULE_DEVICE_TABLE(i2c, max8973_id); | ||
480 | |||
481 | static struct i2c_driver max8973_i2c_driver = { | ||
482 | .driver = { | ||
483 | .name = "max8973", | ||
484 | .owner = THIS_MODULE, | ||
485 | }, | ||
486 | .probe = max8973_probe, | ||
487 | .remove = __devexit_p(max8973_remove), | ||
488 | .id_table = max8973_id, | ||
489 | }; | ||
490 | |||
491 | static int __init max8973_init(void) | ||
492 | { | ||
493 | return i2c_add_driver(&max8973_i2c_driver); | ||
494 | } | ||
495 | subsys_initcall(max8973_init); | ||
496 | |||
497 | static void __exit max8973_cleanup(void) | ||
498 | { | ||
499 | i2c_del_driver(&max8973_i2c_driver); | ||
500 | } | ||
501 | module_exit(max8973_cleanup); | ||
502 | |||
503 | MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>"); | ||
504 | MODULE_DESCRIPTION("MAX8973 voltage regulator driver"); | ||
505 | MODULE_LICENSE("GPL v2"); | ||