wm8994-core.c 16.1 KB
Newer Older
M
Mark Brown 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * wm8994-core.c  --  Device access for Wolfson WM8994
 *
 * Copyright 2009 Wolfson Microelectronics PLC.
 *
 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
 *
 *  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.
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
17
#include <linux/slab.h>
M
Mark Brown 已提交
18
#include <linux/i2c.h>
19
#include <linux/err.h>
M
Mark Brown 已提交
20 21
#include <linux/delay.h>
#include <linux/mfd/core.h>
M
Mark Brown 已提交
22 23 24
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
25
#include <linux/pm_runtime.h>
26
#include <linux/regmap.h>
M
Mark Brown 已提交
27 28 29 30 31 32 33
#include <linux/regulator/consumer.h>
#include <linux/regulator/machine.h>

#include <linux/mfd/wm8994/core.h>
#include <linux/mfd/wm8994/pdata.h>
#include <linux/mfd/wm8994/registers.h>

34
#include "wm8994.h"
M
Mark Brown 已提交
35

36
static const struct mfd_cell wm8994_regulator_devs[] = {
37 38
	{
		.name = "wm8994-ldo",
39
		.id = 0,
40 41 42 43
		.pm_runtime_no_callbacks = true,
	},
	{
		.name = "wm8994-ldo",
44
		.id = 1,
45 46
		.pm_runtime_no_callbacks = true,
	},
M
Mark Brown 已提交
47 48
};

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
static struct resource wm8994_codec_resources[] = {
	{
		.start = WM8994_IRQ_TEMP_SHUT,
		.end   = WM8994_IRQ_TEMP_WARN,
		.flags = IORESOURCE_IRQ,
	},
};

static struct resource wm8994_gpio_resources[] = {
	{
		.start = WM8994_IRQ_GPIO(1),
		.end   = WM8994_IRQ_GPIO(11),
		.flags = IORESOURCE_IRQ,
	},
};

65
static const struct mfd_cell wm8994_devs[] = {
66 67 68 69 70 71 72 73 74 75
	{
		.name = "wm8994-codec",
		.num_resources = ARRAY_SIZE(wm8994_codec_resources),
		.resources = wm8994_codec_resources,
	},

	{
		.name = "wm8994-gpio",
		.num_resources = ARRAY_SIZE(wm8994_gpio_resources),
		.resources = wm8994_gpio_resources,
76
		.pm_runtime_no_callbacks = true,
77
	},
M
Mark Brown 已提交
78 79 80 81 82 83 84
};

/*
 * Supplies for the main bulk of CODEC; the LDO supplies are ignored
 * and should be handled via the standard regulator API supply
 * management.
 */
M
Mark Brown 已提交
85 86 87 88 89 90 91 92 93 94 95 96
static const char *wm1811_main_supplies[] = {
	"DBVDD1",
	"DBVDD2",
	"DBVDD3",
	"DCVDD",
	"AVDD1",
	"AVDD2",
	"CPVDD",
	"SPKVDD1",
	"SPKVDD2",
};

M
Mark Brown 已提交
97 98 99 100 101 102 103 104 105 106
static const char *wm8994_main_supplies[] = {
	"DBVDD",
	"DCVDD",
	"AVDD1",
	"AVDD2",
	"CPVDD",
	"SPKVDD1",
	"SPKVDD2",
};

M
Mark Brown 已提交
107 108 109 110 111 112 113 114 115 116 117 118
static const char *wm8958_main_supplies[] = {
	"DBVDD1",
	"DBVDD2",
	"DBVDD3",
	"DCVDD",
	"AVDD1",
	"AVDD2",
	"CPVDD",
	"SPKVDD1",
	"SPKVDD2",
};

119
#ifdef CONFIG_PM
120
static int wm8994_suspend(struct device *dev)
M
Mark Brown 已提交
121 122 123 124
{
	struct wm8994 *wm8994 = dev_get_drvdata(dev);
	int ret;

125
	/* Don't actually go through with the suspend if the CODEC is
126
	 * still active for accessory detect. */
127 128
	switch (wm8994->type) {
	case WM8958:
129
	case WM1811:
130 131 132 133 134 135 136 137 138 139 140 141
		ret = wm8994_reg_read(wm8994, WM8958_MIC_DETECT_1);
		if (ret < 0) {
			dev_err(dev, "Failed to read power status: %d\n", ret);
		} else if (ret & WM8958_MICD_ENA) {
			dev_dbg(dev, "CODEC still active, ignoring suspend\n");
			return 0;
		}
		break;
	default:
		break;
	}

142 143 144 145 146 147 148
	/* Disable LDO pulldowns while the device is suspended if we
	 * don't know that something will be driving them. */
	if (!wm8994->ldo_ena_always_driven)
		wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
				WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD,
				WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD);

