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