blob: 1f15743460a0ddfc70c0faa5ecb676a81660dcf4 [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 Brown881de672011-08-22 15:43:55 +0200284 /* Disable LDO pulldowns while the device is suspended if we
285 * don't know that something will be driving them. */
286 if (!wm8994->ldo_ena_always_driven)
287 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
288 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD,
289 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD);
290
Mark Brown9e501082010-01-29 18:20:29 +0000291 /* GPIO configuration state is saved here since we may be configuring
292 * the GPIO alternate functions even if we're not using the gpiolib
293 * driver for them.
294 */
295 ret = wm8994_read(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2,
296 &wm8994->gpio_regs);
297 if (ret < 0)
298 dev_err(dev, "Failed to save GPIO registers: %d\n", ret);
299
300 /* For similar reasons we also stash the regulator states */
301 ret = wm8994_read(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2,
302 &wm8994->ldo_regs);
303 if (ret < 0)
304 dev_err(dev, "Failed to save LDO registers: %d\n", ret);
305
Mark Brownf40dff92011-02-21 18:30:31 +0000306 /* Explicitly put the device into reset in case regulators
307 * don't get disabled in order to ensure consistent restart.
308 */
309 wm8994_reg_write(wm8994, WM8994_SOFTWARE_RESET, 0x8994);
310
Mark Brown77bd70e2011-02-04 14:57:43 +0000311 wm8994->suspended = true;
312
Mark Brown559e0df2010-08-31 19:25:12 +0100313 ret = regulator_bulk_disable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000314 wm8994->supplies);
315 if (ret != 0) {
316 dev_err(dev, "Failed to disable supplies: %d\n", ret);
317 return ret;
318 }
319
320 return 0;
321}
322
Mark Brownd450f192010-11-26 17:19:35 +0000323static int wm8994_resume(struct device *dev)
Mark Brown9e501082010-01-29 18:20:29 +0000324{
325 struct wm8994 *wm8994 = dev_get_drvdata(dev);
Mark Brown98ae1cc2011-06-07 11:49:42 +0100326 int ret, i;
Mark Brown9e501082010-01-29 18:20:29 +0000327
Mark Brown77bd70e2011-02-04 14:57:43 +0000328 /* We may have lied to the PM core about suspending */
329 if (!wm8994->suspended)
330 return 0;
331
Mark Brown559e0df2010-08-31 19:25:12 +0100332 ret = regulator_bulk_enable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000333 wm8994->supplies);
334 if (ret != 0) {
335 dev_err(dev, "Failed to enable supplies: %d\n", ret);
336 return ret;
337 }
338
Mark Brown98ae1cc2011-06-07 11:49:42 +0100339 /* Write register at a time as we use the cache on the CPU so store
340 * it in native endian.
341 */
342 for (i = 0; i < ARRAY_SIZE(wm8994->irq_masks_cur); i++) {
343 ret = wm8994_reg_write(wm8994, WM8994_INTERRUPT_STATUS_1_MASK
344 + i, wm8994->irq_masks_cur[i]);
345 if (ret < 0)
346 dev_err(dev, "Failed to restore interrupt masks: %d\n",
347 ret);
348 }
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000349
Mark Brown9e501082010-01-29 18:20:29 +0000350 ret = wm8994_write(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2,
351 &wm8994->ldo_regs);
352 if (ret < 0)
353 dev_err(dev, "Failed to restore LDO registers: %d\n", ret);
354
355 ret = wm8994_write(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2,
356 &wm8994->gpio_regs);
357 if (ret < 0)
358 dev_err(dev, "Failed to restore GPIO registers: %d\n", ret);
359
Mark Brown881de672011-08-22 15:43:55 +0200360 /* Disable LDO pulldowns while the device is active */
361 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
362 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD,
363 0);
364
Mark Brown77bd70e2011-02-04 14:57:43 +0000365 wm8994->suspended = false;
366
Mark Brown9e501082010-01-29 18:20:29 +0000367 return 0;
368}
369#endif
370
371#ifdef CONFIG_REGULATOR
372static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo)
373{
374 struct wm8994_ldo_pdata *ldo_pdata;
375
376 if (!pdata)
377 return 0;
378
379 ldo_pdata = &pdata->ldo[ldo];
380
381 if (!ldo_pdata->init_data)
382 return 0;
383
384 return ldo_pdata->init_data->num_consumer_supplies != 0;
385}
386#else
387static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo)
388{
389 return 0;
390}
391#endif
392
393/*
394 * Instantiate the generic non-control parts of the device.
395 */
Mark Brown559e0df2010-08-31 19:25:12 +0100396static int wm8994_device_init(struct wm8994 *wm8994, int irq)
Mark Brown9e501082010-01-29 18:20:29 +0000397{
398 struct wm8994_pdata *pdata = wm8994->dev->platform_data;
Mark Brown559e0df2010-08-31 19:25:12 +0100399 const char *devname;
Mark Brown9e501082010-01-29 18:20:29 +0000400 int ret, i;
401
402 mutex_init(&wm8994->io_lock);
403 dev_set_drvdata(wm8994->dev, wm8994);
404
405 /* Add the on-chip regulators first for bootstrapping */
406 ret = mfd_add_devices(wm8994->dev, -1,
407 wm8994_regulator_devs,
408 ARRAY_SIZE(wm8994_regulator_devs),
409 NULL, 0);
410 if (ret != 0) {
411 dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
412 goto err;
413 }
414
Mark Brown559e0df2010-08-31 19:25:12 +0100415 switch (wm8994->type) {
416 case WM8994:
417 wm8994->num_supplies = ARRAY_SIZE(wm8994_main_supplies);
418 break;
419 case WM8958:
420 wm8994->num_supplies = ARRAY_SIZE(wm8958_main_supplies);
421 break;
422 default:
423 BUG();
Mark Brownf85dbda2011-06-17 12:19:41 +0100424 goto err;
Mark Brown559e0df2010-08-31 19:25:12 +0100425 }
426
Mark Brown9e501082010-01-29 18:20:29 +0000427 wm8994->supplies = kzalloc(sizeof(struct regulator_bulk_data) *
Mark Brown559e0df2010-08-31 19:25:12 +0100428 wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000429 GFP_KERNEL);
Axel Linfccbd212010-08-04 09:44:47 +0800430 if (!wm8994->supplies) {
431 ret = -ENOMEM;
Mark Brown9e501082010-01-29 18:20:29 +0000432 goto err;
Axel Linfccbd212010-08-04 09:44:47 +0800433 }
Mark Brown9e501082010-01-29 18:20:29 +0000434
Mark Brown559e0df2010-08-31 19:25:12 +0100435 switch (wm8994->type) {
436 case WM8994:
437 for (i = 0; i < ARRAY_SIZE(wm8994_main_supplies); i++)
438 wm8994->supplies[i].supply = wm8994_main_supplies[i];
439 break;
440 case WM8958:
441 for (i = 0; i < ARRAY_SIZE(wm8958_main_supplies); i++)
442 wm8994->supplies[i].supply = wm8958_main_supplies[i];
443 break;
444 default:
445 BUG();
Mark Brownf85dbda2011-06-17 12:19:41 +0100446 goto err;
Mark Brown559e0df2010-08-31 19:25:12 +0100447 }
448
449 ret = regulator_bulk_get(wm8994->dev, wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000450 wm8994->supplies);
451 if (ret != 0) {
452 dev_err(wm8994->dev, "Failed to get supplies: %d\n", ret);
Joonyoung Shim77310742010-02-07 10:16:14 +0900453 goto err_supplies;
Mark Brown9e501082010-01-29 18:20:29 +0000454 }
455
Mark Brown559e0df2010-08-31 19:25:12 +0100456 ret = regulator_bulk_enable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000457 wm8994->supplies);
458 if (ret != 0) {
459 dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret);
Joonyoung Shim77310742010-02-07 10:16:14 +0900460 goto err_get;
Mark Brown9e501082010-01-29 18:20:29 +0000461 }
462
463 ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET);
464 if (ret < 0) {
465 dev_err(wm8994->dev, "Failed to read ID register\n");
466 goto err_enable;
467 }
Mark Brown559e0df2010-08-31 19:25:12 +0100468 switch (ret) {
469 case 0x8994:
470 devname = "WM8994";
471 if (wm8994->type != WM8994)
472 dev_warn(wm8994->dev, "Device registered as type %d\n",
473 wm8994->type);
474 wm8994->type = WM8994;
475 break;
476 case 0x8958:
477 devname = "WM8958";
478 if (wm8994->type != WM8958)
479 dev_warn(wm8994->dev, "Device registered as type %d\n",
480 wm8994->type);
481 wm8994->type = WM8958;
482 break;
483 default:
Mark Brown9e501082010-01-29 18:20:29 +0000484 dev_err(wm8994->dev, "Device is not a WM8994, ID is %x\n",
485 ret);
486 ret = -EINVAL;
487 goto err_enable;
488 }
489
490 ret = wm8994_reg_read(wm8994, WM8994_CHIP_REVISION);
491 if (ret < 0) {
492 dev_err(wm8994->dev, "Failed to read revision register: %d\n",
493 ret);
494 goto err_enable;
495 }
496
Mark Browna2495bc2011-06-02 19:18:55 +0100497 switch (wm8994->type) {
498 case WM8994:
499 switch (ret) {
500 case 0:
501 case 1:
Mark Brown559e0df2010-08-31 19:25:12 +0100502 dev_warn(wm8994->dev,
503 "revision %c not fully supported\n",
504 'A' + ret);
Mark Browna2495bc2011-06-02 19:18:55 +0100505 break;
506 default:
507 break;
508 }
Mark Brown9e501082010-01-29 18:20:29 +0000509 break;
510 default:
Mark Brown9e501082010-01-29 18:20:29 +0000511 break;
512 }
513
Mark Brown559e0df2010-08-31 19:25:12 +0100514 dev_info(wm8994->dev, "%s revision %c\n", devname, 'A' + ret);
Mark Brown9e501082010-01-29 18:20:29 +0000515
516 if (pdata) {
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000517 wm8994->irq_base = pdata->irq_base;
Mark Brown9e501082010-01-29 18:20:29 +0000518 wm8994->gpio_base = pdata->gpio_base;
519
520 /* GPIO configuration is only applied if it's non-zero */
521 for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
522 if (pdata->gpio_defaults[i]) {
523 wm8994_set_bits(wm8994, WM8994_GPIO_1 + i,
524 0xffff,
525 pdata->gpio_defaults[i]);
526 }
527 }
Mark Brown881de672011-08-22 15:43:55 +0200528
529 wm8994->ldo_ena_always_driven = pdata->ldo_ena_always_driven;
Mark Brown9e501082010-01-29 18:20:29 +0000530 }
531
Mark Brown881de672011-08-22 15:43:55 +0200532 /* Disable LDO pulldowns while the device is active */
533 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
534 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD,
535 0);
536
Mark Brown9e501082010-01-29 18:20:29 +0000537 /* In some system designs where the regulators are not in use,
538 * we can achieve a small reduction in leakage currents by
539 * floating LDO outputs. This bit makes no difference if the
540 * LDOs are enabled, it only affects cases where the LDOs were
541 * in operation and are then disabled.
542 */
543 for (i = 0; i < WM8994_NUM_LDO_REGS; i++) {
544 if (wm8994_ldo_in_use(pdata, i))
545 wm8994_set_bits(wm8994, WM8994_LDO_1 + i,
546 WM8994_LDO1_DISCH, WM8994_LDO1_DISCH);
547 else
548 wm8994_set_bits(wm8994, WM8994_LDO_1 + i,
549 WM8994_LDO1_DISCH, 0);
550 }
551
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000552 wm8994_irq_init(wm8994);
553
Mark Brown9e501082010-01-29 18:20:29 +0000554 ret = mfd_add_devices(wm8994->dev, -1,
555 wm8994_devs, ARRAY_SIZE(wm8994_devs),
556 NULL, 0);
557 if (ret != 0) {
558 dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000559 goto err_irq;
Mark Brown9e501082010-01-29 18:20:29 +0000560 }
561
Mark Brownd450f192010-11-26 17:19:35 +0000562 pm_runtime_enable(wm8994->dev);
563 pm_runtime_resume(wm8994->dev);
564
Mark Brown9e501082010-01-29 18:20:29 +0000565 return 0;
566
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000567err_irq:
568 wm8994_irq_exit(wm8994);
Mark Brown9e501082010-01-29 18:20:29 +0000569err_enable:
Mark Brown559e0df2010-08-31 19:25:12 +0100570 regulator_bulk_disable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000571 wm8994->supplies);
572err_get:
Mark Brown559e0df2010-08-31 19:25:12 +0100573 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
Mark Brown9e501082010-01-29 18:20:29 +0000574err_supplies:
575 kfree(wm8994->supplies);
576err:
577 mfd_remove_devices(wm8994->dev);
578 kfree(wm8994);
579 return ret;
580}
581
582static void wm8994_device_exit(struct wm8994 *wm8994)
583{
Mark Brownd450f192010-11-26 17:19:35 +0000584 pm_runtime_disable(wm8994->dev);
Mark Brown9e501082010-01-29 18:20:29 +0000585 mfd_remove_devices(wm8994->dev);
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000586 wm8994_irq_exit(wm8994);
Mark Brown559e0df2010-08-31 19:25:12 +0100587 regulator_bulk_disable(wm8994->num_supplies,
Mark Brown9e501082010-01-29 18:20:29 +0000588 wm8994->supplies);
Mark Brown559e0df2010-08-31 19:25:12 +0100589 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
Mark Brown9e501082010-01-29 18:20:29 +0000590 kfree(wm8994->supplies);
591 kfree(wm8994);
592}
593
594static int wm8994_i2c_read_device(struct wm8994 *wm8994, unsigned short reg,
595 int bytes, void *dest)
596{
597 struct i2c_client *i2c = wm8994->control_data;
598 int ret;
599 u16 r = cpu_to_be16(reg);
600
601 ret = i2c_master_send(i2c, (unsigned char *)&r, 2);
602 if (ret < 0)
603 return ret;
604 if (ret != 2)
605 return -EIO;
606
607 ret = i2c_master_recv(i2c, dest, bytes);
608 if (ret < 0)
609 return ret;
610 if (ret != bytes)
611 return -EIO;
612 return 0;
613}
614
Mark Brown9e501082010-01-29 18:20:29 +0000615static int wm8994_i2c_write_device(struct wm8994 *wm8994, unsigned short reg,
Mark Brown07e73fb2011-03-17 21:42:30 +0000616 int bytes, const void *src)
Mark Brown9e501082010-01-29 18:20:29 +0000617{
618 struct i2c_client *i2c = wm8994->control_data;
Mark Brown334e9ab2011-03-17 21:42:28 +0000619 struct i2c_msg xfer[2];
Mark Brown9e501082010-01-29 18:20:29 +0000620 int ret;
621
622 reg = cpu_to_be16(reg);
Mark Brown9e501082010-01-29 18:20:29 +0000623
Mark Brown334e9ab2011-03-17 21:42:28 +0000624 xfer[0].addr = i2c->addr;
625 xfer[0].flags = 0;
626 xfer[0].len = 2;
627 xfer[0].buf = (char *)&reg;
628
629 xfer[1].addr = i2c->addr;
630 xfer[1].flags = I2C_M_NOSTART;
631 xfer[1].len = bytes;
632 xfer[1].buf = (char *)src;
633
634 ret = i2c_transfer(i2c->adapter, xfer, 2);
Mark Brown9e501082010-01-29 18:20:29 +0000635 if (ret < 0)
636 return ret;
Mark Brown334e9ab2011-03-17 21:42:28 +0000637 if (ret != 2)
Mark Brown9e501082010-01-29 18:20:29 +0000638 return -EIO;
639
640 return 0;
641}
642
643static int wm8994_i2c_probe(struct i2c_client *i2c,
644 const struct i2c_device_id *id)
645{
646 struct wm8994 *wm8994;
647
648 wm8994 = kzalloc(sizeof(struct wm8994), GFP_KERNEL);
Axel Lind0a11692010-08-09 14:52:16 +0800649 if (wm8994 == NULL)
Mark Brown9e501082010-01-29 18:20:29 +0000650 return -ENOMEM;
Mark Brown9e501082010-01-29 18:20:29 +0000651
652 i2c_set_clientdata(i2c, wm8994);
653 wm8994->dev = &i2c->dev;
654 wm8994->control_data = i2c;
655 wm8994->read_dev = wm8994_i2c_read_device;
656 wm8994->write_dev = wm8994_i2c_write_device;
Mark Brownc9fbf7e2010-03-26 16:49:15 +0000657 wm8994->irq = i2c->irq;
Mark Brown559e0df2010-08-31 19:25:12 +0100658 wm8994->type = id->driver_data;
Mark Brown9e501082010-01-29 18:20:29 +0000659
Mark Brown559e0df2010-08-31 19:25:12 +0100660 return wm8994_device_init(wm8994, i2c->irq);
Mark Brown9e501082010-01-29 18:20:29 +0000661}
662
663static int wm8994_i2c_remove(struct i2c_client *i2c)
664{
665 struct wm8994 *wm8994 = i2c_get_clientdata(i2c);
666
667 wm8994_device_exit(wm8994);
668
669 return 0;
670}
671
Mark Brown9e501082010-01-29 18:20:29 +0000672static const struct i2c_device_id wm8994_i2c_id[] = {
Mark Brown559e0df2010-08-31 19:25:12 +0100673 { "wm8994", WM8994 },
674 { "wm8958", WM8958 },
Mark Brown9e501082010-01-29 18:20:29 +0000675 { }
676};
677MODULE_DEVICE_TABLE(i2c, wm8994_i2c_id);
678
Mark Brownaad34312011-03-17 16:33:49 +0000679static UNIVERSAL_DEV_PM_OPS(wm8994_pm_ops, wm8994_suspend, wm8994_resume,
680 NULL);
Mark Brownd450f192010-11-26 17:19:35 +0000681
Mark Brown9e501082010-01-29 18:20:29 +0000682static struct i2c_driver wm8994_i2c_driver = {
683 .driver = {
Mark Brownd450f192010-11-26 17:19:35 +0000684 .name = "wm8994",
685 .owner = THIS_MODULE,
686 .pm = &wm8994_pm_ops,
Mark Brown9e501082010-01-29 18:20:29 +0000687 },
688 .probe = wm8994_i2c_probe,
689 .remove = wm8994_i2c_remove,
Mark Brown9e501082010-01-29 18:20:29 +0000690 .id_table = wm8994_i2c_id,
691};
692
693static int __init wm8994_i2c_init(void)
694{
695 int ret;
696
697 ret = i2c_add_driver(&wm8994_i2c_driver);
698 if (ret != 0)
699 pr_err("Failed to register wm8994 I2C driver: %d\n", ret);
700
701 return ret;
702}
703module_init(wm8994_i2c_init);
704
705static void __exit wm8994_i2c_exit(void)
706{
707 i2c_del_driver(&wm8994_i2c_driver);
708}
709module_exit(wm8994_i2c_exit);
710
711MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
712MODULE_LICENSE("GPL");
713MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");