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); 1935