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