149 150 151
	/* Explicitly put the device into reset in case regulators
	 * don't get disabled in order to ensure consistent restart.
	 */
152 153
	wm8994_reg_write(wm8994, WM8994_SOFTWARE_RESET,
			 wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET));
154

155 156
	regcache_mark_dirty(wm8994->regmap);

157 158 159
	/* Restore GPIO registers to prevent problems with mismatched
	 * pin configurations.
	 */
160 161
	ret = regcache_sync_region(wm8994->regmap, WM8994_GPIO_1,
				   WM8994_GPIO_11);
162 163 164
	if (ret != 0)
		dev_err(dev, "Failed to restore GPIO registers: %d\n", ret);

165 166 167 168 169 170 171
	/* In case one of the GPIOs is used as a wake input. */
	ret = regcache_sync_region(wm8994->regmap,
				   WM8994_INTERRUPT_STATUS_1_MASK,
				   WM8994_INTERRUPT_STATUS_1_MASK);
	if (ret != 0)
		dev_err(dev, "Failed to restore interrupt mask: %d\n", ret);

172
	regcache_cache_only(wm8994->regmap, true);
173 174
	wm8994->suspended = true;

M
Mark Brown 已提交
175
	ret = regulator_bulk_disable(wm8994->num_supplies,
M
Mark Brown 已提交
176 177 178 179 180 181 182 183 184
				     wm8994->supplies);
	if (ret != 0) {
		dev_err(dev, "Failed to disable supplies: %d\n", ret);
		return ret;
	}

	return 0;
}

185
static int wm8994_resume(struct device *dev)
M
Mark Brown 已提交
186 187
{
	struct wm8994 *wm8994 = dev_get_drvdata(dev);
188
	int ret;
M
Mark Brown 已提交
189

190 191 192 193
	/* We may have lied to the PM core about suspending */
	if (!wm8994->suspended)
		return 0;

M
Mark Brown 已提交
194
	ret = regulator_bulk_enable(wm8994->num_supplies,
M
Mark Brown 已提交
195 196 197 198 199 200
				    wm8994->supplies);
	if (ret != 0) {
		dev_err(dev, "Failed to enable supplies: %d\n", ret);
		return ret;
	}

201
	regcache_cache_only(wm8994->regmap, false);
202 203 204 205
	ret = regcache_sync(wm8994->regmap);
	if (ret != 0) {
		dev_err(dev, "Failed to restore register map: %d\n", ret);
		goto err_enable;
206
	}
207

208 209 210 211 212
	/* Disable LDO pulldowns while the device is active */
	wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
			WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD,
			0);

213 214
	wm8994->suspended = false;

M
Mark Brown 已提交
215
	return 0;
216 217 218 219 220

err_enable:
	regulator_bulk_disable(wm8994->num_supplies, wm8994->supplies);

	return ret;
M
Mark Brown 已提交
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
}
#endif

#ifdef CONFIG_REGULATOR
static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo)
{
	struct wm8994_ldo_pdata *ldo_pdata;

	if (!pdata)
		return 0;

	ldo_pdata = &pdata->ldo[ldo];

	if (!ldo_pdata->init_data)
		return 0;

	return ldo_pdata->init_data->num_consumer_supplies != 0;
}
#else
static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo)
{
	return 0;
}
#endif

246
static const struct reg_sequence wm8994_revc_patch[] = {
247 248 249 250 251 252
	{ 0x102, 0x3 },
	{ 0x56, 0x3 },
	{ 0x817, 0x0 },
	{ 0x102, 0x0 },
};

253
static const struct reg_sequence wm8958_reva_patch[] = {
254 255 256 257 258 259
	{ 0x102, 0x3 },
	{ 0xcb, 0x81 },
	{ 0x817, 0x0 },
	{ 0x102, 0x0 },
};

260
static const struct reg_sequence wm1811_reva_patch[] = {
261
	{ 0x102, 0x3 },
262
	{ 0x56, 0xc07 },
263 264 265 266 267
	{ 0x5d, 0x7e },
	{ 0x5e, 0x0 },
	{ 0x102, 0x0 },
};

