root/drivers/mfd/wm831x-core.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. wm831x_reg_locked
  2. wm831x_reg_lock
  3. wm831x_reg_unlock
  4. wm831x_reg_readable
  5. wm831x_reg_writeable
  6. wm831x_reg_volatile
  7. wm831x_reg_read
  8. wm831x_bulk_read
  9. wm831x_write
  10. wm831x_reg_write
  11. wm831x_set_bits
  12. wm831x_device_init
  13. wm831x_device_suspend
  14. wm831x_device_shutdown

   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  */
  32 const 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 };
  90 EXPORT_SYMBOL_GPL(wm831x_isinkv_values);
  91 
  92 static 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  */
 118 void 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 }
 135 EXPORT_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  */
 144 int 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 }
 161 EXPORT_SYMBOL_GPL(wm831x_reg_unlock);
 162 
 163 static 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 
 342 static 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 
 479 static 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  */
 515 int 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 }
 527 EXPORT_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  */
 537 int 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 }
 542 EXPORT_SYMBOL_GPL(wm831x_bulk_read);
 543 
 544 static 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  */
 574 int 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 }
 587 EXPORT_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  */
 597 int 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 }
 613 EXPORT_SYMBOL_GPL(wm831x_set_bits);
 614 
 615 static 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 
 636 static 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 
 656 static 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 
 670 static 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 
 684 static 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 
 698 static 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 
 706 static 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 
 719 static 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 
 732 static 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 
 746 static 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 
 760 static 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 
 774 static 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 
 788 static 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 
 802 static 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 
 816 static 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 
 830 static 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 
 844 static 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 
 858 static 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 
 872 static 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 
 880 static struct resource wm831x_on_resources[] = {
 881         {
 882                 .start = WM831X_IRQ_ON,
 883                 .end   = WM831X_IRQ_ON,
 884                 .flags = IORESOURCE_IRQ,
 885         },
 886 };
 887 
 888 
 889 static 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 
 958 static 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 
 973 static 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 
 981 static 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 
 989 static 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 
1004 static 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 
1012 static 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 
1166 static 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 
1296 static 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 
1450 static 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 
1579 static 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 
1587 static 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 
1595 static const struct mfd_cell backlight_devs[] = {
1596         {
1597                 .name = "wm831x-backlight",
1598         },
1599 };
1600 
1601 struct 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 };
1612 EXPORT_SYMBOL_GPL(wm831x_regmap_config);
1613 
1614 const 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 };
1624 EXPORT_SYMBOL_GPL(wm831x_of_match);
1625 
1626 /*
1627  * Instantiate the generic non-control parts of the device.
1628  */
1629 int 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 
1884 err_irq:
1885         wm831x_irq_exit(wm831x);
1886 err:
1887         mfd_remove_devices(wm831x->dev);
1888         return ret;
1889 }
1890 
1891 int 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 
1927 void 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 }
1934 EXPORT_SYMBOL_GPL(wm831x_device_shutdown);

/* [<][>][^][v][top][bottom][index][help] */