arizona-core.c (34383B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Arizona core driver 4 * 5 * Copyright 2012 Wolfson Microelectronics plc 6 * 7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 8 */ 9 10#include <linux/clk.h> 11#include <linux/delay.h> 12#include <linux/err.h> 13#include <linux/gpio/consumer.h> 14#include <linux/interrupt.h> 15#include <linux/mfd/core.h> 16#include <linux/module.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#include <linux/slab.h> 24#include <linux/ktime.h> 25#include <linux/platform_device.h> 26 27#include <linux/mfd/arizona/core.h> 28#include <linux/mfd/arizona/registers.h> 29 30#include "arizona.h" 31 32static const char * const wm5102_core_supplies[] = { 33 "AVDD", 34 "DBVDD1", 35}; 36 37int arizona_clk32k_enable(struct arizona *arizona) 38{ 39 int ret = 0; 40 41 mutex_lock(&arizona->clk_lock); 42 43 arizona->clk32k_ref++; 44 45 if (arizona->clk32k_ref == 1) { 46 switch (arizona->pdata.clk32k_src) { 47 case ARIZONA_32KZ_MCLK1: 48 ret = pm_runtime_get_sync(arizona->dev); 49 if (ret != 0) 50 goto err_ref; 51 ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK1]); 52 if (ret != 0) { 53 pm_runtime_put_sync(arizona->dev); 54 goto err_ref; 55 } 56 break; 57 case ARIZONA_32KZ_MCLK2: 58 ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK2]); 59 if (ret != 0) 60 goto err_ref; 61 break; 62 } 63 64 ret = regmap_update_bits(arizona->regmap, ARIZONA_CLOCK_32K_1, 65 ARIZONA_CLK_32K_ENA, 66 ARIZONA_CLK_32K_ENA); 67 } 68 69err_ref: 70 if (ret != 0) 71 arizona->clk32k_ref--; 72 73 mutex_unlock(&arizona->clk_lock); 74 75 return ret; 76} 77EXPORT_SYMBOL_GPL(arizona_clk32k_enable); 78 79int arizona_clk32k_disable(struct arizona *arizona) 80{ 81 mutex_lock(&arizona->clk_lock); 82 83 WARN_ON(arizona->clk32k_ref <= 0); 84 85 arizona->clk32k_ref--; 86 87 if (arizona->clk32k_ref == 0) { 88 regmap_update_bits(arizona->regmap, ARIZONA_CLOCK_32K_1, 89 ARIZONA_CLK_32K_ENA, 0); 90 91 switch (arizona->pdata.clk32k_src) { 92 case ARIZONA_32KZ_MCLK1: 93 pm_runtime_put_sync(arizona->dev); 94 clk_disable_unprepare(arizona->mclk[ARIZONA_MCLK1]); 95 break; 96 case ARIZONA_32KZ_MCLK2: 97 clk_disable_unprepare(arizona->mclk[ARIZONA_MCLK2]); 98 break; 99 } 100 } 101 102 mutex_unlock(&arizona->clk_lock); 103 104 return 0; 105} 106EXPORT_SYMBOL_GPL(arizona_clk32k_disable); 107 108static irqreturn_t arizona_clkgen_err(int irq, void *data) 109{ 110 struct arizona *arizona = data; 111 112 dev_err(arizona->dev, "CLKGEN error\n"); 113 114 return IRQ_HANDLED; 115} 116 117static irqreturn_t arizona_underclocked(int irq, void *data) 118{ 119 struct arizona *arizona = data; 120 unsigned int val; 121 int ret; 122 123 ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_8, 124 &val); 125 if (ret != 0) { 126 dev_err(arizona->dev, "Failed to read underclock status: %d\n", 127 ret); 128 return IRQ_NONE; 129 } 130 131 if (val & ARIZONA_AIF3_UNDERCLOCKED_STS) 132 dev_err(arizona->dev, "AIF3 underclocked\n"); 133 if (val & ARIZONA_AIF2_UNDERCLOCKED_STS) 134 dev_err(arizona->dev, "AIF2 underclocked\n"); 135 if (val & ARIZONA_AIF1_UNDERCLOCKED_STS) 136 dev_err(arizona->dev, "AIF1 underclocked\n"); 137 if (val & ARIZONA_ISRC3_UNDERCLOCKED_STS) 138 dev_err(arizona->dev, "ISRC3 underclocked\n"); 139 if (val & ARIZONA_ISRC2_UNDERCLOCKED_STS) 140 dev_err(arizona->dev, "ISRC2 underclocked\n"); 141 if (val & ARIZONA_ISRC1_UNDERCLOCKED_STS) 142 dev_err(arizona->dev, "ISRC1 underclocked\n"); 143 if (val & ARIZONA_FX_UNDERCLOCKED_STS) 144 dev_err(arizona->dev, "FX underclocked\n"); 145 if (val & ARIZONA_ASRC_UNDERCLOCKED_STS) 146 dev_err(arizona->dev, "ASRC underclocked\n"); 147 if (val & ARIZONA_DAC_UNDERCLOCKED_STS) 148 dev_err(arizona->dev, "DAC underclocked\n"); 149 if (val & ARIZONA_ADC_UNDERCLOCKED_STS) 150 dev_err(arizona->dev, "ADC underclocked\n"); 151 if (val & ARIZONA_MIXER_UNDERCLOCKED_STS) 152 dev_err(arizona->dev, "Mixer dropped sample\n"); 153 154 return IRQ_HANDLED; 155} 156 157static irqreturn_t arizona_overclocked(int irq, void *data) 158{ 159 struct arizona *arizona = data; 160 unsigned int val[3]; 161 int ret; 162 163 ret = regmap_bulk_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_6, 164 &val[0], 3); 165 if (ret != 0) { 166 dev_err(arizona->dev, "Failed to read overclock status: %d\n", 167 ret); 168 return IRQ_NONE; 169 } 170 171 switch (arizona->type) { 172 case WM8998: 173 case WM1814: 174 /* Some bits are shifted on WM8998, 175 * rearrange to match the standard bit layout 176 */ 177 val[0] = ((val[0] & 0x60e0) >> 1) | 178 ((val[0] & 0x1e00) >> 2) | 179 (val[0] & 0x000f); 180 break; 181 default: 182 break; 183 } 184 185 if (val[0] & ARIZONA_PWM_OVERCLOCKED_STS) 186 dev_err(arizona->dev, "PWM overclocked\n"); 187 if (val[0] & ARIZONA_FX_CORE_OVERCLOCKED_STS) 188 dev_err(arizona->dev, "FX core overclocked\n"); 189 if (val[0] & ARIZONA_DAC_SYS_OVERCLOCKED_STS) 190 dev_err(arizona->dev, "DAC SYS overclocked\n"); 191 if (val[0] & ARIZONA_DAC_WARP_OVERCLOCKED_STS) 192 dev_err(arizona->dev, "DAC WARP overclocked\n"); 193 if (val[0] & ARIZONA_ADC_OVERCLOCKED_STS) 194 dev_err(arizona->dev, "ADC overclocked\n"); 195 if (val[0] & ARIZONA_MIXER_OVERCLOCKED_STS) 196 dev_err(arizona->dev, "Mixer overclocked\n"); 197 if (val[0] & ARIZONA_AIF3_SYNC_OVERCLOCKED_STS) 198 dev_err(arizona->dev, "AIF3 overclocked\n"); 199 if (val[0] & ARIZONA_AIF2_SYNC_OVERCLOCKED_STS) 200 dev_err(arizona->dev, "AIF2 overclocked\n"); 201 if (val[0] & ARIZONA_AIF1_SYNC_OVERCLOCKED_STS) 202 dev_err(arizona->dev, "AIF1 overclocked\n"); 203 if (val[0] & ARIZONA_PAD_CTRL_OVERCLOCKED_STS) 204 dev_err(arizona->dev, "Pad control overclocked\n"); 205 206 if (val[1] & ARIZONA_SLIMBUS_SUBSYS_OVERCLOCKED_STS) 207 dev_err(arizona->dev, "Slimbus subsystem overclocked\n"); 208 if (val[1] & ARIZONA_SLIMBUS_ASYNC_OVERCLOCKED_STS) 209 dev_err(arizona->dev, "Slimbus async overclocked\n"); 210 if (val[1] & ARIZONA_SLIMBUS_SYNC_OVERCLOCKED_STS) 211 dev_err(arizona->dev, "Slimbus sync overclocked\n"); 212 if (val[1] & ARIZONA_ASRC_ASYNC_SYS_OVERCLOCKED_STS) 213 dev_err(arizona->dev, "ASRC async system overclocked\n"); 214 if (val[1] & ARIZONA_ASRC_ASYNC_WARP_OVERCLOCKED_STS) 215 dev_err(arizona->dev, "ASRC async WARP overclocked\n"); 216 if (val[1] & ARIZONA_ASRC_SYNC_SYS_OVERCLOCKED_STS) 217 dev_err(arizona->dev, "ASRC sync system overclocked\n"); 218 if (val[1] & ARIZONA_ASRC_SYNC_WARP_OVERCLOCKED_STS) 219 dev_err(arizona->dev, "ASRC sync WARP overclocked\n"); 220 if (val[1] & ARIZONA_ADSP2_1_OVERCLOCKED_STS) 221 dev_err(arizona->dev, "DSP1 overclocked\n"); 222 if (val[1] & ARIZONA_ISRC3_OVERCLOCKED_STS) 223 dev_err(arizona->dev, "ISRC3 overclocked\n"); 224 if (val[1] & ARIZONA_ISRC2_OVERCLOCKED_STS) 225 dev_err(arizona->dev, "ISRC2 overclocked\n"); 226 if (val[1] & ARIZONA_ISRC1_OVERCLOCKED_STS) 227 dev_err(arizona->dev, "ISRC1 overclocked\n"); 228 229 if (val[2] & ARIZONA_SPDIF_OVERCLOCKED_STS) 230 dev_err(arizona->dev, "SPDIF overclocked\n"); 231 232 return IRQ_HANDLED; 233} 234 235#define ARIZONA_REG_POLL_DELAY_US 7500 236 237static inline bool arizona_poll_reg_delay(ktime_t timeout) 238{ 239 if (ktime_compare(ktime_get(), timeout) > 0) 240 return false; 241 242 usleep_range(ARIZONA_REG_POLL_DELAY_US / 2, ARIZONA_REG_POLL_DELAY_US); 243 244 return true; 245} 246 247static int arizona_poll_reg(struct arizona *arizona, 248 int timeout_ms, unsigned int reg, 249 unsigned int mask, unsigned int target) 250{ 251 ktime_t timeout = ktime_add_us(ktime_get(), timeout_ms * USEC_PER_MSEC); 252 unsigned int val = 0; 253 int ret; 254 255 do { 256 ret = regmap_read(arizona->regmap, reg, &val); 257 258 if ((val & mask) == target) 259 return 0; 260 } while (arizona_poll_reg_delay(timeout)); 261 262 if (ret) { 263 dev_err(arizona->dev, "Failed polling reg 0x%x: %d\n", 264 reg, ret); 265 return ret; 266 } 267 268 dev_err(arizona->dev, "Polling reg 0x%x timed out: %x\n", reg, val); 269 return -ETIMEDOUT; 270} 271 272static int arizona_wait_for_boot(struct arizona *arizona) 273{ 274 int ret; 275 276 /* 277 * We can't use an interrupt as we need to runtime resume to do so, 278 * we won't race with the interrupt handler as it'll be blocked on 279 * runtime resume. 280 */ 281 ret = arizona_poll_reg(arizona, 30, ARIZONA_INTERRUPT_RAW_STATUS_5, 282 ARIZONA_BOOT_DONE_STS, ARIZONA_BOOT_DONE_STS); 283 284 if (!ret) 285 regmap_write(arizona->regmap, ARIZONA_INTERRUPT_STATUS_5, 286 ARIZONA_BOOT_DONE_STS); 287 288 pm_runtime_mark_last_busy(arizona->dev); 289 290 return ret; 291} 292 293static inline void arizona_enable_reset(struct arizona *arizona) 294{ 295 if (arizona->pdata.reset) 296 gpiod_set_raw_value_cansleep(arizona->pdata.reset, 0); 297} 298 299static void arizona_disable_reset(struct arizona *arizona) 300{ 301 if (arizona->pdata.reset) { 302 switch (arizona->type) { 303 case WM5110: 304 case WM8280: 305 /* Meet requirements for minimum reset duration */ 306 usleep_range(5000, 10000); 307 break; 308 default: 309 break; 310 } 311 312 gpiod_set_raw_value_cansleep(arizona->pdata.reset, 1); 313 usleep_range(1000, 5000); 314 } 315} 316 317struct arizona_sysclk_state { 318 unsigned int fll; 319 unsigned int sysclk; 320}; 321 322static int arizona_enable_freerun_sysclk(struct arizona *arizona, 323 struct arizona_sysclk_state *state) 324{ 325 int ret, err; 326 327 /* Cache existing FLL and SYSCLK settings */ 328 ret = regmap_read(arizona->regmap, ARIZONA_FLL1_CONTROL_1, &state->fll); 329 if (ret) { 330 dev_err(arizona->dev, "Failed to cache FLL settings: %d\n", 331 ret); 332 return ret; 333 } 334 ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, 335 &state->sysclk); 336 if (ret) { 337 dev_err(arizona->dev, "Failed to cache SYSCLK settings: %d\n", 338 ret); 339 return ret; 340 } 341 342 /* Start up SYSCLK using the FLL in free running mode */ 343 ret = regmap_write(arizona->regmap, ARIZONA_FLL1_CONTROL_1, 344 ARIZONA_FLL1_ENA | ARIZONA_FLL1_FREERUN); 345 if (ret) { 346 dev_err(arizona->dev, 347 "Failed to start FLL in freerunning mode: %d\n", 348 ret); 349 return ret; 350 } 351 ret = arizona_poll_reg(arizona, 180, ARIZONA_INTERRUPT_RAW_STATUS_5, 352 ARIZONA_FLL1_CLOCK_OK_STS, 353 ARIZONA_FLL1_CLOCK_OK_STS); 354 if (ret) 355 goto err_fll; 356 357 ret = regmap_write(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, 0x0144); 358 if (ret) { 359 dev_err(arizona->dev, "Failed to start SYSCLK: %d\n", ret); 360 goto err_fll; 361 } 362 363 return 0; 364 365err_fll: 366 err = regmap_write(arizona->regmap, ARIZONA_FLL1_CONTROL_1, state->fll); 367 if (err) 368 dev_err(arizona->dev, 369 "Failed to re-apply old FLL settings: %d\n", err); 370 371 return ret; 372} 373 374static int arizona_disable_freerun_sysclk(struct arizona *arizona, 375 struct arizona_sysclk_state *state) 376{ 377 int ret; 378 379 ret = regmap_write(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, 380 state->sysclk); 381 if (ret) { 382 dev_err(arizona->dev, 383 "Failed to re-apply old SYSCLK settings: %d\n", ret); 384 return ret; 385 } 386 387 ret = regmap_write(arizona->regmap, ARIZONA_FLL1_CONTROL_1, state->fll); 388 if (ret) { 389 dev_err(arizona->dev, 390 "Failed to re-apply old FLL settings: %d\n", ret); 391 return ret; 392 } 393 394 return 0; 395} 396 397static int wm5102_apply_hardware_patch(struct arizona *arizona) 398{ 399 struct arizona_sysclk_state state; 400 int err, ret; 401 402 ret = arizona_enable_freerun_sysclk(arizona, &state); 403 if (ret) 404 return ret; 405 406 /* Start the write sequencer and wait for it to finish */ 407 ret = regmap_write(arizona->regmap, ARIZONA_WRITE_SEQUENCER_CTRL_0, 408 ARIZONA_WSEQ_ENA | ARIZONA_WSEQ_START | 160); 409 if (ret) { 410 dev_err(arizona->dev, "Failed to start write sequencer: %d\n", 411 ret); 412 goto err; 413 } 414 415 ret = arizona_poll_reg(arizona, 30, ARIZONA_WRITE_SEQUENCER_CTRL_1, 416 ARIZONA_WSEQ_BUSY, 0); 417 if (ret) 418 regmap_write(arizona->regmap, ARIZONA_WRITE_SEQUENCER_CTRL_0, 419 ARIZONA_WSEQ_ABORT); 420 421err: 422 err = arizona_disable_freerun_sysclk(arizona, &state); 423 424 return ret ?: err; 425} 426 427/* 428 * Register patch to some of the CODECs internal write sequences 429 * to ensure a clean exit from the low power sleep state. 430 */ 431static const struct reg_sequence wm5110_sleep_patch[] = { 432 { 0x337A, 0xC100 }, 433 { 0x337B, 0x0041 }, 434 { 0x3300, 0xA210 }, 435 { 0x3301, 0x050C }, 436}; 437 438static int wm5110_apply_sleep_patch(struct arizona *arizona) 439{ 440 struct arizona_sysclk_state state; 441 int err, ret; 442 443 ret = arizona_enable_freerun_sysclk(arizona, &state); 444 if (ret) 445 return ret; 446 447 ret = regmap_multi_reg_write_bypassed(arizona->regmap, 448 wm5110_sleep_patch, 449 ARRAY_SIZE(wm5110_sleep_patch)); 450 451 err = arizona_disable_freerun_sysclk(arizona, &state); 452 453 return ret ?: err; 454} 455 456static int wm5102_clear_write_sequencer(struct arizona *arizona) 457{ 458 int ret; 459 460 ret = regmap_write(arizona->regmap, ARIZONA_WRITE_SEQUENCER_CTRL_3, 461 0x0); 462 if (ret) { 463 dev_err(arizona->dev, 464 "Failed to clear write sequencer state: %d\n", ret); 465 return ret; 466 } 467 468 arizona_enable_reset(arizona); 469 regulator_disable(arizona->dcvdd); 470 471 msleep(20); 472 473 ret = regulator_enable(arizona->dcvdd); 474 if (ret) { 475 dev_err(arizona->dev, "Failed to re-enable DCVDD: %d\n", ret); 476 return ret; 477 } 478 arizona_disable_reset(arizona); 479 480 return 0; 481} 482 483#ifdef CONFIG_PM 484static int arizona_isolate_dcvdd(struct arizona *arizona) 485{ 486 int ret; 487 488 ret = regmap_update_bits(arizona->regmap, 489 ARIZONA_ISOLATION_CONTROL, 490 ARIZONA_ISOLATE_DCVDD1, 491 ARIZONA_ISOLATE_DCVDD1); 492 if (ret != 0) 493 dev_err(arizona->dev, "Failed to isolate DCVDD: %d\n", ret); 494 495 return ret; 496} 497 498static int arizona_connect_dcvdd(struct arizona *arizona) 499{ 500 int ret; 501 502 ret = regmap_update_bits(arizona->regmap, 503 ARIZONA_ISOLATION_CONTROL, 504 ARIZONA_ISOLATE_DCVDD1, 0); 505 if (ret != 0) 506 dev_err(arizona->dev, "Failed to connect DCVDD: %d\n", ret); 507 508 return ret; 509} 510 511static int arizona_is_jack_det_active(struct arizona *arizona) 512{ 513 unsigned int val; 514 int ret; 515 516 ret = regmap_read(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE, &val); 517 if (ret) { 518 dev_err(arizona->dev, 519 "Failed to check jack det status: %d\n", ret); 520 return ret; 521 } else if (val & ARIZONA_JD1_ENA) { 522 return 1; 523 } else { 524 return 0; 525 } 526} 527 528static int arizona_runtime_resume(struct device *dev) 529{ 530 struct arizona *arizona = dev_get_drvdata(dev); 531 int ret; 532 533 dev_dbg(arizona->dev, "Leaving AoD mode\n"); 534 535 if (arizona->has_fully_powered_off) { 536 dev_dbg(arizona->dev, "Re-enabling core supplies\n"); 537 538 ret = regulator_bulk_enable(arizona->num_core_supplies, 539 arizona->core_supplies); 540 if (ret) { 541 dev_err(dev, "Failed to enable core supplies: %d\n", 542 ret); 543 return ret; 544 } 545 } 546 547 ret = regulator_enable(arizona->dcvdd); 548 if (ret != 0) { 549 dev_err(arizona->dev, "Failed to enable DCVDD: %d\n", ret); 550 if (arizona->has_fully_powered_off) 551 regulator_bulk_disable(arizona->num_core_supplies, 552 arizona->core_supplies); 553 return ret; 554 } 555 556 if (arizona->has_fully_powered_off) { 557 arizona_disable_reset(arizona); 558 enable_irq(arizona->irq); 559 arizona->has_fully_powered_off = false; 560 } 561 562 regcache_cache_only(arizona->regmap, false); 563 564 switch (arizona->type) { 565 case WM5102: 566 if (arizona->external_dcvdd) { 567 ret = arizona_connect_dcvdd(arizona); 568 if (ret != 0) 569 goto err; 570 } 571 572 ret = wm5102_patch(arizona); 573 if (ret != 0) { 574 dev_err(arizona->dev, "Failed to apply patch: %d\n", 575 ret); 576 goto err; 577 } 578 579 ret = wm5102_apply_hardware_patch(arizona); 580 if (ret) { 581 dev_err(arizona->dev, 582 "Failed to apply hardware patch: %d\n", 583 ret); 584 goto err; 585 } 586 break; 587 case WM5110: 588 case WM8280: 589 ret = arizona_wait_for_boot(arizona); 590 if (ret) 591 goto err; 592 593 if (arizona->external_dcvdd) { 594 ret = arizona_connect_dcvdd(arizona); 595 if (ret != 0) 596 goto err; 597 } else { 598 /* 599 * As this is only called for the internal regulator 600 * (where we know voltage ranges available) it is ok 601 * to request an exact range. 602 */ 603 ret = regulator_set_voltage(arizona->dcvdd, 604 1200000, 1200000); 605 if (ret < 0) { 606 dev_err(arizona->dev, 607 "Failed to set resume voltage: %d\n", 608 ret); 609 goto err; 610 } 611 } 612 613 ret = wm5110_apply_sleep_patch(arizona); 614 if (ret) { 615 dev_err(arizona->dev, 616 "Failed to re-apply sleep patch: %d\n", 617 ret); 618 goto err; 619 } 620 break; 621 case WM1831: 622 case CS47L24: 623 ret = arizona_wait_for_boot(arizona); 624 if (ret != 0) 625 goto err; 626 break; 627 default: 628 ret = arizona_wait_for_boot(arizona); 629 if (ret != 0) 630 goto err; 631 632 if (arizona->external_dcvdd) { 633 ret = arizona_connect_dcvdd(arizona); 634 if (ret != 0) 635 goto err; 636 } 637 break; 638 } 639 640 ret = regcache_sync(arizona->regmap); 641 if (ret != 0) { 642 dev_err(arizona->dev, "Failed to restore register cache\n"); 643 goto err; 644 } 645 646 return 0; 647 648err: 649 regcache_cache_only(arizona->regmap, true); 650 regulator_disable(arizona->dcvdd); 651 return ret; 652} 653 654static int arizona_runtime_suspend(struct device *dev) 655{ 656 struct arizona *arizona = dev_get_drvdata(dev); 657 int jd_active = 0; 658 int ret; 659 660 dev_dbg(arizona->dev, "Entering AoD mode\n"); 661 662 switch (arizona->type) { 663 case WM5110: 664 case WM8280: 665 jd_active = arizona_is_jack_det_active(arizona); 666 if (jd_active < 0) 667 return jd_active; 668 669 if (arizona->external_dcvdd) { 670 ret = arizona_isolate_dcvdd(arizona); 671 if (ret != 0) 672 return ret; 673 } else { 674 /* 675 * As this is only called for the internal regulator 676 * (where we know voltage ranges available) it is ok 677 * to request an exact range. 678 */ 679 ret = regulator_set_voltage(arizona->dcvdd, 680 1175000, 1175000); 681 if (ret < 0) { 682 dev_err(arizona->dev, 683 "Failed to set suspend voltage: %d\n", 684 ret); 685 return ret; 686 } 687 } 688 break; 689 case WM5102: 690 jd_active = arizona_is_jack_det_active(arizona); 691 if (jd_active < 0) 692 return jd_active; 693 694 if (arizona->external_dcvdd) { 695 ret = arizona_isolate_dcvdd(arizona); 696 if (ret != 0) 697 return ret; 698 } 699 700 if (!jd_active) { 701 ret = regmap_write(arizona->regmap, 702 ARIZONA_WRITE_SEQUENCER_CTRL_3, 0x0); 703 if (ret) { 704 dev_err(arizona->dev, 705 "Failed to clear write sequencer: %d\n", 706 ret); 707 return ret; 708 } 709 } 710 break; 711 case WM1831: 712 case CS47L24: 713 break; 714 default: 715 jd_active = arizona_is_jack_det_active(arizona); 716 if (jd_active < 0) 717 return jd_active; 718 719 if (arizona->external_dcvdd) { 720 ret = arizona_isolate_dcvdd(arizona); 721 if (ret != 0) 722 return ret; 723 } 724 break; 725 } 726 727 regcache_cache_only(arizona->regmap, true); 728 regcache_mark_dirty(arizona->regmap); 729 regulator_disable(arizona->dcvdd); 730 731 /* Allow us to completely power down if no jack detection */ 732 if (!jd_active) { 733 dev_dbg(arizona->dev, "Fully powering off\n"); 734 735 arizona->has_fully_powered_off = true; 736 737 disable_irq_nosync(arizona->irq); 738 arizona_enable_reset(arizona); 739 regulator_bulk_disable(arizona->num_core_supplies, 740 arizona->core_supplies); 741 } 742 743 return 0; 744} 745#endif 746 747#ifdef CONFIG_PM_SLEEP 748static int arizona_suspend(struct device *dev) 749{ 750 struct arizona *arizona = dev_get_drvdata(dev); 751 752 dev_dbg(arizona->dev, "Suspend, disabling IRQ\n"); 753 disable_irq(arizona->irq); 754 755 return 0; 756} 757 758static int arizona_suspend_noirq(struct device *dev) 759{ 760 struct arizona *arizona = dev_get_drvdata(dev); 761 762 dev_dbg(arizona->dev, "Late suspend, reenabling IRQ\n"); 763 enable_irq(arizona->irq); 764 765 return 0; 766} 767 768static int arizona_resume_noirq(struct device *dev) 769{ 770 struct arizona *arizona = dev_get_drvdata(dev); 771 772 dev_dbg(arizona->dev, "Early resume, disabling IRQ\n"); 773 disable_irq(arizona->irq); 774 775 return 0; 776} 777 778static int arizona_resume(struct device *dev) 779{ 780 struct arizona *arizona = dev_get_drvdata(dev); 781 782 dev_dbg(arizona->dev, "Resume, reenabling IRQ\n"); 783 enable_irq(arizona->irq); 784 785 return 0; 786} 787#endif 788 789const struct dev_pm_ops arizona_pm_ops = { 790 SET_RUNTIME_PM_OPS(arizona_runtime_suspend, 791 arizona_runtime_resume, 792 NULL) 793 SET_SYSTEM_SLEEP_PM_OPS(arizona_suspend, arizona_resume) 794 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(arizona_suspend_noirq, 795 arizona_resume_noirq) 796}; 797EXPORT_SYMBOL_GPL(arizona_pm_ops); 798 799#ifdef CONFIG_OF 800static int arizona_of_get_core_pdata(struct arizona *arizona) 801{ 802 struct arizona_pdata *pdata = &arizona->pdata; 803 int ret, i; 804 805 /* Handle old non-standard DT binding */ 806 pdata->reset = devm_gpiod_get(arizona->dev, "wlf,reset", GPIOD_OUT_LOW); 807 if (IS_ERR(pdata->reset)) { 808 ret = PTR_ERR(pdata->reset); 809 810 /* 811 * Reset missing will be caught when other binding is read 812 * but all other errors imply this binding is in use but has 813 * encountered a problem so should be handled. 814 */ 815 if (ret == -EPROBE_DEFER) 816 return ret; 817 else if (ret != -ENOENT && ret != -ENOSYS) 818 dev_err(arizona->dev, "Reset GPIO malformed: %d\n", 819 ret); 820 821 pdata->reset = NULL; 822 } 823 824 ret = of_property_read_u32_array(arizona->dev->of_node, 825 "wlf,gpio-defaults", 826 pdata->gpio_defaults, 827 ARRAY_SIZE(pdata->gpio_defaults)); 828 if (ret >= 0) { 829 /* 830 * All values are literal except out of range values 831 * which are chip default, translate into platform 832 * data which uses 0 as chip default and out of range 833 * as zero. 834 */ 835 for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) { 836 if (pdata->gpio_defaults[i] > 0xffff) 837 pdata->gpio_defaults[i] = 0; 838 else if (pdata->gpio_defaults[i] == 0) 839 pdata->gpio_defaults[i] = 0x10000; 840 } 841 } else { 842 dev_err(arizona->dev, "Failed to parse GPIO defaults: %d\n", 843 ret); 844 } 845 846 return 0; 847} 848#else 849static inline int arizona_of_get_core_pdata(struct arizona *arizona) 850{ 851 return 0; 852} 853#endif 854 855static const struct mfd_cell early_devs[] = { 856 { .name = "arizona-ldo1" }, 857}; 858 859static const char * const wm5102_supplies[] = { 860 "MICVDD", 861 "DBVDD2", 862 "DBVDD3", 863 "CPVDD", 864 "SPKVDDL", 865 "SPKVDDR", 866}; 867 868static const struct mfd_cell wm5102_devs[] = { 869 { .name = "arizona-micsupp" }, 870 { .name = "arizona-gpio" }, 871 { .name = "arizona-haptics" }, 872 { .name = "arizona-pwm" }, 873 { 874 .name = "wm5102-codec", 875 .parent_supplies = wm5102_supplies, 876 .num_parent_supplies = ARRAY_SIZE(wm5102_supplies), 877 }, 878}; 879 880static const struct mfd_cell wm5110_devs[] = { 881 { .name = "arizona-micsupp" }, 882 { .name = "arizona-gpio" }, 883 { .name = "arizona-haptics" }, 884 { .name = "arizona-pwm" }, 885 { 886 .name = "wm5110-codec", 887 .parent_supplies = wm5102_supplies, 888 .num_parent_supplies = ARRAY_SIZE(wm5102_supplies), 889 }, 890}; 891 892static const char * const cs47l24_supplies[] = { 893 "MICVDD", 894 "CPVDD", 895 "SPKVDD", 896}; 897 898static const struct mfd_cell cs47l24_devs[] = { 899 { .name = "arizona-gpio" }, 900 { .name = "arizona-haptics" }, 901 { .name = "arizona-pwm" }, 902 { 903 .name = "cs47l24-codec", 904 .parent_supplies = cs47l24_supplies, 905 .num_parent_supplies = ARRAY_SIZE(cs47l24_supplies), 906 }, 907}; 908 909static const char * const wm8997_supplies[] = { 910 "MICVDD", 911 "DBVDD2", 912 "CPVDD", 913 "SPKVDD", 914}; 915 916static const struct mfd_cell wm8997_devs[] = { 917 { .name = "arizona-micsupp" }, 918 { .name = "arizona-gpio" }, 919 { .name = "arizona-haptics" }, 920 { .name = "arizona-pwm" }, 921 { 922 .name = "wm8997-codec", 923 .parent_supplies = wm8997_supplies, 924 .num_parent_supplies = ARRAY_SIZE(wm8997_supplies), 925 }, 926}; 927 928static const struct mfd_cell wm8998_devs[] = { 929 { .name = "arizona-micsupp" }, 930 { .name = "arizona-gpio" }, 931 { .name = "arizona-haptics" }, 932 { .name = "arizona-pwm" }, 933 { 934 .name = "wm8998-codec", 935 .parent_supplies = wm5102_supplies, 936 .num_parent_supplies = ARRAY_SIZE(wm5102_supplies), 937 }, 938}; 939 940int arizona_dev_init(struct arizona *arizona) 941{ 942 static const char * const mclk_name[] = { "mclk1", "mclk2" }; 943 struct device *dev = arizona->dev; 944 const char *type_name = NULL; 945 unsigned int reg, val; 946 int (*apply_patch)(struct arizona *) = NULL; 947 const struct mfd_cell *subdevs = NULL; 948 int n_subdevs = 0, ret, i; 949 950 dev_set_drvdata(arizona->dev, arizona); 951 mutex_init(&arizona->clk_lock); 952 953 if (dev_get_platdata(arizona->dev)) { 954 memcpy(&arizona->pdata, dev_get_platdata(arizona->dev), 955 sizeof(arizona->pdata)); 956 } else { 957 ret = arizona_of_get_core_pdata(arizona); 958 if (ret < 0) 959 return ret; 960 } 961 962 BUILD_BUG_ON(ARRAY_SIZE(arizona->mclk) != ARRAY_SIZE(mclk_name)); 963 for (i = 0; i < ARRAY_SIZE(arizona->mclk); i++) { 964 arizona->mclk[i] = devm_clk_get(arizona->dev, mclk_name[i]); 965 if (IS_ERR(arizona->mclk[i])) { 966 dev_info(arizona->dev, "Failed to get %s: %ld\n", 967 mclk_name[i], PTR_ERR(arizona->mclk[i])); 968 arizona->mclk[i] = NULL; 969 } 970 } 971 972 regcache_cache_only(arizona->regmap, true); 973 974 switch (arizona->type) { 975 case WM5102: 976 case WM5110: 977 case WM8280: 978 case WM8997: 979 case WM8998: 980 case WM1814: 981 case WM1831: 982 case CS47L24: 983 for (i = 0; i < ARRAY_SIZE(wm5102_core_supplies); i++) 984 arizona->core_supplies[i].supply 985 = wm5102_core_supplies[i]; 986 arizona->num_core_supplies = ARRAY_SIZE(wm5102_core_supplies); 987 break; 988 default: 989 dev_err(arizona->dev, "Unknown device type %d\n", 990 arizona->type); 991 return -ENODEV; 992 } 993 994 /* Mark DCVDD as external, LDO1 driver will clear if internal */ 995 arizona->external_dcvdd = true; 996 997 switch (arizona->type) { 998 case WM1831: 999 case CS47L24: 1000 break; /* No LDO1 regulator */ 1001 default: 1002 ret = mfd_add_devices(arizona->dev, -1, early_devs, 1003 ARRAY_SIZE(early_devs), NULL, 0, NULL); 1004 if (ret != 0) { 1005 dev_err(dev, "Failed to add early children: %d\n", ret); 1006 return ret; 1007 } 1008 break; 1009 } 1010 1011 ret = devm_regulator_bulk_get(dev, arizona->num_core_supplies, 1012 arizona->core_supplies); 1013 if (ret != 0) { 1014 dev_err(dev, "Failed to request core supplies: %d\n", 1015 ret); 1016 goto err_early; 1017 } 1018 1019 /** 1020 * Don't use devres here because the only device we have to get 1021 * against is the MFD device and DCVDD will likely be supplied by 1022 * one of its children. Meaning that the regulator will be 1023 * destroyed by the time devres calls regulator put. 1024 */ 1025 arizona->dcvdd = regulator_get(arizona->dev, "DCVDD"); 1026 if (IS_ERR(arizona->dcvdd)) { 1027 ret = PTR_ERR(arizona->dcvdd); 1028 dev_err(dev, "Failed to request DCVDD: %d\n", ret); 1029 goto err_early; 1030 } 1031 1032 if (!arizona->pdata.reset) { 1033 /* Start out with /RESET low to put the chip into reset */ 1034 arizona->pdata.reset = devm_gpiod_get(arizona->dev, "reset", 1035 GPIOD_OUT_LOW); 1036 if (IS_ERR(arizona->pdata.reset)) { 1037 ret = PTR_ERR(arizona->pdata.reset); 1038 if (ret == -EPROBE_DEFER) 1039 goto err_dcvdd; 1040 1041 dev_err(arizona->dev, 1042 "Reset GPIO missing/malformed: %d\n", ret); 1043 1044 arizona->pdata.reset = NULL; 1045 } 1046 } 1047 1048 ret = regulator_bulk_enable(arizona->num_core_supplies, 1049 arizona->core_supplies); 1050 if (ret != 0) { 1051 dev_err(dev, "Failed to enable core supplies: %d\n", 1052 ret); 1053 goto err_dcvdd; 1054 } 1055 1056 ret = regulator_enable(arizona->dcvdd); 1057 if (ret != 0) { 1058 dev_err(dev, "Failed to enable DCVDD: %d\n", ret); 1059 goto err_enable; 1060 } 1061 1062 arizona_disable_reset(arizona); 1063 1064 regcache_cache_only(arizona->regmap, false); 1065 1066 /* Verify that this is a chip we know about */ 1067 ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, ®); 1068 if (ret != 0) { 1069 dev_err(dev, "Failed to read ID register: %d\n", ret); 1070 goto err_reset; 1071 } 1072 1073 switch (reg) { 1074 case 0x5102: 1075 case 0x5110: 1076 case 0x6349: 1077 case 0x6363: 1078 case 0x8997: 1079 break; 1080 default: 1081 dev_err(arizona->dev, "Unknown device ID: %x\n", reg); 1082 ret = -ENODEV; 1083 goto err_reset; 1084 } 1085 1086 /* If we have a /RESET GPIO we'll already be reset */ 1087 if (!arizona->pdata.reset) { 1088 ret = regmap_write(arizona->regmap, ARIZONA_SOFTWARE_RESET, 0); 1089 if (ret != 0) { 1090 dev_err(dev, "Failed to reset device: %d\n", ret); 1091 goto err_reset; 1092 } 1093 1094 usleep_range(1000, 5000); 1095 } 1096 1097 /* Ensure device startup is complete */ 1098 switch (arizona->type) { 1099 case WM5102: 1100 ret = regmap_read(arizona->regmap, 1101 ARIZONA_WRITE_SEQUENCER_CTRL_3, &val); 1102 if (ret) { 1103 dev_err(dev, 1104 "Failed to check write sequencer state: %d\n", 1105 ret); 1106 } else if (val & 0x01) { 1107 ret = wm5102_clear_write_sequencer(arizona); 1108 if (ret) 1109 return ret; 1110 } 1111 break; 1112 default: 1113 break; 1114 } 1115 1116 ret = arizona_wait_for_boot(arizona); 1117 if (ret) { 1118 dev_err(arizona->dev, "Device failed initial boot: %d\n", ret); 1119 goto err_reset; 1120 } 1121 1122 /* Read the device ID information & do device specific stuff */ 1123 ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, ®); 1124 if (ret != 0) { 1125 dev_err(dev, "Failed to read ID register: %d\n", ret); 1126 goto err_reset; 1127 } 1128 1129 ret = regmap_read(arizona->regmap, ARIZONA_DEVICE_REVISION, 1130 &arizona->rev); 1131 if (ret != 0) { 1132 dev_err(dev, "Failed to read revision register: %d\n", ret); 1133 goto err_reset; 1134 } 1135 arizona->rev &= ARIZONA_DEVICE_REVISION_MASK; 1136 1137 switch (reg) { 1138 case 0x5102: 1139 if (IS_ENABLED(CONFIG_MFD_WM5102)) { 1140 type_name = "WM5102"; 1141 if (arizona->type != WM5102) { 1142 dev_warn(arizona->dev, 1143 "WM5102 registered as %d\n", 1144 arizona->type); 1145 arizona->type = WM5102; 1146 } 1147 1148 apply_patch = wm5102_patch; 1149 arizona->rev &= 0x7; 1150 subdevs = wm5102_devs; 1151 n_subdevs = ARRAY_SIZE(wm5102_devs); 1152 } 1153 break; 1154 case 0x5110: 1155 if (IS_ENABLED(CONFIG_MFD_WM5110)) { 1156 switch (arizona->type) { 1157 case WM5110: 1158 type_name = "WM5110"; 1159 break; 1160 case WM8280: 1161 type_name = "WM8280"; 1162 break; 1163 default: 1164 type_name = "WM5110"; 1165 dev_warn(arizona->dev, 1166 "WM5110 registered as %d\n", 1167 arizona->type); 1168 arizona->type = WM5110; 1169 break; 1170 } 1171 1172 apply_patch = wm5110_patch; 1173 subdevs = wm5110_devs; 1174 n_subdevs = ARRAY_SIZE(wm5110_devs); 1175 } 1176 break; 1177 case 0x6363: 1178 if (IS_ENABLED(CONFIG_MFD_CS47L24)) { 1179 switch (arizona->type) { 1180 case CS47L24: 1181 type_name = "CS47L24"; 1182 break; 1183 1184 case WM1831: 1185 type_name = "WM1831"; 1186 break; 1187 1188 default: 1189 dev_warn(arizona->dev, 1190 "CS47L24 registered as %d\n", 1191 arizona->type); 1192 arizona->type = CS47L24; 1193 break; 1194 } 1195 1196 apply_patch = cs47l24_patch; 1197 subdevs = cs47l24_devs; 1198 n_subdevs = ARRAY_SIZE(cs47l24_devs); 1199 } 1200 break; 1201 case 0x8997: 1202 if (IS_ENABLED(CONFIG_MFD_WM8997)) { 1203 type_name = "WM8997"; 1204 if (arizona->type != WM8997) { 1205 dev_warn(arizona->dev, 1206 "WM8997 registered as %d\n", 1207 arizona->type); 1208 arizona->type = WM8997; 1209 } 1210 1211 apply_patch = wm8997_patch; 1212 subdevs = wm8997_devs; 1213 n_subdevs = ARRAY_SIZE(wm8997_devs); 1214 } 1215 break; 1216 case 0x6349: 1217 if (IS_ENABLED(CONFIG_MFD_WM8998)) { 1218 switch (arizona->type) { 1219 case WM8998: 1220 type_name = "WM8998"; 1221 break; 1222 1223 case WM1814: 1224 type_name = "WM1814"; 1225 break; 1226 1227 default: 1228 type_name = "WM8998"; 1229 dev_warn(arizona->dev, 1230 "WM8998 registered as %d\n", 1231 arizona->type); 1232 arizona->type = WM8998; 1233 } 1234 1235 apply_patch = wm8998_patch; 1236 subdevs = wm8998_devs; 1237 n_subdevs = ARRAY_SIZE(wm8998_devs); 1238 } 1239 break; 1240 default: 1241 dev_err(arizona->dev, "Unknown device ID %x\n", reg); 1242 ret = -ENODEV; 1243 goto err_reset; 1244 } 1245 1246 if (!subdevs) { 1247 dev_err(arizona->dev, 1248 "No kernel support for device ID %x\n", reg); 1249 ret = -ENODEV; 1250 goto err_reset; 1251 } 1252 1253 dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A'); 1254 1255 if (apply_patch) { 1256 ret = apply_patch(arizona); 1257 if (ret != 0) { 1258 dev_err(arizona->dev, "Failed to apply patch: %d\n", 1259 ret); 1260 goto err_reset; 1261 } 1262 1263 switch (arizona->type) { 1264 case WM5102: 1265 ret = wm5102_apply_hardware_patch(arizona); 1266 if (ret) { 1267 dev_err(arizona->dev, 1268 "Failed to apply hardware patch: %d\n", 1269 ret); 1270 goto err_reset; 1271 } 1272 break; 1273 case WM5110: 1274 case WM8280: 1275 ret = wm5110_apply_sleep_patch(arizona); 1276 if (ret) { 1277 dev_err(arizona->dev, 1278 "Failed to apply sleep patch: %d\n", 1279 ret); 1280 goto err_reset; 1281 } 1282 break; 1283 default: 1284 break; 1285 } 1286 } 1287 1288 for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) { 1289 if (!arizona->pdata.gpio_defaults[i]) 1290 continue; 1291 1292 regmap_write(arizona->regmap, ARIZONA_GPIO1_CTRL + i, 1293 arizona->pdata.gpio_defaults[i]); 1294 } 1295 1296 /* Chip default */ 1297 if (!arizona->pdata.clk32k_src) 1298 arizona->pdata.clk32k_src = ARIZONA_32KZ_MCLK2; 1299 1300 switch (arizona->pdata.clk32k_src) { 1301 case ARIZONA_32KZ_MCLK1: 1302 case ARIZONA_32KZ_MCLK2: 1303 regmap_update_bits(arizona->regmap, ARIZONA_CLOCK_32K_1, 1304 ARIZONA_CLK_32K_SRC_MASK, 1305 arizona->pdata.clk32k_src - 1); 1306 arizona_clk32k_enable(arizona); 1307 break; 1308 case ARIZONA_32KZ_NONE: 1309 regmap_update_bits(arizona->regmap, ARIZONA_CLOCK_32K_1, 1310 ARIZONA_CLK_32K_SRC_MASK, 2); 1311 break; 1312 default: 1313 dev_err(arizona->dev, "Invalid 32kHz clock source: %d\n", 1314 arizona->pdata.clk32k_src); 1315 ret = -EINVAL; 1316 goto err_reset; 1317 } 1318 1319 for (i = 0; i < ARIZONA_MAX_MICBIAS; i++) { 1320 if (!arizona->pdata.micbias[i].mV && 1321 !arizona->pdata.micbias[i].bypass) 1322 continue; 1323 1324 /* Apply default for bypass mode */ 1325 if (!arizona->pdata.micbias[i].mV) 1326 arizona->pdata.micbias[i].mV = 2800; 1327 1328 val = (arizona->pdata.micbias[i].mV - 1500) / 100; 1329 1330 val <<= ARIZONA_MICB1_LVL_SHIFT; 1331 1332 if (arizona->pdata.micbias[i].ext_cap) 1333 val |= ARIZONA_MICB1_EXT_CAP; 1334 1335 if (arizona->pdata.micbias[i].discharge) 1336 val |= ARIZONA_MICB1_DISCH; 1337 1338 if (arizona->pdata.micbias[i].soft_start) 1339 val |= ARIZONA_MICB1_RATE; 1340 1341 if (arizona->pdata.micbias[i].bypass) 1342 val |= ARIZONA_MICB1_BYPASS; 1343 1344 regmap_update_bits(arizona->regmap, 1345 ARIZONA_MIC_BIAS_CTRL_1 + i, 1346 ARIZONA_MICB1_LVL_MASK | 1347 ARIZONA_MICB1_EXT_CAP | 1348 ARIZONA_MICB1_DISCH | 1349 ARIZONA_MICB1_BYPASS | 1350 ARIZONA_MICB1_RATE, val); 1351 } 1352 1353 pm_runtime_set_active(arizona->dev); 1354 pm_runtime_enable(arizona->dev); 1355 1356 /* Set up for interrupts */ 1357 ret = arizona_irq_init(arizona); 1358 if (ret != 0) 1359 goto err_pm; 1360 1361 pm_runtime_set_autosuspend_delay(arizona->dev, 100); 1362 pm_runtime_use_autosuspend(arizona->dev); 1363 1364 arizona_request_irq(arizona, ARIZONA_IRQ_CLKGEN_ERR, "CLKGEN error", 1365 arizona_clkgen_err, arizona); 1366 arizona_request_irq(arizona, ARIZONA_IRQ_OVERCLOCKED, "Overclocked", 1367 arizona_overclocked, arizona); 1368 arizona_request_irq(arizona, ARIZONA_IRQ_UNDERCLOCKED, "Underclocked", 1369 arizona_underclocked, arizona); 1370 1371 ret = mfd_add_devices(arizona->dev, PLATFORM_DEVID_NONE, 1372 subdevs, n_subdevs, NULL, 0, NULL); 1373 1374 if (ret) { 1375 dev_err(arizona->dev, "Failed to add subdevices: %d\n", ret); 1376 goto err_irq; 1377 } 1378 1379 return 0; 1380 1381err_irq: 1382 arizona_irq_exit(arizona); 1383err_pm: 1384 pm_runtime_disable(arizona->dev); 1385 1386 switch (arizona->pdata.clk32k_src) { 1387 case ARIZONA_32KZ_MCLK1: 1388 case ARIZONA_32KZ_MCLK2: 1389 arizona_clk32k_disable(arizona); 1390 break; 1391 default: 1392 break; 1393 } 1394err_reset: 1395 arizona_enable_reset(arizona); 1396 regulator_disable(arizona->dcvdd); 1397err_enable: 1398 regulator_bulk_disable(arizona->num_core_supplies, 1399 arizona->core_supplies); 1400err_dcvdd: 1401 regulator_put(arizona->dcvdd); 1402err_early: 1403 mfd_remove_devices(dev); 1404 return ret; 1405} 1406EXPORT_SYMBOL_GPL(arizona_dev_init); 1407 1408int arizona_dev_exit(struct arizona *arizona) 1409{ 1410 disable_irq(arizona->irq); 1411 pm_runtime_disable(arizona->dev); 1412 1413 regulator_disable(arizona->dcvdd); 1414 regulator_put(arizona->dcvdd); 1415 1416 switch (arizona->pdata.clk32k_src) { 1417 case ARIZONA_32KZ_MCLK1: 1418 case ARIZONA_32KZ_MCLK2: 1419 arizona_clk32k_disable(arizona); 1420 break; 1421 default: 1422 break; 1423 } 1424 1425 mfd_remove_devices(arizona->dev); 1426 arizona_free_irq(arizona, ARIZONA_IRQ_UNDERCLOCKED, arizona); 1427 arizona_free_irq(arizona, ARIZONA_IRQ_OVERCLOCKED, arizona); 1428 arizona_free_irq(arizona, ARIZONA_IRQ_CLKGEN_ERR, arizona); 1429 arizona_irq_exit(arizona); 1430 arizona_enable_reset(arizona); 1431 1432 regulator_bulk_disable(arizona->num_core_supplies, 1433 arizona->core_supplies); 1434 return 0; 1435} 1436EXPORT_SYMBOL_GPL(arizona_dev_exit); 1437 1438MODULE_LICENSE("GPL v2");