M
Mark Brown 已提交
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
#ifdef CONFIG_OF
static int wm8994_set_pdata_from_of(struct wm8994 *wm8994)
{
	struct device_node *np = wm8994->dev->of_node;
	struct wm8994_pdata *pdata = &wm8994->pdata;
	int i;

	if (!np)
		return 0;

	if (of_property_read_u32_array(np, "wlf,gpio-cfg", pdata->gpio_defaults,
				       ARRAY_SIZE(pdata->gpio_defaults)) >= 0) {
		for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
			if (wm8994->pdata.gpio_defaults[i] == 0)
				pdata->gpio_defaults[i]
					= WM8994_CONFIGURE_GPIO;
		}
	}

	of_property_read_u32_array(np, "wlf,micbias-cfg", pdata->micbias,
				   ARRAY_SIZE(pdata->micbias));

	pdata->lineout1_diff = true;
	pdata->lineout2_diff = true;
	if (of_find_property(np, "wlf,lineout1-se", NULL))
		pdata->lineout1_diff = false;
	if (of_find_property(np, "wlf,lineout2-se", NULL))
		pdata->lineout2_diff = false;

	if (of_find_property(np, "wlf,lineout1-feedback", NULL))
		pdata->lineout1fb = true;
	if (of_find_property(np, "wlf,lineout2-feedback", NULL))
		pdata->lineout2fb = true;

	if (of_find_property(np, "wlf,ldoena-always-driven", NULL))
		pdata->lineout2fb = true;

	pdata->ldo[0].enable = of_get_named_gpio(np, "wlf,ldo1ena", 0);
	if (pdata->ldo[0].enable < 0)
		pdata->ldo[0].enable = 0;

	pdata->ldo[1].enable = of_get_named_gpio(np, "wlf,ldo2ena", 0);
	if (pdata->ldo[1].enable < 0)
		pdata->ldo[1].enable = 0;

	return 0;
}
#else
static int wm8994_set_pdata_from_of(struct wm8994 *wm8994)
{
	return 0;
}
#endif

M
Mark Brown 已提交
322 323 324
/*
 * Instantiate the generic non-control parts of the device.
 */
B
Bill Pemberton 已提交
325
static int wm8994_device_init(struct wm8994 *wm8994, int irq)
M
Mark Brown 已提交
326
{
327
	struct wm8994_pdata *pdata;
328
	struct regmap_config *regmap_config;
329
	const struct reg_sequence *regmap_patch = NULL;
M
Mark Brown 已提交
330
	const char *devname;
331
	int ret, i, patch_regs = 0;
M
Mark Brown 已提交
332
	int pulls = 0;
M
Mark Brown 已提交
333

334 335 336 337 338 339
	if (dev_get_platdata(wm8994->dev)) {
		pdata = dev_get_platdata(wm8994->dev);
		wm8994->pdata = *pdata;
	}
	pdata = &wm8994->pdata;

M
Mark Brown 已提交
340 341 342 343
	ret = wm8994_set_pdata_from_of(wm8994);
	if (ret != 0)
		return ret;

M
Mark Brown 已提交
344 345 346
	dev_set_drvdata(wm8994->dev, wm8994);

	/* Add the on-chip regulators first for bootstrapping */
347
	ret = mfd_add_devices(wm8994->dev, 0,
M
Mark Brown 已提交
348 349
			      wm8994_regulator_devs,
			      ARRAY_SIZE(wm8994_regulator_devs),
350
			      NULL, 0, NULL);
M
Mark Brown 已提交
351 352
	if (ret != 0) {
		dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
353
		goto err;
M
Mark Brown 已提交
354 355
	}

M
Mark Brown 已提交
356
	switch (wm8994->type) {
M
Mark Brown 已提交
357 358 359
	case WM1811:
		wm8994->num_supplies = ARRAY_SIZE(wm1811_main_supplies);
		break;
M
Mark Brown 已提交
360 361 362 363 364 365 366 367
	case WM8994:
		wm8994->num_supplies = ARRAY_SIZE(wm8994_main_supplies);
		break;
	case WM8958:
		wm8994->num_supplies = ARRAY_SIZE(wm8958_main_supplies);
		break;
	default:
		BUG();
368
		goto err;
M
Mark Brown 已提交
369 370
	}

M
Mark Brown 已提交
371 372 373
	wm8994->supplies = devm_kzalloc(wm8994->dev,
					sizeof(struct regulator_bulk_data) *
					wm8994->num_supplies, GFP_KERNEL);
374 375
	if (!wm8994->supplies) {
		ret = -ENOMEM;
376
		goto err;
377
	}
M
Mark Brown 已提交
378

M
Mark Brown 已提交
379
	switch (wm8994->type) {
M
Mark Brown 已提交
380 381 382 383
	case WM1811:
		for (i = 0; i < ARRAY_SIZE(wm1811_main_supplies); i++)
			wm8994->supplies[i].supply = wm1811_main_supplies[i];
		break;
M
Mark Brown 已提交
384 385 386 387 388 389 390 391 392 393
	case WM8994:
		for (i = 0; i < ARRAY_SIZE(wm8994_main_supplies); i++)
			wm8994->supplies[i].supply = wm8994_main_supplies[i];
		break;
	case WM8958:
		for (i = 0; i < ARRAY_SIZE(wm8958_main_supplies); i++)
			wm8994->supplies[i].supply = wm8958_main_supplies[i];
		break;
	default:
		BUG();
394
		goto err;
M
Mark Brown 已提交
395 396
	}
		
397
	ret = devm_regulator_bulk_get(wm8994->dev, wm8994->num_supplies,
M
Mark Brown 已提交
398 399 400
				 wm8994->supplies);
	if (ret != 0) {
		dev_err(wm8994->dev, "Failed to get supplies: %d\n", ret);
401
		goto err;
M
Mark Brown 已提交
402 403
	}

M
Mark Brown 已提交
404
	ret = regulator_bulk_enable(wm8994->num_supplies,
M
Mark Brown 已提交
405 406 407
				    wm8994->supplies);
	if (ret != 0) {
		dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret);
408
		goto err;
M
Mark Brown 已提交
409 410 411 412 413 414 415
	}

	ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET);
	if (ret < 0) {
		dev_err(wm8994->dev, "Failed to read ID register\n");
		goto err_enable;
	}
