wm8994-core.c (16696B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * wm8994-core.c -- Device access for Wolfson WM8994 4 * 5 * Copyright 2009 Wolfson Microelectronics PLC. 6 * 7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 8 */ 9 10#include <linux/kernel.h> 11#include <linux/module.h> 12#include <linux/slab.h> 13#include <linux/i2c.h> 14#include <linux/err.h> 15#include <linux/delay.h> 16#include <linux/mfd/core.h> 17#include <linux/of.h> 18#include <linux/of_device.h> 19#include <linux/pm_runtime.h> 20#include <linux/regmap.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 28#include "wm8994.h" 29 30static const struct mfd_cell wm8994_regulator_devs[] = { 31 { 32 .name = "wm8994-ldo", 33 .id = 0, 34 .pm_runtime_no_callbacks = true, 35 }, 36 { 37 .name = "wm8994-ldo", 38 .id = 1, 39 .pm_runtime_no_callbacks = true, 40 }, 41}; 42 43static const struct resource wm8994_codec_resources[] = { 44 { 45 .start = WM8994_IRQ_TEMP_SHUT, 46 .end = WM8994_IRQ_TEMP_WARN, 47 .flags = IORESOURCE_IRQ, 48 }, 49}; 50 51static const struct resource wm8994_gpio_resources[] = { 52 { 53 .start = WM8994_IRQ_GPIO(1), 54 .end = WM8994_IRQ_GPIO(11), 55 .flags = IORESOURCE_IRQ, 56 }, 57}; 58 59static const struct mfd_cell wm8994_devs[] = { 60 { 61 .name = "wm8994-codec", 62 .num_resources = ARRAY_SIZE(wm8994_codec_resources), 63 .resources = wm8994_codec_resources, 64 }, 65 66 { 67 .name = "wm8994-gpio", 68 .num_resources = ARRAY_SIZE(wm8994_gpio_resources), 69 .resources = wm8994_gpio_resources, 70 .pm_runtime_no_callbacks = true, 71 }, 72}; 73 74/* 75 * Supplies for the main bulk of CODEC; the LDO supplies are ignored 76 * and should be handled via the standard regulator API supply 77 * management. 78 */ 79static const char *wm1811_main_supplies[] = { 80 "DBVDD1", 81 "DBVDD2", 82 "DBVDD3", 83 "DCVDD", 84 "AVDD1", 85 "AVDD2", 86 "CPVDD", 87 "SPKVDD1", 88 "SPKVDD2", 89}; 90 91static const char *wm8994_main_supplies[] = { 92 "DBVDD", 93 "DCVDD", 94 "AVDD1", 95 "AVDD2", 96 "CPVDD", 97 "SPKVDD1", 98 "SPKVDD2", 99}; 100 101static const char *wm8958_main_supplies[] = { 102 "DBVDD1", 103 "DBVDD2", 104 "DBVDD3", 105 "DCVDD", 106 "AVDD1", 107 "AVDD2", 108 "CPVDD", 109 "SPKVDD1", 110 "SPKVDD2", 111}; 112 113#ifdef CONFIG_PM 114static int wm8994_suspend(struct device *dev) 115{ 116 struct wm8994 *wm8994 = dev_get_drvdata(dev); 117 int ret; 118 119 /* Don't actually go through with the suspend if the CODEC is 120 * still active for accessory detect. */ 121 switch (wm8994->type) { 122 case WM8958: 123 case WM1811: 124 ret = wm8994_reg_read(wm8994, WM8958_MIC_DETECT_1); 125 if (ret < 0) { 126 dev_err(dev, "Failed to read power status: %d\n", ret); 127 } else if (ret & WM8958_MICD_ENA) { 128 dev_dbg(dev, "CODEC still active, ignoring suspend\n"); 129 return 0; 130 } 131 break; 132 default: 133 break; 134 } 135 136 /* Disable LDO pulldowns while the device is suspended if we 137 * don't know that something will be driving them. */ 138 if (!wm8994->ldo_ena_always_driven) 139 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2, 140 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD, 141 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD); 142 143 /* Explicitly put the device into reset in case regulators 144 * don't get disabled in order to ensure consistent restart. 145 */ 146 wm8994_reg_write(wm8994, WM8994_SOFTWARE_RESET, 147 wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET)); 148 149 regcache_mark_dirty(wm8994->regmap); 150 151 /* Restore GPIO registers to prevent problems with mismatched 152 * pin configurations. 153 */ 154 ret = regcache_sync_region(wm8994->regmap, WM8994_GPIO_1, 155 WM8994_GPIO_11); 156 if (ret != 0) 157 dev_err(dev, "Failed to restore GPIO registers: %d\n", ret); 158 159 /* In case one of the GPIOs is used as a wake input. */ 160 ret = regcache_sync_region(wm8994->regmap, 161 WM8994_INTERRUPT_STATUS_1_MASK, 162 WM8994_INTERRUPT_STATUS_1_MASK); 163 if (ret != 0) 164 dev_err(dev, "Failed to restore interrupt mask: %d\n", ret); 165 166 regcache_cache_only(wm8994->regmap, true); 167 wm8994->suspended = true; 168 169 ret = regulator_bulk_disable(wm8994->num_supplies, 170 wm8994->supplies); 171 if (ret != 0) { 172 dev_err(dev, "Failed to disable supplies: %d\n", ret); 173 return ret; 174 } 175 176 return 0; 177} 178 179static int wm8994_resume(struct device *dev) 180{ 181 struct wm8994 *wm8994 = dev_get_drvdata(dev); 182 int ret; 183 184 /* We may have lied to the PM core about suspending */ 185 if (!wm8994->suspended) 186 return 0; 187 188 ret = regulator_bulk_enable(wm8994->num_supplies, 189 wm8994->supplies); 190 if (ret != 0) { 191 dev_err(dev, "Failed to enable supplies: %d\n", ret); 192 return ret; 193 } 194 195 regcache_cache_only(wm8994->regmap, false); 196 ret = regcache_sync(wm8994->regmap); 197 if (ret != 0) { 198 dev_err(dev, "Failed to restore register map: %d\n", ret); 199 goto err_enable; 200 } 201 202 /* Disable LDO pulldowns while the device is active */ 203 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2, 204 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD, 205 0); 206 207 wm8994->suspended = false; 208 209 return 0; 210 211err_enable: 212 regulator_bulk_disable(wm8994->num_supplies, wm8994->supplies); 213 214 return ret; 215} 216#endif 217 218#ifdef CONFIG_REGULATOR 219static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo) 220{ 221 struct wm8994_ldo_pdata *ldo_pdata; 222 223 if (!pdata) 224 return 0; 225 226 ldo_pdata = &pdata->ldo[ldo]; 227 228 if (!ldo_pdata->init_data) 229 return 0; 230 231 return ldo_pdata->init_data->num_consumer_supplies != 0; 232} 233#else 234static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo) 235{ 236 return 0; 237} 238#endif 239 240static const struct reg_sequence wm8994_revc_patch[] = { 241 { 0x102, 0x3 }, 242 { 0x56, 0x3 }, 243 { 0x817, 0x0 }, 244 { 0x102, 0x0 }, 245}; 246 247static const struct reg_sequence wm8958_reva_patch[] = { 248 { 0x102, 0x3 }, 249 { 0xcb, 0x81 }, 250 { 0x817, 0x0 }, 251 { 0x102, 0x0 }, 252}; 253 254static const struct reg_sequence wm1811_reva_patch[] = { 255 { 0x102, 0x3 }, 256 { 0x56, 0xc07 }, 257 { 0x5d, 0x7e }, 258 { 0x5e, 0x0 }, 259 { 0x102, 0x0 }, 260}; 261 262#ifdef CONFIG_OF 263static int wm8994_set_pdata_from_of(struct wm8994 *wm8994) 264{ 265 struct device_node *np = wm8994->dev->of_node; 266 struct wm8994_pdata *pdata = &wm8994->pdata; 267 int i; 268 269 if (!np) 270 return 0; 271 272 if (of_property_read_u32_array(np, "wlf,gpio-cfg", pdata->gpio_defaults, 273 ARRAY_SIZE(pdata->gpio_defaults)) >= 0) { 274 for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) { 275 if (wm8994->pdata.gpio_defaults[i] == 0) 276 pdata->gpio_defaults[i] 277 = WM8994_CONFIGURE_GPIO; 278 } 279 } 280 281 of_property_read_u32_array(np, "wlf,micbias-cfg", pdata->micbias, 282 ARRAY_SIZE(pdata->micbias)); 283 284 pdata->lineout1_diff = true; 285 pdata->lineout2_diff = true; 286 if (of_find_property(np, "wlf,lineout1-se", NULL)) 287 pdata->lineout1_diff = false; 288 if (of_find_property(np, "wlf,lineout2-se", NULL)) 289 pdata->lineout2_diff = false; 290 291 if (of_find_property(np, "wlf,lineout1-feedback", NULL)) 292 pdata->lineout1fb = true; 293 if (of_find_property(np, "wlf,lineout2-feedback", NULL)) 294 pdata->lineout2fb = true; 295 296 if (of_find_property(np, "wlf,ldoena-always-driven", NULL)) 297 pdata->lineout2fb = true; 298 299 pdata->spkmode_pu = of_property_read_bool(np, "wlf,spkmode-pu"); 300 301 pdata->csnaddr_pd = of_property_read_bool(np, "wlf,csnaddr-pd"); 302 303 return 0; 304} 305#else 306static int wm8994_set_pdata_from_of(struct wm8994 *wm8994) 307{ 308 return 0; 309} 310#endif 311 312/* 313 * Instantiate the generic non-control parts of the device. 314 */ 315static int wm8994_device_init(struct wm8994 *wm8994, int irq) 316{ 317 struct wm8994_pdata *pdata; 318 struct regmap_config *regmap_config; 319 const struct reg_sequence *regmap_patch = NULL; 320 const char *devname; 321 int ret, i, patch_regs = 0; 322 int pulls = 0; 323 324 if (dev_get_platdata(wm8994->dev)) { 325 pdata = dev_get_platdata(wm8994->dev); 326 wm8994->pdata = *pdata; 327 } 328 pdata = &wm8994->pdata; 329 330 ret = wm8994_set_pdata_from_of(wm8994); 331 if (ret != 0) 332 return ret; 333 334 dev_set_drvdata(wm8994->dev, wm8994); 335 336 /* Add the on-chip regulators first for bootstrapping */ 337 ret = mfd_add_devices(wm8994->dev, 0, 338 wm8994_regulator_devs, 339 ARRAY_SIZE(wm8994_regulator_devs), 340 NULL, 0, NULL); 341 if (ret != 0) { 342 dev_err(wm8994->dev, "Failed to add children: %d\n", ret); 343 goto err; 344 } 345 346 switch (wm8994->type) { 347 case WM1811: 348 wm8994->num_supplies = ARRAY_SIZE(wm1811_main_supplies); 349 break; 350 case WM8994: 351 wm8994->num_supplies = ARRAY_SIZE(wm8994_main_supplies); 352 break; 353 case WM8958: 354 wm8994->num_supplies = ARRAY_SIZE(wm8958_main_supplies); 355 break; 356 default: 357 BUG(); 358 goto err; 359 } 360 361 wm8994->supplies = devm_kcalloc(wm8994->dev, 362 wm8994->num_supplies, 363 sizeof(struct regulator_bulk_data), 364 GFP_KERNEL); 365 if (!wm8994->supplies) { 366 ret = -ENOMEM; 367 goto err; 368 } 369 370 switch (wm8994->type) { 371 case WM1811: 372 for (i = 0; i < ARRAY_SIZE(wm1811_main_supplies); i++) 373 wm8994->supplies[i].supply = wm1811_main_supplies[i]; 374 break; 375 case WM8994: 376 for (i = 0; i < ARRAY_SIZE(wm8994_main_supplies); i++) 377 wm8994->supplies[i].supply = wm8994_main_supplies[i]; 378 break; 379 case WM8958: 380 for (i = 0; i < ARRAY_SIZE(wm8958_main_supplies); i++) 381 wm8994->supplies[i].supply = wm8958_main_supplies[i]; 382 break; 383 default: 384 BUG(); 385 goto err; 386 } 387 388 /* 389 * Can't use devres helper here as some of the supplies are provided by 390 * wm8994->dev's children (regulators) and those regulators are 391 * unregistered by the devres core before the supplies are freed. 392 */ 393 ret = regulator_bulk_get(wm8994->dev, wm8994->num_supplies, 394 wm8994->supplies); 395 if (ret != 0) { 396 if (ret != -EPROBE_DEFER) 397 dev_err(wm8994->dev, "Failed to get supplies: %d\n", 398 ret); 399 goto err; 400 } 401 402 ret = regulator_bulk_enable(wm8994->num_supplies, wm8994->supplies); 403 if (ret != 0) { 404 dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret); 405 goto err_regulator_free; 406 } 407 408 ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET); 409 if (ret < 0) { 410 dev_err(wm8994->dev, "Failed to read ID register\n"); 411 goto err_enable; 412 } 413 switch (ret) { 414 case 0x1811: 415 devname = "WM1811"; 416 if (wm8994->type != WM1811) 417 dev_warn(wm8994->dev, "Device registered as type %d\n", 418 wm8994->type); 419 wm8994->type = WM1811; 420 break; 421 case 0x8994: 422 devname = "WM8994"; 423 if (wm8994->type != WM8994) 424 dev_warn(wm8994->dev, "Device registered as type %d\n", 425 wm8994->type); 426 wm8994->type = WM8994; 427 break; 428 case 0x8958: 429 devname = "WM8958"; 430 if (wm8994->type != WM8958) 431 dev_warn(wm8994->dev, "Device registered as type %d\n", 432 wm8994->type); 433 wm8994->type = WM8958; 434 break; 435 default: 436 dev_err(wm8994->dev, "Device is not a WM8994, ID is %x\n", 437 ret); 438 ret = -EINVAL; 439 goto err_enable; 440 } 441 442 ret = wm8994_reg_read(wm8994, WM8994_CHIP_REVISION); 443 if (ret < 0) { 444 dev_err(wm8994->dev, "Failed to read revision register: %d\n", 445 ret); 446 goto err_enable; 447 } 448 wm8994->revision = ret & WM8994_CHIP_REV_MASK; 449 wm8994->cust_id = (ret & WM8994_CUST_ID_MASK) >> WM8994_CUST_ID_SHIFT; 450 451 switch (wm8994->type) { 452 case WM8994: 453 switch (wm8994->revision) { 454 case 0: 455 case 1: 456 dev_warn(wm8994->dev, 457 "revision %c not fully supported\n", 458 'A' + wm8994->revision); 459 break; 460 case 2: 461 case 3: 462 default: 463 regmap_patch = wm8994_revc_patch; 464 patch_regs = ARRAY_SIZE(wm8994_revc_patch); 465 break; 466 } 467 break; 468 469 case WM8958: 470 switch (wm8994->revision) { 471 case 0: 472 regmap_patch = wm8958_reva_patch; 473 patch_regs = ARRAY_SIZE(wm8958_reva_patch); 474 break; 475 default: 476 break; 477 } 478 break; 479 480 case WM1811: 481 /* Revision C did not change the relevant layer */ 482 if (wm8994->revision > 1) 483 wm8994->revision++; 484 485 regmap_patch = wm1811_reva_patch; 486 patch_regs = ARRAY_SIZE(wm1811_reva_patch); 487 break; 488 489 default: 490 break; 491 } 492 493 dev_info(wm8994->dev, "%s revision %c CUST_ID %02x\n", devname, 494 'A' + wm8994->revision, wm8994->cust_id); 495 496 switch (wm8994->type) { 497 case WM1811: 498 regmap_config = &wm1811_regmap_config; 499 break; 500 case WM8994: 501 regmap_config = &wm8994_regmap_config; 502 break; 503 case WM8958: 504 regmap_config = &wm8958_regmap_config; 505 break; 506 default: 507 dev_err(wm8994->dev, "Unknown device type %d\n", wm8994->type); 508 ret = -EINVAL; 509 goto err_enable; 510 } 511 512 ret = regmap_reinit_cache(wm8994->regmap, regmap_config); 513 if (ret != 0) { 514 dev_err(wm8994->dev, "Failed to reinit register cache: %d\n", 515 ret); 516 goto err_enable; 517 } 518 519 /* Explicitly put the device into reset in case regulators 520 * don't get disabled in order to ensure we know the device 521 * state. 522 */ 523 ret = wm8994_reg_write(wm8994, WM8994_SOFTWARE_RESET, 524 wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET)); 525 if (ret != 0) { 526 dev_err(wm8994->dev, "Failed to reset device: %d\n", ret); 527 goto err_enable; 528 } 529 530 if (regmap_patch) { 531 ret = regmap_register_patch(wm8994->regmap, regmap_patch, 532 patch_regs); 533 if (ret != 0) { 534 dev_err(wm8994->dev, "Failed to register patch: %d\n", 535 ret); 536 goto err_enable; 537 } 538 } 539 540 wm8994->irq_base = pdata->irq_base; 541 wm8994->gpio_base = pdata->gpio_base; 542 543 /* GPIO configuration is only applied if it's non-zero */ 544 for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) { 545 if (pdata->gpio_defaults[i]) { 546 wm8994_set_bits(wm8994, WM8994_GPIO_1 + i, 547 0xffff, pdata->gpio_defaults[i]); 548 } 549 } 550 551 wm8994->ldo_ena_always_driven = pdata->ldo_ena_always_driven; 552 553 if (pdata->spkmode_pu) 554 pulls |= WM8994_SPKMODE_PU; 555 if (pdata->csnaddr_pd) 556 pulls |= WM8994_CSNADDR_PD; 557 558 /* Disable unneeded pulls */ 559 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2, 560 WM8994_LDO1ENA_PD | WM8994_LDO2ENA_PD | 561 WM8994_SPKMODE_PU | WM8994_CSNADDR_PD, 562 pulls); 563 564 /* In some system designs where the regulators are not in use, 565 * we can achieve a small reduction in leakage currents by 566 * floating LDO outputs. This bit makes no difference if the 567 * LDOs are enabled, it only affects cases where the LDOs were 568 * in operation and are then disabled. 569 */ 570 for (i = 0; i < WM8994_NUM_LDO_REGS; i++) { 571 if (wm8994_ldo_in_use(pdata, i)) 572 wm8994_set_bits(wm8994, WM8994_LDO_1 + i, 573 WM8994_LDO1_DISCH, WM8994_LDO1_DISCH); 574 else 575 wm8994_set_bits(wm8994, WM8994_LDO_1 + i, 576 WM8994_LDO1_DISCH, 0); 577 } 578 579 wm8994_irq_init(wm8994); 580 581 ret = mfd_add_devices(wm8994->dev, -1, 582 wm8994_devs, ARRAY_SIZE(wm8994_devs), 583 NULL, 0, NULL); 584 if (ret != 0) { 585 dev_err(wm8994->dev, "Failed to add children: %d\n", ret); 586 goto err_irq; 587 } 588 589 pm_runtime_set_active(wm8994->dev); 590 pm_runtime_enable(wm8994->dev); 591 pm_runtime_idle(wm8994->dev); 592 593 return 0; 594 595err_irq: 596 wm8994_irq_exit(wm8994); 597err_enable: 598 regulator_bulk_disable(wm8994->num_supplies, 599 wm8994->supplies); 600err_regulator_free: 601 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies); 602err: 603 mfd_remove_devices(wm8994->dev); 604 return ret; 605} 606 607static void wm8994_device_exit(struct wm8994 *wm8994) 608{ 609 pm_runtime_get_sync(wm8994->dev); 610 pm_runtime_disable(wm8994->dev); 611 pm_runtime_put_noidle(wm8994->dev); 612 wm8994_irq_exit(wm8994); 613 regulator_bulk_disable(wm8994->num_supplies, wm8994->supplies); 614 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies); 615 mfd_remove_devices(wm8994->dev); 616} 617 618static const struct of_device_id wm8994_of_match[] = { 619 { .compatible = "wlf,wm1811", .data = (void *)WM1811 }, 620 { .compatible = "wlf,wm8994", .data = (void *)WM8994 }, 621 { .compatible = "wlf,wm8958", .data = (void *)WM8958 }, 622 { } 623}; 624MODULE_DEVICE_TABLE(of, wm8994_of_match); 625 626static int wm8994_i2c_probe(struct i2c_client *i2c, 627 const struct i2c_device_id *id) 628{ 629 const struct of_device_id *of_id; 630 struct wm8994 *wm8994; 631 int ret; 632 633 wm8994 = devm_kzalloc(&i2c->dev, sizeof(struct wm8994), GFP_KERNEL); 634 if (wm8994 == NULL) 635 return -ENOMEM; 636 637 i2c_set_clientdata(i2c, wm8994); 638 wm8994->dev = &i2c->dev; 639 wm8994->irq = i2c->irq; 640 641 if (i2c->dev.of_node) { 642 of_id = of_match_device(wm8994_of_match, &i2c->dev); 643 if (of_id) 644 wm8994->type = (enum wm8994_type)of_id->data; 645 } else { 646 wm8994->type = id->driver_data; 647 } 648 649 wm8994->regmap = devm_regmap_init_i2c(i2c, &wm8994_base_regmap_config); 650 if (IS_ERR(wm8994->regmap)) { 651 ret = PTR_ERR(wm8994->regmap); 652 dev_err(wm8994->dev, "Failed to allocate register map: %d\n", 653 ret); 654 return ret; 655 } 656 657 return wm8994_device_init(wm8994, i2c->irq); 658} 659 660static int wm8994_i2c_remove(struct i2c_client *i2c) 661{ 662 struct wm8994 *wm8994 = i2c_get_clientdata(i2c); 663 664 wm8994_device_exit(wm8994); 665 666 return 0; 667} 668 669static const struct i2c_device_id wm8994_i2c_id[] = { 670 { "wm1811", WM1811 }, 671 { "wm1811a", WM1811 }, 672 { "wm8994", WM8994 }, 673 { "wm8958", WM8958 }, 674 { } 675}; 676MODULE_DEVICE_TABLE(i2c, wm8994_i2c_id); 677 678static const struct dev_pm_ops wm8994_pm_ops = { 679 SET_RUNTIME_PM_OPS(wm8994_suspend, wm8994_resume, NULL) 680}; 681 682static struct i2c_driver wm8994_i2c_driver = { 683 .driver = { 684 .name = "wm8994", 685 .pm = &wm8994_pm_ops, 686 .of_match_table = wm8994_of_match, 687 }, 688 .probe = wm8994_i2c_probe, 689 .remove = wm8994_i2c_remove, 690 .id_table = wm8994_i2c_id, 691}; 692 693module_i2c_driver(wm8994_i2c_driver); 694 695MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC"); 696MODULE_LICENSE("GPL"); 697MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 698MODULE_SOFTDEP("pre: wm8994_regulator");