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