M
Mark Brown 已提交
416
	switch (ret) {
M
Mark Brown 已提交
417 418 419 420 421 422 423
	case 0x1811:
		devname = "WM1811";
		if (wm8994->type != WM1811)
			dev_warn(wm8994->dev, "Device registered as type %d\n",
				 wm8994->type);
		wm8994->type = WM1811;
		break;
M
Mark Brown 已提交
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
	case 0x8994:
		devname = "WM8994";
		if (wm8994->type != WM8994)
			dev_warn(wm8994->dev, "Device registered as type %d\n",
				 wm8994->type);
		wm8994->type = WM8994;
		break;
	case 0x8958:
		devname = "WM8958";
		if (wm8994->type != WM8958)
			dev_warn(wm8994->dev, "Device registered as type %d\n",
				 wm8994->type);
		wm8994->type = WM8958;
		break;
	default:
M
Mark Brown 已提交
439 440 441 442 443 444 445 446 447 448 449 450
		dev_err(wm8994->dev, "Device is not a WM8994, ID is %x\n",
			ret);
		ret = -EINVAL;
		goto err_enable;
	}

	ret = wm8994_reg_read(wm8994, WM8994_CHIP_REVISION);
	if (ret < 0) {
		dev_err(wm8994->dev, "Failed to read revision register: %d\n",
			ret);
		goto err_enable;
	}
451 452
	wm8994->revision = ret & WM8994_CHIP_REV_MASK;
	wm8994->cust_id = (ret & WM8994_CUST_ID_MASK) >> WM8994_CUST_ID_SHIFT;
M
Mark Brown 已提交
453

454 455
	switch (wm8994->type) {
	case WM8994:
456
		switch (wm8994->revision) {
457 458
		case 0:
		case 1:
M
Mark Brown 已提交
459 460
			dev_warn(wm8994->dev,
				 "revision %c not fully supported\n",
461
				 'A' + wm8994->revision);
462
			break;
463 464
		case 2:
		case 3:
465
		default:
466 467 468 469 470 471 472 473 474 475 476 477
			regmap_patch = wm8994_revc_patch;
			patch_regs = ARRAY_SIZE(wm8994_revc_patch);
			break;
		}
		break;

	case WM8958:
		switch (wm8994->revision) {
		case 0:
			regmap_patch = wm8958_reva_patch;
			patch_regs = ARRAY_SIZE(wm8958_reva_patch);
			break;
478 479 480
		default:
			break;
		}
M
Mark Brown 已提交
481
		break;
482

483 484
	case WM1811:
		/* Revision C did not change the relevant layer */
485 486
		if (wm8994->revision > 1)
			wm8994->revision++;
487 488 489

		regmap_patch = wm1811_reva_patch;
		patch_regs = ARRAY_SIZE(wm1811_reva_patch);
490
		break;
491

M
Mark Brown 已提交
492 493 494 495
	default:
		break;
	}

