1/* 2 * Copyright (C) 2007-2011 ST-Ericsson 3 * License terms: GNU General Public License (GPL) version 2 4 * Low-level core for exclusive access to the AB5500 IC on the I2C bus 5 * and some basic chip-configuration. 6 * Author: Bengt Jonsson <bengt.g.jonsson@stericsson.com> 7 * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com> 8 * Author: Mattias Wallin <mattias.wallin@stericsson.com> 9 * Author: Rickard Andersson <rickard.andersson@stericsson.com> 10 * Author: Karl Komierowski <karl.komierowski@stericsson.com> 11 * Author: Bibek Basu <bibek.basu@stericsson.com> 12 * 13 * TODO: Event handling with irq_chip. Waiting for PRCMU fw support. 14 */ 15 16#include <linux/module.h> 17#include <linux/mutex.h> 18#include <linux/err.h> 19#include <linux/platform_device.h> 20#include <linux/slab.h> 21#include <linux/device.h> 22#include <linux/irq.h> 23#include <linux/interrupt.h> 24#include <linux/random.h> 25#include <linux/mfd/abx500.h> 26#include <linux/mfd/abx500/ab5500.h> 27#include <linux/list.h> 28#include <linux/bitops.h> 29#include <linux/spinlock.h> 30#include <linux/mfd/core.h> 31#include <linux/version.h> 32#include <linux/mfd/db5500-prcmu.h> 33 34#include "ab5500-core.h" 35#include "ab5500-debugfs.h" 36 37#define AB5500_NUM_EVENT_REG 23 38#define AB5500_IT_LATCH0_REG 0x40 39#define AB5500_IT_MASK0_REG 0x60 40 41/* 42 * Permissible register ranges for reading and writing per device and bank. 43 * 44 * The ranges must be listed in increasing address order, and no overlaps are 45 * allowed. It is assumed that write permission implies read permission 46 * (i.e. only RO and RW permissions should be used). Ranges with write 47 * permission must not be split up. 48 */ 49 50#define NO_RANGE {.count = 0, .range = NULL,} 51static struct ab5500_i2c_banks ab5500_bank_ranges[AB5500_NUM_DEVICES] = { 52 [AB5500_DEVID_USB] = { 53 .nbanks = 1, 54 .bank = (struct ab5500_i2c_ranges []) { 55 { 56 .bankid = AB5500_BANK_USB, 57 .nranges = 12, 58 .range = (struct ab5500_reg_range[]) { 59 { 60 .first = 0x01, 61 .last = 0x01, 62 .perm = AB5500_PERM_RW, 63 }, 64 { 65 .first = 0x80, 66 .last = 0x83, 67 .perm = AB5500_PERM_RW, 68 }, 69 { 70 .first = 0x87, 71 .last = 0x8A, 72 .perm = AB5500_PERM_RW, 73 }, 74 { 75 .first = 0x8B, 76 .last = 0x8B, 77 .perm = AB5500_PERM_RO, 78 }, 79 { 80 .first = 0x91, 81 .last = 0x92, 82 .perm = AB5500_PERM_RO, 83 }, 84 { 85 .first = 0x93, 86 .last = 0x93, 87 .perm = AB5500_PERM_RW, 88 }, 89 { 90 .first = 0x94, 91 .last = 0x94, 92 .perm = AB5500_PERM_RO, 93 }, 94 { 95 .first = 0xA8, 96 .last = 0xB0, 97 .perm = AB5500_PERM_RO, 98 }, 99 { 100 .first = 0xB2, 101 .last = 0xB2, 102 .perm = AB5500_PERM_RO, 103 }, 104 { 105 .first = 0xB4, 106 .last = 0xBC, 107 .perm = AB5500_PERM_RO, 108 }, 109 { 110 .first = 0xBF, 111 .last = 0xBF, 112 .perm = AB5500_PERM_RO, 113 }, 114 { 115 .first = 0xC1, 116 .last = 0xC5, 117 .perm = AB5500_PERM_RO, 118 }, 119 }, 120 }, 121 }, 122 }, 123 [AB5500_DEVID_ADC] = { 124 .nbanks = 1, 125 .bank = (struct ab5500_i2c_ranges []) { 126 { 127 .bankid = AB5500_BANK_ADC, 128 .nranges = 6, 129 .range = (struct ab5500_reg_range[]) { 130 { 131 .first = 0x1F, 132 .last = 0x22, 133 .perm = AB5500_PERM_RO, 134 }, 135 { 136 .first = 0x23, 137 .last = 0x24, 138 .perm = AB5500_PERM_RW, 139 }, 140 { 141 .first = 0x26, 142 .last = 0x2D, 143 .perm = AB5500_PERM_RO, 144 }, 145 { 146 .first = 0x2F, 147 .last = 0x34, 148 .perm = AB5500_PERM_RW, 149 }, 150 { 151 .first = 0x37, 152 .last = 0x57, 153 .perm = AB5500_PERM_RW, 154 }, 155 { 156 .first = 0x58, 157 .last = 0x58, 158 .perm = AB5500_PERM_RO, 159 }, 160 }, 161 }, 162 }, 163 }, 164 [AB5500_DEVID_LEDS] = { 165 .nbanks = 1, 166 .bank = (struct ab5500_i2c_ranges []) { 167 { 168 .bankid = AB5500_BANK_LED, 169 .nranges = 1, 170 .range = (struct ab5500_reg_range[]) { 171 { 172 .first = 0x00, 173 .last = 0x0C, 174 .perm = AB5500_PERM_RW, 175 }, 176 }, 177 }, 178 }, 179 }, 180 [AB5500_DEVID_VIDEO] = { 181 .nbanks = 1, 182 .bank = (struct ab5500_i2c_ranges []) { 183 { 184 .bankid = AB5500_BANK_VDENC, 185 .nranges = 12, 186 .range = (struct ab5500_reg_range[]) { 187 { 188 .first = 0x00, 189 .last = 0x08, 190 .perm = AB5500_PERM_RW, 191 }, 192 { 193 .first = 0x09, 194 .last = 0x09, 195 .perm = AB5500_PERM_RO, 196 }, 197 { 198 .first = 0x0A, 199 .last = 0x12, 200 .perm = AB5500_PERM_RW, 201 }, 202 { 203 .first = 0x15, 204 .last = 0x19, 205 .perm = AB5500_PERM_RW, 206 }, 207 { 208 .first = 0x1B, 209 .last = 0x21, 210 .perm = AB5500_PERM_RW, 211 }, 212 { 213 .first = 0x27, 214 .last = 0x2C, 215 .perm = AB5500_PERM_RW, 216 }, 217 { 218 .first = 0x41, 219 .last = 0x41, 220 .perm = AB5500_PERM_RW, 221 }, 222 { 223 .first = 0x45, 224 .last = 0x5B, 225 .perm = AB5500_PERM_RW, 226 }, 227 { 228 .first = 0x5D, 229 .last = 0x5D, 230 .perm = AB5500_PERM_RW, 231 }, 232 { 233 .first = 0x69, 234 .last = 0x69, 235 .perm = AB5500_PERM_RW, 236 }, 237 { 238 .first = 0x6C, 239 .last = 0x6D, 240 .perm = AB5500_PERM_RW, 241 }, 242 { 243 .first = 0x80, 244 .last = 0x81, 245 .perm = AB5500_PERM_RW, 246 }, 247 }, 248 }, 249 }, 250 }, 251 [AB5500_DEVID_REGULATORS] = { 252 .nbanks = 2, 253 .bank = (struct ab5500_i2c_ranges []) { 254 { 255 .bankid = AB5500_BANK_STARTUP, 256 .nranges = 12, 257 .range = (struct ab5500_reg_range[]) { 258 { 259 .first = 0x00, 260 .last = 0x01, 261 .perm = AB5500_PERM_RW, 262 }, 263 { 264 .first = 0x1F, 265 .last = 0x1F, 266 .perm = AB5500_PERM_RW, 267 }, 268 { 269 .first = 0x2E, 270 .last = 0x2E, 271 .perm = AB5500_PERM_RO, 272 }, 273 { 274 .first = 0x2F, 275 .last = 0x30, 276 .perm = AB5500_PERM_RW, 277 }, 278 { 279 .first = 0x50, 280 .last = 0x51, 281 .perm = AB5500_PERM_RW, 282 }, 283 { 284 .first = 0x60, 285 .last = 0x61, 286 .perm = AB5500_PERM_RW, 287 }, 288 { 289 .first = 0x66, 290 .last = 0x8A, 291 .perm = AB5500_PERM_RW, 292 }, 293 { 294 .first = 0x8C, 295 .last = 0x96, 296 .perm = AB5500_PERM_RW, 297 }, 298 { 299 .first = 0xAA, 300 .last = 0xB4, 301 .perm = AB5500_PERM_RW, 302 }, 303 { 304 .first = 0xB7, 305 .last = 0xBF, 306 .perm = AB5500_PERM_RW, 307 }, 308 { 309 .first = 0xC1, 310 .last = 0xCA, 311 .perm = AB5500_PERM_RW, 312 }, 313 { 314 .first = 0xD3, 315 .last = 0xE0, 316 .perm = AB5500_PERM_RW, 317 }, 318 }, 319 }, 320 { 321 .bankid = AB5500_BANK_SIM_USBSIM, 322 .nranges = 1, 323 .range = (struct ab5500_reg_range[]) { 324 { 325 .first = 0x13, 326 .last = 0x19, 327 .perm = AB5500_PERM_RW, 328 }, 329 }, 330 }, 331 }, 332 }, 333 [AB5500_DEVID_SIM] = { 334 .nbanks = 1, 335 .bank = (struct ab5500_i2c_ranges []) { 336 { 337 .bankid = AB5500_BANK_SIM_USBSIM, 338 .nranges = 1, 339 .range = (struct ab5500_reg_range[]) { 340 { 341 .first = 0x13, 342 .last = 0x19, 343 .perm = AB5500_PERM_RW, 344 }, 345 }, 346 }, 347 }, 348 }, 349 [AB5500_DEVID_RTC] = { 350 .nbanks = 1, 351 .bank = (struct ab5500_i2c_ranges []) { 352 { 353 .bankid = AB5500_BANK_RTC, 354 .nranges = 2, 355 .range = (struct ab5500_reg_range[]) { 356 { 357 .first = 0x00, 358 .last = 0x04, 359 .perm = AB5500_PERM_RW, 360 }, 361 { 362 .first = 0x06, 363 .last = 0x0C, 364 .perm = AB5500_PERM_RW, 365 }, 366 }, 367 }, 368 }, 369 }, 370 [AB5500_DEVID_CHARGER] = { 371 .nbanks = 1, 372 .bank = (struct ab5500_i2c_ranges []) { 373 { 374 .bankid = AB5500_BANK_CHG, 375 .nranges = 2, 376 .range = (struct ab5500_reg_range[]) { 377 { 378 .first = 0x11, 379 .last = 0x11, 380 .perm = AB5500_PERM_RO, 381 }, 382 { 383 .first = 0x12, 384 .last = 0x1B, 385 .perm = AB5500_PERM_RW, 386 }, 387 }, 388 }, 389 }, 390 }, 391 [AB5500_DEVID_FUELGAUGE] = { 392 .nbanks = 1, 393 .bank = (struct ab5500_i2c_ranges []) { 394 { 395 .bankid = AB5500_BANK_FG_BATTCOM_ACC, 396 .nranges = 2, 397 .range = (struct ab5500_reg_range[]) { 398 { 399 .first = 0x00, 400 .last = 0x0B, 401 .perm = AB5500_PERM_RO, 402 }, 403 { 404 .first = 0x0C, 405 .last = 0x10, 406 .perm = AB5500_PERM_RW, 407 }, 408 }, 409 }, 410 }, 411 }, 412 [AB5500_DEVID_VIBRATOR] = { 413 .nbanks = 1, 414 .bank = (struct ab5500_i2c_ranges []) { 415 { 416 .bankid = AB5500_BANK_VIBRA, 417 .nranges = 2, 418 .range = (struct ab5500_reg_range[]) { 419 { 420 .first = 0x10, 421 .last = 0x13, 422 .perm = AB5500_PERM_RW, 423 }, 424 { 425 .first = 0xFE, 426 .last = 0xFE, 427 .perm = AB5500_PERM_RW, 428 }, 429 }, 430 }, 431 }, 432 }, 433 [AB5500_DEVID_CODEC] = { 434 .nbanks = 1, 435 .bank = (struct ab5500_i2c_ranges []) { 436 { 437 .bankid = AB5500_BANK_AUDIO_HEADSETUSB, 438 .nranges = 2, 439 .range = (struct ab5500_reg_range[]) { 440 { 441 .first = 0x00, 442 .last = 0x48, 443 .perm = AB5500_PERM_RW, 444 }, 445 { 446 .first = 0xEB, 447 .last = 0xFB, 448 .perm = AB5500_PERM_RW, 449 }, 450 }, 451 }, 452 }, 453 }, 454 [AB5500_DEVID_POWER] = { 455 .nbanks = 2, 456 .bank = (struct ab5500_i2c_ranges []) { 457 { 458 .bankid = AB5500_BANK_STARTUP, 459 .nranges = 1, 460 .range = (struct ab5500_reg_range[]) { 461 { 462 .first = 0x30, 463 .last = 0x30, 464 .perm = AB5500_PERM_RW, 465 }, 466 }, 467 }, 468 { 469 .bankid = AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP, 470 .nranges = 1, 471 .range = (struct ab5500_reg_range[]) { 472 { 473 .first = 0x01, 474 .last = 0x01, 475 .perm = AB5500_PERM_RW, 476 }, 477 }, 478 }, 479 }, 480 }, 481}; 482 483#define AB5500_IRQ(bank, bit) ((bank) * 8 + (bit)) 484 485/* I appologize for the resource names beeing a mix of upper case 486 * and lower case but I want them to be exact as the documentation */ 487static struct mfd_cell ab5500_devs[AB5500_NUM_DEVICES] = { 488 [AB5500_DEVID_LEDS] = { 489 .name = "ab5500-leds", 490 .id = AB5500_DEVID_LEDS, 491 }, 492 [AB5500_DEVID_POWER] = { 493 .name = "ab5500-power", 494 .id = AB5500_DEVID_POWER, 495 }, 496 [AB5500_DEVID_REGULATORS] = { 497 .name = "ab5500-regulator", 498 .id = AB5500_DEVID_REGULATORS, 499 }, 500 [AB5500_DEVID_SIM] = { 501 .name = "ab5500-sim", 502 .id = AB5500_DEVID_SIM, 503 .num_resources = 1, 504 .resources = (struct resource[]) { 505 { 506 .name = "SIMOFF", 507 .flags = IORESOURCE_IRQ, 508 .start = AB5500_IRQ(2, 0), /*rising*/ 509 .end = AB5500_IRQ(2, 1), /*falling*/ 510 }, 511 }, 512 }, 513 [AB5500_DEVID_RTC] = { 514 .name = "ab5500-rtc", 515 .id = AB5500_DEVID_RTC, 516 .num_resources = 1, 517 .resources = (struct resource[]) { 518 { 519 .name = "RTC_Alarm", 520 .flags = IORESOURCE_IRQ, 521 .start = AB5500_IRQ(1, 7), 522 .end = AB5500_IRQ(1, 7), 523 } 524 }, 525 }, 526 [AB5500_DEVID_CHARGER] = { 527 .name = "ab5500-charger", 528 .id = AB5500_DEVID_CHARGER, 529 }, 530 [AB5500_DEVID_ADC] = { 531 .name = "ab5500-adc", 532 .id = AB5500_DEVID_ADC, 533 .num_resources = 10, 534 .resources = (struct resource[]) { 535 { 536 .name = "TRIGGER-0", 537 .flags = IORESOURCE_IRQ, 538 .start = AB5500_IRQ(0, 0), 539 .end = AB5500_IRQ(0, 0), 540 }, 541 { 542 .name = "TRIGGER-1", 543 .flags = IORESOURCE_IRQ, 544 .start = AB5500_IRQ(0, 1), 545 .end = AB5500_IRQ(0, 1), 546 }, 547 { 548 .name = "TRIGGER-2", 549 .flags = IORESOURCE_IRQ, 550 .start = AB5500_IRQ(0, 2), 551 .end = AB5500_IRQ(0, 2), 552 }, 553 { 554 .name = "TRIGGER-3", 555 .flags = IORESOURCE_IRQ, 556 .start = AB5500_IRQ(0, 3), 557 .end = AB5500_IRQ(0, 3), 558 }, 559 { 560 .name = "TRIGGER-4", 561 .flags = IORESOURCE_IRQ, 562 .start = AB5500_IRQ(0, 4), 563 .end = AB5500_IRQ(0, 4), 564 }, 565 { 566 .name = "TRIGGER-5", 567 .flags = IORESOURCE_IRQ, 568 .start = AB5500_IRQ(0, 5), 569 .end = AB5500_IRQ(0, 5), 570 }, 571 { 572 .name = "TRIGGER-6", 573 .flags = IORESOURCE_IRQ, 574 .start = AB5500_IRQ(0, 6), 575 .end = AB5500_IRQ(0, 6), 576 }, 577 { 578 .name = "TRIGGER-7", 579 .flags = IORESOURCE_IRQ, 580 .start = AB5500_IRQ(0, 7), 581 .end = AB5500_IRQ(0, 7), 582 }, 583 { 584 .name = "TRIGGER-VBAT", 585 .flags = IORESOURCE_IRQ, 586 .start = AB5500_IRQ(0, 8), 587 .end = AB5500_IRQ(0, 8), 588 }, 589 { 590 .name = "TRIGGER-VBAT-TXON", 591 .flags = IORESOURCE_IRQ, 592 .start = AB5500_IRQ(0, 9), 593 .end = AB5500_IRQ(0, 9), 594 }, 595 }, 596 }, 597 [AB5500_DEVID_FUELGAUGE] = { 598 .name = "ab5500-fuelgauge", 599 .id = AB5500_DEVID_FUELGAUGE, 600 .num_resources = 6, 601 .resources = (struct resource[]) { 602 { 603 .name = "Batt_attach", 604 .flags = IORESOURCE_IRQ, 605 .start = AB5500_IRQ(7, 5), 606 .end = AB5500_IRQ(7, 5), 607 }, 608 { 609 .name = "Batt_removal", 610 .flags = IORESOURCE_IRQ, 611 .start = AB5500_IRQ(7, 6), 612 .end = AB5500_IRQ(7, 6), 613 }, 614 { 615 .name = "UART_framing", 616 .flags = IORESOURCE_IRQ, 617 .start = AB5500_IRQ(7, 7), 618 .end = AB5500_IRQ(7, 7), 619 }, 620 { 621 .name = "UART_overrun", 622 .flags = IORESOURCE_IRQ, 623 .start = AB5500_IRQ(8, 0), 624 .end = AB5500_IRQ(8, 0), 625 }, 626 { 627 .name = "UART_Rdy_RX", 628 .flags = IORESOURCE_IRQ, 629 .start = AB5500_IRQ(8, 1), 630 .end = AB5500_IRQ(8, 1), 631 }, 632 { 633 .name = "UART_Rdy_TX", 634 .flags = IORESOURCE_IRQ, 635 .start = AB5500_IRQ(8, 2), 636 .end = AB5500_IRQ(8, 2), 637 }, 638 }, 639 }, 640 [AB5500_DEVID_VIBRATOR] = { 641 .name = "ab5500-vibrator", 642 .id = AB5500_DEVID_VIBRATOR, 643 }, 644 [AB5500_DEVID_CODEC] = { 645 .name = "ab5500-codec", 646 .id = AB5500_DEVID_CODEC, 647 .num_resources = 3, 648 .resources = (struct resource[]) { 649 { 650 .name = "audio_spkr1_ovc", 651 .flags = IORESOURCE_IRQ, 652 .start = AB5500_IRQ(9, 5), 653 .end = AB5500_IRQ(9, 5), 654 }, 655 { 656 .name = "audio_plllocked", 657 .flags = IORESOURCE_IRQ, 658 .start = AB5500_IRQ(9, 6), 659 .end = AB5500_IRQ(9, 6), 660 }, 661 { 662 .name = "audio_spkr2_ovc", 663 .flags = IORESOURCE_IRQ, 664 .start = AB5500_IRQ(17, 4), 665 .end = AB5500_IRQ(17, 4), 666 }, 667 }, 668 }, 669 [AB5500_DEVID_USB] = { 670 .name = "ab5500-usb", 671 .id = AB5500_DEVID_USB, 672 .num_resources = 36, 673 .resources = (struct resource[]) { 674 { 675 .name = "Link_Update", 676 .flags = IORESOURCE_IRQ, 677 .start = AB5500_IRQ(22, 1), 678 .end = AB5500_IRQ(22, 1), 679 }, 680 { 681 .name = "DCIO", 682 .flags = IORESOURCE_IRQ, 683 .start = AB5500_IRQ(8, 3), 684 .end = AB5500_IRQ(8, 4), 685 }, 686 { 687 .name = "VBUS_R", 688 .flags = IORESOURCE_IRQ, 689 .start = AB5500_IRQ(8, 5), 690 .end = AB5500_IRQ(8, 5), 691 }, 692 { 693 .name = "VBUS_F", 694 .flags = IORESOURCE_IRQ, 695 .start = AB5500_IRQ(8, 6), 696 .end = AB5500_IRQ(8, 6), 697 }, 698 { 699 .name = "CHGstate_10_PCVBUSchg", 700 .flags = IORESOURCE_IRQ, 701 .start = AB5500_IRQ(8, 7), 702 .end = AB5500_IRQ(8, 7), 703 }, 704 { 705 .name = "DCIOreverse_ovc", 706 .flags = IORESOURCE_IRQ, 707 .start = AB5500_IRQ(9, 0), 708 .end = AB5500_IRQ(9, 0), 709 }, 710 { 711 .name = "USBCharDetDone", 712 .flags = IORESOURCE_IRQ, 713 .start = AB5500_IRQ(9, 1), 714 .end = AB5500_IRQ(9, 1), 715 }, 716 { 717 .name = "DCIO_no_limit", 718 .flags = IORESOURCE_IRQ, 719 .start = AB5500_IRQ(9, 2), 720 .end = AB5500_IRQ(9, 2), 721 }, 722 { 723 .name = "USB_suspend", 724 .flags = IORESOURCE_IRQ, 725 .start = AB5500_IRQ(9, 3), 726 .end = AB5500_IRQ(9, 3), 727 }, 728 { 729 .name = "DCIOreverse_fwdcurrent", 730 .flags = IORESOURCE_IRQ, 731 .start = AB5500_IRQ(9, 4), 732 .end = AB5500_IRQ(9, 4), 733 }, 734 { 735 .name = "Vbus_Imeasmax_change", 736 .flags = IORESOURCE_IRQ, 737 .start = AB5500_IRQ(9, 5), 738 .end = AB5500_IRQ(9, 6), 739 }, 740 { 741 .name = "OVV", 742 .flags = IORESOURCE_IRQ, 743 .start = AB5500_IRQ(14, 5), 744 .end = AB5500_IRQ(14, 5), 745 }, 746 { 747 .name = "USBcharging_NOTok", 748 .flags = IORESOURCE_IRQ, 749 .start = AB5500_IRQ(15, 3), 750 .end = AB5500_IRQ(15, 3), 751 }, 752 { 753 .name = "usb_adp_sensoroff", 754 .flags = IORESOURCE_IRQ, 755 .start = AB5500_IRQ(15, 6), 756 .end = AB5500_IRQ(15, 6), 757 }, 758 { 759 .name = "usb_adp_probeplug", 760 .flags = IORESOURCE_IRQ, 761 .start = AB5500_IRQ(15, 7), 762 .end = AB5500_IRQ(15, 7), 763 }, 764 { 765 .name = "usb_adp_sinkerror", 766 .flags = IORESOURCE_IRQ, 767 .start = AB5500_IRQ(16, 0), 768 .end = AB5500_IRQ(16, 6), 769 }, 770 { 771 .name = "usb_adp_sourceerror", 772 .flags = IORESOURCE_IRQ, 773 .start = AB5500_IRQ(16, 1), 774 .end = AB5500_IRQ(16, 1), 775 }, 776 { 777 .name = "usb_idgnd_r", 778 .flags = IORESOURCE_IRQ, 779 .start = AB5500_IRQ(16, 2), 780 .end = AB5500_IRQ(16, 2), 781 }, 782 { 783 .name = "usb_idgnd_f", 784 .flags = IORESOURCE_IRQ, 785 .start = AB5500_IRQ(16, 3), 786 .end = AB5500_IRQ(16, 3), 787 }, 788 { 789 .name = "usb_iddetR1", 790 .flags = IORESOURCE_IRQ, 791 .start = AB5500_IRQ(16, 4), 792 .end = AB5500_IRQ(16, 5), 793 }, 794 { 795 .name = "usb_iddetR2", 796 .flags = IORESOURCE_IRQ, 797 .start = AB5500_IRQ(16, 6), 798 .end = AB5500_IRQ(16, 7), 799 }, 800 { 801 .name = "usb_iddetR3", 802 .flags = IORESOURCE_IRQ, 803 .start = AB5500_IRQ(17, 0), 804 .end = AB5500_IRQ(17, 1), 805 }, 806 { 807 .name = "usb_iddetR4", 808 .flags = IORESOURCE_IRQ, 809 .start = AB5500_IRQ(17, 2), 810 .end = AB5500_IRQ(17, 3), 811 }, 812 { 813 .name = "CharTempWindowOk", 814 .flags = IORESOURCE_IRQ, 815 .start = AB5500_IRQ(17, 7), 816 .end = AB5500_IRQ(18, 0), 817 }, 818 { 819 .name = "USB_SprDetect", 820 .flags = IORESOURCE_IRQ, 821 .start = AB5500_IRQ(18, 1), 822 .end = AB5500_IRQ(18, 1), 823 }, 824 { 825 .name = "usb_adp_probe_unplug", 826 .flags = IORESOURCE_IRQ, 827 .start = AB5500_IRQ(18, 2), 828 .end = AB5500_IRQ(18, 2), 829 }, 830 { 831 .name = "VBUSChDrop", 832 .flags = IORESOURCE_IRQ, 833 .start = AB5500_IRQ(18, 3), 834 .end = AB5500_IRQ(18, 4), 835 }, 836 { 837 .name = "dcio_char_rec_done", 838 .flags = IORESOURCE_IRQ, 839 .start = AB5500_IRQ(18, 5), 840 .end = AB5500_IRQ(18, 5), 841 }, 842 { 843 .name = "Charging_stopped_by_temp", 844 .flags = IORESOURCE_IRQ, 845 .start = AB5500_IRQ(18, 6), 846 .end = AB5500_IRQ(18, 6), 847 }, 848 { 849 .name = "CHGstate_11_SafeModeVBUS", 850 .flags = IORESOURCE_IRQ, 851 .start = AB5500_IRQ(21, 1), 852 .end = AB5500_IRQ(21, 2), 853 }, 854 { 855 .name = "CHGstate_12_comletedVBUS", 856 .flags = IORESOURCE_IRQ, 857 .start = AB5500_IRQ(21, 2), 858 .end = AB5500_IRQ(21, 2), 859 }, 860 { 861 .name = "CHGstate_13_completedVBUS", 862 .flags = IORESOURCE_IRQ, 863 .start = AB5500_IRQ(21, 3), 864 .end = AB5500_IRQ(21, 3), 865 }, 866 { 867 .name = "CHGstate_14_FullChgDCIO", 868 .flags = IORESOURCE_IRQ, 869 .start = AB5500_IRQ(21, 4), 870 .end = AB5500_IRQ(21, 4), 871 }, 872 { 873 .name = "CHGstate_15_SafeModeDCIO", 874 .flags = IORESOURCE_IRQ, 875 .start = AB5500_IRQ(21, 5), 876 .end = AB5500_IRQ(21, 5), 877 }, 878 { 879 .name = "CHGstate_16_OFFsuspendDCIO", 880 .flags = IORESOURCE_IRQ, 881 .start = AB5500_IRQ(21, 6), 882 .end = AB5500_IRQ(21, 6), 883 }, 884 { 885 .name = "CHGstate_17_completedDCIO", 886 .flags = IORESOURCE_IRQ, 887 .start = AB5500_IRQ(21, 7), 888 .end = AB5500_IRQ(21, 7), 889 }, 890 }, 891 }, 892 [AB5500_DEVID_OTP] = { 893 .name = "ab5500-otp", 894 .id = AB5500_DEVID_OTP, 895 }, 896 [AB5500_DEVID_VIDEO] = { 897 .name = "ab5500-video", 898 .id = AB5500_DEVID_VIDEO, 899 .num_resources = 1, 900 .resources = (struct resource[]) { 901 { 902 .name = "plugTVdet", 903 .flags = IORESOURCE_IRQ, 904 .start = AB5500_IRQ(22, 2), 905 .end = AB5500_IRQ(22, 2), 906 }, 907 }, 908 }, 909 [AB5500_DEVID_DBIECI] = { 910 .name = "ab5500-dbieci", 911 .id = AB5500_DEVID_DBIECI, 912 .num_resources = 10, 913 .resources = (struct resource[]) { 914 { 915 .name = "COLL", 916 .flags = IORESOURCE_IRQ, 917 .start = AB5500_IRQ(14, 0), 918 .end = AB5500_IRQ(14, 0), 919 }, 920 { 921 .name = "RESERR", 922 .flags = IORESOURCE_IRQ, 923 .start = AB5500_IRQ(14, 1), 924 .end = AB5500_IRQ(14, 1), 925 }, 926 { 927 .name = "FRAERR", 928 .flags = IORESOURCE_IRQ, 929 .start = AB5500_IRQ(14, 2), 930 .end = AB5500_IRQ(14, 2), 931 }, 932 { 933 .name = "COMERR", 934 .flags = IORESOURCE_IRQ, 935 .start = AB5500_IRQ(14, 3), 936 .end = AB5500_IRQ(14, 3), 937 }, 938 { 939 .name = "BSI_indicator", 940 .flags = IORESOURCE_IRQ, 941 .start = AB5500_IRQ(14, 4), 942 .end = AB5500_IRQ(14, 4), 943 }, 944 { 945 .name = "SPDSET", 946 .flags = IORESOURCE_IRQ, 947 .start = AB5500_IRQ(14, 6), 948 .end = AB5500_IRQ(14, 6), 949 }, 950 { 951 .name = "DSENT", 952 .flags = IORESOURCE_IRQ, 953 .start = AB5500_IRQ(14, 7), 954 .end = AB5500_IRQ(14, 7), 955 }, 956 { 957 .name = "DREC", 958 .flags = IORESOURCE_IRQ, 959 .start = AB5500_IRQ(15, 0), 960 .end = AB5500_IRQ(15, 0), 961 }, 962 { 963 .name = "ACCINT", 964 .flags = IORESOURCE_IRQ, 965 .start = AB5500_IRQ(15, 1), 966 .end = AB5500_IRQ(15, 1), 967 }, 968 { 969 .name = "NOPINT", 970 .flags = IORESOURCE_IRQ, 971 .start = AB5500_IRQ(15, 2), 972 .end = AB5500_IRQ(15, 2), 973 }, 974 }, 975 }, 976 [AB5500_DEVID_ONSWA] = { 977 .name = "ab5500-onswa", 978 .id = AB5500_DEVID_ONSWA, 979 .num_resources = 2, 980 .resources = (struct resource[]) { 981 { 982 .name = "ONSWAn_rising", 983 .flags = IORESOURCE_IRQ, 984 .start = AB5500_IRQ(1, 3), 985 .end = AB5500_IRQ(1, 3), 986 }, 987 { 988 .name = "ONSWAn_falling", 989 .flags = IORESOURCE_IRQ, 990 .start = AB5500_IRQ(1, 4), 991 .end = AB5500_IRQ(1, 4), 992 }, 993 }, 994 }, 995}; 996 997/* 998 * Functionality for getting/setting register values. 999 */ 1000int ab5500_get_register_interruptible_raw(struct ab5500 *ab, 1001 u8 bank, u8 reg, 1002 u8 *value) 1003{ 1004 int err; 1005 1006 if (bank >= AB5500_NUM_BANKS) 1007 return -EINVAL; 1008 1009 err = mutex_lock_interruptible(&ab->access_mutex); 1010 if (err) 1011 return err; 1012 err = db5500_prcmu_abb_read(bankinfo[bank].slave_addr, reg, value, 1); 1013 1014 mutex_unlock(&ab->access_mutex); 1015 return err; 1016} 1017 1018static int get_register_page_interruptible(struct ab5500 *ab, u8 bank, 1019 u8 first_reg, u8 *regvals, u8 numregs) 1020{ 1021 int err; 1022 1023 if (bank >= AB5500_NUM_BANKS) 1024 return -EINVAL; 1025 1026 err = mutex_lock_interruptible(&ab->access_mutex); 1027 if (err) 1028 return err; 1029 1030 while (numregs) { 1031 /* The hardware limit for get page is 4 */ 1032 u8 curnum = min_t(u8, numregs, 4u); 1033 1034 err = db5500_prcmu_abb_read(bankinfo[bank].slave_addr, 1035 first_reg, regvals, curnum); 1036 if (err) 1037 goto out; 1038 1039 numregs -= curnum; 1040 first_reg += curnum; 1041 regvals += curnum; 1042 } 1043 1044out: 1045 mutex_unlock(&ab->access_mutex); 1046 return err; 1047} 1048 1049int ab5500_mask_and_set_register_interruptible_raw(struct ab5500 *ab, u8 bank, 1050 u8 reg, u8 bitmask, u8 bitvalues) 1051{ 1052 int err = 0; 1053 1054 if (bank >= AB5500_NUM_BANKS) 1055 return -EINVAL; 1056 1057 if (bitmask) { 1058 u8 buf; 1059 1060 err = mutex_lock_interruptible(&ab->access_mutex); 1061 if (err) 1062 return err; 1063 1064 if (bitmask == 0xFF) /* No need to read in this case. */ 1065 buf = bitvalues; 1066 else { /* Read and modify the register value. */ 1067 err = db5500_prcmu_abb_read(bankinfo[bank].slave_addr, 1068 reg, &buf, 1); 1069 if (err) 1070 return err; 1071 1072 buf = ((~bitmask & buf) | (bitmask & bitvalues)); 1073 } 1074 /* Write the new value. */ 1075 err = db5500_prcmu_abb_write(bankinfo[bank].slave_addr, reg, 1076 &buf, 1); 1077 1078 mutex_unlock(&ab->access_mutex); 1079 } 1080 return err; 1081} 1082 1083static int 1084set_register_interruptible(struct ab5500 *ab, u8 bank, u8 reg, u8 value) 1085{ 1086 return ab5500_mask_and_set_register_interruptible_raw(ab, bank, reg, 1087 0xff, value); 1088} 1089 1090/* 1091 * Read/write permission checking functions. 1092 */ 1093static const struct ab5500_i2c_ranges *get_bankref(u8 devid, u8 bank) 1094{ 1095 u8 i; 1096 1097 if (devid < AB5500_NUM_DEVICES) { 1098 for (i = 0; i < ab5500_bank_ranges[devid].nbanks; i++) { 1099 if (ab5500_bank_ranges[devid].bank[i].bankid == bank) 1100 return &ab5500_bank_ranges[devid].bank[i]; 1101 } 1102 } 1103 return NULL; 1104} 1105 1106static bool page_write_allowed(u8 devid, u8 bank, u8 first_reg, u8 last_reg) 1107{ 1108 u8 i; /* range loop index */ 1109 const struct ab5500_i2c_ranges *bankref; 1110 1111 bankref = get_bankref(devid, bank); 1112 if (bankref == NULL || last_reg < first_reg) 1113 return false; 1114 1115 for (i = 0; i < bankref->nranges; i++) { 1116 if (first_reg < bankref->range[i].first) 1117 break; 1118 if ((last_reg <= bankref->range[i].last) && 1119 (bankref->range[i].perm & AB5500_PERM_WR)) 1120 return true; 1121 } 1122 return false; 1123} 1124 1125static bool reg_write_allowed(u8 devid, u8 bank, u8 reg) 1126{ 1127 return page_write_allowed(devid, bank, reg, reg); 1128} 1129 1130static bool page_read_allowed(u8 devid, u8 bank, u8 first_reg, u8 last_reg) 1131{ 1132 u8 i; 1133 const struct ab5500_i2c_ranges *bankref; 1134 1135 bankref = get_bankref(devid, bank); 1136 if (bankref == NULL || last_reg < first_reg) 1137 return false; 1138 1139 1140 /* Find the range (if it exists in the list) that includes first_reg. */ 1141 for (i = 0; i < bankref->nranges; i++) { 1142 if (first_reg < bankref->range[i].first) 1143 return false; 1144 if (first_reg <= bankref->range[i].last) 1145 break; 1146 } 1147 /* Make sure that the entire range up to and including last_reg is 1148 * readable. This may span several of the ranges in the list. 1149 */ 1150 while ((i < bankref->nranges) && 1151 (bankref->range[i].perm & AB5500_PERM_RD)) { 1152 if (last_reg <= bankref->range[i].last) 1153 return true; 1154 if ((++i >= bankref->nranges) || 1155 (bankref->range[i].first != 1156 (bankref->range[i - 1].last + 1))) { 1157 break; 1158 } 1159 } 1160 return false; 1161} 1162 1163static bool reg_read_allowed(u8 devid, u8 bank, u8 reg) 1164{ 1165 return page_read_allowed(devid, bank, reg, reg); 1166} 1167 1168 1169/* 1170 * The exported register access functionality. 1171 */ 1172static int ab5500_get_chip_id(struct device *dev) 1173{ 1174 struct ab5500 *ab = dev_get_drvdata(dev->parent); 1175 1176 return (int)ab->chip_id; 1177} 1178 1179static int ab5500_mask_and_set_register_interruptible(struct device *dev, 1180 u8 bank, u8 reg, u8 bitmask, u8 bitvalues) 1181{ 1182 struct ab5500 *ab; 1183 struct platform_device *pdev = to_platform_device(dev); 1184 1185 if ((AB5500_NUM_BANKS <= bank) || 1186 !reg_write_allowed(pdev->id, bank, reg)) 1187 return -EINVAL; 1188 1189 ab = dev_get_drvdata(dev->parent); 1190 return ab5500_mask_and_set_register_interruptible_raw(ab, bank, reg, 1191 bitmask, bitvalues); 1192} 1193 1194static int ab5500_set_register_interruptible(struct device *dev, u8 bank, 1195 u8 reg, u8 value) 1196{ 1197 return ab5500_mask_and_set_register_interruptible(dev, bank, reg, 0xFF, 1198 value); 1199} 1200 1201static int ab5500_get_register_interruptible(struct device *dev, u8 bank, 1202 u8 reg, u8 *value) 1203{ 1204 struct ab5500 *ab; 1205 struct platform_device *pdev = to_platform_device(dev); 1206 1207 if ((AB5500_NUM_BANKS <= bank) || 1208 !reg_read_allowed(pdev->id, bank, reg)) 1209 return -EINVAL; 1210 1211 ab = dev_get_drvdata(dev->parent); 1212 return ab5500_get_register_interruptible_raw(ab, bank, reg, value); 1213} 1214 1215static int ab5500_get_register_page_interruptible(struct device *dev, u8 bank, 1216 u8 first_reg, u8 *regvals, u8 numregs) 1217{ 1218 struct ab5500 *ab; 1219 struct platform_device *pdev = to_platform_device(dev); 1220 1221 if ((AB5500_NUM_BANKS <= bank) || 1222 !page_read_allowed(pdev->id, bank, 1223 first_reg, (first_reg + numregs - 1))) 1224 return -EINVAL; 1225 1226 ab = dev_get_drvdata(dev->parent); 1227 return get_register_page_interruptible(ab, bank, first_reg, regvals, 1228 numregs); 1229} 1230 1231static int 1232ab5500_event_registers_startup_state_get(struct device *dev, u8 *event) 1233{ 1234 struct ab5500 *ab; 1235 1236 ab = dev_get_drvdata(dev->parent); 1237 if (!ab->startup_events_read) 1238 return -EAGAIN; /* Try again later */ 1239 1240 memcpy(event, ab->startup_events, AB5500_NUM_EVENT_REG); 1241 return 0; 1242} 1243 1244static struct abx500_ops ab5500_ops = { 1245 .get_chip_id = ab5500_get_chip_id, 1246 .get_register = ab5500_get_register_interruptible, 1247 .set_register = ab5500_set_register_interruptible, 1248 .get_register_page = ab5500_get_register_page_interruptible, 1249 .set_register_page = NULL, 1250 .mask_and_set_register = ab5500_mask_and_set_register_interruptible, 1251 .event_registers_startup_state_get = 1252 ab5500_event_registers_startup_state_get, 1253 .startup_irq_enabled = NULL, 1254}; 1255 1256/* 1257 * ab5500_setup : Basic set-up, datastructure creation/destruction 1258 * and I2C interface.This sets up a default config 1259 * in the AB5500 chip so that it will work as expected. 1260 * @ab : Pointer to ab5500 structure 1261 * @settings : Pointer to struct abx500_init_settings 1262 * @size : Size of init data 1263 */ 1264static int __init ab5500_setup(struct ab5500 *ab, 1265 struct abx500_init_settings *settings, unsigned int size) 1266{ 1267 int err = 0; 1268 int i; 1269 1270 for (i = 0; i < size; i++) { 1271 err = ab5500_mask_and_set_register_interruptible_raw(ab, 1272 settings[i].bank, 1273 settings[i].reg, 1274 0xFF, settings[i].setting); 1275 if (err) 1276 goto exit_no_setup; 1277 1278 /* If event mask register update the event mask in ab5500 */ 1279 if ((settings[i].bank == AB5500_BANK_IT) && 1280 (AB5500_MASK_BASE <= settings[i].reg) && 1281 (settings[i].reg <= AB5500_MASK_END)) { 1282 ab->mask[settings[i].reg - AB5500_MASK_BASE] = 1283 settings[i].setting; 1284 } 1285 } 1286exit_no_setup: 1287 return err; 1288} 1289 1290struct ab_family_id { 1291 u8 id; 1292 char *name; 1293}; 1294 1295static const struct ab_family_id ids[] __initdata = { 1296 /* AB5500 */ 1297 { 1298 .id = AB5500_1_0, 1299 .name = "1.0" 1300 }, 1301 { 1302 .id = AB5500_1_1, 1303 .name = "1.1" 1304 }, 1305 /* Terminator */ 1306 { 1307 .id = 0x00, 1308 } 1309}; 1310 1311static int __init ab5500_probe(struct platform_device *pdev) 1312{ 1313 struct ab5500 *ab; 1314 struct ab5500_platform_data *ab5500_plf_data = 1315 pdev->dev.platform_data; 1316 int err; 1317 int i; 1318 1319 ab = kzalloc(sizeof(struct ab5500), GFP_KERNEL); 1320 if (!ab) { 1321 dev_err(&pdev->dev, 1322 "could not allocate ab5500 device\n"); 1323 return -ENOMEM; 1324 } 1325 1326 /* Initialize data structure */ 1327 mutex_init(&ab->access_mutex); 1328 mutex_init(&ab->irq_lock); 1329 ab->dev = &pdev->dev; 1330 1331 platform_set_drvdata(pdev, ab); 1332 1333 /* Read chip ID register */ 1334 err = ab5500_get_register_interruptible_raw(ab, 1335 AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP, 1336 AB5500_CHIP_ID, &ab->chip_id); 1337 if (err) { 1338 dev_err(&pdev->dev, "could not communicate with the analog " 1339 "baseband chip\n"); 1340 goto exit_no_detect; 1341 } 1342 1343 for (i = 0; ids[i].id != 0x0; i++) { 1344 if (ids[i].id == ab->chip_id) { 1345 snprintf(&ab->chip_name[0], sizeof(ab->chip_name) - 1, 1346 "AB5500 %s", ids[i].name); 1347 break; 1348 } 1349 } 1350 if (ids[i].id == 0x0) { 1351 dev_err(&pdev->dev, "unknown analog baseband chip id: 0x%x\n", 1352 ab->chip_id); 1353 dev_err(&pdev->dev, "driver not started!\n"); 1354 goto exit_no_detect; 1355 } 1356 1357 /* Clear and mask all interrupts */ 1358 for (i = 0; i < AB5500_NUM_IRQ_REGS; i++) { 1359 u8 latchreg = AB5500_IT_LATCH0_REG + i; 1360 u8 maskreg = AB5500_IT_MASK0_REG + i; 1361 u8 val; 1362 1363 ab5500_get_register_interruptible_raw(ab, AB5500_BANK_IT, 1364 latchreg, &val); 1365 set_register_interruptible(ab, AB5500_BANK_IT, maskreg, 0xff); 1366 ab->mask[i] = ab->oldmask[i] = 0xff; 1367 } 1368 1369 err = abx500_register_ops(&pdev->dev, &ab5500_ops); 1370 if (err) { 1371 dev_err(&pdev->dev, "ab5500_register ops error\n"); 1372 goto exit_no_detect; 1373 } 1374 1375 /* Set up and register the platform devices. */ 1376 for (i = 0; i < AB5500_NUM_DEVICES; i++) { 1377 ab5500_devs[i].platform_data = ab5500_plf_data->dev_data[i]; 1378 ab5500_devs[i].pdata_size = 1379 sizeof(ab5500_plf_data->dev_data[i]); 1380 } 1381 1382 err = mfd_add_devices(&pdev->dev, 0, ab5500_devs, 1383 ARRAY_SIZE(ab5500_devs), NULL, 1384 ab5500_plf_data->irq.base); 1385 if (err) { 1386 dev_err(&pdev->dev, "ab5500_mfd_add_device error\n"); 1387 goto exit_no_detect; 1388 } 1389 1390 err = ab5500_setup(ab, ab5500_plf_data->init_settings, 1391 ab5500_plf_data->init_settings_sz); 1392 if (err) { 1393 dev_err(&pdev->dev, "ab5500_setup error\n"); 1394 goto exit_no_detect; 1395 } 1396 1397 ab5500_setup_debugfs(ab); 1398 1399 dev_info(&pdev->dev, "detected AB chip: %s\n", &ab->chip_name[0]); 1400 return 0; 1401 1402exit_no_detect: 1403 kfree(ab); 1404 return err; 1405} 1406 1407static int __exit ab5500_remove(struct platform_device *pdev) 1408{ 1409 struct ab5500 *ab = platform_get_drvdata(pdev); 1410 1411 ab5500_remove_debugfs(); 1412 mfd_remove_devices(&pdev->dev); 1413 kfree(ab); 1414 return 0; 1415} 1416 1417static struct platform_driver ab5500_driver = { 1418 .driver = { 1419 .name = "ab5500-core", 1420 .owner = THIS_MODULE, 1421 }, 1422 .remove = __exit_p(ab5500_remove), 1423}; 1424 1425static int __init ab5500_core_init(void) 1426{ 1427 return platform_driver_probe(&ab5500_driver, ab5500_probe); 1428} 1429 1430static void __exit ab5500_core_exit(void) 1431{ 1432 platform_driver_unregister(&ab5500_driver); 1433} 1434 1435subsys_initcall(ab5500_core_init); 1436module_exit(ab5500_core_exit); 1437 1438MODULE_AUTHOR("Mattias Wallin <mattias.wallin@stericsson.com>"); 1439MODULE_DESCRIPTION("AB5500 core driver"); 1440MODULE_LICENSE("GPL"); 1441