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_dcdc1_resources[] = {
 618        {
 619                .start = WM831X_DC1_CONTROL_1,
 620                .end   = WM831X_DC1_DVS_CONTROL,
 621                .flags = IORESOURCE_REG,
 622        },
 623        {
 624                .name  = "UV",
 625                .start = WM831X_IRQ_UV_DC1,
 626                .end   = WM831X_IRQ_UV_DC1,
 627                .flags = IORESOURCE_IRQ,
 628        },
 629        {
 630                .name  = "HC",
 631                .start = WM831X_IRQ_HC_DC1,
 632                .end   = WM831X_IRQ_HC_DC1,
 633                .flags = IORESOURCE_IRQ,
 634        },
 635};
 636
 637
 638static struct resource wm831x_dcdc2_resources[] = {
 639        {
 640                .start = WM831X_DC2_CONTROL_1,
 641                .end   = WM831X_DC2_DVS_CONTROL,
 642                .flags = IORESOURCE_REG,
 643        },
 644        {
 645                .name  = "UV",
 646                .start = WM831X_IRQ_UV_DC2,
 647                .end   = WM831X_IRQ_UV_DC2,
 648                .flags = IORESOURCE_IRQ,
 649        },
 650        {
 651                .name  = "HC",
 652                .start = WM831X_IRQ_HC_DC2,
 653                .end   = WM831X_IRQ_HC_DC2,
 654                .flags = IORESOURCE_IRQ,
 655        },
 656};
 657
 658static struct resource wm831x_dcdc3_resources[] = {
 659        {
 660                .start = WM831X_DC3_CONTROL_1,
 661                .end   = WM831X_DC3_SLEEP_CONTROL,
 662                .flags = IORESOURCE_REG,
 663        },
 664        {
 665                .name  = "UV",
 666                .start = WM831X_IRQ_UV_DC3,
 667                .end   = WM831X_IRQ_UV_DC3,
 668                .flags = IORESOURCE_IRQ,
 669        },
 670};
 671
 672static struct resource wm831x_dcdc4_resources[] = {
 673        {
 674                .start = WM831X_DC4_CONTROL,
 675                .end   = WM831X_DC4_SLEEP_CONTROL,
 676                .flags = IORESOURCE_REG,
 677        },
 678        {
 679                .name  = "UV",
 680                .start = WM831X_IRQ_UV_DC4,
 681                .end   = WM831X_IRQ_UV_DC4,
 682                .flags = IORESOURCE_IRQ,
 683        },
 684};
 685
 686static struct resource wm8320_dcdc4_buck_resources[] = {
 687        {
 688                .start = WM831X_DC4_CONTROL,
 689                .end   = WM832X_DC4_SLEEP_CONTROL,
 690                .flags = IORESOURCE_REG,
 691        },
 692        {
 693                .name  = "UV",
 694                .start = WM831X_IRQ_UV_DC4,
 695                .end   = WM831X_IRQ_UV_DC4,
 696                .flags = IORESOURCE_IRQ,
 697        },
 698};
 699
 700static struct resource wm831x_gpio_resources[] = {
 701        {
 702                .start = WM831X_IRQ_GPIO_1,
 703                .end   = WM831X_IRQ_GPIO_16,
 704                .flags = IORESOURCE_IRQ,
 705        },
 706};
 707
 708static struct resource wm831x_isink1_resources[] = {
 709        {
 710                .start = WM831X_CURRENT_SINK_1,
 711                .end   = WM831X_CURRENT_SINK_1,
 712                .flags = IORESOURCE_REG,
 713        },
 714        {
 715                .start = WM831X_IRQ_CS1,
 716                .end   = WM831X_IRQ_CS1,
 717                .flags = IORESOURCE_IRQ,
 718        },
 719};
 720
 721static struct resource wm831x_isink2_resources[] = {
 722        {
 723                .start = WM831X_CURRENT_SINK_2,
 724                .end   = WM831X_CURRENT_SINK_2,
 725                .flags = IORESOURCE_REG,
 726        },
 727        {
 728                .start = WM831X_IRQ_CS2,
 729                .end   = WM831X_IRQ_CS2,
 730                .flags = IORESOURCE_IRQ,
 731        },
 732};
 733
 734static struct resource wm831x_ldo1_resources[] = {
 735        {
 736                .start = WM831X_LDO1_CONTROL,
 737                .end   = WM831X_LDO1_SLEEP_CONTROL,
 738                .flags = IORESOURCE_REG,
 739        },
 740        {
 741                .name  = "UV",
 742                .start = WM831X_IRQ_UV_LDO1,
 743                .end   = WM831X_IRQ_UV_LDO1,
 744                .flags = IORESOURCE_IRQ,
 745        },
 746};
 747
 748static struct resource wm831x_ldo2_resources[] = {
 749        {
 750                .start = WM831X_LDO2_CONTROL,
 751                .end   = WM831X_LDO2_SLEEP_CONTROL,
 752                .flags = IORESOURCE_REG,
 753        },
 754        {
 755                .name  = "UV",
 756                .start = WM831X_IRQ_UV_LDO2,
 757                .end   = WM831X_IRQ_UV_LDO2,
 758                .flags = IORESOURCE_IRQ,
 759        },
 760};
 761
 762static struct resource wm831x_ldo3_resources[] = {
 763        {
 764                .start = WM831X_LDO3_CONTROL,
 765                .end   = WM831X_LDO3_SLEEP_CONTROL,
 766                .flags = IORESOURCE_REG,
 767        },
 768        {
 769                .name  = "UV",
 770                .start = WM831X_IRQ_UV_LDO3,
 771                .end   = WM831X_IRQ_UV_LDO3,
 772                .flags = IORESOURCE_IRQ,
 773        },
 774};
 775
 776static struct resource wm831x_ldo4_resources[] = {
 777        {
 778                .start = WM831X_LDO4_CONTROL,
 779                .end   = WM831X_LDO4_SLEEP_CONTROL,
 780                .flags = IORESOURCE_REG,
 781        },
 782        {
 783                .name  = "UV",
 784                .start = WM831X_IRQ_UV_LDO4,
 785                .end   = WM831X_IRQ_UV_LDO4,
 786                .flags = IORESOURCE_IRQ,
 787        },
 788};
 789
 790static struct resource wm831x_ldo5_resources[] = {
 791        {
 792                .start = WM831X_LDO5_CONTROL,
 793                .end   = WM831X_LDO5_SLEEP_CONTROL,
 794                .flags = IORESOURCE_REG,
 795        },
 796        {
 797                .name  = "UV",
 798                .start = WM831X_IRQ_UV_LDO5,
 799                .end   = WM831X_IRQ_UV_LDO5,
 800                .flags = IORESOURCE_IRQ,
 801        },
 802};
 803
 804static struct resource wm831x_ldo6_resources[] = {
 805        {
 806                .start = WM831X_LDO6_CONTROL,
 807                .end   = WM831X_LDO6_SLEEP_CONTROL,
 808                .flags = IORESOURCE_REG,
 809        },
 810        {
 811                .name  = "UV",
 812                .start = WM831X_IRQ_UV_LDO6,
 813                .end   = WM831X_IRQ_UV_LDO6,
 814                .flags = IORESOURCE_IRQ,
 815        },
 816};
 817
 818static struct resource wm831x_ldo7_resources[] = {
 819        {
 820                .start = WM831X_LDO7_CONTROL,
 821                .end   = WM831X_LDO7_SLEEP_CONTROL,
 822                .flags = IORESOURCE_REG,
 823        },
 824        {
 825                .name  = "UV",
 826                .start = WM831X_IRQ_UV_LDO7,
 827                .end   = WM831X_IRQ_UV_LDO7,
 828                .flags = IORESOURCE_IRQ,
 829        },
 830};
 831
 832static struct resource wm831x_ldo8_resources[] = {
 833        {
 834                .start = WM831X_LDO8_CONTROL,
 835                .end   = WM831X_LDO8_SLEEP_CONTROL,
 836                .flags = IORESOURCE_REG,
 837        },
 838        {
 839                .name  = "UV",
 840                .start = WM831X_IRQ_UV_LDO8,
 841                .end   = WM831X_IRQ_UV_LDO8,
 842                .flags = IORESOURCE_IRQ,
 843        },
 844};
 845
 846static struct resource wm831x_ldo9_resources[] = {
 847        {
 848                .start = WM831X_LDO9_CONTROL,
 849                .end   = WM831X_LDO9_SLEEP_CONTROL,
 850                .flags = IORESOURCE_REG,
 851        },
 852        {
 853                .name  = "UV",
 854                .start = WM831X_IRQ_UV_LDO9,
 855                .end   = WM831X_IRQ_UV_LDO9,
 856                .flags = IORESOURCE_IRQ,
 857        },
 858};
 859
 860static struct resource wm831x_ldo10_resources[] = {
 861        {
 862                .start = WM831X_LDO10_CONTROL,
 863                .end   = WM831X_LDO10_SLEEP_CONTROL,
 864                .flags = IORESOURCE_REG,
 865        },
 866        {
 867                .name  = "UV",
 868                .start = WM831X_IRQ_UV_LDO10,
 869                .end   = WM831X_IRQ_UV_LDO10,
 870                .flags = IORESOURCE_IRQ,
 871        },
 872};
 873
 874static struct resource wm831x_ldo11_resources[] = {
 875        {
 876                .start = WM831X_LDO11_ON_CONTROL,
 877                .end   = WM831X_LDO11_SLEEP_CONTROL,
 878                .flags = IORESOURCE_REG,
 879        },
 880};
 881
 882static struct resource wm831x_on_resources[] = {
 883        {
 884                .start = WM831X_IRQ_ON,
 885                .end   = WM831X_IRQ_ON,
 886                .flags = IORESOURCE_IRQ,
 887        },
 888};
 889
 890
 891static struct resource wm831x_power_resources[] = {
 892        {
 893                .name = "SYSLO",
 894                .start = WM831X_IRQ_PPM_SYSLO,
 895                .end   = WM831X_IRQ_PPM_SYSLO,
 896                .flags = IORESOURCE_IRQ,
 897        },
 898        {
 899                .name = "PWR SRC",
 900                .start = WM831X_IRQ_PPM_PWR_SRC,
 901                .end   = WM831X_IRQ_PPM_PWR_SRC,
 902                .flags = IORESOURCE_IRQ,
 903        },
 904        {
 905                .name = "USB CURR",
 906                .start = WM831X_IRQ_PPM_USB_CURR,
 907                .end   = WM831X_IRQ_PPM_USB_CURR,
 908                .flags = IORESOURCE_IRQ,
 909        },
 910        {
 911                .name = "BATT HOT",
 912                .start = WM831X_IRQ_CHG_BATT_HOT,
 913                .end   = WM831X_IRQ_CHG_BATT_HOT,
 914                .flags = IORESOURCE_IRQ,
 915        },
 916        {
 917                .name = "BATT COLD",
 918                .start = WM831X_IRQ_CHG_BATT_COLD,
 919                .end   = WM831X_IRQ_CHG_BATT_COLD,
 920                .flags = IORESOURCE_IRQ,
 921        },
 922        {
 923                .name = "BATT FAIL",
 924                .start = WM831X_IRQ_CHG_BATT_FAIL,
 925                .end   = WM831X_IRQ_CHG_BATT_FAIL,
 926                .flags = IORESOURCE_IRQ,
 927        },
 928        {
 929                .name = "OV",
 930                .start = WM831X_IRQ_CHG_OV,
 931                .end   = WM831X_IRQ_CHG_OV,
 932                .flags = IORESOURCE_IRQ,
 933        },
 934        {
 935                .name = "END",
 936                .start = WM831X_IRQ_CHG_END,
 937                .end   = WM831X_IRQ_CHG_END,
 938                .flags = IORESOURCE_IRQ,
 939        },
 940        {
 941                .name = "TO",
 942                .start = WM831X_IRQ_CHG_TO,
 943                .end   = WM831X_IRQ_CHG_TO,
 944                .flags = IORESOURCE_IRQ,
 945        },
 946        {
 947                .name = "MODE",
 948                .start = WM831X_IRQ_CHG_MODE,
 949                .end   = WM831X_IRQ_CHG_MODE,
 950                .flags = IORESOURCE_IRQ,
 951        },
 952        {
 953                .name = "START",
 954                .start = WM831X_IRQ_CHG_START,
 955                .end   = WM831X_IRQ_CHG_START,
 956                .flags = IORESOURCE_IRQ,
 957        },
 958};
 959
 960static struct resource wm831x_rtc_resources[] = {
 961        {
 962                .name = "PER",
 963                .start = WM831X_IRQ_RTC_PER,
 964                .end   = WM831X_IRQ_RTC_PER,
 965                .flags = IORESOURCE_IRQ,
 966        },
 967        {
 968                .name = "ALM",
 969                .start = WM831X_IRQ_RTC_ALM,
 970                .end   = WM831X_IRQ_RTC_ALM,
 971                .flags = IORESOURCE_IRQ,
 972        },
 973};
 974
 975static struct resource wm831x_status1_resources[] = {
 976        {
 977                .start = WM831X_STATUS_LED_1,
 978                .end   = WM831X_STATUS_LED_1,
 979                .flags = IORESOURCE_REG,
 980        },
 981};
 982
 983static struct resource wm831x_status2_resources[] = {
 984        {
 985                .start = WM831X_STATUS_LED_2,
 986                .end   = WM831X_STATUS_LED_2,
 987                .flags = IORESOURCE_REG,
 988        },
 989};
 990
 991static struct resource wm831x_touch_resources[] = {
 992        {
 993                .name = "TCHPD",
 994                .start = WM831X_IRQ_TCHPD,
 995                .end   = WM831X_IRQ_TCHPD,
 996                .flags = IORESOURCE_IRQ,
 997        },
 998        {
 999                .name = "TCHDATA",
1000                .start = WM831X_IRQ_TCHDATA,
1001                .end   = WM831X_IRQ_TCHDATA,
1002                .flags = IORESOURCE_IRQ,
1003        },
1004};
1005
1006static struct resource wm831x_wdt_resources[] = {
1007        {
1008                .start = WM831X_IRQ_WDOG_TO,
1009                .end   = WM831X_IRQ_WDOG_TO,
1010                .flags = IORESOURCE_IRQ,
1011        },
1012};
1013
1014static struct mfd_cell wm8310_devs[] = {
1015        {
1016                .name = "wm831x-backup",
1017        },
1018        {
1019                .name = "wm831x-buckv",
1020                .id = 1,
1021                .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1022                .resources = wm831x_dcdc1_resources,
1023        },
1024        {
1025                .name = "wm831x-buckv",
1026                .id = 2,
1027                .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1028                .resources = wm831x_dcdc2_resources,
1029        },
1030        {
1031                .name = "wm831x-buckp",
1032                .id = 3,
1033                .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1034                .resources = wm831x_dcdc3_resources,
1035        },
1036        {
1037                .name = "wm831x-boostp",
1038                .id = 4,
1039                .num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
1040                .resources = wm831x_dcdc4_resources,
1041        },
1042        {
1043                .name = "wm831x-clk",
1044        },
1045        {
1046                .name = "wm831x-epe",
1047                .id = 1,
1048        },
1049        {
1050                .name = "wm831x-epe",
1051                .id = 2,
1052        },
1053        {
1054                .name = "wm831x-gpio",
1055                .num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1056                .resources = wm831x_gpio_resources,
1057        },
1058        {
1059                .name = "wm831x-hwmon",
1060        },
1061        {
1062                .name = "wm831x-isink",
1063                .id = 1,
1064                .num_resources = ARRAY_SIZE(wm831x_isink1_resources),
1065                .resources = wm831x_isink1_resources,
1066        },
1067        {
1068                .name = "wm831x-isink",
1069                .id = 2,
1070                .num_resources = ARRAY_SIZE(wm831x_isink2_resources),
1071                .resources = wm831x_isink2_resources,
1072        },
1073        {
1074                .name = "wm831x-ldo",
1075                .id = 1,
1076                .num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1077                .resources = wm831x_ldo1_resources,
1078        },
1079        {
1080                .name = "wm831x-ldo",
1081                .id = 2,
1082                .num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1083                .resources = wm831x_ldo2_resources,
1084        },
1085        {
1086                .name = "wm831x-ldo",
1087                .id = 3,
1088                .num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1089                .resources = wm831x_ldo3_resources,
1090        },
1091        {
1092                .name = "wm831x-ldo",
1093                .id = 4,
1094                .num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1095                .resources = wm831x_ldo4_resources,
1096        },
1097        {
1098                .name = "wm831x-ldo",
1099                .id = 5,
1100                .num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1101                .resources = wm831x_ldo5_resources,
1102        },
1103        {
1104                .name = "wm831x-ldo",
1105                .id = 6,
1106                .num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
1107                .resources = wm831x_ldo6_resources,
1108        },
1109        {
1110                .name = "wm831x-aldo",
1111                .id = 7,
1112                .num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1113                .resources = wm831x_ldo7_resources,
1114        },
1115        {
1116                .name = "wm831x-aldo",
1117                .id = 8,
1118                .num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
1119                .resources = wm831x_ldo8_resources,
1120        },
1121        {
1122                .name = "wm831x-aldo",
1123                .id = 9,
1124                .num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
1125                .resources = wm831x_ldo9_resources,
1126        },
1127        {
1128                .name = "wm831x-aldo",
1129                .id = 10,
1130                .num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
1131                .resources = wm831x_ldo10_resources,
1132        },
1133        {
1134                .name = "wm831x-alive-ldo",
1135                .id = 11,
1136                .num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1137                .resources = wm831x_ldo11_resources,
1138        },
1139        {
1140                .name = "wm831x-on",
1141                .num_resources = ARRAY_SIZE(wm831x_on_resources),
1142                .resources = wm831x_on_resources,
1143        },
1144        {
1145                .name = "wm831x-power",
1146                .num_resources = ARRAY_SIZE(wm831x_power_resources),
1147                .resources = wm831x_power_resources,
1148        },
1149        {
1150                .name = "wm831x-status",
1151                .id = 1,
1152                .num_resources = ARRAY_SIZE(wm831x_status1_resources),
1153                .resources = wm831x_status1_resources,
1154        },
1155        {
1156                .name = "wm831x-status",
1157                .id = 2,
1158                .num_resources = ARRAY_SIZE(wm831x_status2_resources),
1159                .resources = wm831x_status2_resources,
1160        },
1161        {
1162                .name = "wm831x-watchdog",
1163                .num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1164                .resources = wm831x_wdt_resources,
1165        },
1166};
1167
1168static struct mfd_cell wm8311_devs[] = {
1169        {
1170                .name = "wm831x-backup",
1171        },
1172        {
1173                .name = "wm831x-buckv",
1174                .id = 1,
1175                .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1176                .resources = wm831x_dcdc1_resources,
1177        },
1178        {
1179                .name = "wm831x-buckv",
1180                .id = 2,
1181                .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1182                .resources = wm831x_dcdc2_resources,
1183        },
1184        {
1185                .name = "wm831x-buckp",
1186                .id = 3,
1187                .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1188                .resources = wm831x_dcdc3_resources,
1189        },
1190        {
1191                .name = "wm831x-boostp",
1192                .id = 4,
1193                .num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
1194                .resources = wm831x_dcdc4_resources,
1195        },
1196        {
1197                .name = "wm831x-clk",
1198        },
1199        {
1200                .name = "wm831x-epe",
1201                .id = 1,
1202        },
1203        {
1204                .name = "wm831x-epe",
1205                .id = 2,
1206        },
1207        {
1208                .name = "wm831x-gpio",
1209                .num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1210                .resources = wm831x_gpio_resources,
1211        },
1212        {
1213                .name = "wm831x-hwmon",
1214        },
1215        {
1216                .name = "wm831x-isink",
1217                .id = 1,
1218                .num_resources = ARRAY_SIZE(wm831x_isink1_resources),
1219                .resources = wm831x_isink1_resources,
1220        },
1221        {
1222                .name = "wm831x-isink",
1223                .id = 2,
1224                .num_resources = ARRAY_SIZE(wm831x_isink2_resources),
1225                .resources = wm831x_isink2_resources,
1226        },
1227        {
1228                .name = "wm831x-ldo",
1229                .id = 1,
1230                .num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1231                .resources = wm831x_ldo1_resources,
1232        },
1233        {
1234                .name = "wm831x-ldo",
1235                .id = 2,
1236                .num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1237                .resources = wm831x_ldo2_resources,
1238        },
1239        {
1240                .name = "wm831x-ldo",
1241                .id = 3,
1242                .num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1243                .resources = wm831x_ldo3_resources,
1244        },
1245        {
1246                .name = "wm831x-ldo",
1247                .id = 4,
1248                .num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1249                .resources = wm831x_ldo4_resources,
1250        },
1251        {
1252                .name = "wm831x-ldo",
1253                .id = 5,
1254                .num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1255                .resources = wm831x_ldo5_resources,
1256        },
1257        {
1258                .name = "wm831x-aldo",
1259                .id = 7,
1260                .num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1261                .resources = wm831x_ldo7_resources,
1262        },
1263        {
1264                .name = "wm831x-alive-ldo",
1265                .id = 11,
1266                .num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1267                .resources = wm831x_ldo11_resources,
1268        },
1269        {
1270                .name = "wm831x-on",
1271                .num_resources = ARRAY_SIZE(wm831x_on_resources),
1272                .resources = wm831x_on_resources,
1273        },
1274        {
1275                .name = "wm831x-power",
1276                .num_resources = ARRAY_SIZE(wm831x_power_resources),
1277                .resources = wm831x_power_resources,
1278        },
1279        {
1280                .name = "wm831x-status",
1281                .id = 1,
1282                .num_resources = ARRAY_SIZE(wm831x_status1_resources),
1283                .resources = wm831x_status1_resources,
1284        },
1285        {
1286                .name = "wm831x-status",
1287                .id = 2,
1288                .num_resources = ARRAY_SIZE(wm831x_status2_resources),
1289                .resources = wm831x_status2_resources,
1290        },
1291        {
1292                .name = "wm831x-watchdog",
1293                .num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1294                .resources = wm831x_wdt_resources,
1295        },
1296};
1297
1298static struct mfd_cell wm8312_devs[] = {
1299        {
1300                .name = "wm831x-backup",
1301        },
1302        {
1303                .name = "wm831x-buckv",
1304                .id = 1,
1305                .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1306                .resources = wm831x_dcdc1_resources,
1307        },
1308        {
1309                .name = "wm831x-buckv",
1310                .id = 2,
1311                .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1312                .resources = wm831x_dcdc2_resources,
1313        },
1314        {
1315                .name = "wm831x-buckp",
1316                .id = 3,
1317                .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1318                .resources = wm831x_dcdc3_resources,
1319        },
1320        {
1321                .name = "wm831x-boostp",
1322                .id = 4,
1323                .num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
1324                .resources = wm831x_dcdc4_resources,
1325        },
1326        {
1327                .name = "wm831x-clk",
1328        },
1329        {
1330                .name = "wm831x-epe",
1331                .id = 1,
1332        },
1333        {
1334                .name = "wm831x-epe",
1335                .id = 2,
1336        },
1337        {
1338                .name = "wm831x-gpio",
1339                .num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1340                .resources = wm831x_gpio_resources,
1341        },
1342        {
1343                .name = "wm831x-hwmon",
1344        },
1345        {
1346                .name = "wm831x-isink",
1347                .id = 1,
1348                .num_resources = ARRAY_SIZE(wm831x_isink1_resources),
1349                .resources = wm831x_isink1_resources,
1350        },
1351        {
1352                .name = "wm831x-isink",
1353                .id = 2,
1354                .num_resources = ARRAY_SIZE(wm831x_isink2_resources),
1355                .resources = wm831x_isink2_resources,
1356        },
1357        {
1358                .name = "wm831x-ldo",
1359                .id = 1,
1360                .num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1361                .resources = wm831x_ldo1_resources,
1362        },
1363        {
1364                .name = "wm831x-ldo",
1365                .id = 2,
1366                .num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1367                .resources = wm831x_ldo2_resources,
1368        },
1369        {
1370                .name = "wm831x-ldo",
1371                .id = 3,
1372                .num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1373                .resources = wm831x_ldo3_resources,
1374        },
1375        {
1376                .name = "wm831x-ldo",
1377                .id = 4,
1378                .num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1379                .resources = wm831x_ldo4_resources,
1380        },
1381        {
1382                .name = "wm831x-ldo",
1383                .id = 5,
1384                .num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1385                .resources = wm831x_ldo5_resources,
1386        },
1387        {
1388                .name = "wm831x-ldo",
1389                .id = 6,
1390                .num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
1391                .resources = wm831x_ldo6_resources,
1392        },
1393        {
1394                .name = "wm831x-aldo",
1395                .id = 7,
1396                .num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1397                .resources = wm831x_ldo7_resources,
1398        },
1399        {
1400                .name = "wm831x-aldo",
1401                .id = 8,
1402                .num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
1403                .resources = wm831x_ldo8_resources,
1404        },
1405        {
1406                .name = "wm831x-aldo",
1407                .id = 9,
1408                .num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
1409                .resources = wm831x_ldo9_resources,
1410        },
1411        {
1412                .name = "wm831x-aldo",
1413                .id = 10,
1414                .num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
1415                .resources = wm831x_ldo10_resources,
1416        },
1417        {
1418                .name = "wm831x-alive-ldo",
1419                .id = 11,
1420                .num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1421                .resources = wm831x_ldo11_resources,
1422        },
1423        {
1424                .name = "wm831x-on",
1425                .num_resources = ARRAY_SIZE(wm831x_on_resources),
1426                .resources = wm831x_on_resources,
1427        },
1428        {
1429                .name = "wm831x-power",
1430                .num_resources = ARRAY_SIZE(wm831x_power_resources),
1431                .resources = wm831x_power_resources,
1432        },
1433        {
1434                .name = "wm831x-status",
1435                .id = 1,
1436                .num_resources = ARRAY_SIZE(wm831x_status1_resources),
1437                .resources = wm831x_status1_resources,
1438        },
1439        {
1440                .name = "wm831x-status",
1441                .id = 2,
1442                .num_resources = ARRAY_SIZE(wm831x_status2_resources),
1443                .resources = wm831x_status2_resources,
1444        },
1445        {
1446                .name = "wm831x-watchdog",
1447                .num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1448                .resources = wm831x_wdt_resources,
1449        },
1450};
1451
1452static struct mfd_cell wm8320_devs[] = {
1453        {
1454                .name = "wm831x-backup",
1455        },
1456        {
1457                .name = "wm831x-buckv",
1458                .id = 1,
1459                .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1460                .resources = wm831x_dcdc1_resources,
1461        },
1462        {
1463                .name = "wm831x-buckv",
1464                .id = 2,
1465                .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1466                .resources = wm831x_dcdc2_resources,
1467        },
1468        {
1469                .name = "wm831x-buckp",
1470                .id = 3,
1471                .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1472                .resources = wm831x_dcdc3_resources,
1473        },
1474        {
1475                .name = "wm831x-buckp",
1476                .id = 4,
1477                .num_resources = ARRAY_SIZE(wm8320_dcdc4_buck_resources),
1478                .resources = wm8320_dcdc4_buck_resources,
1479        },
1480        {
1481                .name = "wm831x-clk",
1482        },
1483        {
1484                .name = "wm831x-gpio",
1485                .num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1486                .resources = wm831x_gpio_resources,
1487        },
1488        {
1489                .name = "wm831x-hwmon",
1490        },
1491        {
1492                .name = "wm831x-ldo",
1493                .id = 1,
1494                .num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1495                .resources = wm831x_ldo1_resources,
1496        },
1497        {
1498                .name = "wm831x-ldo",
1499                .id = 2,
1500                .num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1501                .resources = wm831x_ldo2_resources,
1502        },
1503        {
1504                .name = "wm831x-ldo",
1505                .id = 3,
1506                .num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1507                .resources = wm831x_ldo3_resources,
1508        },
1509        {
1510                .name = "wm831x-ldo",
1511                .id = 4,
1512                .num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1513                .resources = wm831x_ldo4_resources,
1514        },
1515        {
1516                .name = "wm831x-ldo",
1517                .id = 5,
1518                .num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1519                .resources = wm831x_ldo5_resources,
1520        },
1521        {
1522                .name = "wm831x-ldo",
1523                .id = 6,
1524                .num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
1525                .resources = wm831x_ldo6_resources,
1526        },
1527        {
1528                .name = "wm831x-aldo",
1529                .id = 7,
1530                .num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1531                .resources = wm831x_ldo7_resources,
1532        },
1533        {
1534                .name = "wm831x-aldo",
1535                .id = 8,
1536                .num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
1537                .resources = wm831x_ldo8_resources,
1538        },
1539        {
1540                .name = "wm831x-aldo",
1541                .id = 9,
1542                .num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
1543                .resources = wm831x_ldo9_resources,
1544        },
1545        {
1546                .name = "wm831x-aldo",
1547                .id = 10,
1548                .num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
1549                .resources = wm831x_ldo10_resources,
1550        },
1551        {
1552                .name = "wm831x-alive-ldo",
1553                .id = 11,
1554                .num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1555                .resources = wm831x_ldo11_resources,
1556        },
1557        {
1558                .name = "wm831x-on",
1559                .num_resources = ARRAY_SIZE(wm831x_on_resources),
1560                .resources = wm831x_on_resources,
1561        },
1562        {
1563                .name = "wm831x-status",
1564                .id = 1,
1565                .num_resources = ARRAY_SIZE(wm831x_status1_resources),
1566                .resources = wm831x_status1_resources,
1567        },
1568        {
1569                .name = "wm831x-status",
1570                .id = 2,
1571                .num_resources = ARRAY_SIZE(wm831x_status2_resources),
1572                .resources = wm831x_status2_resources,
1573        },
1574        {
1575                .name = "wm831x-watchdog",
1576                .num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1577                .resources = wm831x_wdt_resources,
1578        },
1579};
1580
1581static struct mfd_cell touch_devs[] = {
1582        {
1583                .name = "wm831x-touch",
1584                .num_resources = ARRAY_SIZE(wm831x_touch_resources),
1585                .resources = wm831x_touch_resources,
1586        },
1587};
1588
1589static struct mfd_cell rtc_devs[] = {
1590        {
1591                .name = "wm831x-rtc",
1592                .num_resources = ARRAY_SIZE(wm831x_rtc_resources),
1593                .resources = wm831x_rtc_resources,
1594        },
1595};
1596
1597static struct mfd_cell backlight_devs[] = {
1598        {
1599                .name = "wm831x-backlight",
1600        },
1601};
1602
1603struct regmap_config wm831x_regmap_config = {
1604        .reg_bits = 16,
1605        .val_bits = 16,
1606
1607        .cache_type = REGCACHE_RBTREE,
1608
1609        .max_register = WM831X_DBE_CHECK_DATA,
1610        .readable_reg = wm831x_reg_readable,
1611        .writeable_reg = wm831x_reg_writeable,
1612        .volatile_reg = wm831x_reg_volatile,
1613};
1614EXPORT_SYMBOL_GPL(wm831x_regmap_config);
1615
1616/*
1617 * Instantiate the generic non-control parts of the device.
1618 */
1619int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
1620{
1621        struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
1622        int rev, wm831x_num;
1623        enum wm831x_parent parent;
1624        int ret, i;
1625
1626        mutex_init(&wm831x->io_lock);
1627        mutex_init(&wm831x->key_lock);
1628        dev_set_drvdata(wm831x->dev, wm831x);
1629        wm831x->soft_shutdown = pdata->soft_shutdown;
1630
1631        ret = wm831x_reg_read(wm831x, WM831X_PARENT_ID);
1632        if (ret < 0) {
1633                dev_err(wm831x->dev, "Failed to read parent ID: %d\n", ret);
1634                goto err;
1635        }
1636        switch (ret) {
1637        case 0x6204:
1638        case 0x6246:
1639                break;
1640        default:
1641                dev_err(wm831x->dev, "Device is not a WM831x: ID %x\n", ret);
1642                ret = -EINVAL;
1643                goto err;
1644        }
1645
1646        ret = wm831x_reg_read(wm831x, WM831X_REVISION);
1647        if (ret < 0) {
1648                dev_err(wm831x->dev, "Failed to read revision: %d\n", ret);
1649                goto err;
1650        }
1651        rev = (ret & WM831X_PARENT_REV_MASK) >> WM831X_PARENT_REV_SHIFT;
1652
1653        ret = wm831x_reg_read(wm831x, WM831X_RESET_ID);
1654        if (ret < 0) {
1655                dev_err(wm831x->dev, "Failed to read device ID: %d\n", ret);
1656                goto err;
1657        }
1658
1659        /* Some engineering samples do not have the ID set, rely on
1660         * the device being registered correctly.
1661         */
1662        if (ret == 0) {
1663                dev_info(wm831x->dev, "Device is an engineering sample\n");
1664                ret = id;
1665        }
1666
1667        switch (ret) {
1668        case WM8310:
1669                parent = WM8310;
1670                wm831x->num_gpio = 16;
1671                wm831x->charger_irq_wake = 1;
1672                if (rev > 0) {
1673                        wm831x->has_gpio_ena = 1;
1674                        wm831x->has_cs_sts = 1;
1675                }
1676
1677                dev_info(wm831x->dev, "WM8310 revision %c\n", 'A' + rev);
1678                break;
1679
1680        case WM8311:
1681                parent = WM8311;
1682                wm831x->num_gpio = 16;
1683                wm831x->charger_irq_wake = 1;
1684                if (rev > 0) {
1685                        wm831x->has_gpio_ena = 1;
1686                        wm831x->has_cs_sts = 1;
1687                }
1688
1689                dev_info(wm831x->dev, "WM8311 revision %c\n", 'A' + rev);
1690                break;
1691
1692        case WM8312:
1693                parent = WM8312;
1694                wm831x->num_gpio = 16;
1695                wm831x->charger_irq_wake = 1;
1696                if (rev > 0) {
1697                        wm831x->has_gpio_ena = 1;
1698                        wm831x->has_cs_sts = 1;
1699                }
1700
1701                dev_info(wm831x->dev, "WM8312 revision %c\n", 'A' + rev);
1702                break;
1703
1704        case WM8320:
1705                parent = WM8320;
1706                wm831x->num_gpio = 12;
1707                dev_info(wm831x->dev, "WM8320 revision %c\n", 'A' + rev);
1708                break;
1709
1710        case WM8321:
1711                parent = WM8321;
1712                wm831x->num_gpio = 12;
1713                dev_info(wm831x->dev, "WM8321 revision %c\n", 'A' + rev);
1714                break;
1715
1716        case WM8325:
1717                parent = WM8325;
1718                wm831x->num_gpio = 12;
1719                dev_info(wm831x->dev, "WM8325 revision %c\n", 'A' + rev);
1720                break;
1721
1722        case WM8326:
1723                parent = WM8326;
1724                wm831x->num_gpio = 12;
1725                dev_info(wm831x->dev, "WM8326 revision %c\n", 'A' + rev);
1726                break;
1727
1728        default:
1729                dev_err(wm831x->dev, "Unknown WM831x device %04x\n", ret);
1730                ret = -EINVAL;
1731                goto err;
1732        }
1733
1734        /* This will need revisiting in future but is OK for all
1735         * current parts.
1736         */
1737        if (parent != id)
1738                dev_warn(wm831x->dev, "Device was registered as a WM%lx\n",
1739                         id);
1740
1741        /* Bootstrap the user key */
1742        ret = wm831x_reg_read(wm831x, WM831X_SECURITY_KEY);
1743        if (ret < 0) {
1744                dev_err(wm831x->dev, "Failed to read security key: %d\n", ret);
1745                goto err;
1746        }
1747        if (ret != 0) {
1748                dev_warn(wm831x->dev, "Security key had non-zero value %x\n",
1749                         ret);
1750                wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0);
1751        }
1752        wm831x->locked = 1;
1753
1754        if (pdata && pdata->pre_init) {
1755                ret = pdata->pre_init(wm831x);
1756                if (ret != 0) {
1757                        dev_err(wm831x->dev, "pre_init() failed: %d\n", ret);
1758                        goto err;
1759                }
1760        }
1761
1762        if (pdata) {
1763                for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
1764                        if (!pdata->gpio_defaults[i])
1765                                continue;
1766
1767                        wm831x_reg_write(wm831x,
1768                                         WM831X_GPIO1_CONTROL + i,
1769                                         pdata->gpio_defaults[i] & 0xffff);
1770                }
1771        }
1772
1773        /* Multiply by 10 as we have many subdevices of the same type */
1774        if (pdata && pdata->wm831x_num)
1775                wm831x_num = pdata->wm831x_num * 10;
1776        else
1777                wm831x_num = -1;
1778
1779        ret = wm831x_irq_init(wm831x, irq);
1780        if (ret != 0)
1781                goto err;
1782
1783        wm831x_auxadc_init(wm831x);
1784
1785        /* The core device is up, instantiate the subdevices. */
1786        switch (parent) {
1787        case WM8310:
1788                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1789                                      wm8310_devs, ARRAY_SIZE(wm8310_devs),
1790                                      NULL, 0, NULL);
1791                break;
1792
1793        case WM8311:
1794                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1795                                      wm8311_devs, ARRAY_SIZE(wm8311_devs),
1796                                      NULL, 0, NULL);
1797                if (!pdata || !pdata->disable_touch)
1798                        mfd_add_devices(wm831x->dev, wm831x_num,
1799                                        touch_devs, ARRAY_SIZE(touch_devs),
1800                                        NULL, 0, NULL);
1801                break;
1802
1803        case WM8312:
1804                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1805                                      wm8312_devs, ARRAY_SIZE(wm8312_devs),
1806                                      NULL, 0, NULL);
1807                if (!pdata || !pdata->disable_touch)
1808                        mfd_add_devices(wm831x->dev, wm831x_num,
1809                                        touch_devs, ARRAY_SIZE(touch_devs),
1810                                        NULL, 0, NULL);
1811                break;
1812
1813        case WM8320:
1814        case WM8321:
1815        case WM8325:
1816        case WM8326:
1817                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1818                                      wm8320_devs, ARRAY_SIZE(wm8320_devs),
1819                                      NULL, 0, NULL);
1820                break;
1821
1822        default:
1823                /* If this happens the bus probe function is buggy */
1824                BUG();
1825        }
1826
1827        if (ret != 0) {
1828                dev_err(wm831x->dev, "Failed to add children\n");
1829                goto err_irq;
1830        }
1831
1832        /* The RTC can only be used if the 32.768kHz crystal is
1833         * enabled; this can't be controlled by software at runtime.
1834         */
1835        ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2);
1836        if (ret < 0) {
1837                dev_err(wm831x->dev, "Failed to read clock status: %d\n", ret);
1838                goto err_irq;
1839        }
1840
1841        if (ret & WM831X_XTAL_ENA) {
1842                ret = mfd_add_devices(wm831x->dev, wm831x_num,
1843                                      rtc_devs, ARRAY_SIZE(rtc_devs),
1844                                      NULL, 0, NULL);
1845                if (ret != 0) {
1846                        dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret);
1847                        goto err_irq;
1848                }
1849        } else {
1850                dev_info(wm831x->dev, "32.768kHz clock disabled, no RTC\n");
1851        }
1852
1853        if (pdata && pdata->backlight) {
1854                /* Treat errors as non-critical */
1855                ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs,
1856                                      ARRAY_SIZE(backlight_devs), NULL,
1857                                      0, NULL);
1858                if (ret < 0)
1859                        dev_err(wm831x->dev, "Failed to add backlight: %d\n",
1860                                ret);
1861        }
1862
1863        wm831x_otp_init(wm831x);
1864
1865        if (pdata && pdata->post_init) {
1866                ret = pdata->post_init(wm831x);
1867                if (ret != 0) {
1868                        dev_err(wm831x->dev, "post_init() failed: %d\n", ret);
1869                        goto err_irq;
1870                }
1871        }
1872
1873        return 0;
1874
1875err_irq:
1876        wm831x_irq_exit(wm831x);
1877err:
1878        mfd_remove_devices(wm831x->dev);
1879        return ret;
1880}
1881
1882void wm831x_device_exit(struct wm831x *wm831x)
1883{
1884        wm831x_otp_exit(wm831x);
1885        mfd_remove_devices(wm831x->dev);
1886        free_irq(wm831x_irq(wm831x, WM831X_IRQ_AUXADC_DATA), wm831x);
1887        wm831x_irq_exit(wm831x);
1888}
1889
1890int wm831x_device_suspend(struct wm831x *wm831x)
1891{
1892        int reg, mask;
1893
1894        /* If the charger IRQs are a wake source then make sure we ack
1895         * them even if they're not actively being used (eg, no power
1896         * driver or no IRQ line wired up) then acknowledge the
1897         * interrupts otherwise suspend won't last very long.
1898         */
1899        if (wm831x->charger_irq_wake) {
1900                reg = wm831x_reg_read(wm831x, WM831X_INTERRUPT_STATUS_2_MASK);
1901
1902                mask = WM831X_CHG_BATT_HOT_EINT |
1903                        WM831X_CHG_BATT_COLD_EINT |
1904                        WM831X_CHG_BATT_FAIL_EINT |
1905                        WM831X_CHG_OV_EINT | WM831X_CHG_END_EINT |
1906                        WM831X_CHG_TO_EINT | WM831X_CHG_MODE_EINT |
1907                        WM831X_CHG_START_EINT;
1908
1909                /* If any of the interrupts are masked read the statuses */
1910                if (reg & mask)
1911                        reg = wm831x_reg_read(wm831x,
1912                                              WM831X_INTERRUPT_STATUS_2);
1913
1914                if (reg & mask) {
1915                        dev_info(wm831x->dev,
1916                                 "Acknowledging masked charger IRQs: %x\n",
1917                                 reg & mask);
1918                        wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_2,
1919                                         reg & mask);
1920                }
1921        }
1922
1923        return 0;
1924}
1925
1926void wm831x_device_shutdown(struct wm831x *wm831x)
1927{
1928        if (wm831x->soft_shutdown) {
1929                dev_info(wm831x->dev, "Initiating shutdown...\n");
1930                wm831x_set_bits(wm831x, WM831X_POWER_STATE, WM831X_CHIP_ON, 0);
1931        }
1932}
1933EXPORT_SYMBOL_GPL(wm831x_device_shutdown);
1934
1935MODULE_DESCRIPTION("Core support for the WM831X AudioPlus PMIC");
1936MODULE_LICENSE("GPL");
1937MODULE_AUTHOR("Mark Brown");
1938
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.