496 497
	dev_info(wm8994->dev, "%s revision %c CUST_ID %02x\n", devname,
		 'A' + wm8994->revision, wm8994->cust_id);
M
Mark Brown 已提交
498

499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
	switch (wm8994->type) {
	case WM1811:
		regmap_config = &wm1811_regmap_config;
		break;
	case WM8994:
		regmap_config = &wm8994_regmap_config;
		break;
	case WM8958:
		regmap_config = &wm8958_regmap_config;
		break;
	default:
		dev_err(wm8994->dev, "Unknown device type %d\n", wm8994->type);
		return -EINVAL;
	}

	ret = regmap_reinit_cache(wm8994->regmap, regmap_config);
	if (ret != 0) {
		dev_err(wm8994->dev, "Failed to reinit register cache: %d\n",
			ret);
		return ret;
	}
M
Mark Brown 已提交
520

521 522 523 524 525 526 527 528 529 530 531
	/* Explicitly put the device into reset in case regulators
	 * don't get disabled in order to ensure we know the device
	 * state.
	 */
	ret = wm8994_reg_write(wm8994, WM8994_SOFTWARE_RESET,
			       wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET));
	if (ret != 0) {
		dev_err(wm8994->dev, "Failed to reset device: %d\n", ret);
		return ret;
	}

532 533 534 535 536 537
	if (regmap_patch) {
		ret = regmap_register_patch(wm8994->regmap, regmap_patch,
					    patch_regs);
		if (ret != 0) {
			dev_err(wm8994->dev, "Failed to register patch: %d\n",
				ret);
538
			goto err;
539 540 541
		}
	}

542 543 544 545 546 547 548 549
	wm8994->irq_base = pdata->irq_base;
	wm8994->gpio_base = pdata->gpio_base;

	/* GPIO configuration is only applied if it's non-zero */
	for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
		if (pdata->gpio_defaults[i]) {
			wm8994_set_bits(wm8994, WM8994_GPIO_1 + i,
					0xffff, pdata->gpio_defaults[i]);
M
Mark Brown 已提交
550
		}
551
	}
552

553
	wm8994->ldo_ena_always_driven = pdata->ldo_ena_always_driven;
M
Mark Brown 已提交
554

555 556
	if (pdata->spkmode_pu)
		pulls |= WM8994_SPKMODE_PU;
M
Mark Brown 已提交
557

M
Mark Brown 已提交
558
	/* Disable unneeded pulls */
559
	wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
M
Mark Brown 已提交
560 561 562
			WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD |
			WM8994_SPKMODE_PU | WM8994_CSNADDR_PD,
			pulls);
563

M
Mark Brown 已提交
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578
	/* In some system designs where the regulators are not in use,
	 * we can achieve a small reduction in leakage currents by
	 * floating LDO outputs.  This bit makes no difference if the
	 * LDOs are enabled, it only affects cases where the LDOs were
	 * in operation and are then disabled.
	 */
	for (i = 0; i < WM8994_NUM_LDO_REGS; i++) {
		if (wm8994_ldo_in_use(pdata, i))
			wm8994_set_bits(wm8994, WM8994_LDO_1 + i,
					WM8994_LDO1_DISCH, WM8994_LDO1_DISCH);
		else
			wm8994_set_bits(wm8994, WM8994_LDO_1 + i,
					WM8994_LDO1_DISCH, 0);
	}

579 580
	wm8994_irq_init(wm8994);

M
Mark Brown 已提交
581 582
	ret = mfd_add_devices(wm8994->dev, -1,
			      wm8994_devs, ARRAY_SIZE(wm8994_devs),
583
			      NULL, 0, NULL);
M
Mark Brown 已提交
584 585
	if (ret != 0) {
		dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
586
		goto err_irq;
M
Mark Brown 已提交
587 588
	}

589
	pm_runtime_enable(wm8994->dev);
590
	pm_runtime_idle(wm8994->dev);
591

M
Mark Brown 已提交
592 593
	return 0;

594 595
err_irq:
	wm8994_irq_exit(wm8994);
M
Mark Brown 已提交
596
err_enable:
M
Mark Brown 已提交
597
	regulator_bulk_disable(wm8994->num_supplies,
M
Mark Brown 已提交
598
			       wm8994->supplies);
