wm831x-core.c (41304B)
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 */ 32const 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}; 90EXPORT_SYMBOL_GPL(wm831x_isinkv_values); 91 92static 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_lock: 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 */ 120void wm831x_reg_lock(struct wm831x *wm831x) 121{ 122 int ret; 123 124 ret = wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0); 125 if (ret == 0) { 126 dev_vdbg(wm831x->dev, "Registers locked\n"); 127 128 mutex_lock(&wm831x->io_lock); 129 WARN_ON(wm831x->locked); 130 wm831x->locked = 1; 131 mutex_unlock(&wm831x->io_lock); 132 } else { 133 dev_err(wm831x->dev, "Failed to lock registers: %d\n", ret); 134 } 135 136} 137EXPORT_SYMBOL_GPL(wm831x_reg_lock); 138 139/** 140 * wm831x_reg_unlock: Unlock user keyed registers 141 * 142 * The WM831x has a user key preventing writes to particularly 143 * critical registers. This function locks those registers, 144 * preventing spurious writes. 145 * 146 * @wm831x: pointer to local driver data structure 147 */ 148int 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} 165EXPORT_SYMBOL_GPL(wm831x_reg_unlock); 166 167static 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 346static 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 483static 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 */ 519int 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} 531EXPORT_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 */ 541int 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} 546EXPORT_SYMBOL_GPL(wm831x_bulk_read); 547 548static 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 */ 578int 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} 591EXPORT_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 */ 601int 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} 617EXPORT_SYMBOL_GPL(wm831x_set_bits); 618 619static 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 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_DC1, "UV"), 626 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_HC_DC1, "HC"), 627}; 628 629 630static const struct resource wm831x_dcdc2_resources[] = { 631 { 632 .start = WM831X_DC2_CONTROL_1, 633 .end = WM831X_DC2_DVS_CONTROL, 634 .flags = IORESOURCE_REG, 635 }, 636 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_DC2, "UV"), 637 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_HC_DC2, "HC"), 638}; 639 640static const struct resource wm831x_dcdc3_resources[] = { 641 { 642 .start = WM831X_DC3_CONTROL_1, 643 .end = WM831X_DC3_SLEEP_CONTROL, 644 .flags = IORESOURCE_REG, 645 }, 646 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_DC3, "UV"), 647}; 648 649static const struct resource wm831x_dcdc4_resources[] = { 650 { 651 .start = WM831X_DC4_CONTROL, 652 .end = WM831X_DC4_SLEEP_CONTROL, 653 .flags = IORESOURCE_REG, 654 }, 655 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_DC4, "UV"), 656}; 657 658static const struct resource wm8320_dcdc4_buck_resources[] = { 659 { 660 .start = WM831X_DC4_CONTROL, 661 .end = WM832X_DC4_SLEEP_CONTROL, 662 .flags = IORESOURCE_REG, 663 }, 664 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_DC4, "UV"), 665}; 666 667static const struct resource wm831x_gpio_resources[] = { 668 { 669 .start = WM831X_IRQ_GPIO_1, 670 .end = WM831X_IRQ_GPIO_16, 671 .flags = IORESOURCE_IRQ, 672 }, 673}; 674 675static const struct resource wm831x_isink1_resources[] = { 676 { 677 .start = WM831X_CURRENT_SINK_1, 678 .end = WM831X_CURRENT_SINK_1, 679 .flags = IORESOURCE_REG, 680 }, 681 DEFINE_RES_IRQ(WM831X_IRQ_CS1), 682}; 683 684static const struct resource wm831x_isink2_resources[] = { 685 { 686 .start = WM831X_CURRENT_SINK_2, 687 .end = WM831X_CURRENT_SINK_2, 688 .flags = IORESOURCE_REG, 689 }, 690 DEFINE_RES_IRQ(WM831X_IRQ_CS2), 691}; 692 693static const struct resource wm831x_ldo1_resources[] = { 694 { 695 .start = WM831X_LDO1_CONTROL, 696 .end = WM831X_LDO1_SLEEP_CONTROL, 697 .flags = IORESOURCE_REG, 698 }, 699 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO1, "UV"), 700}; 701 702static const struct resource wm831x_ldo2_resources[] = { 703 { 704 .start = WM831X_LDO2_CONTROL, 705 .end = WM831X_LDO2_SLEEP_CONTROL, 706 .flags = IORESOURCE_REG, 707 }, 708 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO2, "UV"), 709}; 710 711static const struct resource wm831x_ldo3_resources[] = { 712 { 713 .start = WM831X_LDO3_CONTROL, 714 .end = WM831X_LDO3_SLEEP_CONTROL, 715 .flags = IORESOURCE_REG, 716 }, 717 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO3, "UV"), 718}; 719 720static const struct resource wm831x_ldo4_resources[] = { 721 { 722 .start = WM831X_LDO4_CONTROL, 723 .end = WM831X_LDO4_SLEEP_CONTROL, 724 .flags = IORESOURCE_REG, 725 }, 726 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO4, "UV"), 727}; 728 729static const struct resource wm831x_ldo5_resources[] = { 730 { 731 .start = WM831X_LDO5_CONTROL, 732 .end = WM831X_LDO5_SLEEP_CONTROL, 733 .flags = IORESOURCE_REG, 734 }, 735 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO5, "UV"), 736}; 737 738static const struct resource wm831x_ldo6_resources[] = { 739 { 740 .start = WM831X_LDO6_CONTROL, 741 .end = WM831X_LDO6_SLEEP_CONTROL, 742 .flags = IORESOURCE_REG, 743 }, 744 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO6, "UV"), 745}; 746 747static const struct resource wm831x_ldo7_resources[] = { 748 { 749 .start = WM831X_LDO7_CONTROL, 750 .end = WM831X_LDO7_SLEEP_CONTROL, 751 .flags = IORESOURCE_REG, 752 }, 753 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO7, "UV"), 754}; 755 756static const struct resource wm831x_ldo8_resources[] = { 757 { 758 .start = WM831X_LDO8_CONTROL, 759 .end = WM831X_LDO8_SLEEP_CONTROL, 760 .flags = IORESOURCE_REG, 761 }, 762 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO8, "UV"), 763}; 764 765static const struct resource wm831x_ldo9_resources[] = { 766 { 767 .start = WM831X_LDO9_CONTROL, 768 .end = WM831X_LDO9_SLEEP_CONTROL, 769 .flags = IORESOURCE_REG, 770 }, 771 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO9, "UV"), 772}; 773 774static const struct resource wm831x_ldo10_resources[] = { 775 { 776 .start = WM831X_LDO10_CONTROL, 777 .end = WM831X_LDO10_SLEEP_CONTROL, 778 .flags = IORESOURCE_REG, 779 }, 780 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_UV_LDO10, "UV"), 781}; 782 783static const struct resource wm831x_ldo11_resources[] = { 784 { 785 .start = WM831X_LDO11_ON_CONTROL, 786 .end = WM831X_LDO11_SLEEP_CONTROL, 787 .flags = IORESOURCE_REG, 788 }, 789}; 790 791static const struct resource wm831x_on_resources[] = { 792 DEFINE_RES_IRQ(WM831X_IRQ_ON), 793}; 794 795 796static const struct resource wm831x_power_resources[] = { 797 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_PPM_SYSLO, "SYSLO"), 798 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_PPM_PWR_SRC, "PWR SRC"), 799 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_PPM_USB_CURR, "USB CURR"), 800 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_CHG_BATT_HOT, "BATT HOT"), 801 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_CHG_BATT_COLD, "BATT COLD"), 802 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_CHG_BATT_FAIL, "BATT FAIL"), 803 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_CHG_OV, "OV"), 804 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_CHG_END, "END"), 805 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_CHG_TO, "TO"), 806 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_CHG_MODE, "MODE"), 807 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_CHG_START, "START"), 808}; 809 810static const struct resource wm831x_rtc_resources[] = { 811 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_RTC_PER, "PER"), 812 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_RTC_ALM, "ALM"), 813}; 814 815static const struct resource wm831x_status1_resources[] = { 816 { 817 .start = WM831X_STATUS_LED_1, 818 .end = WM831X_STATUS_LED_1, 819 .flags = IORESOURCE_REG, 820 }, 821}; 822 823static const struct resource wm831x_status2_resources[] = { 824 { 825 .start = WM831X_STATUS_LED_2, 826 .end = WM831X_STATUS_LED_2, 827 .flags = IORESOURCE_REG, 828 }, 829}; 830 831static const struct resource wm831x_touch_resources[] = { 832 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_TCHPD, "TCHPD"), 833 DEFINE_RES_IRQ_NAMED(WM831X_IRQ_TCHDATA, "TCHDATA"), 834}; 835 836static const struct resource wm831x_wdt_resources[] = { 837 DEFINE_RES_IRQ(WM831X_IRQ_WDOG_TO), 838}; 839 840static const struct mfd_cell wm8310_devs[] = { 841 { 842 .name = "wm831x-backup", 843 }, 844 { 845 .name = "wm831x-buckv", 846 .id = 1, 847 .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources), 848 .resources = wm831x_dcdc1_resources, 849 }, 850 { 851 .name = "wm831x-buckv", 852 .id = 2, 853 .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources), 854 .resources = wm831x_dcdc2_resources, 855 }, 856 { 857 .name = "wm831x-buckp", 858 .id = 3, 859 .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources), 860 .resources = wm831x_dcdc3_resources, 861 }, 862 { 863 .name = "wm831x-boostp", 864 .id = 4, 865 .num_resources = ARRAY_SIZE(wm831x_dcdc4_resources), 866 .resources = wm831x_dcdc4_resources, 867 }, 868 { 869 .name = "wm831x-clk", 870 }, 871 { 872 .name = "wm831x-epe", 873 .id = 1, 874 }, 875 { 876 .name = "wm831x-epe", 877 .id = 2, 878 }, 879 { 880 .name = "wm831x-gpio", 881 .num_resources = ARRAY_SIZE(wm831x_gpio_resources), 882 .resources = wm831x_gpio_resources, 883 }, 884 { 885 .name = "wm831x-hwmon", 886 }, 887 { 888 .name = "wm831x-isink", 889 .id = 1, 890 .num_resources = ARRAY_SIZE(wm831x_isink1_resources), 891 .resources = wm831x_isink1_resources, 892 }, 893 { 894 .name = "wm831x-isink", 895 .id = 2, 896 .num_resources = ARRAY_SIZE(wm831x_isink2_resources), 897 .resources = wm831x_isink2_resources, 898 }, 899 { 900 .name = "wm831x-ldo", 901 .id = 1, 902 .num_resources = ARRAY_SIZE(wm831x_ldo1_resources), 903 .resources = wm831x_ldo1_resources, 904 }, 905 { 906 .name = "wm831x-ldo", 907 .id = 2, 908 .num_resources = ARRAY_SIZE(wm831x_ldo2_resources), 909 .resources = wm831x_ldo2_resources, 910 }, 911 { 912 .name = "wm831x-ldo", 913 .id = 3, 914 .num_resources = ARRAY_SIZE(wm831x_ldo3_resources), 915 .resources = wm831x_ldo3_resources, 916 }, 917 { 918 .name = "wm831x-ldo", 919 .id = 4, 920 .num_resources = ARRAY_SIZE(wm831x_ldo4_resources), 921 .resources = wm831x_ldo4_resources, 922 }, 923 { 924 .name = "wm831x-ldo", 925 .id = 5, 926 .num_resources = ARRAY_SIZE(wm831x_ldo5_resources), 927 .resources = wm831x_ldo5_resources, 928 }, 929 { 930 .name = "wm831x-ldo", 931 .id = 6, 932 .num_resources = ARRAY_SIZE(wm831x_ldo6_resources), 933 .resources = wm831x_ldo6_resources, 934 }, 935 { 936 .name = "wm831x-aldo", 937 .id = 7, 938 .num_resources = ARRAY_SIZE(wm831x_ldo7_resources), 939 .resources = wm831x_ldo7_resources, 940 }, 941 { 942 .name = "wm831x-aldo", 943 .id = 8, 944 .num_resources = ARRAY_SIZE(wm831x_ldo8_resources), 945 .resources = wm831x_ldo8_resources, 946 }, 947 { 948 .name = "wm831x-aldo", 949 .id = 9, 950 .num_resources = ARRAY_SIZE(wm831x_ldo9_resources), 951 .resources = wm831x_ldo9_resources, 952 }, 953 { 954 .name = "wm831x-aldo", 955 .id = 10, 956 .num_resources = ARRAY_SIZE(wm831x_ldo10_resources), 957 .resources = wm831x_ldo10_resources, 958 }, 959 { 960 .name = "wm831x-alive-ldo", 961 .id = 11, 962 .num_resources = ARRAY_SIZE(wm831x_ldo11_resources), 963 .resources = wm831x_ldo11_resources, 964 }, 965 { 966 .name = "wm831x-on", 967 .num_resources = ARRAY_SIZE(wm831x_on_resources), 968 .resources = wm831x_on_resources, 969 }, 970 { 971 .name = "wm831x-power", 972 .num_resources = ARRAY_SIZE(wm831x_power_resources), 973 .resources = wm831x_power_resources, 974 }, 975 { 976 .name = "wm831x-status", 977 .id = 1, 978 .num_resources = ARRAY_SIZE(wm831x_status1_resources), 979 .resources = wm831x_status1_resources, 980 }, 981 { 982 .name = "wm831x-status", 983 .id = 2, 984 .num_resources = ARRAY_SIZE(wm831x_status2_resources), 985 .resources = wm831x_status2_resources, 986 }, 987 { 988 .name = "wm831x-watchdog", 989 .num_resources = ARRAY_SIZE(wm831x_wdt_resources), 990 .resources = wm831x_wdt_resources, 991 }, 992}; 993 994static const struct mfd_cell wm8311_devs[] = { 995 { 996 .name = "wm831x-backup", 997 }, 998 { 999 .name = "wm831x-buckv", 1000 .id = 1, 1001 .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources), 1002 .resources = wm831x_dcdc1_resources, 1003 }, 1004 { 1005 .name = "wm831x-buckv", 1006 .id = 2, 1007 .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources), 1008 .resources = wm831x_dcdc2_resources, 1009 }, 1010 { 1011 .name = "wm831x-buckp", 1012 .id = 3, 1013 .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources), 1014 .resources = wm831x_dcdc3_resources, 1015 }, 1016 { 1017 .name = "wm831x-boostp", 1018 .id = 4, 1019 .num_resources = ARRAY_SIZE(wm831x_dcdc4_resources), 1020 .resources = wm831x_dcdc4_resources, 1021 }, 1022 { 1023 .name = "wm831x-clk", 1024 }, 1025 { 1026 .name = "wm831x-epe", 1027 .id = 1, 1028 }, 1029 { 1030 .name = "wm831x-epe", 1031 .id = 2, 1032 }, 1033 { 1034 .name = "wm831x-gpio", 1035 .num_resources = ARRAY_SIZE(wm831x_gpio_resources), 1036 .resources = wm831x_gpio_resources, 1037 }, 1038 { 1039 .name = "wm831x-hwmon", 1040 }, 1041 { 1042 .name = "wm831x-isink", 1043 .id = 1, 1044 .num_resources = ARRAY_SIZE(wm831x_isink1_resources), 1045 .resources = wm831x_isink1_resources, 1046 }, 1047 { 1048 .name = "wm831x-isink", 1049 .id = 2, 1050 .num_resources = ARRAY_SIZE(wm831x_isink2_resources), 1051 .resources = wm831x_isink2_resources, 1052 }, 1053 { 1054 .name = "wm831x-ldo", 1055 .id = 1, 1056 .num_resources = ARRAY_SIZE(wm831x_ldo1_resources), 1057 .resources = wm831x_ldo1_resources, 1058 }, 1059 { 1060 .name = "wm831x-ldo", 1061 .id = 2, 1062 .num_resources = ARRAY_SIZE(wm831x_ldo2_resources), 1063 .resources = wm831x_ldo2_resources, 1064 }, 1065 { 1066 .name = "wm831x-ldo", 1067 .id = 3, 1068 .num_resources = ARRAY_SIZE(wm831x_ldo3_resources), 1069 .resources = wm831x_ldo3_resources, 1070 }, 1071 { 1072 .name = "wm831x-ldo", 1073 .id = 4, 1074 .num_resources = ARRAY_SIZE(wm831x_ldo4_resources), 1075 .resources = wm831x_ldo4_resources, 1076 }, 1077 { 1078 .name = "wm831x-ldo", 1079 .id = 5, 1080 .num_resources = ARRAY_SIZE(wm831x_ldo5_resources), 1081 .resources = wm831x_ldo5_resources, 1082 }, 1083 { 1084 .name = "wm831x-aldo", 1085 .id = 7, 1086 .num_resources = ARRAY_SIZE(wm831x_ldo7_resources), 1087 .resources = wm831x_ldo7_resources, 1088 }, 1089 { 1090 .name = "wm831x-alive-ldo", 1091 .id = 11, 1092 .num_resources = ARRAY_SIZE(wm831x_ldo11_resources), 1093 .resources = wm831x_ldo11_resources, 1094 }, 1095 { 1096 .name = "wm831x-on", 1097 .num_resources = ARRAY_SIZE(wm831x_on_resources), 1098 .resources = wm831x_on_resources, 1099 }, 1100 { 1101 .name = "wm831x-power", 1102 .num_resources = ARRAY_SIZE(wm831x_power_resources), 1103 .resources = wm831x_power_resources, 1104 }, 1105 { 1106 .name = "wm831x-status", 1107 .id = 1, 1108 .num_resources = ARRAY_SIZE(wm831x_status1_resources), 1109 .resources = wm831x_status1_resources, 1110 }, 1111 { 1112 .name = "wm831x-status", 1113 .id = 2, 1114 .num_resources = ARRAY_SIZE(wm831x_status2_resources), 1115 .resources = wm831x_status2_resources, 1116 }, 1117 { 1118 .name = "wm831x-watchdog", 1119 .num_resources = ARRAY_SIZE(wm831x_wdt_resources), 1120 .resources = wm831x_wdt_resources, 1121 }, 1122}; 1123 1124static const struct mfd_cell wm8312_devs[] = { 1125 { 1126 .name = "wm831x-backup", 1127 }, 1128 { 1129 .name = "wm831x-buckv", 1130 .id = 1, 1131 .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources), 1132 .resources = wm831x_dcdc1_resources, 1133 }, 1134 { 1135 .name = "wm831x-buckv", 1136 .id = 2, 1137 .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources), 1138 .resources = wm831x_dcdc2_resources, 1139 }, 1140 { 1141 .name = "wm831x-buckp", 1142 .id = 3, 1143 .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources), 1144 .resources = wm831x_dcdc3_resources, 1145 }, 1146 { 1147 .name = "wm831x-boostp", 1148 .id = 4, 1149 .num_resources = ARRAY_SIZE(wm831x_dcdc4_resources), 1150 .resources = wm831x_dcdc4_resources, 1151 }, 1152 { 1153 .name = "wm831x-clk", 1154 }, 1155 { 1156 .name = "wm831x-epe", 1157 .id = 1, 1158 }, 1159 { 1160 .name = "wm831x-epe", 1161 .id = 2, 1162 }, 1163 { 1164 .name = "wm831x-gpio", 1165 .num_resources = ARRAY_SIZE(wm831x_gpio_resources), 1166 .resources = wm831x_gpio_resources, 1167 }, 1168 { 1169 .name = "wm831x-hwmon", 1170 }, 1171 { 1172 .name = "wm831x-isink", 1173 .id = 1, 1174 .num_resources = ARRAY_SIZE(wm831x_isink1_resources), 1175 .resources = wm831x_isink1_resources, 1176 }, 1177 { 1178 .name = "wm831x-isink", 1179 .id = 2, 1180 .num_resources = ARRAY_SIZE(wm831x_isink2_resources), 1181 .resources = wm831x_isink2_resources, 1182 }, 1183 { 1184 .name = "wm831x-ldo", 1185 .id = 1, 1186 .num_resources = ARRAY_SIZE(wm831x_ldo1_resources), 1187 .resources = wm831x_ldo1_resources, 1188 }, 1189 { 1190 .name = "wm831x-ldo", 1191 .id = 2, 1192 .num_resources = ARRAY_SIZE(wm831x_ldo2_resources), 1193 .resources = wm831x_ldo2_resources, 1194 }, 1195 { 1196 .name = "wm831x-ldo", 1197 .id = 3, 1198 .num_resources = ARRAY_SIZE(wm831x_ldo3_resources), 1199 .resources = wm831x_ldo3_resources, 1200 }, 1201 { 1202 .name = "wm831x-ldo", 1203 .id = 4, 1204 .num_resources = ARRAY_SIZE(wm831x_ldo4_resources), 1205 .resources = wm831x_ldo4_resources, 1206 }, 1207 { 1208 .name = "wm831x-ldo", 1209 .id = 5, 1210 .num_resources = ARRAY_SIZE(wm831x_ldo5_resources), 1211 .resources = wm831x_ldo5_resources, 1212 }, 1213 { 1214 .name = "wm831x-ldo", 1215 .id = 6, 1216 .num_resources = ARRAY_SIZE(wm831x_ldo6_resources), 1217 .resources = wm831x_ldo6_resources, 1218 }, 1219 { 1220 .name = "wm831x-aldo", 1221 .id = 7, 1222 .num_resources = ARRAY_SIZE(wm831x_ldo7_resources), 1223 .resources = wm831x_ldo7_resources, 1224 }, 1225 { 1226 .name = "wm831x-aldo", 1227 .id = 8, 1228 .num_resources = ARRAY_SIZE(wm831x_ldo8_resources), 1229 .resources = wm831x_ldo8_resources, 1230 }, 1231 { 1232 .name = "wm831x-aldo", 1233 .id = 9, 1234 .num_resources = ARRAY_SIZE(wm831x_ldo9_resources), 1235 .resources = wm831x_ldo9_resources, 1236 }, 1237 { 1238 .name = "wm831x-aldo", 1239 .id = 10, 1240 .num_resources = ARRAY_SIZE(wm831x_ldo10_resources), 1241 .resources = wm831x_ldo10_resources, 1242 }, 1243 { 1244 .name = "wm831x-alive-ldo", 1245 .id = 11, 1246 .num_resources = ARRAY_SIZE(wm831x_ldo11_resources), 1247 .resources = wm831x_ldo11_resources, 1248 }, 1249 { 1250 .name = "wm831x-on", 1251 .num_resources = ARRAY_SIZE(wm831x_on_resources), 1252 .resources = wm831x_on_resources, 1253 }, 1254 { 1255 .name = "wm831x-power", 1256 .num_resources = ARRAY_SIZE(wm831x_power_resources), 1257 .resources = wm831x_power_resources, 1258 }, 1259 { 1260 .name = "wm831x-status", 1261 .id = 1, 1262 .num_resources = ARRAY_SIZE(wm831x_status1_resources), 1263 .resources = wm831x_status1_resources, 1264 }, 1265 { 1266 .name = "wm831x-status", 1267 .id = 2, 1268 .num_resources = ARRAY_SIZE(wm831x_status2_resources), 1269 .resources = wm831x_status2_resources, 1270 }, 1271 { 1272 .name = "wm831x-watchdog", 1273 .num_resources = ARRAY_SIZE(wm831x_wdt_resources), 1274 .resources = wm831x_wdt_resources, 1275 }, 1276}; 1277 1278static const struct mfd_cell wm8320_devs[] = { 1279 { 1280 .name = "wm831x-backup", 1281 }, 1282 { 1283 .name = "wm831x-buckv", 1284 .id = 1, 1285 .num_resources = ARRAY_SIZE(wm831x_dcdc1_resources), 1286 .resources = wm831x_dcdc1_resources, 1287 }, 1288 { 1289 .name = "wm831x-buckv", 1290 .id = 2, 1291 .num_resources = ARRAY_SIZE(wm831x_dcdc2_resources), 1292 .resources = wm831x_dcdc2_resources, 1293 }, 1294 { 1295 .name = "wm831x-buckp", 1296 .id = 3, 1297 .num_resources = ARRAY_SIZE(wm831x_dcdc3_resources), 1298 .resources = wm831x_dcdc3_resources, 1299 }, 1300 { 1301 .name = "wm831x-buckp", 1302 .id = 4, 1303 .num_resources = ARRAY_SIZE(wm8320_dcdc4_buck_resources), 1304 .resources = wm8320_dcdc4_buck_resources, 1305 }, 1306 { 1307 .name = "wm831x-clk", 1308 }, 1309 { 1310 .name = "wm831x-gpio", 1311 .num_resources = ARRAY_SIZE(wm831x_gpio_resources), 1312 .resources = wm831x_gpio_resources, 1313 }, 1314 { 1315 .name = "wm831x-hwmon", 1316 }, 1317 { 1318 .name = "wm831x-ldo", 1319 .id = 1, 1320 .num_resources = ARRAY_SIZE(wm831x_ldo1_resources), 1321 .resources = wm831x_ldo1_resources, 1322 }, 1323 { 1324 .name = "wm831x-ldo", 1325 .id = 2, 1326 .num_resources = ARRAY_SIZE(wm831x_ldo2_resources), 1327 .resources = wm831x_ldo2_resources, 1328 }, 1329 { 1330 .name = "wm831x-ldo", 1331 .id = 3, 1332 .num_resources = ARRAY_SIZE(wm831x_ldo3_resources), 1333 .resources = wm831x_ldo3_resources, 1334 }, 1335 { 1336 .name = "wm831x-ldo", 1337 .id = 4, 1338 .num_resources = ARRAY_SIZE(wm831x_ldo4_resources), 1339 .resources = wm831x_ldo4_resources, 1340 }, 1341 { 1342 .name = "wm831x-ldo", 1343 .id = 5, 1344 .num_resources = ARRAY_SIZE(wm831x_ldo5_resources), 1345 .resources = wm831x_ldo5_resources, 1346 }, 1347 { 1348 .name = "wm831x-ldo", 1349 .id = 6, 1350 .num_resources = ARRAY_SIZE(wm831x_ldo6_resources), 1351 .resources = wm831x_ldo6_resources, 1352 }, 1353 { 1354 .name = "wm831x-aldo", 1355 .id = 7, 1356 .num_resources = ARRAY_SIZE(wm831x_ldo7_resources), 1357 .resources = wm831x_ldo7_resources, 1358 }, 1359 { 1360 .name = "wm831x-aldo", 1361 .id = 8, 1362 .num_resources = ARRAY_SIZE(wm831x_ldo8_resources), 1363 .resources = wm831x_ldo8_resources, 1364 }, 1365 { 1366 .name = "wm831x-aldo", 1367 .id = 9, 1368 .num_resources = ARRAY_SIZE(wm831x_ldo9_resources), 1369 .resources = wm831x_ldo9_resources, 1370 }, 1371 { 1372 .name = "wm831x-aldo", 1373 .id = 10, 1374 .num_resources = ARRAY_SIZE(wm831x_ldo10_resources), 1375 .resources = wm831x_ldo10_resources, 1376 }, 1377 { 1378 .name = "wm831x-alive-ldo", 1379 .id = 11, 1380 .num_resources = ARRAY_SIZE(wm831x_ldo11_resources), 1381 .resources = wm831x_ldo11_resources, 1382 }, 1383 { 1384 .name = "wm831x-on", 1385 .num_resources = ARRAY_SIZE(wm831x_on_resources), 1386 .resources = wm831x_on_resources, 1387 }, 1388 { 1389 .name = "wm831x-status", 1390 .id = 1, 1391 .num_resources = ARRAY_SIZE(wm831x_status1_resources), 1392 .resources = wm831x_status1_resources, 1393 }, 1394 { 1395 .name = "wm831x-status", 1396 .id = 2, 1397 .num_resources = ARRAY_SIZE(wm831x_status2_resources), 1398 .resources = wm831x_status2_resources, 1399 }, 1400 { 1401 .name = "wm831x-watchdog", 1402 .num_resources = ARRAY_SIZE(wm831x_wdt_resources), 1403 .resources = wm831x_wdt_resources, 1404 }, 1405}; 1406 1407static const struct mfd_cell touch_devs[] = { 1408 { 1409 .name = "wm831x-touch", 1410 .num_resources = ARRAY_SIZE(wm831x_touch_resources), 1411 .resources = wm831x_touch_resources, 1412 }, 1413}; 1414 1415static const struct mfd_cell rtc_devs[] = { 1416 { 1417 .name = "wm831x-rtc", 1418 .num_resources = ARRAY_SIZE(wm831x_rtc_resources), 1419 .resources = wm831x_rtc_resources, 1420 }, 1421}; 1422 1423static const struct mfd_cell backlight_devs[] = { 1424 { 1425 .name = "wm831x-backlight", 1426 }, 1427}; 1428 1429struct regmap_config wm831x_regmap_config = { 1430 .reg_bits = 16, 1431 .val_bits = 16, 1432 1433 .cache_type = REGCACHE_RBTREE, 1434 1435 .max_register = WM831X_DBE_CHECK_DATA, 1436 .readable_reg = wm831x_reg_readable, 1437 .writeable_reg = wm831x_reg_writeable, 1438 .volatile_reg = wm831x_reg_volatile, 1439}; 1440EXPORT_SYMBOL_GPL(wm831x_regmap_config); 1441 1442const struct of_device_id wm831x_of_match[] = { 1443 { .compatible = "wlf,wm8310", .data = (void *)WM8310 }, 1444 { .compatible = "wlf,wm8311", .data = (void *)WM8311 }, 1445 { .compatible = "wlf,wm8312", .data = (void *)WM8312 }, 1446 { .compatible = "wlf,wm8320", .data = (void *)WM8320 }, 1447 { .compatible = "wlf,wm8321", .data = (void *)WM8321 }, 1448 { .compatible = "wlf,wm8325", .data = (void *)WM8325 }, 1449 { .compatible = "wlf,wm8326", .data = (void *)WM8326 }, 1450 { }, 1451}; 1452EXPORT_SYMBOL_GPL(wm831x_of_match); 1453 1454/* 1455 * Instantiate the generic non-control parts of the device. 1456 */ 1457int wm831x_device_init(struct wm831x *wm831x, int irq) 1458{ 1459 struct wm831x_pdata *pdata = &wm831x->pdata; 1460 int rev, wm831x_num; 1461 enum wm831x_parent parent; 1462 int ret, i; 1463 1464 mutex_init(&wm831x->io_lock); 1465 mutex_init(&wm831x->key_lock); 1466 dev_set_drvdata(wm831x->dev, wm831x); 1467 1468 wm831x->soft_shutdown = pdata->soft_shutdown; 1469 1470 ret = wm831x_reg_read(wm831x, WM831X_PARENT_ID); 1471 if (ret < 0) { 1472 dev_err(wm831x->dev, "Failed to read parent ID: %d\n", ret); 1473 goto err; 1474 } 1475 switch (ret) { 1476 case 0x6204: 1477 case 0x6246: 1478 break; 1479 default: 1480 dev_err(wm831x->dev, "Device is not a WM831x: ID %x\n", ret); 1481 ret = -EINVAL; 1482 goto err; 1483 } 1484 1485 ret = wm831x_reg_read(wm831x, WM831X_REVISION); 1486 if (ret < 0) { 1487 dev_err(wm831x->dev, "Failed to read revision: %d\n", ret); 1488 goto err; 1489 } 1490 rev = (ret & WM831X_PARENT_REV_MASK) >> WM831X_PARENT_REV_SHIFT; 1491 1492 ret = wm831x_reg_read(wm831x, WM831X_RESET_ID); 1493 if (ret < 0) { 1494 dev_err(wm831x->dev, "Failed to read device ID: %d\n", ret); 1495 goto err; 1496 } 1497 1498 /* Some engineering samples do not have the ID set, rely on 1499 * the device being registered correctly. 1500 */ 1501 if (ret == 0) { 1502 dev_info(wm831x->dev, "Device is an engineering sample\n"); 1503 ret = wm831x->type; 1504 } 1505 1506 switch (ret) { 1507 case WM8310: 1508 parent = WM8310; 1509 wm831x->num_gpio = 16; 1510 wm831x->charger_irq_wake = 1; 1511 if (rev > 0) { 1512 wm831x->has_gpio_ena = 1; 1513 wm831x->has_cs_sts = 1; 1514 } 1515 1516 dev_info(wm831x->dev, "WM8310 revision %c\n", 'A' + rev); 1517 break; 1518 1519 case WM8311: 1520 parent = WM8311; 1521 wm831x->num_gpio = 16; 1522 wm831x->charger_irq_wake = 1; 1523 if (rev > 0) { 1524 wm831x->has_gpio_ena = 1; 1525 wm831x->has_cs_sts = 1; 1526 } 1527 1528 dev_info(wm831x->dev, "WM8311 revision %c\n", 'A' + rev); 1529 break; 1530 1531 case WM8312: 1532 parent = WM8312; 1533 wm831x->num_gpio = 16; 1534 wm831x->charger_irq_wake = 1; 1535 if (rev > 0) { 1536 wm831x->has_gpio_ena = 1; 1537 wm831x->has_cs_sts = 1; 1538 } 1539 1540 dev_info(wm831x->dev, "WM8312 revision %c\n", 'A' + rev); 1541 break; 1542 1543 case WM8320: 1544 parent = WM8320; 1545 wm831x->num_gpio = 12; 1546 dev_info(wm831x->dev, "WM8320 revision %c\n", 'A' + rev); 1547 break; 1548 1549 case WM8321: 1550 parent = WM8321; 1551 wm831x->num_gpio = 12; 1552 dev_info(wm831x->dev, "WM8321 revision %c\n", 'A' + rev); 1553 break; 1554 1555 case WM8325: 1556 parent = WM8325; 1557 wm831x->num_gpio = 12; 1558 dev_info(wm831x->dev, "WM8325 revision %c\n", 'A' + rev); 1559 break; 1560 1561 case WM8326: 1562 parent = WM8326; 1563 wm831x->num_gpio = 12; 1564 dev_info(wm831x->dev, "WM8326 revision %c\n", 'A' + rev); 1565 break; 1566 1567 default: 1568 dev_err(wm831x->dev, "Unknown WM831x device %04x\n", ret); 1569 ret = -EINVAL; 1570 goto err; 1571 } 1572 1573 /* This will need revisiting in future but is OK for all 1574 * current parts. 1575 */ 1576 if (parent != wm831x->type) 1577 dev_warn(wm831x->dev, "Device was registered as a WM%x\n", 1578 wm831x->type); 1579 1580 /* Bootstrap the user key */ 1581 ret = wm831x_reg_read(wm831x, WM831X_SECURITY_KEY); 1582 if (ret < 0) { 1583 dev_err(wm831x->dev, "Failed to read security key: %d\n", ret); 1584 goto err; 1585 } 1586 if (ret != 0) { 1587 dev_warn(wm831x->dev, "Security key had non-zero value %x\n", 1588 ret); 1589 wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0); 1590 } 1591 wm831x->locked = 1; 1592 1593 if (pdata->pre_init) { 1594 ret = pdata->pre_init(wm831x); 1595 if (ret != 0) { 1596 dev_err(wm831x->dev, "pre_init() failed: %d\n", ret); 1597 goto err; 1598 } 1599 } 1600 1601 for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) { 1602 if (!pdata->gpio_defaults[i]) 1603 continue; 1604 1605 wm831x_reg_write(wm831x, 1606 WM831X_GPIO1_CONTROL + i, 1607 pdata->gpio_defaults[i] & 0xffff); 1608 } 1609 1610 /* Multiply by 10 as we have many subdevices of the same type */ 1611 if (pdata->wm831x_num) 1612 wm831x_num = pdata->wm831x_num * 10; 1613 else 1614 wm831x_num = -1; 1615 1616 ret = wm831x_irq_init(wm831x, irq); 1617 if (ret != 0) 1618 goto err; 1619 1620 wm831x_auxadc_init(wm831x); 1621 1622 /* The core device is up, instantiate the subdevices. */ 1623 switch (parent) { 1624 case WM8310: 1625 ret = mfd_add_devices(wm831x->dev, wm831x_num, 1626 wm8310_devs, ARRAY_SIZE(wm8310_devs), 1627 NULL, 0, NULL); 1628 break; 1629 1630 case WM8311: 1631 ret = mfd_add_devices(wm831x->dev, wm831x_num, 1632 wm8311_devs, ARRAY_SIZE(wm8311_devs), 1633 NULL, 0, NULL); 1634 if (!pdata->disable_touch) 1635 mfd_add_devices(wm831x->dev, wm831x_num, 1636 touch_devs, ARRAY_SIZE(touch_devs), 1637 NULL, 0, NULL); 1638 break; 1639 1640 case WM8312: 1641 ret = mfd_add_devices(wm831x->dev, wm831x_num, 1642 wm8312_devs, ARRAY_SIZE(wm8312_devs), 1643 NULL, 0, NULL); 1644 if (!pdata->disable_touch) 1645 mfd_add_devices(wm831x->dev, wm831x_num, 1646 touch_devs, ARRAY_SIZE(touch_devs), 1647 NULL, 0, NULL); 1648 break; 1649 1650 case WM8320: 1651 case WM8321: 1652 case WM8325: 1653 case WM8326: 1654 ret = mfd_add_devices(wm831x->dev, wm831x_num, 1655 wm8320_devs, ARRAY_SIZE(wm8320_devs), 1656 NULL, 0, NULL); 1657 break; 1658 1659 default: 1660 /* If this happens the bus probe function is buggy */ 1661 BUG(); 1662 } 1663 1664 if (ret != 0) { 1665 dev_err(wm831x->dev, "Failed to add children\n"); 1666 goto err_irq; 1667 } 1668 1669 /* The RTC can only be used if the 32.768kHz crystal is 1670 * enabled; this can't be controlled by software at runtime. 1671 */ 1672 ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2); 1673 if (ret < 0) { 1674 dev_err(wm831x->dev, "Failed to read clock status: %d\n", ret); 1675 goto err_irq; 1676 } 1677 1678 if (ret & WM831X_XTAL_ENA) { 1679 ret = mfd_add_devices(wm831x->dev, wm831x_num, 1680 rtc_devs, ARRAY_SIZE(rtc_devs), 1681 NULL, 0, NULL); 1682 if (ret != 0) { 1683 dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret); 1684 goto err_irq; 1685 } 1686 } else { 1687 dev_info(wm831x->dev, "32.768kHz clock disabled, no RTC\n"); 1688 } 1689 1690 if (pdata->backlight) { 1691 /* Treat errors as non-critical */ 1692 ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs, 1693 ARRAY_SIZE(backlight_devs), NULL, 1694 0, NULL); 1695 if (ret < 0) 1696 dev_err(wm831x->dev, "Failed to add backlight: %d\n", 1697 ret); 1698 } 1699 1700 wm831x_otp_init(wm831x); 1701 1702 if (pdata->post_init) { 1703 ret = pdata->post_init(wm831x); 1704 if (ret != 0) { 1705 dev_err(wm831x->dev, "post_init() failed: %d\n", ret); 1706 goto err_irq; 1707 } 1708 } 1709 1710 return 0; 1711 1712err_irq: 1713 wm831x_irq_exit(wm831x); 1714err: 1715 mfd_remove_devices(wm831x->dev); 1716 return ret; 1717} 1718 1719int wm831x_device_suspend(struct wm831x *wm831x) 1720{ 1721 int reg, mask; 1722 1723 /* If the charger IRQs are a wake source then make sure we ack 1724 * them even if they're not actively being used (eg, no power 1725 * driver or no IRQ line wired up) then acknowledge the 1726 * interrupts otherwise suspend won't last very long. 1727 */ 1728 if (wm831x->charger_irq_wake) { 1729 reg = wm831x_reg_read(wm831x, WM831X_INTERRUPT_STATUS_2_MASK); 1730 1731 mask = WM831X_CHG_BATT_HOT_EINT | 1732 WM831X_CHG_BATT_COLD_EINT | 1733 WM831X_CHG_BATT_FAIL_EINT | 1734 WM831X_CHG_OV_EINT | WM831X_CHG_END_EINT | 1735 WM831X_CHG_TO_EINT | WM831X_CHG_MODE_EINT | 1736 WM831X_CHG_START_EINT; 1737 1738 /* If any of the interrupts are masked read the statuses */ 1739 if (reg & mask) 1740 reg = wm831x_reg_read(wm831x, 1741 WM831X_INTERRUPT_STATUS_2); 1742 1743 if (reg & mask) { 1744 dev_info(wm831x->dev, 1745 "Acknowledging masked charger IRQs: %x\n", 1746 reg & mask); 1747 wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_2, 1748 reg & mask); 1749 } 1750 } 1751 1752 return 0; 1753} 1754 1755void wm831x_device_shutdown(struct wm831x *wm831x) 1756{ 1757 if (wm831x->soft_shutdown) { 1758 dev_info(wm831x->dev, "Initiating shutdown...\n"); 1759 wm831x_set_bits(wm831x, WM831X_POWER_STATE, WM831X_CHIP_ON, 0); 1760 } 1761} 1762EXPORT_SYMBOL_GPL(wm831x_device_shutdown);