linux/drivers/mfd/wm831x-core.c
<<
>>
Prefs
   1/*
   2 * wm831x-core.c  --  Device access for Wolfson WM831x PMICs
   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/bcd.h>
  18#include <linux/delay.h>
  19#include <linux/mfd/core.h>
  20#include <linux/slab.h>
  21#include <linux/err.h>
  22
  23#include <linux/mfd/wm831x/core.h>
  24#include <linux/mfd/wm831x/pdata.h>
  25#include <linux/mfd/wm831x/irq.h>
  26#include <linux/mfd/wm831x/auxadc.h>
  27#include <linux/mfd/wm831x/otp.h>
  28#include <linux/mfd/wm831x/pmu.h>
  29#include <linux/mfd/wm831x/regulator.h>
  30
  31/* Current settings - values are 2*2^(reg_val/4) microamps.  These are
  32 * exported since they are used by multiple drivers.
  33 */
  34int wm831x_isinkv_values[WM831X_ISINK_MAX_ISEL + 1] = {
  35        2,
  36        2,
  37        3,
  38        3,
  39        4,
  40        5,
  41        6,
  42        7,
  43        8,
  44        10,
  45        11,
  46        13,
  47        16,
  48        19,
  49        23,
  50        27,
  51        32,
  52        38,
  53        45,
  54        54,
  55        64,
  56        76,
  57        91,
  58        108,
  59        128,
  60        152,
  61        181,
  62        215,
  63        256,
  64        304,
  65        362,
  66        431,
  67        512,
  68        609,
  69        724,
  70        861,
  71        1024,
  72        1218,
  73        1448,
  74        1722,
  75        2048,
  76        2435,
  77        2896,
  78        3444,
  79        4096,
  80        4871,
  81        5793,
  82        6889,
  83        8192,
  84        9742,
  85        11585,
  86        13777,
  87        16384,
  88        19484,
  89        23170,
  90        27554,
  91};
  92EXPORT_SYMBOL_GPL(wm831x_isinkv_values);
  93
  94static int wm831x_reg_locked(struct wm831x *wm831x, unsigned short reg)
  95{
  96        if (!wm831x->locked)
  97                return 0;
  98
  99        switch (reg) {
 100        case WM831X_WATCHDOG:
 101        case WM831X_DC4_CONTROL:
 102        case WM831X_ON_PIN_CONTROL:
 103        case WM831X_BACKUP_CHARGER_CONTROL:
 104        case WM831X_CHARGER_CONTROL_1:
 105        case WM831X_CHARGER_CONTROL_2:
 106                return 1;
 107
 108        default:
 109                return 0;
 110        }
 111}
 112
 113/**
 114 * wm831x_reg_unlock: Unlock user keyed registers
 115 *
 116 * The WM831x has a user key preventing writes to particularly
 117 * critical registers.  This function locks those registers,
 118 * allowing writes to them.
 119 */
 120void wm831x_reg_lock(struct wm831x *wm831x)
 121{
 122        int ret;
 123
 124        ret = wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0);
 125        if (ret == 0) {
 126                dev_vdbg(wm831x->dev, "Registers locked\n");
 127
 128                mutex_lock(&wm831x->io_lock);
 129                WARN_ON(wm831x->locked);
 130                wm831x->locked = 1;
 131                mutex_unlock(&wm831x->io_lock);
 132        } else {
 133                dev_err(wm831x->dev, "Failed to lock registers: %d\n", ret);
 134        }
 135
 136}
 137EXPORT_SYMBOL_GPL(wm831x_reg_lock);
 138
 139/**
 140 * wm831x_reg_unlock: Unlock user keyed registers
 141 *
 142 * The WM831x has a user key preventing writes to particularly
 143 * critical registers.  This function locks those registers,
 144 * preventing spurious writes.
 145 */
 146int wm831x_reg_unlock(struct wm831x *wm831x)
 147{
 148        int ret;
 149
 150        /* 0x9716 is the value required to unlock the registers */
 151        ret = wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0x9716);
 152        if (ret == 0) {
 153                dev_vdbg(wm831x->dev, "Registers unlocked\n");
 154
 155                mutex_lock(&wm831x->io_lock);
 156                WARN_ON(!wm831x->locked);
 157                wm831x->locked = 0;
 158                mutex_unlock(&wm831x->io_lock);
 159        }
 160
 161        return ret;
 162}
 163EXPORT_SYMBOL_GPL(wm831x_reg_unlock);
 164
 165static bool wm831x_reg_readable(struct device *dev, unsigned int reg)
 166{
 167        switch (reg) {
 168        case WM831X_RESET_ID:
 169        case WM831X_REVISION:
 170        case WM831X_PARENT_ID:
 171        case WM831X_SYSVDD_CONTROL:
 172        case WM831X_THERMAL_MONITORING:
 173        case WM831X_POWER_STATE:
 174        case WM831X_WATCHDOG:
 175        case WM831X_ON_PIN_CONTROL:
 176        case WM831X_RESET_CONTROL:
 177        case WM831X_CONTROL_INTERFACE:
 178        case WM831X_SECURITY_KEY:
 179        case WM831X_SOFTWARE_SCRATCH:
 180        case WM831X_OTP_CONTROL:
 181        case WM831X_GPIO_LEVEL:
 182        case WM831X_SYSTEM_STATUS:
 183        case WM831X_ON_SOURCE:
 184        case WM831X_OFF_SOURCE:
 185        case WM831X_SYSTEM_INTERRUPTS:
 186        case WM831X_INTERRUPT_STATUS_1:
 187        case WM831X_INTERRUPT_STATUS_2:
 188        case WM831X_INTERRUPT_STATUS_3:
 189        case WM831X_INTERRUPT_STATUS_4:
 190        case WM831X_INTERRUPT_STATUS_5:
 191        case WM831X_IRQ_CONFIG:
 192        case WM831X_SYSTEM_INTERRUPTS_MASK:
 193        case WM831X_INTERRUPT_STATUS_1_MASK:
 194        case WM831X_INTERRUPT_STATUS_2_MASK:
 195        case WM831X_INTERRUPT_STATUS_3_MASK:
 196        case WM831X_INTERRUPT_STATUS_4_MASK:
 197        case WM831X_INTERRUPT_STATUS_5_MASK:
 198        case WM831X_RTC_WRITE_COUNTER:
 199        case WM831X_RTC_TIME_1:
 200        case WM831X_RTC_TIME_2:
 201        case WM831X_RTC_ALARM_1:
 202        case WM831X_RTC_ALARM_2:
 203        case WM831X_RTC_CONTROL:
 204        case WM831X_RTC_TRIM:
 205        case WM831X_TOUCH_CONTROL_1:
 206        case WM831X_TOUCH_CONTROL_2:
 207        case WM831X_TOUCH_DATA_X:
 208        case WM831X_TOUCH_DATA_Y:
 209        case WM831X_TOUCH_DATA_Z:
 210        case WM831X_AUXADC_DATA:
 211        case WM831X_AUXADC_CONTROL:
 212        case WM831X_AUXADC_SOURCE:
 213        case WM831X_COMPARATOR_CONTROL:
 214        case WM831X_COMPARATOR_1:
 215        case WM831X_COMPARATOR_2:
 216        case WM831X_COMPARATOR_3:
 217        case WM831X_COMPARATOR_4:
 218        case WM831X_GPIO1_CONTROL:
 219        case WM831X_GPIO2_CONTROL:
 220        case WM831X_GPIO3_CONTROL:
 221        case WM831X_GPIO4_CONTROL:
 222        case WM831X_GPIO5_CONTROL:
 223        case WM831X_GPIO6_CONTROL:
 224        case WM831X_GPIO7_CONTROL:
 225        case WM831X_GPIO8_CONTROL:
 226        case WM831X_GPIO9_CONTROL:
 227        case WM831X_GPIO10_CONTROL:
 228        case WM831X_GPIO11_CONTROL:
 229        case WM831X_GPIO12_CONTROL:
 230        case WM831X_GPIO13_CONTROL:
 231        case WM831X_GPIO14_CONTROL:
 232        case WM831X_GPIO15_CONTROL:
 233        case WM831X_GPIO16_CONTROL:
 234        case WM831X_CHARGER_CONTROL_1:
 235        case WM831X_CHARGER_CONTROL_2:
 236        case WM831X_CHARGER_STATUS:
 237        case WM831X_BACKUP_CHARGER_CONTROL:
 238        case WM831X_STATUS_LED_1:
 239        case WM831X_STATUS_LED_2:
 240        case WM831X_CURRENT_SINK_1:
 241        case WM831X_CURRENT_SINK_2:
 242        case WM831X_DCDC_ENABLE:
 243        case WM831X_LDO_ENABLE:
 244        case WM831X_DCDC_STATUS:
 245        case WM831X_LDO_STATUS:
 246        case WM831X_DCDC_UV_STATUS:
 247        case WM831X_LDO_UV_STATUS:
 248        case WM831X_DC1_CONTROL_1:
 249        case WM831X_DC1_CONTROL_2:
 250        case WM831X_DC1_ON_CONFIG:
 251        case WM831X_DC1_SLEEP_CONTROL:
 252        case WM831X_DC1_DVS_CONTROL:
 253        case WM831X_DC2_CONTROL_1:
 254        case WM831X_DC2_CONTROL_2:
 255        case WM831X_DC2_ON_CONFIG:
 256        case WM831X_DC2_SLEEP_CONTROL:
 257        case WM831X_DC2_DVS_CONTROL:
 258        case WM831X_DC3_CONTROL_1:
 259        case WM831X_DC3_CONTROL_2:
 260        case WM831X_DC3_ON_CONFIG:
 261        case WM831X_DC3_SLEEP_CONTROL:
 262        case WM831X_DC4_CONTROL:
 263        case WM831X_DC4_SLEEP_CONTROL:
 264        case WM831X_EPE1_CONTROL:
 265        case WM831X_EPE2_CONTROL:
 266        case WM831X_LDO1_CONTROL:
 267        case WM831X_LDO1_ON_CONTROL:
 268        case WM831X_LDO1_SLEEP_CONTROL:
 269        case WM831X_LDO2_CONTROL:
 270        case WM831X_LDO2_ON_CONTROL:
 271        case WM831X_LDO2_SLEEP_CONTROL:
 272        case WM831X_LDO3_CONTROL:
 273        case WM831X_LDO3_ON_CONTROL:
 274        case WM831X_LDO3_SLEEP_CONTROL:
 275        case WM831X_LDO4_CONTROL:
 276        case WM831X_LDO4_ON_CONTROL:
 277        case WM831X_LDO4_SLEEP_CONTROL:
 278        case WM831X_LDO5_CONTROL:
 279        case WM831X_LDO5_ON_CONTROL:
 280        case WM831X_LDO5_SLEEP_CONTROL:
 281        case WM831X_LDO6_CONTROL:
 282        case WM831X_LDO6_ON_CONTROL:
 283        case WM831X_LDO6_SLEEP_CONTROL:
 284        case WM831X_LDO7_CONTROL:
 285        case WM831X_LDO7_ON_CONTROL:
 286        case WM831X_LDO7_SLEEP_CONTROL:
 287        case WM831X_LDO8_CONTROL:
 288        case WM831X_LDO8_ON_CONTROL:
 289        case WM831X_LDO8_SLEEP_CONTROL:
 290        case WM831X_LDO9_CONTROL:
 291        case WM831X_LDO9_ON_CONTROL:
 292        case WM831X_LDO9_SLEEP_CONTROL:
 293        case WM831X_LDO10_CONTROL:
 294        case WM831X_LDO10_ON_CONTROL:
 295        case WM831X_LDO10_SLEEP_CONTROL:
 296        case WM831X_LDO11_ON_CONTROL:
 297        case WM831X_LDO11_SLEEP_CONTROL:
 298        case WM831X_POWER_GOOD_SOURCE_1:
 299        case WM831X_POWER_GOOD_SOURCE_2:
 300        case WM831X_CLOCK_CONTROL_1:
 301        case WM831X_CLOCK_CONTROL_2:
 302        case WM831X_FLL_CONTROL_1:
 303        case WM831X_FLL_CONTROL_2:
 304        case WM831X_FLL_CONTROL_3:
 305        case WM831X_FLL_CONTROL_4:
 306        case WM831X_FLL_CONTROL_5:
 307        case WM831X_UNIQUE_ID_1:
 308        case WM831X_UNIQUE_ID_2:
 309        case WM831X_UNIQUE_ID_3:
 310        case WM831X_UNIQUE_ID_4:
 311        case WM831X_UNIQUE_ID_5:
 312        case WM831X_UNIQUE_ID_6:
 313        case WM831X_UNIQUE_ID_7:
 314        case WM831X_UNIQUE_ID_8:
 315        case WM831X_FACTORY_OTP_ID:
 316        case WM831X_FACTORY_OTP_1:
 317        case WM831X_FACTORY_OTP_2:
 318        case WM831X_FACTORY_OTP_3:
 319        case WM831X_FACTORY_OTP_4:
 320        case WM831X_FACTORY_OTP_5:
 321        case WM831X_CUSTOMER_OTP_ID:
 322        case WM831X_DC1_OTP_CONTROL:
 323        case WM831X_DC2_OTP_CONTROL:
 324        case WM831X_DC3_OTP_CONTROL:
 325        case WM831X_LDO1_2_OTP_CONTROL:
 326        case WM831X_LDO3_4_OTP_CONTROL:
 327        case WM831X_LDO5_6_OTP_CONTROL:
 328        case WM831X_LDO7_8_OTP_CONTROL:
 329        case WM831X_LDO9_10_OTP_CONTROL:
 330        case WM831X_LDO11_EPE_CONTROL:
 331        case WM831X_GPIO1_OTP_CONTROL:
 332        case WM831X_GPIO2_OTP_CONTROL:
 333        case WM831X_GPIO3_OTP_CONTROL:
 334        case WM831X_GPIO4_OTP_CONTROL:
 335        case WM831X_GPIO5_OTP_CONTROL:
 336        case WM831X_GPIO6_OTP_CONTROL:
 337        case WM831X_DBE_CHECK_DATA:
 338                return true;
 339        default:
 340                return false;
 341        }
 342}
 343
 344static bool wm831x_reg_writeable(struct device *dev, unsigned int reg)
 345{
 346        struct wm831x *wm831x = dev_get_drvdata(dev);
 347
 348        if (wm831x_reg_locked(wm831x, reg))
 349                return false;
 350
 351        switch (reg) {
 352        case WM831X_SYSVDD_CONTROL:
 353        case WM831X_THERMAL_MONITORING:
 354        case WM831X_POWER_STATE:
 355        case WM831X_WATCHDOG:
 356        case WM831X_ON_PIN_CONTROL:
 357        case WM831X_RESET_CONTROL:
 358        case WM831X_CONTROL_INTERFACE:
 359        case WM831X_SECURITY_KEY:
 360        case WM831X_SOFTWARE_SCRATCH:
 361        case WM831X_OTP_CONTROL:
 362        case WM831X_GPIO_LEVEL:
 363        case WM831X_INTERRUPT_STATUS_1:
 364        case WM831X_INTERRUPT_STATUS_2:
 365        case WM831X_INTERRUPT_STATUS_3:
 366        case WM831X_INTERRUPT_STATUS_4:
 367        case WM831X_INTERRUPT_STATUS_5:
 368        case WM831X_IRQ_CONFIG:
 369        case WM831X_SYSTEM_INTERRUPTS_MASK:
 370        case WM831X_INTERRUPT_STATUS_1_MASK:
 371        case WM831X_INTERRUPT_STATUS_2_MASK:
 372        case WM831X_INTERRUPT_STATUS_3_MASK:
 373        case WM831X_INTERRUPT_STATUS_4_MASK:
 374        case WM831X_INTERRUPT_STATUS_5_MASK:
 375        case WM831X_RTC_TIME_1:
 376        case WM831X_RTC_TIME_2:
 377        case WM831X_RTC_ALARM_1:
 378        case WM831X_RTC_ALARM_2:
 379        case WM831X_RTC_CONTROL:
 380        case WM831X_RTC_TRIM:
 381        case WM831X_TOUCH_CONTROL_1:
 382        case WM831X_TOUCH_CONTROL_2:
 383        case WM831X_AUXADC_CONTROL:
 384        case WM831X_AUXADC_SOURCE:
 385        case WM831X_COMPARATOR_CONTROL:
 386        case WM831X_COMPARATOR_1:
 387        case WM831X_COMPARATOR_2:
 388        case WM831X_COMPARATOR_3:
 389        case WM831X_COMPARATOR_4:
 390        case WM831X_GPIO1_CONTROL:
 391        case WM831X_GPIO2_CONTROL:
 392        case WM831X_GPIO3_CONTROL:
 393        case WM831X_GPIO4_CONTROL:
 394        case WM831X_GPIO5_CONTROL:
 395        case WM831X_GPIO6_CONTROL:
 396        case WM831X_GPIO7_CONTROL:
 397        case WM831X_GPIO8_CONTROL:
 398        case WM831X_GPIO9_CONTROL:
 399        case WM831X_GPIO10_CONTROL:
 400        case WM831X_GPIO11_CONTROL:
 401        case WM831X_GPIO12_CONTROL:
 402        case WM831X_GPIO13_CONTROL:
 403        case WM831X_GPIO14_CONTROL:
 404        case WM831X_GPIO15_CONTROL:
 405        case WM831X_GPIO16_CONTROL:
 406        case WM831X_CHARGER_CONTROL_1:
 407        case WM831X_CHARGER_CONTROL_2:
 408        case WM831X_CHARGER_STATUS:
 409        case WM831X_BACKUP_CHARGER_CONTROL:
 410        case WM831X_STATUS_LED_1:
 411        case WM831X_STATUS_LED_2:
 412        case WM831X_CURRENT_SINK_1:
 413        case WM831X_CURRENT_SINK_2:
 414        case WM831X_DCDC_ENABLE:
 415        case WM831X_LDO_ENABLE:
 416        case WM831X_DC1_CONTROL_1:
 417        case WM831X_DC1_CONTROL_2:
 418        case WM831X_DC1_ON_CONFIG:
 419        case WM831X_DC1_SLEEP_CONTROL:
 420        case WM831X_DC1_DVS_CONTROL:
 421        case WM831X_DC2_CONTROL_1:
 422        case WM831X_DC2_CONTROL_2:
 423        case WM831X_DC2_ON_CONFIG:
 424        case WM831X_DC2_SLEEP_CONTROL:
 425        case WM831X_DC2_DVS_CONTROL:
 426        case WM831X_DC3_CONTROL_1:
 427        case WM831X_DC3_CONTROL_2:
 428        case WM831X_DC3_ON_CONFIG:
 429        case WM831X_DC3_SLEEP_CONTROL:
 430        case WM831X_DC4_CONTROL:
 431        case WM831X_DC4_SLEEP_CONTROL:
 432        case WM831X_EPE1_CONTROL:
 433        case WM831X_EPE2_CONTROL:
 434        case WM831X_LDO1_CONTROL:
 435        case WM831X_LDO1_ON_CONTROL:
 436        case WM831X_LDO1_SLEEP_CONTROL:
 437        case WM831X_LDO2_CONTROL:
 438        case WM831X_LDO2_ON_CONTROL:
 439        case WM831X_LDO2_SLEEP_CONTROL:
 440        case WM831X_LDO3_CONTROL:
 441        case WM831X_LDO3_ON_CONTROL:
 442        case WM831X_LDO3_SLEEP_CONTROL:
 443        case WM831X_LDO4_CONTROL:
 444        case WM831X_LDO4_ON_CONTROL:
 445        case WM831X_LDO4_SLEEP_CONTROL:
 446        case WM831X_LDO5_CONTROL:
 447        case WM831X_LDO5_ON_CONTROL:
 448        case WM831X_LDO5_SLEEP_CONTROL:
 449        case WM831X_LDO6_CONTROL:
 450        case WM831X_LDO6_ON_CONTROL:
 451        case WM831X_LDO6_SLEEP_CONTROL:
 452        case WM831X_LDO7_CONTROL:
 453        case WM831X_LDO7_ON_CONTROL:
 454        case WM831X_LDO7_SLEEP_CONTROL:
 455        case WM831X_LDO8_CONTROL:
 456        case WM831X_LDO8_ON_CONTROL:
 457        case WM831X_LDO8_SLEEP_CONTROL:
 458        case WM831X_LDO9_CONTROL:
 459        case WM831X_LDO9_ON_CONTROL:
 460        case WM831X_LDO9_SLEEP_CONTROL:
 461        case WM831X_LDO10_CONTROL:
 462        case WM831X_LDO10_ON_CONTROL:
 463        case WM831X_LDO10_SLEEP_CONTROL:
 464        case WM831X_LDO11_ON_CONTROL:
 465        case WM831X_LDO11_SLEEP_CONTROL:
 466        case WM831X_POWER_GOOD_SOURCE_1:
 467        case WM831X_POWER_GOOD_SOURCE_2:
 468        case WM831X_CLOCK_CONTROL_1:
 469        case WM831X_CLOCK_CONTROL_2:
 470        case WM831X_FLL_CONTROL_1:
 471        case WM831X_FLL_CONTROL_2:
 472        case WM831X_FLL_CONTROL_3:
 473        case WM831X_FLL_CONTROL_4:
 474        case WM831X_FLL_CONTROL_5:
 475                return true;
 476        default:
 477                return false;
 478        }
 479}
 480
 481static bool wm831x_reg_volatile(struct device *dev, unsigned int reg)
 482{
 483        switch (reg) {
 484        case WM831X_SYSTEM_STATUS:
 485        case WM831X_ON_SOURCE:
 486        case WM831X_OFF_SOURCE:
 487        case WM831X_GPIO_LEVEL:
 488        case WM831X_SYSTEM_INTERRUPTS:
 489        case WM831X_INTERRUPT_STATUS_1:
 490        case WM831X_INTERRUPT_STATUS_2:
 491        case WM831X_INTERRUPT_STATUS_3:
 492        case WM831X_INTERRUPT_STATUS_4:
 493        case WM831X_INTERRUPT_STATUS_5:
 494        case WM831X_RTC_TIME_1:
 495        case WM831X_RTC_TIME_2:
 496        case WM831X_TOUCH_DATA_X:
 497        case WM831X_TOUCH_DATA_Y:
 498        case WM831X_TOUCH_DATA_Z:
 499        case WM831X_AUXADC_DATA:
 500        case WM831X_CHARGER_STATUS:
 501        case WM831X_DCDC_STATUS:
 502        case WM831X_LDO_STATUS:
 503        case WM831X_DCDC_UV_STATUS:
 504        case WM831X_LDO_UV_STATUS:
 505                return true;
 506        default:
 507                return false;
 508        }
 509}
 510
 511/**
 512 * wm831x_reg_read: Read a single WM831x register.
 513 *
 514 * @wm831x: Device to read from.
 515 * @reg: Register to read.
 516 */
 517int wm831x_reg_read(struct wm831x *wm831x, unsigned short reg)
 518{
 519        unsigned int val;
 520        int ret;
 521
 522        ret = regmap_read(wm831x->regmap, reg, &val);
 523
 524        if (ret < 0)
 525                return ret;
 526        else
 527                return val;
 528}
 529EXPORT_SYMBOL_GPL(wm831x_reg_read);
 530
 531/**
 532 * wm831x_bulk_read: Read multiple WM831x registers
 533 *
 534 * @wm831x: Device to read from
 535 * @reg: First register
 536 * @count: Number of registers
 537 * @buf: Buffer to fill.
 538 */
 539int wm831x_bulk_read(struct wm831x *wm831x, unsigned short reg,
 540                     int count, u16 *buf)
 541{
 542        return regmap_bulk_read(wm831x->regmap, reg, buf, count);
 543}
 544EXPORT_SYMBOL_GPL(wm831x_bulk_read);
 545
 546static int wm831x_write(struct wm831x *wm831x, unsigned short reg,
 547                        int bytes, void *src)
 548{
 549        u16 *buf = src;
 550        int i, ret;
 551
 552        BUG_ON(bytes % 2);
 553        BUG_ON(bytes <= 0);
 554
 555        for (i = 0; i < bytes / 2; i++) {
 556                if (wm831x_reg_locked(wm831x, reg))
 557                        return -EPERM;
 558
 559                dev_vdbg(wm831x->dev, "Write %04x to R%d(0x%x)\n",
 560                         buf[i], reg + i, reg + i);
 561                ret = regmap_write(wm831x->regmap, reg + i, buf[i]);
 562                if (ret != 0)
 563                        return ret;
 564        }
 565
 566        return 0;
 567}
 568
 569/**
 570 * wm831x_reg_write: Write a single WM831x register.
 571 *
 572 * @wm831x: Device to write to.
 573 * @reg: Register to write to.
 574 * @val: Value to write.
 575 */
 576int wm831x_reg_write(struct wm831x *wm831x, unsigned short reg,
 577                     unsigned short val)
 578{
 579        int ret;
 580
 581        mutex_lock(&wm831x->io_lock);
 582
 583        ret = wm831x_write(wm831x, reg, 2, &val);
 584
 585        mutex_unlock(&wm831x->io_lock);
 586
 587        return ret;
 588}
 589EXPORT_SYMBOL_GPL(wm831x_reg_write);
 590
 591/**
 592 * wm831x_set_bits: Set the value of a bitfield in a WM831x register
 593 *
 594 * @wm831x: Device to write to.
 595 * @reg: Register to write to.
 596 * @mask: Mask of bits to set.
 597 * @val: Value to set (unshifted)
 598 */
 599int wm831x_set_bits(struct wm831x *wm831x, unsigned short reg,
 600                    unsigned short mask, unsigned short val)
 601{
 602        int ret;
 603
 604        mutex_lock(&wm831x->io_lock);
 605
 606        if (!wm831x_reg_locked(wm831x, reg))
 607                ret = regmap_update_bits(wm831x->regmap, reg, mask, val);
 608        else
 609                ret = -EPERM;
 610
 611        mutex_unlock(&wm831x->io_lock);
 612
 613        return ret;
 614}
 615EXPORT_SYMBOL_GPL(wm831x_set_bits);
 616
 617static struct resource wm831x_io_parent = {
 618        .start = 0,
 619        .end   = 0xffffffff,
 620        .flags = IORESOURCE_IO,
 621};
 622
 623static struct resource wm831x_dcdc1_resources[] = {
 624        {
 625                .parent = &wm831x_io_parent,
 626                .start = WM831X_DC1_CONTROL_1,
 627                .end   = WM831X_DC1_DVS_CONTROL,
 628                .flags = IORESOURCE_IO,
 629        },
 630        {
 631                .name  = "UV",
 632                .start = WM831X_IRQ_UV_DC1,
 633                .end   = WM831X_IRQ_UV_DC1,
 634                .flags = IORESOURCE_IRQ,
 635        },
 636        {
 637                .name  = "HC",
 638                .start = WM831X_IRQ_HC_DC1,
 639                .end   = WM831X_IRQ_HC_DC1,
 640                .flags = IORESOURCE_IRQ,
 641        },
 642};
 643
 644
 645static struct resource wm831x_dcdc2_resources[] = {
 646        {
 647                .parent = &wm831x_io_parent,
 648                .start = WM831X_DC2_CONTROL_1,
 649                .end   = WM831X_DC2_DVS_CONTROL,
 650                .flags = IORESOURCE_IO,
 651        },
 652        {
 653                .name  = "UV",
 654                .start = WM831X_IRQ_UV_DC2,
 655                .end   = WM831X_IRQ_UV_DC2,
 656                .flags = IORESOURCE_IRQ,
 657        },
 658        {
 659                .name  = "HC",
 660                .start = WM831X_IRQ_HC_DC2,
 661                .end   = WM831X_IRQ_HC_DC2,
 662                .flags = IORESOURCE_IRQ,
 663        },
 664};
 665
 666static struct resource wm831x_dcdc3_resources[] = {
 667        {
 668                .parent = &wm831x_io_parent,
 669                .start = WM831X_DC3_CONTROL_1,
 670                .end   = WM831X_DC3_SLEEP_CONTROL,
 671                .flags = IORESOURCE_IO,
 672        },
 673        {
 674                .name  = "UV",
 675                .start = WM831X_IRQ_UV_DC3,
 676                .end   = WM831X_IRQ_UV_DC3,
 677                .flags = IORESOURCE_IRQ,
 678        },
 679};
 680
 681static struct resource wm831x_dcdc4_resources[] = {
 682        {
 683                .parent = &wm831x_io_parent,
 684                .start = WM831X_DC4_CONTROL,
 685                .end   = WM831X_DC4_SLEEP_CONTROL,
 686                .flags = IORESOURCE_IO,
 687        },
 688        {
 689                .name  = "UV",
 690                .start = WM831X_IRQ_UV_DC4,
 691                .end   = WM831X_IRQ_UV_DC4,
 692                .flags = IORESOURCE_IRQ,
 693        },
 694};
 695
 696static struct resource wm8320_dcdc4_buck_resources[] = {
 697        {
 698                .parent = &wm831x_io_parent,
 699                .start = WM831X_DC4_CONTROL,
 700                .end   = WM832X_DC4_SLEEP_CONTROL,
 701                .flags = IORESOURCE_IO,
 702        },
 703        {
 704                .name  = "UV",
 705                .start = WM831X_IRQ_UV_DC4,
 706                .end   = WM831X_IRQ_UV_DC4,
 707                .flags = IORESOURCE_IRQ,
 708        },
 709};
 710
 711static struct resource wm831x_gpio_resources[] = {
 712        {
 713                .start = WM831X_IRQ_GPIO_1,
 714                .end   = WM831X_IRQ_GPIO_16,
 715                .flags = IORESOURCE_IRQ,
 716        },
 717};
 718
 719static struct resource wm831x_isink1_resources[] = {
 720        {
 721                .parent = &wm831x_io_parent,
 722                .start = WM831X_CURRENT_SINK_1,
 723                .end   = WM831X_CURRENT_SINK_1,
 724                .flags = IORESOURCE_IO,
 725        },
 726        {
 727                .start = WM831X_IRQ_CS1,
 728                .end   = WM831X_IRQ_CS1,
 729                .flags = IORESOURCE_IRQ,
 730        },
 731};
 732
 733static struct resource wm831x_isink2_resources[] = {
 734        {
 735                .parent = &wm831x_io_parent,
 736                .start = WM831X_CURRENT_SINK_2,
 737                .end   = WM831X_CURRENT_SINK_2,
 738                .flags = IORESOURCE_IO,
 739        },
 740        {
 741                .start = WM831X_IRQ_CS2,
 742                .end   = WM831X_IRQ_CS2,
 743                .flags = IORESOURCE_IRQ,
 744        },
 745};
 746
 747static struct resource wm831x_ldo1_resources[] = {
 748        {
 749                .parent = &wm831x_io_parent,
 750                .start = WM831X_LDO1_CONTROL,
 751                .end   = WM831X_LDO1_SLEEP_CONTROL,
 752                .flags = IORESOURCE_IO,
 753        },
 754        {
 755                .name  = "UV",
 756                .start = WM831X_IRQ_UV_LDO1,
 757                .end   = WM831X_IRQ_UV_LDO1,
 758                .flags = IORESOURCE_IRQ,
 759        },
 760};
 761
 762static struct resource wm831x_ldo2_resources[] = {
 763        {
 764                .parent = &wm831x_io_parent,
 765                .start = WM831X_LDO2_CONTROL,
 766                .end   = WM831X_LDO2_SLEEP_CONTROL,
 767                .flags = IORESOURCE_IO,
 768        },
 769        {
 770                .name  = "UV",
 771                .start = WM831X_IRQ_UV_LDO2,
 772                .end   = WM831X_IRQ_UV_LDO2,
 773                .flags = IORESOURCE_IRQ,
 774        },
 775};
 776
 777static struct resource wm831x_ldo3_resources[] = {
 778        {
 779                .parent = &wm831x_io_parent,
 780                .start = WM831X_LDO3_CONTROL,
 781                .end   = WM831X_LDO3_SLEEP_CONTROL,
 782                .flags = IORESOURCE_IO,
 783        },
 784        {
 785                .name  = "UV",
 786                .start = WM831X_IRQ_UV_LDO3,
 787                .end   = WM831X_IRQ_UV_LDO3,
 788                .flags = IORESOURCE_IRQ,
 789        },
 790};
 791
 792static struct resource wm831x_ldo4_resources[] = {
 793        {
 794                .parent = &wm831x_io_parent,
 795                .start = WM831X_LDO4_CONTROL,
 796                .end   = WM831X_LDO4_SLEEP_CONTROL,
 797                .flags = IORESOURCE_IO,
 798        },
 799        {
 800                .name  = "UV",
 801                .start = WM831X_IRQ_UV_LDO4,
 802                .end   = WM831X_IRQ_UV_LDO4,
 803                .flags = IORESOURCE_IRQ,
 804        },
 805};
 806
 807static struct resource wm831x_ldo5_resources[] = {
 808        {
 809                .parent = &wm831x_io_parent,
 810                .start = WM831X_LDO5_CONTROL,
 811                .end   = WM831X_LDO5_SLEEP_CONTROL,
 812                .flags = IORESOURCE_IO,
 813        },
 814        {
 815                .name  = "UV",
 816                .start = WM831X_IRQ_UV_LDO5,
 817                .end   = WM831X_IRQ_UV_LDO5,
 818                .flags = IORESOURCE_IRQ,
 819        },
 820};
 821
 822static struct resource wm831x_ldo6_resources[] = {
 823        {
 824                .parent = &wm831x_io_parent,
 825                .start = WM831X_LDO6_CONTROL,
 826                .end   = WM831X_LDO6_SLEEP_CONTROL,
 827                .flags = IORESOURCE_IO,
 828        },
 829        {
 830                .name  = "UV",
 831                .start = WM831X_IRQ_UV_LDO6,
 832                .end   = WM831X_IRQ_UV_LDO6,
 833                .flags = IORESOURCE_IRQ,
 834        },
 835};
 836
 837static struct resource wm831x_ldo7_resources[] = {
 838        {
 839                .parent = &wm831x_io_parent,
 840                .start = WM831X_LDO7_CONTROL,
 841                .end   = WM831X_LDO7_SLEEP_CONTROL,
 842                .flags = IORESOURCE_IO,
 843        },
 844        {
 845                .name  = "UV",
 846                .start = WM831X_IRQ_UV_LDO7,
 847                .end   = WM831X_IRQ_UV_LDO7,
 848                .flags = IORESOURCE_IRQ,
 849        },
 850};
 851
 852static struct resource wm831x_ldo8_resources[] = {
 853        {
 854                .parent = &wm831x_io_parent,
 855                .start = WM831X_LDO8_CONTROL,
 856                .end   = WM831X_LDO8_SLEEP_CONTROL,
 857                .flags = IORESOURCE_IO,
 858        },
 859        {
 860                .name  = "UV",
 861                .start = WM831X_IRQ_UV_LDO8,
 862                .end   = WM831X_IRQ_UV_LDO8,
 863                .flags = IORESOURCE_IRQ,
 864        },
 865};
 866
 867static struct resource wm831x_ldo9_resources[] = {
 868        {
 869                .parent = &wm831x_io_parent,
 870                .start = WM831X_LDO9_CONTROL,
 871                .end   = WM831X_LDO9_SLEEP_CONTROL,
 872                .flags = IORESOURCE_IO,
 873        },
 874        {
 875                .name  = "UV",
 876                .start = WM831X_IRQ_UV_LDO9,
 877                .end   = WM831X_IRQ_UV_LDO9,
 878                .flags = IORESOURCE_IRQ,
 879        },
 880};
 881
 882static struct resource wm831x_ldo10_resources[] = {
 883        {
 884                .parent = &wm831x_io_parent,
 885                .start = WM831X_LDO10_CONTROL,
 886                .end   = WM831X_LDO10_SLEEP_CONTROL,
 887                .flags = IORESOURCE_IO,
 888        },
 889        {
 890                .name  = "UV",
 891                .start = WM831X_IRQ_UV_LDO10,
 892                .end   = WM831X_IRQ_UV_LDO10,
 893                .flags = IORESOURCE_IRQ,
 894        },
 895};
 896
 897static struct resource wm831x_ldo11_resources[] = {
 898        {
 899                .parent = &wm831x_io_parent,
 900                .start = WM831X_LDO11_ON_CONTROL,
 901                .end   = WM831X_LDO11_SLEEP_CONTROL,
 902                .flags = IORESOURCE_IO,
 903        },
 904};
 905
 906static struct resource wm831x_on_resources[] = {
 907        {
 908                .start = WM831X_IRQ_ON,
 909                .end   = WM831X_IRQ_ON,
 910                .flags = IORESOURCE_IRQ,
 911        },
 912};
 913
 914
 915static struct resource wm831x_power_resources[] = {
 916        {
 917                .name = "SYSLO",
 918                .start = WM831X_IRQ_PPM_SYSLO,
 919                .end   = WM831X_IRQ_PPM_SYSLO,
 920                .flags = IORESOURCE_IRQ,
 921        },
 922        {
 923                .name = "PWR SRC",
 924                .start = WM831X_IRQ_PPM_PWR_SRC,
 925                .end   = WM831X_IRQ_PPM_PWR_SRC,
 926                .flags = IORESOURCE_IRQ,
 927        },
 928        {
 929                .name = "USB CURR",
 930                .start = WM831X_IRQ_PPM_USB_CURR,
 931                .end   = WM831X_IRQ_PPM_USB_CURR,
 932                .flags = IORESOURCE_IRQ,
 933        },
 934        {
 935                .name = "BATT HOT",
 936                .start = WM831X_IRQ_CHG_BATT_HOT,
 937                .end   = WM831X_IRQ_CHG_BATT_HOT,
 938                .flags = IORESOURCE_IRQ,
 939        },
 940        {
 941                .name = "BATT COLD",
 942                .start = WM831X_IRQ_CHG_BATT_COLD,
 943                .end   = WM831X_IRQ_CHG_BATT_COLD,
 944                .flags = IORESOURCE_IRQ,
 945        },
 946        {
 947                .name = "BATT FAIL",
 948                .start = WM831X_IRQ_CHG_BATT_FAIL,
 949                .end   = WM831X_IRQ_CHG_BATT_FAIL,
 950                .flags = IORESOURCE_IRQ,
 951        },
 952        {
 953                .name = "OV",
 954                .start = WM831X_IRQ_CHG_OV,
 955                .end   = WM831X_IRQ_CHG_OV,
 956                .flags = IORESOURCE_IRQ,
 957        },
 958        {
 959                .name = "END",
 960                .start = WM831X_IRQ_CHG_END,
 961                .end   = WM831X_IRQ_CHG_END,
 962                .flags = IORESOURCE_IRQ,
 963        },
 964        {
 965                .name = "TO",
 966                .start = WM831X_IRQ_CHG_TO,
 967                .end   = WM831X_IRQ_CHG_TO,
 968                .flags = IORESOURCE_IRQ,
 969        },
 970        {
 971                .name = "MODE",
 972                .start = WM831X_IRQ_CHG_MODE,
 973                .end   = WM831X_IRQ_CHG_MODE,
 974                .flags = IORESOURCE_IRQ,
 975        },
 976        {
 977                .name = "START",
 978                .start = WM831X_IRQ_CHG_START,
 979                .end   = WM831X_IRQ_CHG_START,
 980                .flags = IORESOURCE_IRQ,
 981        },
 982};
 983
 984static struct resource wm831x_rtc_resources[] = {
 985        {
 986                .name = "PER",
 987                .start = WM831X_IRQ_RTC_PER,
 988                .end   = WM831X_IRQ_RTC_PER,
 989                .flags = IORESOURCE_IRQ,
 990        },
 991        {
 992                .name = "ALM",
 993                .start = WM831X_IRQ_RTC_ALM,
 994                .end   = WM831X_IRQ_RTC_ALM,
 995                .flags = IORESOURCE_IRQ,
 996        },
 997};
 998
 999static struct resource wm831x_status1_resources[] = {
1000        {
1001                .parent = &wm831x_io_parent,
1002                .start = WM831X_STATUS_LED_1,
1003                .end   = WM831X_STATUS_LED_1,
1004                .flags = IORESOURCE_IO,
1005        },
1006};
1007
1008static struct resource wm831x_status2_resources[] = {
1009        {
1010                .parent = &wm831x_io_parent,
1011                .start = WM831X_STATUS_LED_2,
1012                .end   = WM831X_STATUS_LED_2,
1013                .flags = IORESOURCE_IO,
1014        },
1015};
1016
1017static struct resource wm831x_touch_resources[] = {
1018        {
1019                .name = "TCHPD",
1020                .start = WM831X_IRQ_TCHPD,
1021                .end   = WM831X_IRQ_TCHPD,
1022                .flags = IORESOURCE_IRQ,
1023        },
1024        {
1025                .name = "TCHDATA",
1026                .start = WM831X_IRQ_TCHDATA,
1027                .end   = WM831X_IRQ_TCHDATA,
1028                .flags = IORESOURCE_IRQ,
1029        },
1030};
1031
1032static struct resource wm831x_wdt_resources[] = {
1033        {
1034                .start = WM831X_IRQ_WDOG_TO,
1035                .end   = WM831X_IRQ_WDOG_TO,
1036                .flags = IORESOURCE_IRQ,
1037        },
1038};
1039
1040static struct mfd_cell wm8310_devs[] = {
1041        {
1042                .name = "wm831x-backup",
1043        },
1044        {
1045                .name = "wm831x-buckv",
1046                .id = 1,
1047                .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1048                .resources = wm831x_dcdc1_resources,
1049        },
1050        {
1051                .name = "wm831x-buckv",
1052                .id = 2,
1053                .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1054                .resources = wm831x_dcdc2_resources,
1055        },
1056        {
1057                .name = "wm831x-buckp",
1058                .id = 3,
1059                .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1060                .resources = wm831x_dcdc3_resources,
1061        },
1062        {
1063                .name = "wm831x-boostp",
1064                .id = 4,
1065                .num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
1066                .resources = wm831x_dcdc4_resources,
1067        },
1068        {
1069                .name = "wm831x-clk",
1070        },
1071        {
1072                .name = "wm831x-epe",
1073                .id = 1,
1074        },
1075        {
1076                .name = "wm831x-epe",
1077                .id = 2,
1078        },
1079        {
1080                .name = "wm831x-gpio",
1081                .num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1082                .resources = wm831x_gpio_resources,
1083        },
1084        {
1085                .name = "wm831x-hwmon",
1086        },
1087        {
1088                .name = "wm831x-isink",
1089                .id = 1,
1090                .num_resources = ARRAY_SIZE(wm831x_isink1_resources),
1091                .resources = wm831x_isink1_resources,
1092        },
1093        {
1094                .name = "wm831x-isink",
1095                .id = 2,
1096                .num_resources = ARRAY_SIZE(wm831x_isink2_resources),
1097                .resources = wm831x_isink2_resources,
1098        },
1099        {
1100                .name = "wm831x-ldo",
1101                .id = 1,
1102                .num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1103                .resources = wm831x_ldo1_resources,
1104        },
1105        {
1106                .name = "wm831x-ldo",
1107                .id = 2,
1108                .num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1109                .resources = wm831x_ldo2_resources,
1110        },
1111        {
1112                .name = "wm831x-ldo",
1113                .id = 3,
1114                .num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1115                .resources = wm831x_ldo3_resources,
1116        },
1117        {
1118                .name = "wm831x-ldo",
1119                .id = 4,
1120                .num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1121                .resources = wm831x_ldo4_resources,
1122        },
1123        {
1124                .name = "wm831x-ldo",
1125                .id = 5,
1126                .num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1127                .resources = wm831x_ldo5_resources,
1128        },
1129        {
1130                .name = "wm831x-ldo",
1131                .id = 6,
1132                .num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
1133                .resources = wm831x_ldo6_resources,
1134        },
1135        {
1136                .name = "wm831x-aldo",
1137                .id = 7,
1138                .num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1139                .resources = wm831x_ldo7_resources,
1140        },
1141        {
1142                .name = "wm831x-aldo",
1143                .id = 8,
1144                .num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
1145                .resources = wm831x_ldo8_resources,
1146        },
1147        {
1148                .name = "wm831x-aldo",
1149                .id = 9,
1150                .num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
1151                .resources = wm831x_ldo9_resources,
1152        },
1153        {
1154                .name = "wm831x-aldo",
1155                .id = 10,
1156                .num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
1157                .resources = wm831x_ldo10_resources,
1158        },
1159        {
1160                .name = "wm831x-alive-ldo",
1161                .id = 11,
1162                .num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1163                .resources = wm831x_ldo11_resources,
1164        },
1165        {
1166                .name = "wm831x-on",
1167                .num_resources = ARRAY_SIZE(wm831x_on_resources),
1168                .resources = wm831x_on_resources,
1169        },
1170        {
1171                .name = "wm831x-power",
1172                .num_resources = ARRAY_SIZE(wm831x_power_resources),
1173                .resources = wm831x_power_resources,
1174        },
1175        {
1176                .name = "wm831x-status",
1177                .id = 1,
1178                .num_resources = ARRAY_SIZE(wm831x_status1_resources),
1179                .resources = wm831x_status1_resources,
1180        },
1181        {
1182                .name = "wm831x-status",
1183                .id = 2,
1184                .num_resources = ARRAY_SIZE(wm831x_status2_resources),
1185                .resources = wm831x_status2_resources,
1186        },
1187        {
1188                .name = "wm831x-watchdog",
1189                .num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1190                .resources = wm831x_wdt_resources,
1191        },
1192};
1193
1194static struct mfd_cell wm8311_devs[] = {
1195        {
1196                .name = "wm831x-backup",
1197        },
1198        {
1199                .name = "wm831x-buckv",
1200                .id = 1,
1201                .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1202                .resources = wm831x_dcdc1_resources,
1203        },
1204        {
1205                .name = "wm831x-buckv",
1206                .id = 2,
1207                .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1208                .resources = wm831x_dcdc2_resources,
1209        },
1210        {
1211                .name = "wm831x-buckp",
1212                .id = 3,
1213                .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1214                .resources = wm831x_dcdc3_resources,
1215        },
1216        {
1217                .name = "wm831x-boostp",
1218                .id = 4,
1219                .num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
1220                .resources = wm831x_dcdc4_resources,
1221        },
1222        {
1223                .name = "wm831x-clk",
1224        },
1225        {
1226                .name = "wm831x-epe",
1227                .id = 1,
1228        },
1229        {
1230                .name = "wm831x-epe",
1231                .id = 2,
1232        },
1233        {
1234                .name = "wm831x-gpio",
1235                .num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1236                .resources = wm831x_gpio_resources,
1237        },
1238        {
1239                .name = "wm831x-hwmon",
1240        },
1241        {
1242                .name = "wm831x-isink",
1243                .id = 1,
1244                .num_resources = ARRAY_SIZE(wm831x_isink1_resources),
1245                .resources = wm831x_isink1_resources,
1246        },
1247        {
1248                .name = "wm831x-isink",
1249                .id = 2,
1250                .num_resources = ARRAY_SIZE(wm831x_isink2_resources),
1251                .resources = wm831x_isink2_resources,
1252        },
1253        {
1254                .name = "wm831x-ldo",
1255                .id = 1,
1256                .num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1257                .resources = wm831x_ldo1_resources,
1258        },
1259        {
1260                .name = "wm831x-ldo",
1261                .id = 2,
1262                .num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1263                .resources = wm831x_ldo2_resources,
1264        },
1265        {
1266                .name = "wm831x-ldo",
1267                .id = 3,
1268                .num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1269                .resources = wm831x_ldo3_resources,
1270        },
1271        {
1272                .name = "wm831x-ldo",
1273                .id = 4,
1274                .num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1275                .resources = wm831x_ldo4_resources,
1276        },
1277        {
1278                .name = "wm831x-ldo",
1279                .id = 5,
1280                .num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1281                .resources = wm831x_ldo5_resources,
1282        },
1283        {
1284                .name = "wm831x-aldo",
1285                .id = 7,
1286                .num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1287                .resources = wm831x_ldo7_resources,
1288        },
1289        {
1290                .name = "wm831x-alive-ldo",
1291                .id = 11,
1292                .num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1293                .resources = wm831x_ldo11_resources,
1294        },
1295        {
1296                .name = "wm831x-on",
1297                .num_resources = ARRAY_SIZE(wm831x_on_resources),
1298                .resources = wm831x_on_resources,
1299        },
1300        {
1301                .name = "wm831x-power",
1302                .num_resources = ARRAY_SIZE(wm831x_power_resources),
1303                .resources = wm831x_power_resources,
1304        },
1305        {
1306                .name = "wm831x-status",
1307                .id = 1,
1308                .num_resources = ARRAY_SIZE(wm831x_status1_resources),
1309                .resources = wm831x_status1_resources,
1310        },
1311        {
1312                .name = "wm831x-status",
1313                .id = 2,
1314                .num_resources = ARRAY_SIZE(wm831x_status2_resources),
1315                .resources = wm831x_status2_resources,
1316        },
1317        {
1318                .name = "wm831x-watchdog",
1319                .num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1320                .resources = wm831x_wdt_resources,
1321        },
1322};
1323
1324static struct mfd_cell wm8312_devs[] = {
1325        {
1326                .name = "wm831x-backup",
1327        },
1328        {
1329                .name = "wm831x-buckv",
1330                .id = 1,
1331                .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1332                .resources = wm831x_dcdc1_resources,
1333        },
1334        {
1335                .name = "wm831x-buckv",
1336                .id = 2,
1337                .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1338                .resources = wm831x_dcdc2_resources,
1339        },
1340        {
1341                .name = "wm831x-buckp",
1342                .id = 3,
1343                .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1344                .resources = wm831x_dcdc3_resources,
1345        },
1346        {
1347                .name = "wm831x-boostp",
1348                .id = 4,
1349                .num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
1350                .resources = wm831x_dcdc4_resources,
1351        },
1352        {
1353                .name = "wm831x-clk",
1354        },
1355        {
1356                .name = "wm831x-epe",
1357                .id = 1,
1358        },
1359        {
1360                .name = "wm831x-epe",
1361                .id = 2,
1362        },
1363        {
1364                .name = "wm831x-gpio",
1365                .num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1366                .resources = wm831x_gpio_resources,
1367        },
1368        {
1369                .name = "wm831x-hwmon",
1370        },
1371        {
1372                .name = "wm831x-isink",
1373                .id = 1,
1374                .num_resources = ARRAY_SIZE(wm831x_isink1_resources),
1375                .resources = wm831x_isink1_resources,
1376        },
1377        {
1378                .name = "wm831x-isink",
1379                .id = 2,
1380                .num_resources = ARRAY_SIZE(wm831x_isink2_resources),
1381                .resources = wm831x_isink2_resources,
1382        },
1383        {
1384                .name = "wm831x-ldo",
1385                .id = 1,
1386                .num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1387                .resources = wm831x_ldo1_resources,
1388        },
1389        {
1390                .name = "wm831x-ldo",
1391                .id = 2,
1392                .num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1393                .resources = wm831x_ldo2_resources,
1394        },
1395        {
1396                .name = "wm831x-ldo",
1397                .id = 3,
1398                .num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1399                .resources = wm831x_ldo3_resources,
1400        },
1401        {
1402                .name = "wm831x-ldo",
1403                .id = 4,
1404                .num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1405                .resources = wm831x_ldo4_resources,
1406        },
1407        {
1408                .name = "wm831x-ldo",
1409                .id = 5,
1410                .num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1411                .resources = wm831x_ldo5_resources,
1412        },
1413        {
1414                .name = "wm831x-ldo",
1415                .id = 6,
1416                .num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
1417                .resources = wm831x_ldo6_resources,
1418        },
1419        {
1420                .name = "wm831x-aldo",
1421                .id = 7,
1422                .num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1423                .resources = wm831x_ldo7_resources,
1424        },
1425        {
1426                .name = "wm831x-aldo",
1427                .id = 8,
1428                .num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
1429                .resources = wm831x_ldo8_resources,
1430        },
1431        {
1432                .name = "wm831x-aldo",
1433                .id = 9,
1434                .num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
1435                .resources = wm831x_ldo9_resources,
1436        },
1437        {
1438                .name = "wm831x-aldo",
1439                .id = 10,
1440                .num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
1441                .resources = wm831x_ldo10_resources,
1442        },
1443        {
1444                .name = "wm831x-alive-ldo",
1445                .id = 11,
1446                .num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1447                .resources = wm831x_ldo11_resources,
1448        },
1449        {
1450                .name = "wm831x-on",
1451                .num_resources = ARRAY_SIZE(wm831x_on_resources),
1452                .resources = wm831x_on_resources,
1453        },
1454        {
1455                .name = "wm831x-power",
1456                .num_resources = ARRAY_SIZE(wm831x_power_resources),
1457                .resources = wm831x_power_resources,
1458        },
1459        {
1460                .name = "wm831x-status",
1461                .id = 1,
1462                .num_resources = ARRAY_SIZE(wm831x_status1_resources),
1463                .resources = wm831x_status1_resources,
1464        },
1465        {
1466                .name = "wm831x-status",
1467                .id = 2,
1468                .num_resources = ARRAY_SIZE(wm831x_status2_resources),
1469                .resources = wm831x_status2_resources,
1470        },
1471        {
1472                .name = "wm831x-watchdog",
1473                .num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1474                .resources = wm831x_wdt_resources,
1475        },
1476};
1477
1478static struct mfd_cell wm8320_devs[] = {
1479        {
1480                .name = "wm831x-backup",
1481        },
1482        {
1483                .name = "wm831x-buckv",
1484                .id = 1,
1485                .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1486                .resources = wm831x_dcdc1_resources,
1487        },
1488        {
1489                .name = "wm831x-buckv",
1490                .id = 2,
1491                .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1492                .resources = wm831x_dcdc2_resources,
1493        },
1494        {
1495                .name = "wm831x-buckp",
1496                .id = 3,
1497                .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1498                .resources = wm831x_dcdc3_resources,
1499        },
1500        {
1501                .name = "wm831x-buckp",
1502                .id = 4,
1503                .num_resources = ARRAY_SIZE(wm8320_dcdc4_buck_resources),
1504                .resources = wm8320_dcdc4_buck_resources,
1505        },
1506        {
1507                .name = "wm831x-clk",
1508        },
1509        {
1510                .name = "wm831x-gpio",
1511                .num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1512                .resources = wm831x_gpio_resources,
1513        },
1514        {
1515                .name = "wm831x-hwmon",
1516        },
1517        {
1518                .name = "wm831x-ldo",
1519                .id = 1,
1520                .num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1521                .resources = wm831x_ldo1_resources,
1522        },
1523        {
1524                .name = "wm831x-ldo",
1525                .id = 2,
1526                .num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1527                .resources = wm831x_ldo2_resources,
1528        },
1529        {
1530                .name = "wm831x-ldo",
1531                .id = 3,
1532                .num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1533                .resources = wm831x_ldo3_resources,
1534        },
1535        {
1536                .name = "wm831x-ldo",
1537                .id = 4,
1538                .num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1539                .resources = wm831x_ldo4_resources,
1540        },
1541        {
1542                .name = "wm831x-ldo",
1543                .id = 5,
1544                .num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1545                .resources = wm831x_ldo5_resources,
1546        },
1547        {
1548                .name = "wm831x-ldo",
1549                .id = 6,
1550                .num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
1551                .resources = wm831x_ldo6_resources,
1552        },
1553        {
1554                .name = "wm831x-aldo",
1555                .id = 7,
1556                .num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1557                .resources = wm831x_ldo7_resources,
1558        },
1559        {
1560                .name = "wm831x-aldo",
1561                .id = 8,
1562                .num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
1563                .resources = wm831x_ldo8_resources,
1564        },
1565        {
1566                .name = "wm831x-aldo",
1567                .id = 9,
1568                .num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
1569                .resources = wm831x_ldo9_resources,
1570        },
1571        {
1572                .name = "wm831x-aldo",
1573                .id = 10,
1574                .num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
1575                .resources = wm831x_ldo10_resources,
1576        },
1577        {
1578                .name = "wm831x-alive-ldo",
1579                .id = 11,
1580                .num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1581                .resources = wm831x_ldo11_resources,
1582        },
1583        {
1584                .name = "wm831x-on",
1585                .num_resources = ARRAY_SIZE(wm831x_on_resources),
1586                .resources = wm831x_on_resources,
1587        },
1588        {
1589                .name = "wm831x-status",
1590                .id = 1,
1591                .num_resources = ARRAY_SIZE(wm831x_status1_resources),
1592                .resources = wm831x_status1_resources,
1593        },
1594        {
1595                .name = "wm831x-status",
1596                .id = 2,
1597                .num_resources = ARRAY_SIZE(wm831x_status2_resources),
1598                .resources = wm831x_status2_resources,
1599        },
1600        {
1601                .name = "wm831x-watchdog",
1602                .num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1603                .resources = wm831x_wdt_resources,
1604        },
1605};
1606
1607static struct mfd_cell touch_devs[] = {
1608        {
1609                .name = "wm831x-touch",
1610                .num_resources = ARRAY_SIZE(wm831x_touch_resources),
1611                .resources = wm831x_touch_resources,
1612        },
1613};
1614
1615static struct mfd_cell rtc_devs[] = {
1616        {
1617                .name = "wm831x-rtc",
1618                .num_resources = ARRAY_SIZE(wm831x_rtc_resources),
1619                .resources = wm831x_rtc_resources,
1620        },
1621};
1622
1623static struct mfd_cell backlight_devs[] = {
1624        {
1625                .name = "wm831x-backlight",
1626        },
1627};
1628
1629struct regmap_config wm831x_regmap_config = {
1630        .reg_bits = 16,
1631        .val_bits = 16,
1632
1633        .cache_type = REGCACHE_RBTREE,
1634
1635        .max_register = WM831X_DBE_CHECK_DATA,
1636        .readable_reg = wm831x_reg_readable,
1637        .writeable_reg = wm831x_reg_writeable,
1638        .volatile_reg = wm831x_reg_volatile,
1639};
1640EXPORT_SYMBOL_GPL(wm831x_regmap_config);
1641
1642/*
1643 * Instantiate the generic non-control parts of the device.
1644 */
1645int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
1646{
1647        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
1648        int rev, wm831x_num;
1649        enum wm831x_parent parent;
1650        int ret, i;
1651
1652        mutex_init(&wm831x->io_lock);
1653        mutex_init(&wm831x->key_lock);
1654        dev_set_drvdata(wm831x->dev, wm831x);
1655        wm831x->soft_shutdown = pdata->soft_shutdown;
1656
1657        ret = wm831x_reg_read(wm831x, WM831X_PARENT_ID);
1658        if (ret < 0) {
1659                dev_err(wm831x->dev, "Failed to read parent ID: %d\n", ret);
1660                goto err;
1661        }
1662        switch (ret) {
1663        case 0x6204:
1664        case 0x6246:
1665                break;
1666        default:
1667                dev_err(wm831x->dev, "Device is not a WM831x: ID %x\n", ret);
1668                ret = -EINVAL;
1669                goto err;
1670        }
1671
1672        ret = wm831x_reg_read(wm831x, WM831X_REVISION);
1673        if (ret < 0) {
1674                dev_err(wm831x->dev, "Failed to read revision: %d\n", ret);
1675                goto err;
1676        }
1677        rev = (ret & WM831X_PARENT_REV_MASK) >> WM831X_PARENT_REV_SHIFT;
1678
1679        ret = wm831x_reg_read(wm831x, WM831X_RESET_ID);
1680        if (ret < 0) {
1681                dev_err(wm831x->dev, "Failed to read device ID: %d\n", ret);
1682                goto err;
1683        }
1684
1685        /* Some engineering samples do not have the ID set, rely on
1686         * the device being registered correctly.
1687         */
1688        if (ret == 0) {
1689                dev_info(wm831x->dev, "Device is an engineering sample\n");
1690                ret = id;
1691        }
1692
1693        switch (ret) {
1694        case WM8310:
1695                parent = WM8310;
1696                wm831x->num_gpio = 16;
1697                wm831x->charger_irq_wake = 1;
1698                if (rev > 0) {
1699                        wm831x->has_gpio_ena = 1;
1700                        wm831x->has_cs_sts = 1;
1701                }
1702
1703                dev_info(wm831x->dev, "WM8310 revision %c\n", 'A' + rev);
1704                break;
1705
1706        case WM8311:
1707                parent = WM8311;
1708                wm831x->num_gpio = 16;
1709                wm831x->charger_irq_wake = 1;
1710                if (rev > 0) {
1711                        wm831x->has_gpio_ena = 1;
1712                        wm831x->has_cs_sts = 1;
1713                }
1714
1715                dev_info(wm831x->dev, "WM8311 revision %c\n", 'A' + rev);
1716                break;
1717
1718        case WM8312:
1719                parent = WM8312;
1720                wm831x->num_gpio = 16;
1721                wm831x->charger_irq_wake = 1;
1722                if (rev > 0) {
1723                        wm831x->has_gpio_ena = 1;
1724                        wm831x->has_cs_sts = 1;
1725                }
1726
1727                dev_info(wm831x->dev, "WM8312 revision %c\n", 'A' + rev);
1728                break;
1729
1730        case WM8320:
1731                parent = WM8320;
1732                wm831x->num_gpio = 12;
1733                dev_info(wm831x->dev, "WM8320 revision %c\n", 'A' + rev);
1734                break;
1735
1736        case WM8321:
1737                parent = WM8321;
1738                wm831x->num_gpio = 12;
1739                dev_info(wm831x->dev, "WM8321 revision %c\n", 'A' + rev);
1740                break;
1741
1742        case WM8325:
1743                parent = WM8325;
1744                wm831x->num_gpio = 12;
1745                dev_info(wm831x->dev, "WM8325 revision %c\n", 'A' + rev);
1746                break;
1747
1748        case WM8326:
1749                parent = WM8326;
1750                wm831x->num_gpio = 12;
1751                dev_info(wm831x->dev, "WM8326 revision %c\n", 'A' + rev);
1752                break;
1753
1754        default:
1755                dev_err(wm831x->dev, "Unknown WM831x device %04x\n", ret);
1756                ret = -EINVAL;
1757                goto err;
1758        }
1759
1760        /* This will need revisiting in future but is OK for all
1761         * current parts.
1762         */
1763        if (parent != id)
1764                dev_warn(wm831x->dev, "Device was registered as a WM%lx\n",
1765                         id);
1766
1767        /* Bootstrap the user key */
1768        ret = wm831x_reg_read(wm831x, WM831X_SECURITY_KEY);
1769        if (ret < 0) {
1770                dev_err(wm831x->dev, "Failed to read security key: %d\n", ret);
1771                goto err;
1772        }
1773        if (ret != 0) {
1774                dev_warn(wm831x->dev, "Security key had non-zero value %x\n",
1775                         ret);
1776                wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0);
1777        }
1778        wm831x->locked = 1;
1779
1780        if (pdata && pdata->pre_init) {
1781                ret = pdata->pre_init(wm831x);
1782                if (ret != 0) {
1783                        dev_err(wm831x->dev, "pre_init() failed: %d\n", ret);
1784                        goto err;
1785                }
1786        }
1787
1788        if (pdata) {
1789                for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
1790                        if (!pdata->gpio_defaults[i])
1791                                continue;
1792
1793                        wm831x_reg_write(wm831x,
1794                                         WM831X_GPIO1_CONTROL + i,
1795                                         pdata->gpio_defaults[i] & 0xffff);
1796                }
1797        }
1798
1799        /* Multiply by 10 as we have many subdevices of the same type */
1800        if (pdata && pdata->wm831x_num)
1801                wm831x_num = pdata->wm831x_num * 10;
1802        else
1803                wm831x_num = -1;
1804
1805        ret = wm831x_irq_init(wm831x, irq);
1806        if (ret != 0)
1807                goto err;
1808
1809        wm831x_auxadc_init(wm831x);
1810
1811        /* The core device is up, instantiate the subdevices. */
1812        switch (parent) {
1813        case WM8310:
1814                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1815                                      wm8310_devs, ARRAY_SIZE(wm8310_devs),
1816                                      NULL, 0, NULL);
1817                break;
1818
1819        case WM8311:
1820                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1821                                      wm8311_devs, ARRAY_SIZE(wm8311_devs),
1822                                      NULL, 0, NULL);
1823                if (!pdata || !pdata->disable_touch)
1824                        mfd_add_devices(wm831x->dev, wm831x_num,
1825                                        touch_devs, ARRAY_SIZE(touch_devs),
1826                                        NULL, 0, NULL);
1827                break;
1828
1829        case WM8312:
1830                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1831                                      wm8312_devs, ARRAY_SIZE(wm8312_devs),
1832                                      NULL, 0, NULL);
1833                if (!pdata || !pdata->disable_touch)
1834                        mfd_add_devices(wm831x->dev, wm831x_num,
1835                                        touch_devs, ARRAY_SIZE(touch_devs),
1836                                        NULL, 0, NULL);
1837                break;
1838
1839        case WM8320:
1840        case WM8321:
1841        case WM8325:
1842        case WM8326:
1843                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1844                                      wm8320_devs, ARRAY_SIZE(wm8320_devs),
1845                                      NULL, 0, NULL);
1846                break;
1847
1848        default:
1849                /* If this happens the bus probe function is buggy */
1850                BUG();
1851        }
1852
1853        if (ret != 0) {
1854                dev_err(wm831x->dev, "Failed to add children\n");
1855                goto err_irq;
1856        }
1857
1858        /* The RTC can only be used if the 32.768kHz crystal is
1859         * enabled; this can't be controlled by software at runtime.
1860         */
1861        ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2);
1862        if (ret < 0) {
1863                dev_err(wm831x->dev, "Failed to read clock status: %d\n", ret);
1864                goto err_irq;
1865        }
1866
1867        if (ret & WM831X_XTAL_ENA) {
1868                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1869                                      rtc_devs, ARRAY_SIZE(rtc_devs),
1870                                      NULL, 0, NULL);
1871                if (ret != 0) {
1872                        dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret);
1873                        goto err_irq;
1874                }
1875        } else {
1876                dev_info(wm831x->dev, "32.768kHz clock disabled, no RTC\n");
1877        }
1878
1879        if (pdata && pdata->backlight) {
1880                /* Treat errors as non-critical */
1881                ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs,
1882                                      ARRAY_SIZE(backlight_devs), NULL,
1883                                      0, NULL);
1884                if (ret < 0)
1885                        dev_err(wm831x->dev, "Failed to add backlight: %d\n",
1886                                ret);
1887        }
1888
1889        wm831x_otp_init(wm831x);
1890
1891        if (pdata && pdata->post_init) {
1892                ret = pdata->post_init(wm831x);
1893                if (ret != 0) {
1894                        dev_err(wm831x->dev, "post_init() failed: %d\n", ret);
1895                        goto err_irq;
1896                }
1897        }
1898
1899        return 0;
1900
1901err_irq:
1902        wm831x_irq_exit(wm831x);
1903err:
1904        mfd_remove_devices(wm831x->dev);
1905        return ret;
1906}
1907
1908void wm831x_device_exit(struct wm831x *wm831x)
1909{
1910        wm831x_otp_exit(wm831x);
1911        mfd_remove_devices(wm831x->dev);
1912        free_irq(wm831x_irq(wm831x, WM831X_IRQ_AUXADC_DATA), wm831x);
1913        wm831x_irq_exit(wm831x);
1914}
1915
1916int wm831x_device_suspend(struct wm831x *wm831x)
1917{
1918        int reg, mask;
1919
1920        /* If the charger IRQs are a wake source then make sure we ack
1921         * them even if they're not actively being used (eg, no power
1922         * driver or no IRQ line wired up) then acknowledge the
1923         * interrupts otherwise suspend won't last very long.
1924         */
1925        if (wm831x->charger_irq_wake) {
1926                reg = wm831x_reg_read(wm831x, WM831X_INTERRUPT_STATUS_2_MASK);
1927
1928                mask = WM831X_CHG_BATT_HOT_EINT |
1929                        WM831X_CHG_BATT_COLD_EINT |
1930                        WM831X_CHG_BATT_FAIL_EINT |
1931                        WM831X_CHG_OV_EINT | WM831X_CHG_END_EINT |
1932                        WM831X_CHG_TO_EINT | WM831X_CHG_MODE_EINT |
1933                        WM831X_CHG_START_EINT;
1934
1935                /* If any of the interrupts are masked read the statuses */
1936                if (reg & mask)
1937                        reg = wm831x_reg_read(wm831x,
1938                                              WM831X_INTERRUPT_STATUS_2);
1939
1940                if (reg & mask) {
1941                        dev_info(wm831x->dev,
1942                                 "Acknowledging masked charger IRQs: %x\n",
1943                                 reg & mask);
1944                        wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_2,
1945                                         reg & mask);
1946                }
1947        }
1948
1949        return 0;
1950}
1951
1952void wm831x_device_shutdown(struct wm831x *wm831x)
1953{
1954        if (wm831x->soft_shutdown) {
1955                dev_info(wm831x->dev, "Initiating shutdown...\n");
1956                wm831x_set_bits(wm831x, WM831X_POWER_STATE, WM831X_CHIP_ON, 0);
1957        }
1958}
1959EXPORT_SYMBOL_GPL(wm831x_device_shutdown);
1960
1961MODULE_DESCRIPTION("Core support for the WM831X AudioPlus PMIC");
1962MODULE_LICENSE("GPL");
1963MODULE_AUTHOR("Mark Brown");
1964
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.