599
err:
M
Mark Brown 已提交
600 601 602 603
	mfd_remove_devices(wm8994->dev);
	return ret;
}

B
Bill Pemberton 已提交
604
static void wm8994_device_exit(struct wm8994 *wm8994)
M
Mark Brown 已提交
605
{
606
	pm_runtime_disable(wm8994->dev);
607
	wm8994_irq_exit(wm8994);
M
Mark Brown 已提交
608
	regulator_bulk_disable(wm8994->num_supplies,
M
Mark Brown 已提交
609
			       wm8994->supplies);
610
	mfd_remove_devices(wm8994->dev);
M
Mark Brown 已提交
611 612
}

613
static const struct of_device_id wm8994_of_match[] = {
614 615 616
	{ .compatible = "wlf,wm1811", .data = (void *)WM1811 },
	{ .compatible = "wlf,wm8994", .data = (void *)WM8994 },
	{ .compatible = "wlf,wm8958", .data = (void *)WM8958 },
617 618 619 620
	{ }
};
MODULE_DEVICE_TABLE(of, wm8994_of_match);

B
Bill Pemberton 已提交
621
static int wm8994_i2c_probe(struct i2c_client *i2c,
622
				      const struct i2c_device_id *id)
M
Mark Brown 已提交
623
{
M
Mark Brown 已提交
624
	const struct of_device_id *of_id;
M
Mark Brown 已提交
625
	struct wm8994 *wm8994;
626
	int ret;
M
Mark Brown 已提交
627

M
Mark Brown 已提交
628
	wm8994 = devm_kzalloc(&i2c->dev, sizeof(struct wm8994), GFP_KERNEL);
629
	if (wm8994 == NULL)
M
Mark Brown 已提交
630 631 632 633
		return -ENOMEM;

	i2c_set_clientdata(i2c, wm8994);
	wm8994->dev = &i2c->dev;
634
	wm8994->irq = i2c->irq;
M
Mark Brown 已提交
635 636 637 638

	if (i2c->dev.of_node) {
		of_id = of_match_device(wm8994_of_match, &i2c->dev);
		if (of_id)
639
			wm8994->type = (enum wm8994_type)of_id->data;
M
Mark Brown 已提交
640 641 642
	} else {
		wm8994->type = id->driver_data;
	}
M
Mark Brown 已提交
643

644
	wm8994->regmap = devm_regmap_init_i2c(i2c, &wm8994_base_regmap_config);
645 646 647 648 649 650 651
	if (IS_ERR(wm8994->regmap)) {
		ret = PTR_ERR(wm8994->regmap);
		dev_err(wm8994->dev, "Failed to allocate register map: %d\n",
			ret);
		return ret;
	}

M
Mark Brown 已提交
652
	return wm8994_device_init(wm8994, i2c->irq);
M
Mark Brown 已提交
653 654
}

B
Bill Pemberton 已提交
655
static int wm8994_i2c_remove(struct i2c_client *i2c)
M
Mark Brown 已提交
656 657 658 659 660 661 662 663 664
{
	struct wm8994 *wm8994 = i2c_get_clientdata(i2c);

	wm8994_device_exit(wm8994);

	return 0;
}

static const struct i2c_device_id wm8994_i2c_id[] = {
M
Mark Brown 已提交
665
	{ "wm1811", WM1811 },
666
	{ "wm1811a", WM1811 },
M
Mark Brown 已提交
667 668
	{ "wm8994", WM8994 },
	{ "wm8958", WM8958 },
M
Mark Brown 已提交
669 670 671 672
	{ }
};
MODULE_DEVICE_TABLE(i2c, wm8994_i2c_id);

673 674 675
static const struct dev_pm_ops wm8994_pm_ops = {
	SET_RUNTIME_PM_OPS(wm8994_suspend, wm8994_resume, NULL)
};
676

M
Mark Brown 已提交
677 678
static struct i2c_driver wm8994_i2c_driver = {
	.driver = {
679 680
		.name = "wm8994",
		.pm = &wm8994_pm_ops,
M
Mark Brown 已提交
681
		.of_match_table = of_match_ptr(wm8994_of_match),
M
Mark Brown 已提交
682 683
	},
	.probe = wm8994_i2c_probe,
B
Bill Pemberton 已提交
684
	.remove = wm8994_i2c_remove,
M
Mark Brown 已提交
685 686 687
	.id_table = wm8994_i2c_id,
};

688
module_i2c_driver(wm8994_i2c_driver);
M
Mark Brown 已提交
689 690 691 692

MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");