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