wm8994-core.c revision 5a0e3ad6af8660be21ca98a971cd00f331318c05
1/* 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> 17#include <linux/slab.h> 18#include <linux/i2c.h> 19#include <linux/delay.h> 20#include <linux/mfd/core.h> 21#include <linux/regulator/consumer.h> 22#include <linux/regulator/machine.h> 23 24#include <linux/mfd/wm8994/core.h> 25#include <linux/mfd/wm8994/pdata.h> 26#include <linux/mfd/wm8994/registers.h> 27 28static int wm8994_read(struct wm8994 *wm8994, unsigned short reg, 29 int bytes, void *dest) 30{ 31 int ret, i; 32 u16 *buf = dest; 33 34 BUG_ON(bytes % 2); 35 BUG_ON(bytes <= 0); 36 37 ret = wm8994->read_dev(wm8994, reg, bytes, dest); 38 if (ret < 0) 39 return ret; 40 41 for (i = 0; i < bytes / 2; i++) { 42 buf[i] = be16_to_cpu(buf[i]); 43 44 dev_vdbg(wm8994->dev, "Read %04x from R%d(0x%x)\n", 45 buf[i], reg + i, reg + i); 46 } 47 48 return 0; 49} 50 51/** 52 * wm8994_reg_read: Read a single WM8994 register. 53 * 54 * @wm8994: Device to read from. 55 * @reg: Register to read. 56 */ 57int wm8994_reg_read(struct wm8994 *wm8994, unsigned short reg) 58{ 59 unsigned short val; 60 int ret; 61 62 mutex_lock(&wm8994->io_lock); 63 64 ret = wm8994_read(wm8994, reg, 2, &val); 65 66 mutex_unlock(&wm8994->io_lock); 67 68 if (ret < 0) 69 return ret; 70 else 71 return val; 72} 73EXPORT_SYMBOL_GPL(wm8994_reg_read); 74 75/** 76 * wm8994_bulk_read: Read multiple WM8994 registers 77 * 78 * @wm8994: Device to read from 79 * @reg: First register 80 * @count: Number of registers 81 * @buf: Buffer to fill. 82 */ 83int wm8994_bulk_read(struct wm8994 *wm8994, unsigned short reg, 84 int count, u16 *buf) 85{ 86 int ret; 87 88 mutex_lock(&wm8994->io_lock); 89 90 ret = wm8994_read(wm8994, reg, count * 2, buf); 91 92 mutex_unlock(&wm8994->io_lock); 93 94 return ret; 95} 96EXPORT_SYMBOL_GPL(wm8994_bulk_read); 97 98static int wm8994_write(struct wm8994 *wm8994, unsigned short reg, 99 int bytes, void *src) 100{ 101 u16 *buf = src; 102 int i; 103 104 BUG_ON(bytes % 2); 105 BUG_ON(bytes <= 0); 106 107 for (i = 0; i < bytes / 2; i++) { 108 dev_vdbg(wm8994->dev, "Write %04x to R%d(0x%x)\n", 109 buf[i], reg + i, reg + i); 110 111 buf[i] = cpu_to_be16(buf[i]); 112 } 113 114 return wm8994->write_dev(wm8994, reg, bytes, src); 115} 116 117/** 118 * wm8994_reg_write: Write a single WM8994 register. 119 * 120 * @wm8994: Device to write to. 121 * @reg: Register to write to. 122 * @val: Value to write. 123 */ 124int wm8994_reg_write(struct wm8994 *wm8994, unsigned short reg, 125 unsigned short val) 126{ 127 int ret; 128 129 mutex_lock(&wm8994->io_lock); 130 131 ret = wm8994_write(wm8994, reg, 2, &val); 132 133 mutex_unlock(&wm8994->io_lock); 134 135 return ret; 136} 137EXPORT_SYMBOL_GPL(wm8994_reg_write); 138 139/** 140 * wm8994_set_bits: Set the value of a bitfield in a WM8994 register 141 * 142 * @wm8994: Device to write to. 143 * @reg: Register to write to. 144 * @mask: Mask of bits to set. 145 * @val: Value to set (unshifted) 146 */ 147int wm8994_set_bits(struct wm8994 *wm8994, unsigned short reg, 148 unsigned short mask, unsigned short val) 149{ 150 int ret; 151 u16 r; 152 153 mutex_lock(&wm8994->io_lock); 154 155 ret = wm8994_read(wm8994, reg, 2, &r); 156 if (ret < 0) 157 goto out; 158 159 r &= ~mask; 160 r |= val; 161 162 ret = wm8994_write(wm8994, reg, 2, &r); 163 164out: 165 mutex_unlock(&wm8994->io_lock); 166 167 return ret; 168} 169EXPORT_SYMBOL_GPL(wm8994_set_bits); 170 171static struct mfd_cell wm8994_regulator_devs[] = { 172 { .name = "wm8994-ldo", .id = 1 }, 173 { .name = "wm8994-ldo", .id = 2 }, 174}; 175 176static struct mfd_cell wm8994_devs[] = { 177 { .name = "wm8994-codec" }, 178 { .name = "wm8994-gpio" }, 179}; 180 181/* 182 * Supplies for the main bulk of CODEC; the LDO supplies are ignored 183 * and should be handled via the standard regulator API supply 184 * management. 185 */ 186static const char *wm8994_main_supplies[] = { 187 "DBVDD", 188 "DCVDD", 189 "AVDD1", 190 "AVDD2", 191 "CPVDD", 192 "SPKVDD1", 193 "SPKVDD2", 194}; 195 196#ifdef CONFIG_PM 197static int wm8994_device_suspend(struct device *dev) 198{ 199 struct wm8994 *wm8994 = dev_get_drvdata(dev); 200 int ret; 201 202 /* GPIO configuration state is saved here since we may be configuring 203 * the GPIO alternate functions even if we're not using the gpiolib 204 * driver for them. 205 */ 206 ret = wm8994_read(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2, 207 &wm8994->gpio_regs); 208 if (ret < 0) 209 dev_err(dev, "Failed to save GPIO registers: %d\n", ret); 210 211 /* For similar reasons we also stash the regulator states */ 212 ret = wm8994_read(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2, 213 &wm8994->ldo_regs); 214 if (ret < 0) 215 dev_err(dev, "Failed to save LDO registers: %d\n", ret); 216 217 ret = regulator_bulk_disable(ARRAY_SIZE(wm8994_main_supplies), 218 wm8994->supplies); 219 if (ret != 0) { 220 dev_err(dev, "Failed to disable supplies: %d\n", ret); 221 return ret; 222 } 223 224 return 0; 225} 226 227static int wm8994_device_resume(struct device *dev) 228{ 229 struct wm8994 *wm8994 = dev_get_drvdata(dev); 230 int ret; 231 232 ret = regulator_bulk_enable(ARRAY_SIZE(wm8994_main_supplies), 233 wm8994->supplies); 234 if (ret != 0) { 235 dev_err(dev, "Failed to enable supplies: %d\n", ret); 236 return ret; 237 } 238 239 ret = wm8994_write(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2, 240 &wm8994->ldo_regs); 241 if (ret < 0) 242 dev_err(dev, "Failed to restore LDO registers: %d\n", ret); 243 244 ret = wm8994_write(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2, 245 &wm8994->gpio_regs); 246 if (ret < 0) 247 dev_err(dev, "Failed to restore GPIO registers: %d\n", ret); 248 249 return 0; 250} 251#endif 252 253#ifdef CONFIG_REGULATOR 254static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo) 255{ 256 struct wm8994_ldo_pdata *ldo_pdata; 257 258 if (!pdata) 259 return 0; 260 261 ldo_pdata = &pdata->ldo[ldo]; 262 263 if (!ldo_pdata->init_data) 264 return 0; 265 266 return ldo_pdata->init_data->num_consumer_supplies != 0; 267} 268#else 269static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo) 270{ 271 return 0; 272} 273#endif 274 275/* 276 * Instantiate the generic non-control parts of the device. 277 */ 278static int wm8994_device_init(struct wm8994 *wm8994, unsigned long id, int irq) 279{ 280 struct wm8994_pdata *pdata = wm8994->dev->platform_data; 281 int ret, i; 282 283 mutex_init(&wm8994->io_lock); 284 dev_set_drvdata(wm8994->dev, wm8994); 285 286 /* Add the on-chip regulators first for bootstrapping */ 287 ret = mfd_add_devices(wm8994->dev, -1, 288 wm8994_regulator_devs, 289 ARRAY_SIZE(wm8994_regulator_devs), 290 NULL, 0); 291 if (ret != 0) { 292 dev_err(wm8994->dev, "Failed to add children: %d\n", ret); 293 goto err; 294 } 295 296 wm8994->supplies = kzalloc(sizeof(struct regulator_bulk_data) * 297 ARRAY_SIZE(wm8994_main_supplies), 298 GFP_KERNEL); 299 if (!wm8994->supplies) 300 goto err; 301 302 for (i = 0; i < ARRAY_SIZE(wm8994_main_supplies); i++) 303 wm8994->supplies[i].supply = wm8994_main_supplies[i]; 304 305 ret = regulator_bulk_get(wm8994->dev, ARRAY_SIZE(wm8994_main_supplies), 306 wm8994->supplies); 307 if (ret != 0) { 308 dev_err(wm8994->dev, "Failed to get supplies: %d\n", ret); 309 goto err_supplies; 310 } 311 312 ret = regulator_bulk_enable(ARRAY_SIZE(wm8994_main_supplies), 313 wm8994->supplies); 314 if (ret != 0) { 315 dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret); 316 goto err_get; 317 } 318 319 ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET); 320 if (ret < 0) { 321 dev_err(wm8994->dev, "Failed to read ID register\n"); 322 goto err_enable; 323 } 324 if (ret != 0x8994) { 325 dev_err(wm8994->dev, "Device is not a WM8994, ID is %x\n", 326 ret); 327 ret = -EINVAL; 328 goto err_enable; 329 } 330 331 ret = wm8994_reg_read(wm8994, WM8994_CHIP_REVISION); 332 if (ret < 0) { 333 dev_err(wm8994->dev, "Failed to read revision register: %d\n", 334 ret); 335 goto err_enable; 336 } 337 338 switch (ret) { 339 case 0: 340 case 1: 341 dev_warn(wm8994->dev, "revision %c not fully supported\n", 342 'A' + ret); 343 break; 344 default: 345 dev_info(wm8994->dev, "revision %c\n", 'A' + ret); 346 break; 347 } 348 349 350 if (pdata) { 351 wm8994->gpio_base = pdata->gpio_base; 352 353 /* GPIO configuration is only applied if it's non-zero */ 354 for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) { 355 if (pdata->gpio_defaults[i]) { 356 wm8994_set_bits(wm8994, WM8994_GPIO_1 + i, 357 0xffff, 358 pdata->gpio_defaults[i]); 359 } 360 } 361 } 362 363 /* In some system designs where the regulators are not in use, 364 * we can achieve a small reduction in leakage currents by 365 * floating LDO outputs. This bit makes no difference if the 366 * LDOs are enabled, it only affects cases where the LDOs were 367 * in operation and are then disabled. 368 */ 369 for (i = 0; i < WM8994_NUM_LDO_REGS; i++) { 370 if (wm8994_ldo_in_use(pdata, i)) 371 wm8994_set_bits(wm8994, WM8994_LDO_1 + i, 372 WM8994_LDO1_DISCH, WM8994_LDO1_DISCH); 373 else 374 wm8994_set_bits(wm8994, WM8994_LDO_1 + i, 375 WM8994_LDO1_DISCH, 0); 376 } 377 378 ret = mfd_add_devices(wm8994->dev, -1, 379 wm8994_devs, ARRAY_SIZE(wm8994_devs), 380 NULL, 0); 381 if (ret != 0) { 382 dev_err(wm8994->dev, "Failed to add children: %d\n", ret); 383 goto err_enable; 384 } 385 386 return 0; 387 388err_enable: 389 regulator_bulk_disable(ARRAY_SIZE(wm8994_main_supplies), 390 wm8994->supplies); 391err_get: 392 regulator_bulk_free(ARRAY_SIZE(wm8994_main_supplies), wm8994->supplies); 393err_supplies: 394 kfree(wm8994->supplies); 395err: 396 mfd_remove_devices(wm8994->dev); 397 kfree(wm8994); 398 return ret; 399} 400 401static void wm8994_device_exit(struct wm8994 *wm8994) 402{ 403 mfd_remove_devices(wm8994->dev); 404 regulator_bulk_disable(ARRAY_SIZE(wm8994_main_supplies), 405 wm8994->supplies); 406 regulator_bulk_free(ARRAY_SIZE(wm8994_main_supplies), wm8994->supplies); 407 kfree(wm8994->supplies); 408 kfree(wm8994); 409} 410 411static int wm8994_i2c_read_device(struct wm8994 *wm8994, unsigned short reg, 412 int bytes, void *dest) 413{ 414 struct i2c_client *i2c = wm8994->control_data; 415 int ret; 416 u16 r = cpu_to_be16(reg); 417 418 ret = i2c_master_send(i2c, (unsigned char *)&r, 2); 419 if (ret < 0) 420 return ret; 421 if (ret != 2) 422 return -EIO; 423 424 ret = i2c_master_recv(i2c, dest, bytes); 425 if (ret < 0) 426 return ret; 427 if (ret != bytes) 428 return -EIO; 429 return 0; 430} 431 432/* Currently we allocate the write buffer on the stack; this is OK for 433 * small writes - if we need to do large writes this will need to be 434 * revised. 435 */ 436static int wm8994_i2c_write_device(struct wm8994 *wm8994, unsigned short reg, 437 int bytes, void *src) 438{ 439 struct i2c_client *i2c = wm8994->control_data; 440 unsigned char msg[bytes + 2]; 441 int ret; 442 443 reg = cpu_to_be16(reg); 444 memcpy(&msg[0], ®, 2); 445 memcpy(&msg[2], src, bytes); 446 447 ret = i2c_master_send(i2c, msg, bytes + 2); 448 if (ret < 0) 449 return ret; 450 if (ret < bytes + 2) 451 return -EIO; 452 453 return 0; 454} 455 456static int wm8994_i2c_probe(struct i2c_client *i2c, 457 const struct i2c_device_id *id) 458{ 459 struct wm8994 *wm8994; 460 461 wm8994 = kzalloc(sizeof(struct wm8994), GFP_KERNEL); 462 if (wm8994 == NULL) { 463 kfree(i2c); 464 return -ENOMEM; 465 } 466 467 i2c_set_clientdata(i2c, wm8994); 468 wm8994->dev = &i2c->dev; 469 wm8994->control_data = i2c; 470 wm8994->read_dev = wm8994_i2c_read_device; 471 wm8994->write_dev = wm8994_i2c_write_device; 472 473 return wm8994_device_init(wm8994, id->driver_data, i2c->irq); 474} 475 476static int wm8994_i2c_remove(struct i2c_client *i2c) 477{ 478 struct wm8994 *wm8994 = i2c_get_clientdata(i2c); 479 480 wm8994_device_exit(wm8994); 481 482 return 0; 483} 484 485#ifdef CONFIG_PM 486static int wm8994_i2c_suspend(struct i2c_client *i2c, pm_message_t state) 487{ 488 return wm8994_device_suspend(&i2c->dev); 489} 490 491static int wm8994_i2c_resume(struct i2c_client *i2c) 492{ 493 return wm8994_device_resume(&i2c->dev); 494} 495#else 496#define wm8994_i2c_suspend NULL 497#define wm8994_i2c_resume NULL 498#endif 499 500static const struct i2c_device_id wm8994_i2c_id[] = { 501 { "wm8994", 0 }, 502 { } 503}; 504MODULE_DEVICE_TABLE(i2c, wm8994_i2c_id); 505 506static struct i2c_driver wm8994_i2c_driver = { 507 .driver = { 508 .name = "wm8994", 509 .owner = THIS_MODULE, 510 }, 511 .probe = wm8994_i2c_probe, 512 .remove = wm8994_i2c_remove, 513 .suspend = wm8994_i2c_suspend, 514 .resume = wm8994_i2c_resume, 515 .id_table = wm8994_i2c_id, 516}; 517 518static int __init wm8994_i2c_init(void) 519{ 520 int ret; 521 522 ret = i2c_add_driver(&wm8994_i2c_driver); 523 if (ret != 0) 524 pr_err("Failed to register wm8994 I2C driver: %d\n", ret); 525 526 return ret; 527} 528module_init(wm8994_i2c_init); 529 530static void __exit wm8994_i2c_exit(void) 531{ 532 i2c_del_driver(&wm8994_i2c_driver); 533} 534module_exit(wm8994_i2c_exit); 535 536MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC"); 537MODULE_LICENSE("GPL"); 538MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 539