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