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