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        ret = devm_regulator_bulk_get(wm8994->dev, wm8994->num_supplies,
 398                                 wm8994->supplies);
 399        if (ret != 0) {
 400                dev_err(wm8994->dev, "Failed to get supplies: %d\n", ret);
 401                goto err;
 402        }
 403
 404        ret = regulator_bulk_enable(wm8994->num_supplies,
 405                                    wm8994->supplies);
 406        if (ret != 0) {
 407                dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret);
 408                goto err;
 409        }
 410
 411        ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET);
 412        if (ret < 0) {
 413                dev_err(wm8994->dev, "Failed to read ID register\n");
 414                goto err_enable;
 415        }
 416        switch (ret) {
 417        case 0x1811:
 418                devname = "WM1811";
 419                if (wm8994->type != WM1811)
 420                        dev_warn(wm8994->dev, "Device registered as type %d\n",
 421                                 wm8994->type);
 422                wm8994->type = WM1811;
 423                break;
 424        case 0x8994:
 425                devname = "WM8994";
 426                if (wm8994->type != WM8994)
 427                        dev_warn(wm8994->dev, "Device registered as type %d\n",
 428                                 wm8994->type);
 429                wm8994->type = WM8994;
 430                break;
 431        case 0x8958:
 432                devname = "WM8958";
 433                if (wm8994->type != WM8958)
 434                        dev_warn(wm8994->dev, "Device registered as type %d\n",
 435                                 wm8994->type);
 436                wm8994->type = WM8958;
 437                break;
 438        default:
 439                dev_err(wm8994->dev, "Device is not a WM8994, ID is %x\n",
 440                        ret);
 441                ret = -EINVAL;
 442                goto err_enable;
 443        }
 444
 445        ret = wm8994_reg_read(wm8994, WM8994_CHIP_REVISION);
 446        if (ret < 0) {
 447                dev_err(wm8994->dev, "Failed to read revision register: %d\n",
 448                        ret);
 449                goto err_enable;
 450        }
 451        wm8994->revision = ret & WM8994_CHIP_REV_MASK;
 452        wm8994->cust_id = (ret & WM8994_CUST_ID_MASK) >> WM8994_CUST_ID_SHIFT;
 453
 454        switch (wm8994->type) {
 455        case WM8994:
 456                switch (wm8994->revision) {
 457                case 0:
 458                case 1:
 459                        dev_warn(wm8994->dev,
 460                                 "revision %c not fully supported\n",
 461                                 'A' + wm8994->revision);
 462                        break;
 463                case 2:
 464                case 3:
 465                default:
 466                        regmap_patch = wm8994_revc_patch;
 467                        patch_regs = ARRAY_SIZE(wm8994_revc_patch);
 468                        break;
 469                }
 470                break;
 471
 472        case WM8958:
 473                switch (wm8994->revision) {
 474                case 0:
 475                        regmap_patch = wm8958_reva_patch;
 476                        patch_regs = ARRAY_SIZE(wm8958_reva_patch);
 477                        break;
 478                default:
 479                        break;
 480                }
 481                break;
 482
 483        case WM1811:
 484                /* Revision C did not change the relevant layer */
 485                if (wm8994->revision > 1)
 486                        wm8994->revision++;
 487
 488                regmap_patch = wm1811_reva_patch;
 489                patch_regs = ARRAY_SIZE(wm1811_reva_patch);
 490                break;
 491
 492        default:
 493                break;
 494        }
 495
 496        dev_info(wm8994->dev, "%s revision %c CUST_ID %02x\n", devname,
 497                 'A' + wm8994->revision, wm8994->cust_id);
 498
 499        switch (wm8994->type) {
 500        case WM1811:
 501                regmap_config = &wm1811_regmap_config;
 502                break;
 503        case WM8994:
 504                regmap_config = &wm8994_regmap_config;
 505                break;
 506        case WM8958:
 507                regmap_config = &wm8958_regmap_config;
 508                break;
 509        default:
 510                dev_err(wm8994->dev, "Unknown device type %d\n", wm8994->type);
 511                return -EINVAL;
 512        }
 513
 514        ret = regmap_reinit_cache(wm8994->regmap, regmap_config);
 515        if (ret != 0) {
 516                dev_err(wm8994->dev, "Failed to reinit register cache: %d\n",
 517                        ret);
 518                return ret;
 519        }
 520
 521        /* Explicitly put the device into reset in case regulators
 522         * don't get disabled in order to ensure we know the device
 523         * state.
 524         */
 525        ret = wm8994_reg_write(wm8994, WM8994_SOFTWARE_RESET,
 526                               wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET));
 527        if (ret != 0) {
 528                dev_err(wm8994->dev, "Failed to reset device: %d\n", ret);
 529                return ret;
 530        }
 531
 532        if (regmap_patch) {
 533                ret = regmap_register_patch(wm8994->regmap, regmap_patch,
 534                                            patch_regs);
 535                if (ret != 0) {
 536                        dev_err(wm8994->dev, "Failed to register patch: %d\n",
 537                                ret);
 538                        goto err;
 539                }
 540        }
 541
 542        wm8994->irq_base = pdata->irq_base;
 543        wm8994->gpio_base = pdata->gpio_base;
 544
 545        /* GPIO configuration is only applied if it's non-zero */
 546        for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
 547                if (pdata->gpio_defaults[i]) {
 548                        wm8994_set_bits(wm8994, WM8994_GPIO_1 + i,
 549                                        0xffff, pdata->gpio_defaults[i]);
 550                }
 551        }
 552
 553        wm8994->ldo_ena_always_driven = pdata->ldo_ena_always_driven;
 554
 555        if (pdata->spkmode_pu)
 556                pulls |= WM8994_SPKMODE_PU;
 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_enable(wm8994->dev);
 590        pm_runtime_idle(wm8994->dev);
 591
 592        return 0;
 593
 594err_irq:
 595        wm8994_irq_exit(wm8994);
 596err_enable:
 597        regulator_bulk_disable(wm8994->num_supplies,
 598                               wm8994->supplies);
 599err:
 600        mfd_remove_devices(wm8994->dev);
 601        return ret;
 602}
 603
 604static void wm8994_device_exit(struct wm8994 *wm8994)
 605{
 606        pm_runtime_disable(wm8994->dev);
 607        mfd_remove_devices(wm8994->dev);
 608        wm8994_irq_exit(wm8994);
 609        regulator_bulk_disable(wm8994->num_supplies,
 610                               wm8994->supplies);
 611}
 612
 613static const struct of_device_id wm8994_of_match[] = {
 614        { .compatible = "wlf,wm1811", .data = (void *)WM1811 },
 615        { .compatible = "wlf,wm8994", .data = (void *)WM8994 },
 616        { .compatible = "wlf,wm8958", .data = (void *)WM8958 },
 617        { }
 618};
 619MODULE_DEVICE_TABLE(of, wm8994_of_match);
 620
 621static int wm8994_i2c_probe(struct i2c_client *i2c,
 622                                      const struct i2c_device_id *id)
 623{
 624        const struct of_device_id *of_id;
 625        struct wm8994 *wm8994;
 626        int ret;
 627
 628        wm8994 = devm_kzalloc(&i2c->dev, sizeof(struct wm8994), GFP_KERNEL);
 629        if (wm8994 == NULL)
 630                return -ENOMEM;
 631
 632        i2c_set_clientdata(i2c, wm8994);
 633        wm8994->dev = &i2c->dev;
 634        wm8994->irq = i2c->irq;
 635
 636        if (i2c->dev.of_node) {
 637                of_id = of_match_device(wm8994_of_match, &i2c->dev);
 638                if (of_id)
 639                        wm8994->type = (enum wm8994_type)of_id->data;
 640        } else {
 641                wm8994->type = id->driver_data;
 642        }
 643
 644        wm8994->regmap = devm_regmap_init_i2c(i2c, &wm8994_base_regmap_config);
 645        if (IS_ERR(wm8994->regmap)) {
 646                ret = PTR_ERR(wm8994->regmap);
 647                dev_err(wm8994->dev, "Failed to allocate register map: %d\n",
 648                        ret);
 649                return ret;
 650        }
 651
 652        return wm8994_device_init(wm8994, i2c->irq);
 653}
 654
 655static int wm8994_i2c_remove(struct i2c_client *i2c)
 656{
 657        struct wm8994 *wm8994 = i2c_get_clientdata(i2c);
 658
 659        wm8994_device_exit(wm8994);
 660
 661        return 0;
 662}
 663
 664static const struct i2c_device_id wm8994_i2c_id[] = {
 665        { "wm1811", WM1811 },
 666        { "wm1811a", WM1811 },
 667        { "wm8994", WM8994 },
 668        { "wm8958", WM8958 },
 669        { }
 670};
 671MODULE_DEVICE_TABLE(i2c, wm8994_i2c_id);
 672
 673static const struct dev_pm_ops wm8994_pm_ops = {
 674        SET_RUNTIME_PM_OPS(wm8994_suspend, wm8994_resume, NULL)
 675};
 676
 677static struct i2c_driver wm8994_i2c_driver = {
 678        .driver = {
 679                .name = "wm8994",
 680                .pm = &wm8994_pm_ops,
 681                .of_match_table = of_match_ptr(wm8994_of_match),
 682        },
 683        .probe = wm8994_i2c_probe,
 684        .remove = wm8994_i2c_remove,
 685        .id_table = wm8994_i2c_id,
 686};
 687
 688module_i2c_driver(wm8994_i2c_driver);
 689
 690MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
 691MODULE_LICENSE("GPL");
 692MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
 693