blob: 9b01a22c3e707bef6ce37910af96fe33eed310ed [file] [log] [blame]
Mark Brown9e501082010-01-29 18:20:29 +00001/*
2 * wm8994-core.c -- Device access for Wolfson WM8994
3 *
4 * Copyright 2009 Wolfson Microelectronics PLC.
5 *
6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 *
13 */
14
15#include <linux/kernel.h>
16#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090017#include <linux/slab.h>
Mark Brown9e501082010-01-29 18:20:29 +000018#include <linux/i2c.h>
19#include <linux/delay.h>
20#include <linux/mfd/core.h>
Mark Brownd450f192010-11-26 17:19:35 +000021#include <linux/pm_runtime.h>
Mark Brown9e501082010-01-29 18:20:29 +000022#include <linux/regulator/consumer.h>
23#include <linux/regulator/machine.h>
24
25#include <linux/mfd/wm8994/core.h>
26#include <linux/mfd/wm8994/pdata.h>
27#include <linux/mfd/wm8994/registers.h>
28
29static int wm8994_read(struct wm8994 *wm8994, unsigned short reg,
30 int bytes, void *dest)
31{
32 int ret, i;
33 u16 *buf = dest;
34
35 BUG_ON(bytes % 2);
36 BUG_ON(bytes <= 0);
37
38 ret = wm8994->read_dev(wm8994, reg, bytes, dest);
39 if (ret < 0)
40 return ret;
41
42 for (i = 0; i < bytes / 2; i++) {
Mark Brown9e501082010-01-29 18:20:29 +000043 dev_vdbg(wm8994->dev, "Read %04x from R%d(0x%x)\n",
Mark Brown316b6cc2011-03-18 12:50:10 +000044 be16_to_cpu(buf[i]), reg + i, reg + i);
Mark Brown9e501082010-01-29 18:20:29 +000045 }
46
47 return 0;
48}
49
50/**
51 * wm8994_reg_read: Read a single WM8994 register.
52 *
53 * @wm8994: Device to read from.
54 * @reg: Register to read.
55 */
56int wm8994_reg_read(struct wm8994 *wm8994, unsigned short reg)
57{
58 unsigned short val;
59 int ret;
60
61 mutex_lock(&wm8994->io_lock);
62
63 ret = wm8994_read(wm8994, reg, 2, &val);
64
65 mutex_unlock(&wm8994->io_lock);
66
67 if (ret < 0)
68 return ret;
69 else
Mark Brown316b6cc2011-03-18 12:50:10 +000070 return be16_to_cpu(val);
Mark Brown9e501082010-01-29 18:20:29 +000071}
72EXPORT_SYMBOL_GPL(wm8994_reg_read);
73
74/**
75 * wm8994_bulk_read: Read multiple WM8994 registers
76 *
77 * @wm8994: Device to read from
78 * @reg: First register
79 * @count: Number of registers
Mark Brown316b6cc2011-03-18 12:50:10 +000080 * @buf: Buffer to fill. The data will be returned big endian.
Mark Brown9e501082010-01-29 18:20:29 +000081 */
82int wm8994_bulk_read(struct wm8994 *wm8994, unsigned short reg,
83 int count, u16 *buf)
84{
85 int ret;
86
87 mutex_lock(&wm8994->io_lock);
88
89 ret = wm8994_read(wm8994, reg, count * 2, buf);
90
91 mutex_unlock(&wm8994->io_lock);
92
93 return ret;
94}
95EXPORT_SYMBOL_GPL(wm8994_bulk_read);
96
97static int wm8994_write(struct wm8994 *wm8994, unsigned short reg,
Mark Brown07e73fb2011-03-17 21:42:30 +000098 int bytes, const void *src)
Mark Brown9e501082010-01-29 18:20:29 +000099{
Mark Brown07e73fb2011-03-17 21:42:30 +0000100 const u16 *buf = src;
Mark Brown9e501082010-01-29 18:20:29 +0000101 int i;
102
103 BUG_ON(bytes % 2);
104 BUG_ON(bytes <= 0);
105
106 for (i = 0; i < bytes / 2; i++) {
107 dev_vdbg(wm8994->dev, "Write %04x to R%d(0x%x)\n",
Mark Brown42771632011-03-17 21:42:29 +0000108 be16_to_cpu(buf[i]), reg + i, reg + i);
Mark Brown9e501082010-01-29 18:20:29 +0000109 }
110
111 return wm8994->write_dev(wm8994, reg, bytes, src);
112}
113
114/**
115 * wm8994_reg_write: Write a single WM8994 register.
116 *
117 * @wm8994: Device to write to.
118 * @reg: Register to write to.
119 * @val: Value to write.
120 */
121int wm8994_reg_write(struct wm8994 *wm8994, unsigned short reg,
122 unsigned short val)
123{
124 int ret;
125
Mark Brown42771632011-03-17 21:42:29 +0000126 val = cpu_to_be16(val);
127
Mark Brown9e501082010-01-29 18:20:29 +0000128 mutex_lock(&wm8994->io_lock);
129
130 ret = wm8994_write(wm8994, reg, 2, &val);
131
132 mutex_unlock(&wm8994->io_lock);
133
134 return ret;
135}
136EXPORT_SYMBOL_GPL(wm8994_reg_write);
137
138/**
Mark Browne93c5382011-03-10 13:54:07 +0000139 * wm8994_bulk_write: Write multiple WM8994 registers
140 *
141 * @wm8994: Device to write to
142 * @reg: First register
143 * @count: Number of registers
Mark Brown42771632011-03-17 21:42:29 +0000144 * @buf: Buffer to write from. Data must be big-endian formatted.
Mark Browne93c5382011-03-10 13:54:07 +0000145 */
146int wm8994_bulk_write(struct wm8994 *wm8994, unsigned short reg,
Mark Brown07e73fb2011-03-17 21:42:30 +0000147 int count, const u16 *buf)
Mark Browne93c5382011-03-10 13:54:07 +0000148{
149 int ret;
150
151 mutex_lock(&wm8994->io_lock);
152
153 ret = wm8994_write(wm8994, reg, count * 2, buf);
154
155 mutex_unlock(&wm8994->io_lock);
156
157 return ret;
158}
159EXPORT_SYMBOL_GPL(wm8994_bulk_write);
160
161/**
Mark Brown9e501082010-01-29 18:20:29 +0000162 * wm8994_set_bits: Set the value of a bitfield in a WM8994 register
163 *
164 * @wm8994: Device to write to.
165 * @reg: Register to write to.
166 * @mask: Mask of bits to set.
167 * @val: Value to set (unshifted)
168 */
169int wm8994_set_bits(struct wm8994 *wm8994, unsigned short reg,
170 unsigned short mask, unsigned short val)
171{
172 int ret;
173 u16 r;
174
175 mutex_lock(&wm8994->io_lock);
176
177 ret = wm8994_read(wm8994, reg, 2, &r);
178 if (ret < 0)
179 goto out;
180
Mark Brown316b6cc2011-03-18 12:50:10 +0000181 r = be16_to_cpu(r);
182
Mark Brown9e501082010-01-29 18:20:29 +0000183 r &= ~mask;
184 r |= val;
185
Mark Brown42771632011-03-17 21:42:29 +0000186 r = cpu_to_be16(r);
187
Mark Brown9e501082010-01-29 18:20:29 +0000188 ret = wm8994_write(wm8994, reg, 2, &r);
189
190out:
191 mutex_unlock(&wm8994->io_lock);
192
193 return ret;
194}
195EXPORT_SYMBOL_GPL(wm8994_set_bits);
196
197static struct mfd_cell wm8994_regulator_devs[] = {
Mark Brownd450f192010-11-26 17:19:35 +0000198 {
199 .name = "wm8994-ldo",
200 .id = 1,
201 .pm_runtime_no_callbacks = true,
202 },
203 {
204 .name = "wm8994-ldo",
205 .id = 2,
206 .pm_runtime_no_callbacks = true,
207 },
Mark Brown9e501082010-01-29 18:20:29 +0000208};
209
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000210static struct resource wm8994_codec_resources[] = {
211 {
212 .start = WM8994_IRQ_TEMP_SHUT,
213 .end = WM8994_IRQ_TEMP_WARN,
214 .flags = IORESOURCE_IRQ,
215 },
216};
217
218static struct resource wm8994_gpio_resources[] = {
219 {
220 .start = WM8994_IRQ_GPIO(1),
221 .end = WM8994_IRQ_GPIO(11),
222 .flags = IORESOURCE_IRQ,
223 },
224};
225
Mark Brown9e501082010-01-29 18:20:29 +0000226static struct mfd_cell wm8994_devs[] = {
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000227 {
228 .name = "wm8994-codec",
229 .num_resources = ARRAY_SIZE(wm8994_codec_resources),
230 .resources = wm8994_codec_resources,
231 },
232
233 {
234 .name = "wm8994-gpio",
235 .num_resources = ARRAY_SIZE(wm8994_gpio_resources),
236 .resources = wm8994_gpio_resources,
Mark Brownd450f192010-11-26 17:19:35 +0000237 .pm_runtime_no_callbacks = true,
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000238 },
Mark Brown9e501082010-01-29 18:20:29 +0000239};
240
241/*
242 * Supplies for the main bulk of CODEC; the LDO supplies are ignored
243 * and should be handled via the standard regulator API supply
244 * management.
245 */
246static const char *wm8994_main_supplies[] = {
247 "DBVDD",
248 "DCVDD",
249 "AVDD1",
250 "AVDD2",
251 "CPVDD",
252 "SPKVDD1",
253 "SPKVDD2",
254};
255
Mark Brown559e0df2010-08-31 19:25:12 +0100256static const char *wm8958_main_supplies[] = {
257 "DBVDD1",
258 "DBVDD2",
259 "DBVDD3",
260 "DCVDD",
261 "AVDD1",
262 "AVDD2",
263 "CPVDD",
264 "SPKVDD1",
265 "SPKVDD2",
266};
267
Mark Brown9e501082010-01-29 18:20:29 +0000268#ifdef CONFIG_PM
Mark Brownd450f192010-11-26 17:19:35 +0000269static int wm8994_suspend(struct device *dev)
Mark Brown9e501082010-01-29 18:20:29 +0000270{
271 struct wm8994 *wm8994 = dev_get_drvdata(dev);
272 int ret;
273
Mark Brown77bd70e2011-02-04 14:57:43 +0000274 /* Don't actually go through with the suspend if the CODEC is
275 * still active (eg, for audio passthrough from CP. */
276 ret = wm8994_reg_read(wm8994, WM8994_POWER_MANAGEMENT_1);
277 if (ret < 0) {
278 dev_err(dev, "Failed to read power status: %d\n", ret);
279 } else if (ret & WM8994_VMID_SEL_MASK) {
280 dev_dbg(dev, "CODEC still active, ignoring suspend\n");
281 return 0;
282 }
283
Mark Brown5f40c6b2011-08-13 14:37:48 +0900284 ret = wm8994_reg_read(wm8994, WM8994_POWER_MANAGEMENT_4);
285 if (ret < 0) {
286 dev_err(dev, "Failed to read power status: %d\n", ret);
287 } else if (ret & (WM8994_AIF2ADCL_ENA | WM8994_AIF2ADCR_ENA |
288 WM8994_AIF1ADC2L_ENA | WM8994_AIF1ADC2R_ENA |
289 WM8994_AIF1ADC1L_ENA | WM8994_AIF1ADC1R_ENA)) {
290 dev_dbg(dev, "CODEC still active, ignoring suspend\n");
291 return 0;
292 }
293
294 ret = wm8994_reg_read(wm8994, WM8994_POWER_MANAGEMENT_5);
295 if (ret < 0) {
296 dev_err(dev, "Failed to read power status: %d\n", ret);
297 } else if (ret & (WM8994_AIF2DACL_ENA | WM8994_AIF2DACR_ENA |
298 WM8994_AIF1DAC2L_ENA | WM8994_AIF1DAC2R_ENA |
299 WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA)) {
300 dev_dbg(dev, "CODEC still active, ignoring suspend\n");
301 return 0;
302 }
303
304 switch (wm8994->type) {
305 case WM8958:
306 ret = wm8994_reg_read(wm8994, WM8958_MIC_DETECT_1);
307 if (ret < 0) {
308 dev_err(dev, "Failed to read power status: %d\n", ret);
309 } else if (ret & WM8958_MICD_ENA) {
310 dev_dbg(dev, "CODEC still active, ignoring suspend\n");
311 return 0;
312 }
313 break;
314 default:
315 break;
316 }
317
Mark Brown881de672011-08-22 15:43:55 +0200318 /* Disable LDO pulldowns while the device is suspended if we
319 * don't know that something will be driving them. */
320 if (!wm8994->ldo_ena_always_driven)
321 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
322 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD,
323 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD);
324
Mark Brown9e501082010-01-29 18:20:29 +0000325 /* GPIO configuration state is saved here since we may be configuring
326 * the GPIO alternate functions even if we're not using the gpiolib
327 * driver for them.
328 */
329 ret = wm8994_read(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2,
330 &wm8994->gpio_regs);
331 if (ret < 0)
332 dev_err(dev, "Failed to save GPIO registers: %d\n", ret);
333
334 /* For similar reasons we also stash the regulator states */
335 ret = wm8994_read(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2,
336 &wm8994->ldo_regs);
337 if (ret < 0)
338 dev_err(dev, "Failed to save LDO registers: %d\n", ret);
339
Mark Brownf40dff92011-02-21 18:30:31 +0000340 /* Explicitly put the device into reset in case regulators
341 * don't get disabled in order to ensure consistent restart.
342 */
343 wm8994_reg_write(wm8994, WM8994_SOFTWARE_RESET, 0x8994);
344
Mark Brown77bd70e2011-02-04 14:57:43 +0000345 wm8994->suspended = true;
346
Mark Brown559e0df2010-08-31 19:25:12 +0100347 ret = regulator_bulk_disable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000348 wm8994->supplies);
349 if (ret != 0) {
350 dev_err(dev, "Failed to disable supplies: %d\n", ret);
351 return ret;
352 }
353
354 return 0;
355}
356
Mark Brownd450f192010-11-26 17:19:35 +0000357static int wm8994_resume(struct device *dev)
Mark Brown9e501082010-01-29 18:20:29 +0000358{
359 struct wm8994 *wm8994 = dev_get_drvdata(dev);
Mark Brown98ae1cc2011-06-07 11:49:42 +0100360 int ret, i;
Mark Brown9e501082010-01-29 18:20:29 +0000361
Mark Brown77bd70e2011-02-04 14:57:43 +0000362 /* We may have lied to the PM core about suspending */
363 if (!wm8994->suspended)
364 return 0;
365
Mark Brown559e0df2010-08-31 19:25:12 +0100366 ret = regulator_bulk_enable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000367 wm8994->supplies);
368 if (ret != 0) {
369 dev_err(dev, "Failed to enable supplies: %d\n", ret);
370 return ret;
371 }
372
Mark Brown98ae1cc2011-06-07 11:49:42 +0100373 /* Write register at a time as we use the cache on the CPU so store
374 * it in native endian.
375 */
376 for (i = 0; i < ARRAY_SIZE(wm8994->irq_masks_cur); i++) {
377 ret = wm8994_reg_write(wm8994, WM8994_INTERRUPT_STATUS_1_MASK
378 + i, wm8994->irq_masks_cur[i]);
379 if (ret < 0)
380 dev_err(dev, "Failed to restore interrupt masks: %d\n",
381 ret);
382 }
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000383
Mark Brown9e501082010-01-29 18:20:29 +0000384 ret = wm8994_write(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2,
385 &wm8994->ldo_regs);
386 if (ret < 0)
387 dev_err(dev, "Failed to restore LDO registers: %d\n", ret);
388
389 ret = wm8994_write(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2,
390 &wm8994->gpio_regs);
391 if (ret < 0)
392 dev_err(dev, "Failed to restore GPIO registers: %d\n", ret);
393
Mark Brown881de672011-08-22 15:43:55 +0200394 /* Disable LDO pulldowns while the device is active */
395 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
396 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD,
397 0);
398
Mark Brown77bd70e2011-02-04 14:57:43 +0000399 wm8994->suspended = false;
400
Mark Brown9e501082010-01-29 18:20:29 +0000401 return 0;
402}
403#endif
404
405#ifdef CONFIG_REGULATOR
406static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo)
407{
408 struct wm8994_ldo_pdata *ldo_pdata;
409
410 if (!pdata)
411 return 0;
412
413 ldo_pdata = &pdata->ldo[ldo];
414
415 if (!ldo_pdata->init_data)
416 return 0;
417
418 return ldo_pdata->init_data->num_consumer_supplies != 0;
419}
420#else
421static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo)
422{
423 return 0;
424}
425#endif
426
427/*
428 * Instantiate the generic non-control parts of the device.
429 */
Mark Brown559e0df2010-08-31 19:25:12 +0100430static int wm8994_device_init(struct wm8994 *wm8994, int irq)
Mark Brown9e501082010-01-29 18:20:29 +0000431{
432 struct wm8994_pdata *pdata = wm8994->dev->platform_data;
Mark Brown559e0df2010-08-31 19:25:12 +0100433 const char *devname;
Mark Brown9e501082010-01-29 18:20:29 +0000434 int ret, i;
435
436 mutex_init(&wm8994->io_lock);
437 dev_set_drvdata(wm8994->dev, wm8994);
438
439 /* Add the on-chip regulators first for bootstrapping */
440 ret = mfd_add_devices(wm8994->dev, -1,
441 wm8994_regulator_devs,
442 ARRAY_SIZE(wm8994_regulator_devs),
443 NULL, 0);
444 if (ret != 0) {
445 dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
446 goto err;
447 }
448
Mark Brown559e0df2010-08-31 19:25:12 +0100449 switch (wm8994->type) {
450 case WM8994:
451 wm8994->num_supplies = ARRAY_SIZE(wm8994_main_supplies);
452 break;
453 case WM8958:
454 wm8994->num_supplies = ARRAY_SIZE(wm8958_main_supplies);
455 break;
456 default:
457 BUG();
Mark Brownf85dbda2011-06-17 12:19:41 +0100458 goto err;
Mark Brown559e0df2010-08-31 19:25:12 +0100459 }
460
Mark Brown9e501082010-01-29 18:20:29 +0000461 wm8994->supplies = kzalloc(sizeof(struct regulator_bulk_data) *
Mark Brown559e0df2010-08-31 19:25:12 +0100462 wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000463 GFP_KERNEL);
Axel Linfccbd212010-08-04 09:44:47 +0800464 if (!wm8994->supplies) {
465 ret = -ENOMEM;
Mark Brown9e501082010-01-29 18:20:29 +0000466 goto err;
Axel Linfccbd212010-08-04 09:44:47 +0800467 }
Mark Brown9e501082010-01-29 18:20:29 +0000468
Mark Brown559e0df2010-08-31 19:25:12 +0100469 switch (wm8994->type) {
470 case WM8994:
471 for (i = 0; i < ARRAY_SIZE(wm8994_main_supplies); i++)
472 wm8994->supplies[i].supply = wm8994_main_supplies[i];
473 break;
474 case WM8958:
475 for (i = 0; i < ARRAY_SIZE(wm8958_main_supplies); i++)
476 wm8994->supplies[i].supply = wm8958_main_supplies[i];
477 break;
478 default:
479 BUG();
Mark Brownf85dbda2011-06-17 12:19:41 +0100480 goto err;
Mark Brown559e0df2010-08-31 19:25:12 +0100481 }
482
483 ret = regulator_bulk_get(wm8994->dev, wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000484 wm8994->supplies);
485 if (ret != 0) {
486 dev_err(wm8994->dev, "Failed to get supplies: %d\n", ret);
Joonyoung Shim77310742010-02-07 10:16:14 +0900487 goto err_supplies;
Mark Brown9e501082010-01-29 18:20:29 +0000488 }
489
Mark Brown559e0df2010-08-31 19:25:12 +0100490 ret = regulator_bulk_enable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000491 wm8994->supplies);
492 if (ret != 0) {
493 dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret);
Joonyoung Shim77310742010-02-07 10:16:14 +0900494 goto err_get;
Mark Brown9e501082010-01-29 18:20:29 +0000495 }
496
497 ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET);
498 if (ret < 0) {
499 dev_err(wm8994->dev, "Failed to read ID register\n");
500 goto err_enable;
501 }
Mark Brown559e0df2010-08-31 19:25:12 +0100502 switch (ret) {
503 case 0x8994:
504 devname = "WM8994";
505 if (wm8994->type != WM8994)
506 dev_warn(wm8994->dev, "Device registered as type %d\n",
507 wm8994->type);
508 wm8994->type = WM8994;
509 break;
510 case 0x8958:
511 devname = "WM8958";
512 if (wm8994->type != WM8958)
513 dev_warn(wm8994->dev, "Device registered as type %d\n",
514 wm8994->type);
515 wm8994->type = WM8958;
516 break;
517 default:
Mark Brown9e501082010-01-29 18:20:29 +0000518 dev_err(wm8994->dev, "Device is not a WM8994, ID is %x\n",
519 ret);
520 ret = -EINVAL;
521 goto err_enable;
522 }
523
524 ret = wm8994_reg_read(wm8994, WM8994_CHIP_REVISION);
525 if (ret < 0) {
526 dev_err(wm8994->dev, "Failed to read revision register: %d\n",
527 ret);
528 goto err_enable;
529 }
530
Mark Browna2495bc2011-06-02 19:18:55 +0100531 switch (wm8994->type) {
532 case WM8994:
533 switch (ret) {
534 case 0:
535 case 1:
Mark Brown559e0df2010-08-31 19:25:12 +0100536 dev_warn(wm8994->dev,
537 "revision %c not fully supported\n",
538 'A' + ret);
Mark Browna2495bc2011-06-02 19:18:55 +0100539 break;
540 default:
541 break;
542 }
Mark Brown9e501082010-01-29 18:20:29 +0000543 break;
544 default:
Mark Brown9e501082010-01-29 18:20:29 +0000545 break;
546 }
547
Mark Brown559e0df2010-08-31 19:25:12 +0100548 dev_info(wm8994->dev, "%s revision %c\n", devname, 'A' + ret);
Mark Brown9e501082010-01-29 18:20:29 +0000549
550 if (pdata) {
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000551 wm8994->irq_base = pdata->irq_base;
Mark Brown9e501082010-01-29 18:20:29 +0000552 wm8994->gpio_base = pdata->gpio_base;
553
554 /* GPIO configuration is only applied if it's non-zero */
555 for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
556 if (pdata->gpio_defaults[i]) {
557 wm8994_set_bits(wm8994, WM8994_GPIO_1 + i,
558 0xffff,
559 pdata->gpio_defaults[i]);
560 }
561 }
Mark Brown881de672011-08-22 15:43:55 +0200562
563 wm8994->ldo_ena_always_driven = pdata->ldo_ena_always_driven;
Mark Brown9e501082010-01-29 18:20:29 +0000564 }
565
Mark Brown881de672011-08-22 15:43:55 +0200566 /* Disable LDO pulldowns while the device is active */
567 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
568 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD,
569 0);
570
Mark Brown9e501082010-01-29 18:20:29 +0000571 /* In some system designs where the regulators are not in use,
572 * we can achieve a small reduction in leakage currents by
573 * floating LDO outputs. This bit makes no difference if the
574 * LDOs are enabled, it only affects cases where the LDOs were
575 * in operation and are then disabled.
576 */
577 for (i = 0; i < WM8994_NUM_LDO_REGS; i++) {
578 if (wm8994_ldo_in_use(pdata, i))
579 wm8994_set_bits(wm8994, WM8994_LDO_1 + i,
580 WM8994_LDO1_DISCH, WM8994_LDO1_DISCH);
581 else
582 wm8994_set_bits(wm8994, WM8994_LDO_1 + i,
583 WM8994_LDO1_DISCH, 0);
584 }
585
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000586 wm8994_irq_init(wm8994);
587
Mark Brown9e501082010-01-29 18:20:29 +0000588 ret = mfd_add_devices(wm8994->dev, -1,
589 wm8994_devs, ARRAY_SIZE(wm8994_devs),
590 NULL, 0);
591 if (ret != 0) {
592 dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000593 goto err_irq;
Mark Brown9e501082010-01-29 18:20:29 +0000594 }
595
Mark Brownd450f192010-11-26 17:19:35 +0000596 pm_runtime_enable(wm8994->dev);
597 pm_runtime_resume(wm8994->dev);
598
Mark Brown9e501082010-01-29 18:20:29 +0000599 return 0;
600
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000601err_irq:
602 wm8994_irq_exit(wm8994);
Mark Brown9e501082010-01-29 18:20:29 +0000603err_enable:
Mark Brown559e0df2010-08-31 19:25:12 +0100604 regulator_bulk_disable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000605 wm8994->supplies);
606err_get:
Mark Brown559e0df2010-08-31 19:25:12 +0100607 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
Mark Brown9e501082010-01-29 18:20:29 +0000608err_supplies:
609 kfree(wm8994->supplies);
610err:
611 mfd_remove_devices(wm8994->dev);
612 kfree(wm8994);
613 return ret;
614}
615
616static void wm8994_device_exit(struct wm8994 *wm8994)
617{
Mark Brownd450f192010-11-26 17:19:35 +0000618 pm_runtime_disable(wm8994->dev);
Mark Brown9e501082010-01-29 18:20:29 +0000619 mfd_remove_devices(wm8994->dev);
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000620 wm8994_irq_exit(wm8994);
Mark Brown559e0df2010-08-31 19:25:12 +0100621 regulator_bulk_disable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000622 wm8994->supplies);
Mark Brown559e0df2010-08-31 19:25:12 +0100623 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
Mark Brown9e501082010-01-29 18:20:29 +0000624 kfree(wm8994->supplies);
625 kfree(wm8994);
626}
627
628static int wm8994_i2c_read_device(struct wm8994 *wm8994, unsigned short reg,
629 int bytes, void *dest)
630{
631 struct i2c_client *i2c = wm8994->control_data;
632 int ret;
633 u16 r = cpu_to_be16(reg);
634
635 ret = i2c_master_send(i2c, (unsigned char *)&r, 2);
636 if (ret < 0)
637 return ret;
638 if (ret != 2)
639 return -EIO;
640
641 ret = i2c_master_recv(i2c, dest, bytes);
642 if (ret < 0)
643 return ret;
644 if (ret != bytes)
645 return -EIO;
646 return 0;
647}
648
Mark Brown9e501082010-01-29 18:20:29 +0000649static int wm8994_i2c_write_device(struct wm8994 *wm8994, unsigned short reg,
Mark Brown07e73fb2011-03-17 21:42:30 +0000650 int bytes, const void *src)
Mark Brown9e501082010-01-29 18:20:29 +0000651{
652 struct i2c_client *i2c = wm8994->control_data;
Mark Brown334e9ab2011-03-17 21:42:28 +0000653 struct i2c_msg xfer[2];
Mark Brown9e501082010-01-29 18:20:29 +0000654 int ret;
655
656 reg = cpu_to_be16(reg);
Mark Brown9e501082010-01-29 18:20:29 +0000657
Mark Brown334e9ab2011-03-17 21:42:28 +0000658 xfer[0].addr = i2c->addr;
659 xfer[0].flags = 0;
660 xfer[0].len = 2;
661 xfer[0].buf = (char *)&reg;
662
663 xfer[1].addr = i2c->addr;
664 xfer[1].flags = I2C_M_NOSTART;
665 xfer[1].len = bytes;
666 xfer[1].buf = (char *)src;
667
668 ret = i2c_transfer(i2c->adapter, xfer, 2);
Mark Brown9e501082010-01-29 18:20:29 +0000669 if (ret < 0)
670 return ret;
Mark Brown334e9ab2011-03-17 21:42:28 +0000671 if (ret != 2)
Mark Brown9e501082010-01-29 18:20:29 +0000672 return -EIO;
673
674 return 0;
675}
676
677static int wm8994_i2c_probe(struct i2c_client *i2c,
678 const struct i2c_device_id *id)
679{
680 struct wm8994 *wm8994;
681
682 wm8994 = kzalloc(sizeof(struct wm8994), GFP_KERNEL);
Axel Lind0a11692010-08-09 14:52:16 +0800683 if (wm8994 == NULL)
Mark Brown9e501082010-01-29 18:20:29 +0000684 return -ENOMEM;
Mark Brown9e501082010-01-29 18:20:29 +0000685
686 i2c_set_clientdata(i2c, wm8994);
687 wm8994->dev = &i2c->dev;
688 wm8994->control_data = i2c;
689 wm8994->read_dev = wm8994_i2c_read_device;
690 wm8994->write_dev = wm8994_i2c_write_device;
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000691 wm8994->irq = i2c->irq;
Mark Brown559e0df2010-08-31 19:25:12 +0100692 wm8994->type = id->driver_data;
Mark Brown9e501082010-01-29 18:20:29 +0000693
Mark Brown559e0df2010-08-31 19:25:12 +0100694 return wm8994_device_init(wm8994, i2c->irq);
Mark Brown9e501082010-01-29 18:20:29 +0000695}
696
697static int wm8994_i2c_remove(struct i2c_client *i2c)
698{
699 struct wm8994 *wm8994 = i2c_get_clientdata(i2c);
700
701 wm8994_device_exit(wm8994);
702
703 return 0;
704}
705
Mark Brown9e501082010-01-29 18:20:29 +0000706static const struct i2c_device_id wm8994_i2c_id[] = {
Mark Brown559e0df2010-08-31 19:25:12 +0100707 { "wm8994", WM8994 },
708 { "wm8958", WM8958 },
Mark Brown9e501082010-01-29 18:20:29 +0000709 { }
710};
711MODULE_DEVICE_TABLE(i2c, wm8994_i2c_id);
712
Mark Brownaad34312011-03-17 16:33:49 +0000713static UNIVERSAL_DEV_PM_OPS(wm8994_pm_ops, wm8994_suspend, wm8994_resume,
714 NULL);
Mark Brownd450f192010-11-26 17:19:35 +0000715
Mark Brown9e501082010-01-29 18:20:29 +0000716static struct i2c_driver wm8994_i2c_driver = {
717 .driver = {
Mark Brownd450f192010-11-26 17:19:35 +0000718 .name = "wm8994",
719 .owner = THIS_MODULE,
720 .pm = &wm8994_pm_ops,
Mark Brown9e501082010-01-29 18:20:29 +0000721 },
722 .probe = wm8994_i2c_probe,
723 .remove = wm8994_i2c_remove,
Mark Brown9e501082010-01-29 18:20:29 +0000724 .id_table = wm8994_i2c_id,
725};
726
727static int __init wm8994_i2c_init(void)
728{
729 int ret;
730
731 ret = i2c_add_driver(&wm8994_i2c_driver);
732 if (ret != 0)
733 pr_err("Failed to register wm8994 I2C driver: %d\n", ret);
734
735 return ret;
736}
737module_init(wm8994_i2c_init);
738
739static void __exit wm8994_i2c_exit(void)
740{
741 i2c_del_driver(&wm8994_i2c_driver);
742}
743module_exit(wm8994_i2c_exit);
744
745MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
746MODULE_LICENSE("GPL");
747MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");