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