1/* 2 * Copyright (C) ST-Ericsson SA 2010 3 * 4 * Author: Mattias Wallin <mattias.wallin@stericsson.com> for ST-Ericsson. 5 * License Terms: GNU General Public License v2 6 */ 7/* 8 * AB8500 register access 9 * ====================== 10 * 11 * read: 12 * # echo BANK > <debugfs>/ab8500/register-bank 13 * # echo ADDR > <debugfs>/ab8500/register-address 14 * # cat <debugfs>/ab8500/register-value 15 * 16 * write: 17 * # echo BANK > <debugfs>/ab8500/register-bank 18 * # echo ADDR > <debugfs>/ab8500/register-address 19 * # echo VALUE > <debugfs>/ab8500/register-value 20 * 21 * read all registers from a bank: 22 * # echo BANK > <debugfs>/ab8500/register-bank 23 * # cat <debugfs>/ab8500/all-bank-register 24 * 25 * BANK target AB8500 register bank 26 * ADDR target AB8500 register address 27 * VALUE decimal or 0x-prefixed hexadecimal 28 * 29 * 30 * User Space notification on AB8500 IRQ 31 * ===================================== 32 * 33 * Allows user space entity to be notified when target AB8500 IRQ occurs. 34 * When subscribed, a sysfs entry is created in ab8500.i2c platform device. 35 * One can pool this file to get target IRQ occurence information. 36 * 37 * subscribe to an AB8500 IRQ: 38 * # echo IRQ > <debugfs>/ab8500/irq-subscribe 39 * 40 * unsubscribe from an AB8500 IRQ: 41 * # echo IRQ > <debugfs>/ab8500/irq-unsubscribe 42 * 43 * 44 * AB8500 register formated read/write access 45 * ========================================== 46 * 47 * Read: read data, data>>SHIFT, data&=MASK, output data 48 * [0xABCDEF98] shift=12 mask=0xFFF => 0x00000CDE 49 * Write: read data, data &= ~(MASK<<SHIFT), data |= (VALUE<<SHIFT), write data 50 * [0xABCDEF98] shift=12 mask=0xFFF value=0x123 => [0xAB123F98] 51 * 52 * Usage: 53 * # echo "CMD [OPTIONS] BANK ADRESS [VALUE]" > $debugfs/ab8500/hwreg 54 * 55 * CMD read read access 56 * write write access 57 * 58 * BANK target reg bank 59 * ADDRESS target reg address 60 * VALUE (write) value to be updated 61 * 62 * OPTIONS 63 * -d|-dec (read) output in decimal 64 * -h|-hexa (read) output in 0x-hexa (default) 65 * -l|-w|-b 32bit (default), 16bit or 8bit reg access 66 * -m|-mask MASK 0x-hexa mask (default 0xFFFFFFFF) 67 * -s|-shift SHIFT bit shift value (read:left, write:right) 68 * -o|-offset OFFSET address offset to add to ADDRESS value 69 * 70 * Warning: bit shift operation is applied to bit-mask. 71 * Warning: bit shift direction depends on read or right command. 72 */ 73 74#include <linux/seq_file.h> 75#include <linux/uaccess.h> 76#include <linux/fs.h> 77#include <linux/module.h> 78#include <linux/debugfs.h> 79#include <linux/platform_device.h> 80#include <linux/interrupt.h> 81#include <linux/kobject.h> 82#include <linux/slab.h> 83#include <linux/irq.h> 84 85#include <linux/mfd/abx500.h> 86#include <linux/mfd/abx500/ab8500.h> 87#include <linux/mfd/abx500/ab8500-gpadc.h> 88 89#ifdef CONFIG_DEBUG_FS 90#include <linux/string.h> 91#include <linux/ctype.h> 92#endif 93 94static u32 debug_bank; 95static u32 debug_address; 96 97static int irq_ab8500; 98static int irq_first; 99static int irq_last; 100static u32 *irq_count; 101static int num_irqs; 102 103static struct device_attribute **dev_attr; 104static char **event_name; 105 106static u8 avg_sample = SAMPLE_16; 107static u8 trig_edge = RISING_EDGE; 108static u8 conv_type = ADC_SW; 109static u8 trig_timer; 110 111/** 112 * struct ab8500_reg_range 113 * @first: the first address of the range 114 * @last: the last address of the range 115 * @perm: access permissions for the range 116 */ 117struct ab8500_reg_range { 118 u8 first; 119 u8 last; 120 u8 perm; 121}; 122 123/** 124 * struct ab8500_prcmu_ranges 125 * @num_ranges: the number of ranges in the list 126 * @bankid: bank identifier 127 * @range: the list of register ranges 128 */ 129struct ab8500_prcmu_ranges { 130 u8 num_ranges; 131 u8 bankid; 132 const struct ab8500_reg_range *range; 133}; 134 135/* hwreg- "mask" and "shift" entries ressources */ 136struct hwreg_cfg { 137 u32 bank; /* target bank */ 138 unsigned long addr; /* target address */ 139 uint fmt; /* format */ 140 unsigned long mask; /* read/write mask, applied before any bit shift */ 141 long shift; /* bit shift (read:right shift, write:left shift */ 142}; 143/* fmt bit #0: 0=hexa, 1=dec */ 144#define REG_FMT_DEC(c) ((c)->fmt & 0x1) 145#define REG_FMT_HEX(c) (!REG_FMT_DEC(c)) 146 147static struct hwreg_cfg hwreg_cfg = { 148 .addr = 0, /* default: invalid phys addr */ 149 .fmt = 0, /* default: 32bit access, hex output */ 150 .mask = 0xFFFFFFFF, /* default: no mask */ 151 .shift = 0, /* default: no bit shift */ 152}; 153 154#define AB8500_NAME_STRING "ab8500" 155#define AB8500_ADC_NAME_STRING "gpadc" 156#define AB8500_NUM_BANKS 24 157 158#define AB8500_REV_REG 0x80 159 160static struct ab8500_prcmu_ranges *debug_ranges; 161 162static struct ab8500_prcmu_ranges ab8500_debug_ranges[AB8500_NUM_BANKS] = { 163 [0x0] = { 164 .num_ranges = 0, 165 .range = NULL, 166 }, 167 [AB8500_SYS_CTRL1_BLOCK] = { 168 .num_ranges = 3, 169 .range = (struct ab8500_reg_range[]) { 170 { 171 .first = 0x00, 172 .last = 0x02, 173 }, 174 { 175 .first = 0x42, 176 .last = 0x42, 177 }, 178 { 179 .first = 0x80, 180 .last = 0x81, 181 }, 182 }, 183 }, 184 [AB8500_SYS_CTRL2_BLOCK] = { 185 .num_ranges = 4, 186 .range = (struct ab8500_reg_range[]) { 187 { 188 .first = 0x00, 189 .last = 0x0D, 190 }, 191 { 192 .first = 0x0F, 193 .last = 0x17, 194 }, 195 { 196 .first = 0x30, 197 .last = 0x30, 198 }, 199 { 200 .first = 0x32, 201 .last = 0x33, 202 }, 203 }, 204 }, 205 [AB8500_REGU_CTRL1] = { 206 .num_ranges = 3, 207 .range = (struct ab8500_reg_range[]) { 208 { 209 .first = 0x00, 210 .last = 0x00, 211 }, 212 { 213 .first = 0x03, 214 .last = 0x10, 215 }, 216 { 217 .first = 0x80, 218 .last = 0x84, 219 }, 220 }, 221 }, 222 [AB8500_REGU_CTRL2] = { 223 .num_ranges = 5, 224 .range = (struct ab8500_reg_range[]) { 225 { 226 .first = 0x00, 227 .last = 0x15, 228 }, 229 { 230 .first = 0x17, 231 .last = 0x19, 232 }, 233 { 234 .first = 0x1B, 235 .last = 0x1D, 236 }, 237 { 238 .first = 0x1F, 239 .last = 0x22, 240 }, 241 { 242 .first = 0x40, 243 .last = 0x44, 244 }, 245 /* 0x80-0x8B is SIM registers and should 246 * not be accessed from here */ 247 }, 248 }, 249 [AB8500_USB] = { 250 .num_ranges = 2, 251 .range = (struct ab8500_reg_range[]) { 252 { 253 .first = 0x80, 254 .last = 0x83, 255 }, 256 { 257 .first = 0x87, 258 .last = 0x8A, 259 }, 260 }, 261 }, 262 [AB8500_TVOUT] = { 263 .num_ranges = 9, 264 .range = (struct ab8500_reg_range[]) { 265 { 266 .first = 0x00, 267 .last = 0x12, 268 }, 269 { 270 .first = 0x15, 271 .last = 0x17, 272 }, 273 { 274 .first = 0x19, 275 .last = 0x21, 276 }, 277 { 278 .first = 0x27, 279 .last = 0x2C, 280 }, 281 { 282 .first = 0x41, 283 .last = 0x41, 284 }, 285 { 286 .first = 0x45, 287 .last = 0x5B, 288 }, 289 { 290 .first = 0x5D, 291 .last = 0x5D, 292 }, 293 { 294 .first = 0x69, 295 .last = 0x69, 296 }, 297 { 298 .first = 0x80, 299 .last = 0x81, 300 }, 301 }, 302 }, 303 [AB8500_DBI] = { 304 .num_ranges = 0, 305 .range = NULL, 306 }, 307 [AB8500_ECI_AV_ACC] = { 308 .num_ranges = 1, 309 .range = (struct ab8500_reg_range[]) { 310 { 311 .first = 0x80, 312 .last = 0x82, 313 }, 314 }, 315 }, 316 [0x9] = { 317 .num_ranges = 0, 318 .range = NULL, 319 }, 320 [AB8500_GPADC] = { 321 .num_ranges = 1, 322 .range = (struct ab8500_reg_range[]) { 323 { 324 .first = 0x00, 325 .last = 0x08, 326 }, 327 }, 328 }, 329 [AB8500_CHARGER] = { 330 .num_ranges = 9, 331 .range = (struct ab8500_reg_range[]) { 332 { 333 .first = 0x00, 334 .last = 0x03, 335 }, 336 { 337 .first = 0x05, 338 .last = 0x05, 339 }, 340 { 341 .first = 0x40, 342 .last = 0x40, 343 }, 344 { 345 .first = 0x42, 346 .last = 0x42, 347 }, 348 { 349 .first = 0x44, 350 .last = 0x44, 351 }, 352 { 353 .first = 0x50, 354 .last = 0x55, 355 }, 356 { 357 .first = 0x80, 358 .last = 0x82, 359 }, 360 { 361 .first = 0xC0, 362 .last = 0xC2, 363 }, 364 { 365 .first = 0xf5, 366 .last = 0xf6, 367 }, 368 }, 369 }, 370 [AB8500_GAS_GAUGE] = { 371 .num_ranges = 3, 372 .range = (struct ab8500_reg_range[]) { 373 { 374 .first = 0x00, 375 .last = 0x00, 376 }, 377 { 378 .first = 0x07, 379 .last = 0x0A, 380 }, 381 { 382 .first = 0x10, 383 .last = 0x14, 384 }, 385 }, 386 }, 387 [AB8500_DEVELOPMENT] = { 388 .num_ranges = 1, 389 .range = (struct ab8500_reg_range[]) { 390 { 391 .first = 0x00, 392 .last = 0x00, 393 }, 394 }, 395 }, 396 [AB8500_DEBUG] = { 397 .num_ranges = 1, 398 .range = (struct ab8500_reg_range[]) { 399 { 400 .first = 0x05, 401 .last = 0x07, 402 }, 403 }, 404 }, 405 [AB8500_AUDIO] = { 406 .num_ranges = 1, 407 .range = (struct ab8500_reg_range[]) { 408 { 409 .first = 0x00, 410 .last = 0x6F, 411 }, 412 }, 413 }, 414 [AB8500_INTERRUPT] = { 415 .num_ranges = 0, 416 .range = NULL, 417 }, 418 [AB8500_RTC] = { 419 .num_ranges = 1, 420 .range = (struct ab8500_reg_range[]) { 421 { 422 .first = 0x00, 423 .last = 0x0F, 424 }, 425 }, 426 }, 427 [AB8500_MISC] = { 428 .num_ranges = 8, 429 .range = (struct ab8500_reg_range[]) { 430 { 431 .first = 0x00, 432 .last = 0x05, 433 }, 434 { 435 .first = 0x10, 436 .last = 0x15, 437 }, 438 { 439 .first = 0x20, 440 .last = 0x25, 441 }, 442 { 443 .first = 0x30, 444 .last = 0x35, 445 }, 446 { 447 .first = 0x40, 448 .last = 0x45, 449 }, 450 { 451 .first = 0x50, 452 .last = 0x50, 453 }, 454 { 455 .first = 0x60, 456 .last = 0x67, 457 }, 458 { 459 .first = 0x80, 460 .last = 0x80, 461 }, 462 }, 463 }, 464 [0x11] = { 465 .num_ranges = 0, 466 .range = NULL, 467 }, 468 [0x12] = { 469 .num_ranges = 0, 470 .range = NULL, 471 }, 472 [0x13] = { 473 .num_ranges = 0, 474 .range = NULL, 475 }, 476 [0x14] = { 477 .num_ranges = 0, 478 .range = NULL, 479 }, 480 [AB8500_OTP_EMUL] = { 481 .num_ranges = 1, 482 .range = (struct ab8500_reg_range[]) { 483 { 484 .first = 0x01, 485 .last = 0x0F, 486 }, 487 }, 488 }, 489}; 490 491static struct ab8500_prcmu_ranges ab8505_debug_ranges[AB8500_NUM_BANKS] = { 492 [0x0] = { 493 .num_ranges = 0, 494 .range = NULL, 495 }, 496 [AB8500_SYS_CTRL1_BLOCK] = { 497 .num_ranges = 5, 498 .range = (struct ab8500_reg_range[]) { 499 { 500 .first = 0x00, 501 .last = 0x04, 502 }, 503 { 504 .first = 0x42, 505 .last = 0x42, 506 }, 507 { 508 .first = 0x52, 509 .last = 0x52, 510 }, 511 { 512 .first = 0x54, 513 .last = 0x57, 514 }, 515 { 516 .first = 0x80, 517 .last = 0x83, 518 }, 519 }, 520 }, 521 [AB8500_SYS_CTRL2_BLOCK] = { 522 .num_ranges = 5, 523 .range = (struct ab8500_reg_range[]) { 524 { 525 .first = 0x00, 526 .last = 0x0D, 527 }, 528 { 529 .first = 0x0F, 530 .last = 0x17, 531 }, 532 { 533 .first = 0x20, 534 .last = 0x20, 535 }, 536 { 537 .first = 0x30, 538 .last = 0x30, 539 }, 540 { 541 .first = 0x32, 542 .last = 0x3A, 543 }, 544 }, 545 }, 546 [AB8500_REGU_CTRL1] = { 547 .num_ranges = 3, 548 .range = (struct ab8500_reg_range[]) { 549 { 550 .first = 0x00, 551 .last = 0x00, 552 }, 553 { 554 .first = 0x03, 555 .last = 0x11, 556 }, 557 { 558 .first = 0x80, 559 .last = 0x86, 560 }, 561 }, 562 }, 563 [AB8500_REGU_CTRL2] = { 564 .num_ranges = 6, 565 .range = (struct ab8500_reg_range[]) { 566 { 567 .first = 0x00, 568 .last = 0x06, 569 }, 570 { 571 .first = 0x08, 572 .last = 0x15, 573 }, 574 { 575 .first = 0x17, 576 .last = 0x19, 577 }, 578 { 579 .first = 0x1B, 580 .last = 0x1D, 581 }, 582 { 583 .first = 0x1F, 584 .last = 0x30, 585 }, 586 { 587 .first = 0x40, 588 .last = 0x48, 589 }, 590 /* 0x80-0x8B is SIM registers and should 591 * not be accessed from here */ 592 }, 593 }, 594 [AB8500_USB] = { 595 .num_ranges = 3, 596 .range = (struct ab8500_reg_range[]) { 597 { 598 .first = 0x80, 599 .last = 0x83, 600 }, 601 { 602 .first = 0x87, 603 .last = 0x8A, 604 }, 605 { 606 .first = 0x91, 607 .last = 0x94, 608 }, 609 }, 610 }, 611 [AB8500_TVOUT] = { 612 .num_ranges = 0, 613 .range = NULL, 614 }, 615 [AB8500_DBI] = { 616 .num_ranges = 0, 617 .range = NULL, 618 }, 619 [AB8500_ECI_AV_ACC] = { 620 .num_ranges = 1, 621 .range = (struct ab8500_reg_range[]) { 622 { 623 .first = 0x80, 624 .last = 0x82, 625 }, 626 }, 627 }, 628 [AB8500_RESERVED] = { 629 .num_ranges = 0, 630 .range = NULL, 631 }, 632 [AB8500_GPADC] = { 633 .num_ranges = 1, 634 .range = (struct ab8500_reg_range[]) { 635 { 636 .first = 0x00, 637 .last = 0x08, 638 }, 639 }, 640 }, 641 [AB8500_CHARGER] = { 642 .num_ranges = 9, 643 .range = (struct ab8500_reg_range[]) { 644 { 645 .first = 0x02, 646 .last = 0x03, 647 }, 648 { 649 .first = 0x05, 650 .last = 0x05, 651 }, 652 { 653 .first = 0x40, 654 .last = 0x44, 655 }, 656 { 657 .first = 0x50, 658 .last = 0x57, 659 }, 660 { 661 .first = 0x60, 662 .last = 0x60, 663 }, 664 { 665 .first = 0xA0, 666 .last = 0xA7, 667 }, 668 { 669 .first = 0xAF, 670 .last = 0xB2, 671 }, 672 { 673 .first = 0xC0, 674 .last = 0xC2, 675 }, 676 { 677 .first = 0xF5, 678 .last = 0xF5, 679 }, 680 }, 681 }, 682 [AB8500_GAS_GAUGE] = { 683 .num_ranges = 3, 684 .range = (struct ab8500_reg_range[]) { 685 { 686 .first = 0x00, 687 .last = 0x00, 688 }, 689 { 690 .first = 0x07, 691 .last = 0x0A, 692 }, 693 { 694 .first = 0x10, 695 .last = 0x14, 696 }, 697 }, 698 }, 699 [AB8500_AUDIO] = { 700 .num_ranges = 1, 701 .range = (struct ab8500_reg_range[]) { 702 { 703 .first = 0x00, 704 .last = 0x83, 705 }, 706 }, 707 }, 708 [AB8500_INTERRUPT] = { 709 .num_ranges = 11, 710 .range = (struct ab8500_reg_range[]) { 711 { 712 .first = 0x00, 713 .last = 0x04, 714 }, 715 { 716 .first = 0x06, 717 .last = 0x07, 718 }, 719 { 720 .first = 0x09, 721 .last = 0x09, 722 }, 723 { 724 .first = 0x0B, 725 .last = 0x0C, 726 }, 727 { 728 .first = 0x12, 729 .last = 0x15, 730 }, 731 { 732 .first = 0x18, 733 .last = 0x18, 734 }, 735 /* Latch registers should not be read here */ 736 { 737 .first = 0x40, 738 .last = 0x44, 739 }, 740 { 741 .first = 0x46, 742 .last = 0x49, 743 }, 744 { 745 .first = 0x4B, 746 .last = 0x4D, 747 }, 748 { 749 .first = 0x52, 750 .last = 0x55, 751 }, 752 { 753 .first = 0x58, 754 .last = 0x58, 755 }, 756 /* LatchHier registers should not be read here */ 757 }, 758 }, 759 [AB8500_RTC] = { 760 .num_ranges = 2, 761 .range = (struct ab8500_reg_range[]) { 762 { 763 .first = 0x00, 764 .last = 0x14, 765 }, 766 { 767 .first = 0x16, 768 .last = 0x17, 769 }, 770 }, 771 }, 772 [AB8500_MISC] = { 773 .num_ranges = 8, 774 .range = (struct ab8500_reg_range[]) { 775 { 776 .first = 0x00, 777 .last = 0x06, 778 }, 779 { 780 .first = 0x10, 781 .last = 0x16, 782 }, 783 { 784 .first = 0x20, 785 .last = 0x26, 786 }, 787 { 788 .first = 0x30, 789 .last = 0x36, 790 }, 791 { 792 .first = 0x40, 793 .last = 0x46, 794 }, 795 { 796 .first = 0x50, 797 .last = 0x50, 798 }, 799 { 800 .first = 0x60, 801 .last = 0x6B, 802 }, 803 { 804 .first = 0x80, 805 .last = 0x82, 806 }, 807 }, 808 }, 809 [AB8500_DEVELOPMENT] = { 810 .num_ranges = 2, 811 .range = (struct ab8500_reg_range[]) { 812 { 813 .first = 0x00, 814 .last = 0x00, 815 }, 816 { 817 .first = 0x05, 818 .last = 0x05, 819 }, 820 }, 821 }, 822 [AB8500_DEBUG] = { 823 .num_ranges = 1, 824 .range = (struct ab8500_reg_range[]) { 825 { 826 .first = 0x05, 827 .last = 0x07, 828 }, 829 }, 830 }, 831 [AB8500_PROD_TEST] = { 832 .num_ranges = 0, 833 .range = NULL, 834 }, 835 [AB8500_STE_TEST] = { 836 .num_ranges = 0, 837 .range = NULL, 838 }, 839 [AB8500_OTP_EMUL] = { 840 .num_ranges = 1, 841 .range = (struct ab8500_reg_range[]) { 842 { 843 .first = 0x01, 844 .last = 0x15, 845 }, 846 }, 847 }, 848}; 849 850static struct ab8500_prcmu_ranges ab8540_debug_ranges[AB8500_NUM_BANKS] = { 851 [AB8500_M_FSM_RANK] = { 852 .num_ranges = 1, 853 .range = (struct ab8500_reg_range[]) { 854 { 855 .first = 0x00, 856 .last = 0x0B, 857 }, 858 }, 859 }, 860 [AB8500_SYS_CTRL1_BLOCK] = { 861 .num_ranges = 6, 862 .range = (struct ab8500_reg_range[]) { 863 { 864 .first = 0x00, 865 .last = 0x04, 866 }, 867 { 868 .first = 0x42, 869 .last = 0x42, 870 }, 871 { 872 .first = 0x50, 873 .last = 0x54, 874 }, 875 { 876 .first = 0x57, 877 .last = 0x57, 878 }, 879 { 880 .first = 0x80, 881 .last = 0x83, 882 }, 883 { 884 .first = 0x90, 885 .last = 0x90, 886 }, 887 }, 888 }, 889 [AB8500_SYS_CTRL2_BLOCK] = { 890 .num_ranges = 5, 891 .range = (struct ab8500_reg_range[]) { 892 { 893 .first = 0x00, 894 .last = 0x0D, 895 }, 896 { 897 .first = 0x0F, 898 .last = 0x10, 899 }, 900 { 901 .first = 0x20, 902 .last = 0x21, 903 }, 904 { 905 .first = 0x32, 906 .last = 0x3C, 907 }, 908 { 909 .first = 0x40, 910 .last = 0x42, 911 }, 912 }, 913 }, 914 [AB8500_REGU_CTRL1] = { 915 .num_ranges = 4, 916 .range = (struct ab8500_reg_range[]) { 917 { 918 .first = 0x03, 919 .last = 0x15, 920 }, 921 { 922 .first = 0x20, 923 .last = 0x20, 924 }, 925 { 926 .first = 0x80, 927 .last = 0x85, 928 }, 929 { 930 .first = 0x87, 931 .last = 0x88, 932 }, 933 }, 934 }, 935 [AB8500_REGU_CTRL2] = { 936 .num_ranges = 8, 937 .range = (struct ab8500_reg_range[]) { 938 { 939 .first = 0x00, 940 .last = 0x06, 941 }, 942 { 943 .first = 0x08, 944 .last = 0x15, 945 }, 946 { 947 .first = 0x17, 948 .last = 0x19, 949 }, 950 { 951 .first = 0x1B, 952 .last = 0x1D, 953 }, 954 { 955 .first = 0x1F, 956 .last = 0x2F, 957 }, 958 { 959 .first = 0x31, 960 .last = 0x3A, 961 }, 962 { 963 .first = 0x43, 964 .last = 0x44, 965 }, 966 { 967 .first = 0x48, 968 .last = 0x49, 969 }, 970 }, 971 }, 972 [AB8500_USB] = { 973 .num_ranges = 3, 974 .range = (struct ab8500_reg_range[]) { 975 { 976 .first = 0x80, 977 .last = 0x83, 978 }, 979 { 980 .first = 0x87, 981 .last = 0x8A, 982 }, 983 { 984 .first = 0x91, 985 .last = 0x94, 986 }, 987 }, 988 }, 989 [AB8500_TVOUT] = { 990 .num_ranges = 0, 991 .range = NULL 992 }, 993 [AB8500_DBI] = { 994 .num_ranges = 4, 995 .range = (struct ab8500_reg_range[]) { 996 { 997 .first = 0x00, 998 .last = 0x07, 999 }, 1000 { 1001 .first = 0x10, 1002 .last = 0x11, 1003 }, 1004 { 1005 .first = 0x20, 1006 .last = 0x21, 1007 }, 1008 { 1009 .first = 0x30, 1010 .last = 0x43, 1011 }, 1012 }, 1013 }, 1014 [AB8500_ECI_AV_ACC] = { 1015 .num_ranges = 2, 1016 .range = (struct ab8500_reg_range[]) { 1017 { 1018 .first = 0x00, 1019 .last = 0x03, 1020 }, 1021 { 1022 .first = 0x80, 1023 .last = 0x82, 1024 }, 1025 }, 1026 }, 1027 [AB8500_RESERVED] = { 1028 .num_ranges = 0, 1029 .range = NULL, 1030 }, 1031 [AB8500_GPADC] = { 1032 .num_ranges = 4, 1033 .range = (struct ab8500_reg_range[]) { 1034 { 1035 .first = 0x00, 1036 .last = 0x01, 1037 }, 1038 { 1039 .first = 0x04, 1040 .last = 0x06, 1041 }, 1042 { 1043 .first = 0x09, 1044 .last = 0x0A, 1045 }, 1046 { 1047 .first = 0x10, 1048 .last = 0x14, 1049 }, 1050 }, 1051 }, 1052 [AB8500_CHARGER] = { 1053 .num_ranges = 10, 1054 .range = (struct ab8500_reg_range[]) { 1055 { 1056 .first = 0x00, 1057 .last = 0x00, 1058 }, 1059 { 1060 .first = 0x02, 1061 .last = 0x05, 1062 }, 1063 { 1064 .first = 0x40, 1065 .last = 0x44, 1066 }, 1067 { 1068 .first = 0x50, 1069 .last = 0x57, 1070 }, 1071 { 1072 .first = 0x60, 1073 .last = 0x60, 1074 }, 1075 { 1076 .first = 0x70, 1077 .last = 0x70, 1078 }, 1079 { 1080 .first = 0xA0, 1081 .last = 0xA9, 1082 }, 1083 { 1084 .first = 0xAF, 1085 .last = 0xB2, 1086 }, 1087 { 1088 .first = 0xC0, 1089 .last = 0xC6, 1090 }, 1091 { 1092 .first = 0xF5, 1093 .last = 0xF5, 1094 }, 1095 }, 1096 }, 1097 [AB8500_GAS_GAUGE] = { 1098 .num_ranges = 3, 1099 .range = (struct ab8500_reg_range[]) { 1100 { 1101 .first = 0x00, 1102 .last = 0x00, 1103 }, 1104 { 1105 .first = 0x07, 1106 .last = 0x0A, 1107 }, 1108 { 1109 .first = 0x10, 1110 .last = 0x14, 1111 }, 1112 }, 1113 }, 1114 [AB8500_AUDIO] = { 1115 .num_ranges = 1, 1116 .range = (struct ab8500_reg_range[]) { 1117 { 1118 .first = 0x00, 1119 .last = 0x9f, 1120 }, 1121 }, 1122 }, 1123 [AB8500_INTERRUPT] = { 1124 .num_ranges = 6, 1125 .range = (struct ab8500_reg_range[]) { 1126 { 1127 .first = 0x00, 1128 .last = 0x05, 1129 }, 1130 { 1131 .first = 0x0B, 1132 .last = 0x0D, 1133 }, 1134 { 1135 .first = 0x12, 1136 .last = 0x20, 1137 }, 1138 /* Latch registers should not be read here */ 1139 { 1140 .first = 0x40, 1141 .last = 0x45, 1142 }, 1143 { 1144 .first = 0x4B, 1145 .last = 0x4D, 1146 }, 1147 { 1148 .first = 0x52, 1149 .last = 0x60, 1150 }, 1151 /* LatchHier registers should not be read here */ 1152 }, 1153 }, 1154 [AB8500_RTC] = { 1155 .num_ranges = 3, 1156 .range = (struct ab8500_reg_range[]) { 1157 { 1158 .first = 0x00, 1159 .last = 0x07, 1160 }, 1161 { 1162 .first = 0x0B, 1163 .last = 0x18, 1164 }, 1165 { 1166 .first = 0x20, 1167 .last = 0x25, 1168 }, 1169 }, 1170 }, 1171 [AB8500_MISC] = { 1172 .num_ranges = 9, 1173 .range = (struct ab8500_reg_range[]) { 1174 { 1175 .first = 0x00, 1176 .last = 0x06, 1177 }, 1178 { 1179 .first = 0x10, 1180 .last = 0x16, 1181 }, 1182 { 1183 .first = 0x20, 1184 .last = 0x26, 1185 }, 1186 { 1187 .first = 0x30, 1188 .last = 0x36, 1189 }, 1190 { 1191 .first = 0x40, 1192 .last = 0x49, 1193 }, 1194 { 1195 .first = 0x50, 1196 .last = 0x50, 1197 }, 1198 { 1199 .first = 0x60, 1200 .last = 0x6B, 1201 }, 1202 { 1203 .first = 0x70, 1204 .last = 0x74, 1205 }, 1206 { 1207 .first = 0x80, 1208 .last = 0x82, 1209 }, 1210 }, 1211 }, 1212 [AB8500_DEVELOPMENT] = { 1213 .num_ranges = 3, 1214 .range = (struct ab8500_reg_range[]) { 1215 { 1216 .first = 0x00, 1217 .last = 0x01, 1218 }, 1219 { 1220 .first = 0x06, 1221 .last = 0x06, 1222 }, 1223 { 1224 .first = 0x10, 1225 .last = 0x21, 1226 }, 1227 }, 1228 }, 1229 [AB8500_DEBUG] = { 1230 .num_ranges = 3, 1231 .range = (struct ab8500_reg_range[]) { 1232 { 1233 .first = 0x01, 1234 .last = 0x0C, 1235 }, 1236 { 1237 .first = 0x0E, 1238 .last = 0x11, 1239 }, 1240 { 1241 .first = 0x80, 1242 .last = 0x81, 1243 }, 1244 }, 1245 }, 1246 [AB8500_PROD_TEST] = { 1247 .num_ranges = 0, 1248 .range = NULL, 1249 }, 1250 [AB8500_STE_TEST] = { 1251 .num_ranges = 0, 1252 .range = NULL, 1253 }, 1254 [AB8500_OTP_EMUL] = { 1255 .num_ranges = 1, 1256 .range = (struct ab8500_reg_range[]) { 1257 { 1258 .first = 0x00, 1259 .last = 0x3F, 1260 }, 1261 }, 1262 }, 1263}; 1264 1265 1266static irqreturn_t ab8500_debug_handler(int irq, void *data) 1267{ 1268 char buf[16]; 1269 struct kobject *kobj = (struct kobject *)data; 1270 unsigned int irq_abb = irq - irq_first; 1271 1272 if (irq_abb < num_irqs) 1273 irq_count[irq_abb]++; 1274 /* 1275 * This makes it possible to use poll for events (POLLPRI | POLLERR) 1276 * from userspace on sysfs file named <irq-nr> 1277 */ 1278 sprintf(buf, "%d", irq); 1279 sysfs_notify(kobj, NULL, buf); 1280 1281 return IRQ_HANDLED; 1282} 1283 1284/* Prints to seq_file or log_buf */ 1285static int ab8500_registers_print(struct device *dev, u32 bank, 1286 struct seq_file *s) 1287{ 1288 unsigned int i; 1289 1290 for (i = 0; i < debug_ranges[bank].num_ranges; i++) { 1291 u32 reg; 1292 1293 for (reg = debug_ranges[bank].range[i].first; 1294 reg <= debug_ranges[bank].range[i].last; 1295 reg++) { 1296 u8 value; 1297 int err; 1298 1299 err = abx500_get_register_interruptible(dev, 1300 (u8)bank, (u8)reg, &value); 1301 if (err < 0) { 1302 dev_err(dev, "ab->read fail %d\n", err); 1303 return err; 1304 } 1305 1306 if (s) { 1307 seq_printf(s, " [0x%02X/0x%02X]: 0x%02X\n", 1308 bank, reg, value); 1309 /* Error is not returned here since 1310 * the output is wanted in any case */ 1311 if (seq_has_overflowed(s)) 1312 return 0; 1313 } else { 1314 dev_info(dev, " [0x%02X/0x%02X]: 0x%02X\n", 1315 bank, reg, value); 1316 } 1317 } 1318 } 1319 1320 return 0; 1321} 1322 1323static int ab8500_print_bank_registers(struct seq_file *s, void *p) 1324{ 1325 struct device *dev = s->private; 1326 u32 bank = debug_bank; 1327 1328 seq_puts(s, AB8500_NAME_STRING " register values:\n"); 1329 1330 seq_printf(s, " bank 0x%02X:\n", bank); 1331 1332 return ab8500_registers_print(dev, bank, s); 1333} 1334 1335static int ab8500_registers_open(struct inode *inode, struct file *file) 1336{ 1337 return single_open(file, ab8500_print_bank_registers, inode->i_private); 1338} 1339 1340static const struct file_operations ab8500_registers_fops = { 1341 .open = ab8500_registers_open, 1342 .read = seq_read, 1343 .llseek = seq_lseek, 1344 .release = single_release, 1345 .owner = THIS_MODULE, 1346}; 1347 1348static int ab8500_print_all_banks(struct seq_file *s, void *p) 1349{ 1350 struct device *dev = s->private; 1351 unsigned int i; 1352 1353 seq_puts(s, AB8500_NAME_STRING " register values:\n"); 1354 1355 for (i = 0; i < AB8500_NUM_BANKS; i++) { 1356 int err; 1357 1358 seq_printf(s, " bank 0x%02X:\n", i); 1359 err = ab8500_registers_print(dev, i, s); 1360 if (err) 1361 return err; 1362 } 1363 return 0; 1364} 1365 1366/* Dump registers to kernel log */ 1367void ab8500_dump_all_banks(struct device *dev) 1368{ 1369 unsigned int i; 1370 1371 dev_info(dev, "ab8500 register values:\n"); 1372 1373 for (i = 1; i < AB8500_NUM_BANKS; i++) { 1374 dev_info(dev, " bank 0x%02X:\n", i); 1375 ab8500_registers_print(dev, i, NULL); 1376 } 1377} 1378 1379/* Space for 500 registers. */ 1380#define DUMP_MAX_REGS 700 1381static struct ab8500_register_dump 1382{ 1383 u8 bank; 1384 u8 reg; 1385 u8 value; 1386} ab8500_complete_register_dump[DUMP_MAX_REGS]; 1387 1388/* This shall only be called upon kernel panic! */ 1389void ab8500_dump_all_banks_to_mem(void) 1390{ 1391 int i, r = 0; 1392 u8 bank; 1393 int err = 0; 1394 1395 pr_info("Saving all ABB registers for crash analysis.\n"); 1396 1397 for (bank = 0; bank < AB8500_NUM_BANKS; bank++) { 1398 for (i = 0; i < debug_ranges[bank].num_ranges; i++) { 1399 u8 reg; 1400 1401 for (reg = debug_ranges[bank].range[i].first; 1402 reg <= debug_ranges[bank].range[i].last; 1403 reg++) { 1404 u8 value; 1405 1406 err = prcmu_abb_read(bank, reg, &value, 1); 1407 1408 if (err < 0) 1409 goto out; 1410 1411 ab8500_complete_register_dump[r].bank = bank; 1412 ab8500_complete_register_dump[r].reg = reg; 1413 ab8500_complete_register_dump[r].value = value; 1414 1415 r++; 1416 1417 if (r >= DUMP_MAX_REGS) { 1418 pr_err("%s: too many register to dump!\n", 1419 __func__); 1420 err = -EINVAL; 1421 goto out; 1422 } 1423 } 1424 } 1425 } 1426out: 1427 if (err >= 0) 1428 pr_info("Saved all ABB registers.\n"); 1429 else 1430 pr_info("Failed to save all ABB registers.\n"); 1431} 1432 1433static int ab8500_all_banks_open(struct inode *inode, struct file *file) 1434{ 1435 struct seq_file *s; 1436 int err; 1437 1438 err = single_open(file, ab8500_print_all_banks, inode->i_private); 1439 if (!err) { 1440 /* Default buf size in seq_read is not enough */ 1441 s = (struct seq_file *)file->private_data; 1442 s->size = (PAGE_SIZE * 2); 1443 s->buf = kmalloc(s->size, GFP_KERNEL); 1444 if (!s->buf) { 1445 single_release(inode, file); 1446 err = -ENOMEM; 1447 } 1448 } 1449 return err; 1450} 1451 1452static const struct file_operations ab8500_all_banks_fops = { 1453 .open = ab8500_all_banks_open, 1454 .read = seq_read, 1455 .llseek = seq_lseek, 1456 .release = single_release, 1457 .owner = THIS_MODULE, 1458}; 1459 1460static int ab8500_bank_print(struct seq_file *s, void *p) 1461{ 1462 seq_printf(s, "0x%02X\n", debug_bank); 1463 return 0; 1464} 1465 1466static int ab8500_bank_open(struct inode *inode, struct file *file) 1467{ 1468 return single_open(file, ab8500_bank_print, inode->i_private); 1469} 1470 1471static ssize_t ab8500_bank_write(struct file *file, 1472 const char __user *user_buf, 1473 size_t count, loff_t *ppos) 1474{ 1475 struct device *dev = ((struct seq_file *)(file->private_data))->private; 1476 unsigned long user_bank; 1477 int err; 1478 1479 err = kstrtoul_from_user(user_buf, count, 0, &user_bank); 1480 if (err) 1481 return err; 1482 1483 if (user_bank >= AB8500_NUM_BANKS) { 1484 dev_err(dev, "debugfs error input > number of banks\n"); 1485 return -EINVAL; 1486 } 1487 1488 debug_bank = user_bank; 1489 1490 return count; 1491} 1492 1493static int ab8500_address_print(struct seq_file *s, void *p) 1494{ 1495 seq_printf(s, "0x%02X\n", debug_address); 1496 return 0; 1497} 1498 1499static int ab8500_address_open(struct inode *inode, struct file *file) 1500{ 1501 return single_open(file, ab8500_address_print, inode->i_private); 1502} 1503 1504static ssize_t ab8500_address_write(struct file *file, 1505 const char __user *user_buf, 1506 size_t count, loff_t *ppos) 1507{ 1508 struct device *dev = ((struct seq_file *)(file->private_data))->private; 1509 unsigned long user_address; 1510 int err; 1511 1512 err = kstrtoul_from_user(user_buf, count, 0, &user_address); 1513 if (err) 1514 return err; 1515 1516 if (user_address > 0xff) { 1517 dev_err(dev, "debugfs error input > 0xff\n"); 1518 return -EINVAL; 1519 } 1520 debug_address = user_address; 1521 1522 return count; 1523} 1524 1525static int ab8500_val_print(struct seq_file *s, void *p) 1526{ 1527 struct device *dev = s->private; 1528 int ret; 1529 u8 regvalue; 1530 1531 ret = abx500_get_register_interruptible(dev, 1532 (u8)debug_bank, (u8)debug_address, ®value); 1533 if (ret < 0) { 1534 dev_err(dev, "abx500_get_reg fail %d, %d\n", 1535 ret, __LINE__); 1536 return -EINVAL; 1537 } 1538 seq_printf(s, "0x%02X\n", regvalue); 1539 1540 return 0; 1541} 1542 1543static int ab8500_val_open(struct inode *inode, struct file *file) 1544{ 1545 return single_open(file, ab8500_val_print, inode->i_private); 1546} 1547 1548static ssize_t ab8500_val_write(struct file *file, 1549 const char __user *user_buf, 1550 size_t count, loff_t *ppos) 1551{ 1552 struct device *dev = ((struct seq_file *)(file->private_data))->private; 1553 unsigned long user_val; 1554 int err; 1555 1556 err = kstrtoul_from_user(user_buf, count, 0, &user_val); 1557 if (err) 1558 return err; 1559 1560 if (user_val > 0xff) { 1561 dev_err(dev, "debugfs error input > 0xff\n"); 1562 return -EINVAL; 1563 } 1564 err = abx500_set_register_interruptible(dev, 1565 (u8)debug_bank, debug_address, (u8)user_val); 1566 if (err < 0) { 1567 pr_err("abx500_set_reg failed %d, %d", err, __LINE__); 1568 return -EINVAL; 1569 } 1570 1571 return count; 1572} 1573 1574/* 1575 * Interrupt status 1576 */ 1577static u32 num_interrupts[AB8500_MAX_NR_IRQS]; 1578static u32 num_wake_interrupts[AB8500_MAX_NR_IRQS]; 1579static int num_interrupt_lines; 1580 1581bool __attribute__((weak)) suspend_test_wake_cause_interrupt_is_mine(u32 my_int) 1582{ 1583 return false; 1584} 1585 1586void ab8500_debug_register_interrupt(int line) 1587{ 1588 if (line < num_interrupt_lines) { 1589 num_interrupts[line]++; 1590 if (suspend_test_wake_cause_interrupt_is_mine(irq_ab8500)) 1591 num_wake_interrupts[line]++; 1592 } 1593} 1594 1595static int ab8500_interrupts_print(struct seq_file *s, void *p) 1596{ 1597 int line; 1598 1599 seq_puts(s, "name: number: number of: wake:\n"); 1600 1601 for (line = 0; line < num_interrupt_lines; line++) { 1602 struct irq_desc *desc = irq_to_desc(line + irq_first); 1603 1604 seq_printf(s, "%3i: %6i %4i", 1605 line, 1606 num_interrupts[line], 1607 num_wake_interrupts[line]); 1608 1609 if (desc && desc->name) 1610 seq_printf(s, "-%-8s", desc->name); 1611 if (desc && desc->action) { 1612 struct irqaction *action = desc->action; 1613 1614 seq_printf(s, " %s", action->name); 1615 while ((action = action->next) != NULL) 1616 seq_printf(s, ", %s", action->name); 1617 } 1618 seq_putc(s, '\n'); 1619 } 1620 1621 return 0; 1622} 1623 1624static int ab8500_interrupts_open(struct inode *inode, struct file *file) 1625{ 1626 return single_open(file, ab8500_interrupts_print, inode->i_private); 1627} 1628 1629/* 1630 * - HWREG DB8500 formated routines 1631 */ 1632static int ab8500_hwreg_print(struct seq_file *s, void *d) 1633{ 1634 struct device *dev = s->private; 1635 int ret; 1636 u8 regvalue; 1637 1638 ret = abx500_get_register_interruptible(dev, 1639 (u8)hwreg_cfg.bank, (u8)hwreg_cfg.addr, ®value); 1640 if (ret < 0) { 1641 dev_err(dev, "abx500_get_reg fail %d, %d\n", 1642 ret, __LINE__); 1643 return -EINVAL; 1644 } 1645 1646 if (hwreg_cfg.shift >= 0) 1647 regvalue >>= hwreg_cfg.shift; 1648 else 1649 regvalue <<= -hwreg_cfg.shift; 1650 regvalue &= hwreg_cfg.mask; 1651 1652 if (REG_FMT_DEC(&hwreg_cfg)) 1653 seq_printf(s, "%d\n", regvalue); 1654 else 1655 seq_printf(s, "0x%02X\n", regvalue); 1656 return 0; 1657} 1658 1659static int ab8500_hwreg_open(struct inode *inode, struct file *file) 1660{ 1661 return single_open(file, ab8500_hwreg_print, inode->i_private); 1662} 1663 1664#define AB8500_SUPPLY_CONTROL_CONFIG_1 0x01 1665#define AB8500_SUPPLY_CONTROL_REG 0x00 1666#define AB8500_FIRST_SIM_REG 0x80 1667#define AB8500_LAST_SIM_REG 0x8B 1668#define AB8505_LAST_SIM_REG 0x8C 1669 1670static int ab8500_print_modem_registers(struct seq_file *s, void *p) 1671{ 1672 struct device *dev = s->private; 1673 struct ab8500 *ab8500; 1674 int err; 1675 u8 value; 1676 u8 orig_value; 1677 u32 bank = AB8500_REGU_CTRL2; 1678 u32 last_sim_reg = AB8500_LAST_SIM_REG; 1679 u32 reg; 1680 1681 ab8500 = dev_get_drvdata(dev->parent); 1682 dev_warn(dev, "WARNING! This operation can interfer with modem side\n" 1683 "and should only be done with care\n"); 1684 1685 err = abx500_get_register_interruptible(dev, 1686 AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, &orig_value); 1687 if (err < 0) { 1688 dev_err(dev, "ab->read fail %d\n", err); 1689 return err; 1690 } 1691 /* Config 1 will allow APE side to read SIM registers */ 1692 err = abx500_set_register_interruptible(dev, 1693 AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, 1694 AB8500_SUPPLY_CONTROL_CONFIG_1); 1695 if (err < 0) { 1696 dev_err(dev, "ab->write fail %d\n", err); 1697 return err; 1698 } 1699 1700 seq_printf(s, " bank 0x%02X:\n", bank); 1701 1702 if (is_ab9540(ab8500) || is_ab8505(ab8500)) 1703 last_sim_reg = AB8505_LAST_SIM_REG; 1704 1705 for (reg = AB8500_FIRST_SIM_REG; reg <= last_sim_reg; reg++) { 1706 err = abx500_get_register_interruptible(dev, 1707 bank, reg, &value); 1708 if (err < 0) { 1709 dev_err(dev, "ab->read fail %d\n", err); 1710 return err; 1711 } 1712 seq_printf(s, " [0x%02X/0x%02X]: 0x%02X\n", bank, reg, value); 1713 } 1714 err = abx500_set_register_interruptible(dev, 1715 AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, orig_value); 1716 if (err < 0) { 1717 dev_err(dev, "ab->write fail %d\n", err); 1718 return err; 1719 } 1720 return 0; 1721} 1722 1723static int ab8500_modem_open(struct inode *inode, struct file *file) 1724{ 1725 return single_open(file, ab8500_print_modem_registers, 1726 inode->i_private); 1727} 1728 1729static const struct file_operations ab8500_modem_fops = { 1730 .open = ab8500_modem_open, 1731 .read = seq_read, 1732 .llseek = seq_lseek, 1733 .release = single_release, 1734 .owner = THIS_MODULE, 1735}; 1736 1737static int ab8500_gpadc_bat_ctrl_print(struct seq_file *s, void *p) 1738{ 1739 int bat_ctrl_raw; 1740 int bat_ctrl_convert; 1741 struct ab8500_gpadc *gpadc; 1742 1743 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 1744 bat_ctrl_raw = ab8500_gpadc_read_raw(gpadc, BAT_CTRL, 1745 avg_sample, trig_edge, trig_timer, conv_type); 1746 bat_ctrl_convert = ab8500_gpadc_ad_to_voltage(gpadc, 1747 BAT_CTRL, bat_ctrl_raw); 1748 1749 seq_printf(s, "%d,0x%X\n", bat_ctrl_convert, bat_ctrl_raw); 1750 1751 return 0; 1752} 1753 1754static int ab8500_gpadc_bat_ctrl_open(struct inode *inode, struct file *file) 1755{ 1756 return single_open(file, ab8500_gpadc_bat_ctrl_print, 1757 inode->i_private); 1758} 1759 1760static const struct file_operations ab8500_gpadc_bat_ctrl_fops = { 1761 .open = ab8500_gpadc_bat_ctrl_open, 1762 .read = seq_read, 1763 .llseek = seq_lseek, 1764 .release = single_release, 1765 .owner = THIS_MODULE, 1766}; 1767 1768static int ab8500_gpadc_btemp_ball_print(struct seq_file *s, void *p) 1769{ 1770 int btemp_ball_raw; 1771 int btemp_ball_convert; 1772 struct ab8500_gpadc *gpadc; 1773 1774 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 1775 btemp_ball_raw = ab8500_gpadc_read_raw(gpadc, BTEMP_BALL, 1776 avg_sample, trig_edge, trig_timer, conv_type); 1777 btemp_ball_convert = ab8500_gpadc_ad_to_voltage(gpadc, BTEMP_BALL, 1778 btemp_ball_raw); 1779 1780 seq_printf(s, "%d,0x%X\n", btemp_ball_convert, btemp_ball_raw); 1781 1782 return 0; 1783} 1784 1785static int ab8500_gpadc_btemp_ball_open(struct inode *inode, 1786 struct file *file) 1787{ 1788 return single_open(file, ab8500_gpadc_btemp_ball_print, 1789 inode->i_private); 1790} 1791 1792static const struct file_operations ab8500_gpadc_btemp_ball_fops = { 1793 .open = ab8500_gpadc_btemp_ball_open, 1794 .read = seq_read, 1795 .llseek = seq_lseek, 1796 .release = single_release, 1797 .owner = THIS_MODULE, 1798}; 1799 1800static int ab8500_gpadc_main_charger_v_print(struct seq_file *s, void *p) 1801{ 1802 int main_charger_v_raw; 1803 int main_charger_v_convert; 1804 struct ab8500_gpadc *gpadc; 1805 1806 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 1807 main_charger_v_raw = ab8500_gpadc_read_raw(gpadc, MAIN_CHARGER_V, 1808 avg_sample, trig_edge, trig_timer, conv_type); 1809 main_charger_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, 1810 MAIN_CHARGER_V, main_charger_v_raw); 1811 1812 seq_printf(s, "%d,0x%X\n", main_charger_v_convert, main_charger_v_raw); 1813 1814 return 0; 1815} 1816 1817static int ab8500_gpadc_main_charger_v_open(struct inode *inode, 1818 struct file *file) 1819{ 1820 return single_open(file, ab8500_gpadc_main_charger_v_print, 1821 inode->i_private); 1822} 1823 1824static const struct file_operations ab8500_gpadc_main_charger_v_fops = { 1825 .open = ab8500_gpadc_main_charger_v_open, 1826 .read = seq_read, 1827 .llseek = seq_lseek, 1828 .release = single_release, 1829 .owner = THIS_MODULE, 1830}; 1831 1832static int ab8500_gpadc_acc_detect1_print(struct seq_file *s, void *p) 1833{ 1834 int acc_detect1_raw; 1835 int acc_detect1_convert; 1836 struct ab8500_gpadc *gpadc; 1837 1838 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 1839 acc_detect1_raw = ab8500_gpadc_read_raw(gpadc, ACC_DETECT1, 1840 avg_sample, trig_edge, trig_timer, conv_type); 1841 acc_detect1_convert = ab8500_gpadc_ad_to_voltage(gpadc, ACC_DETECT1, 1842 acc_detect1_raw); 1843 1844 seq_printf(s, "%d,0x%X\n", acc_detect1_convert, acc_detect1_raw); 1845 1846 return 0; 1847} 1848 1849static int ab8500_gpadc_acc_detect1_open(struct inode *inode, 1850 struct file *file) 1851{ 1852 return single_open(file, ab8500_gpadc_acc_detect1_print, 1853 inode->i_private); 1854} 1855 1856static const struct file_operations ab8500_gpadc_acc_detect1_fops = { 1857 .open = ab8500_gpadc_acc_detect1_open, 1858 .read = seq_read, 1859 .llseek = seq_lseek, 1860 .release = single_release, 1861 .owner = THIS_MODULE, 1862}; 1863 1864static int ab8500_gpadc_acc_detect2_print(struct seq_file *s, void *p) 1865{ 1866 int acc_detect2_raw; 1867 int acc_detect2_convert; 1868 struct ab8500_gpadc *gpadc; 1869 1870 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 1871 acc_detect2_raw = ab8500_gpadc_read_raw(gpadc, ACC_DETECT2, 1872 avg_sample, trig_edge, trig_timer, conv_type); 1873 acc_detect2_convert = ab8500_gpadc_ad_to_voltage(gpadc, 1874 ACC_DETECT2, acc_detect2_raw); 1875 1876 seq_printf(s, "%d,0x%X\n", acc_detect2_convert, acc_detect2_raw); 1877 1878 return 0; 1879} 1880 1881static int ab8500_gpadc_acc_detect2_open(struct inode *inode, 1882 struct file *file) 1883{ 1884 return single_open(file, ab8500_gpadc_acc_detect2_print, 1885 inode->i_private); 1886} 1887 1888static const struct file_operations ab8500_gpadc_acc_detect2_fops = { 1889 .open = ab8500_gpadc_acc_detect2_open, 1890 .read = seq_read, 1891 .llseek = seq_lseek, 1892 .release = single_release, 1893 .owner = THIS_MODULE, 1894}; 1895 1896static int ab8500_gpadc_aux1_print(struct seq_file *s, void *p) 1897{ 1898 int aux1_raw; 1899 int aux1_convert; 1900 struct ab8500_gpadc *gpadc; 1901 1902 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 1903 aux1_raw = ab8500_gpadc_read_raw(gpadc, ADC_AUX1, 1904 avg_sample, trig_edge, trig_timer, conv_type); 1905 aux1_convert = ab8500_gpadc_ad_to_voltage(gpadc, ADC_AUX1, 1906 aux1_raw); 1907 1908 seq_printf(s, "%d,0x%X\n", aux1_convert, aux1_raw); 1909 1910 return 0; 1911} 1912 1913static int ab8500_gpadc_aux1_open(struct inode *inode, struct file *file) 1914{ 1915 return single_open(file, ab8500_gpadc_aux1_print, inode->i_private); 1916} 1917 1918static const struct file_operations ab8500_gpadc_aux1_fops = { 1919 .open = ab8500_gpadc_aux1_open, 1920 .read = seq_read, 1921 .llseek = seq_lseek, 1922 .release = single_release, 1923 .owner = THIS_MODULE, 1924}; 1925 1926static int ab8500_gpadc_aux2_print(struct seq_file *s, void *p) 1927{ 1928 int aux2_raw; 1929 int aux2_convert; 1930 struct ab8500_gpadc *gpadc; 1931 1932 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 1933 aux2_raw = ab8500_gpadc_read_raw(gpadc, ADC_AUX2, 1934 avg_sample, trig_edge, trig_timer, conv_type); 1935 aux2_convert = ab8500_gpadc_ad_to_voltage(gpadc, ADC_AUX2, 1936 aux2_raw); 1937 1938 seq_printf(s, "%d,0x%X\n", aux2_convert, aux2_raw); 1939 1940 return 0; 1941} 1942 1943static int ab8500_gpadc_aux2_open(struct inode *inode, struct file *file) 1944{ 1945 return single_open(file, ab8500_gpadc_aux2_print, inode->i_private); 1946} 1947 1948static const struct file_operations ab8500_gpadc_aux2_fops = { 1949 .open = ab8500_gpadc_aux2_open, 1950 .read = seq_read, 1951 .llseek = seq_lseek, 1952 .release = single_release, 1953 .owner = THIS_MODULE, 1954}; 1955 1956static int ab8500_gpadc_main_bat_v_print(struct seq_file *s, void *p) 1957{ 1958 int main_bat_v_raw; 1959 int main_bat_v_convert; 1960 struct ab8500_gpadc *gpadc; 1961 1962 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 1963 main_bat_v_raw = ab8500_gpadc_read_raw(gpadc, MAIN_BAT_V, 1964 avg_sample, trig_edge, trig_timer, conv_type); 1965 main_bat_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, MAIN_BAT_V, 1966 main_bat_v_raw); 1967 1968 seq_printf(s, "%d,0x%X\n", main_bat_v_convert, main_bat_v_raw); 1969 1970 return 0; 1971} 1972 1973static int ab8500_gpadc_main_bat_v_open(struct inode *inode, 1974 struct file *file) 1975{ 1976 return single_open(file, ab8500_gpadc_main_bat_v_print, 1977 inode->i_private); 1978} 1979 1980static const struct file_operations ab8500_gpadc_main_bat_v_fops = { 1981 .open = ab8500_gpadc_main_bat_v_open, 1982 .read = seq_read, 1983 .llseek = seq_lseek, 1984 .release = single_release, 1985 .owner = THIS_MODULE, 1986}; 1987 1988static int ab8500_gpadc_vbus_v_print(struct seq_file *s, void *p) 1989{ 1990 int vbus_v_raw; 1991 int vbus_v_convert; 1992 struct ab8500_gpadc *gpadc; 1993 1994 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 1995 vbus_v_raw = ab8500_gpadc_read_raw(gpadc, VBUS_V, 1996 avg_sample, trig_edge, trig_timer, conv_type); 1997 vbus_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, VBUS_V, 1998 vbus_v_raw); 1999 2000 seq_printf(s, "%d,0x%X\n", vbus_v_convert, vbus_v_raw); 2001 2002 return 0; 2003} 2004 2005static int ab8500_gpadc_vbus_v_open(struct inode *inode, struct file *file) 2006{ 2007 return single_open(file, ab8500_gpadc_vbus_v_print, inode->i_private); 2008} 2009 2010static const struct file_operations ab8500_gpadc_vbus_v_fops = { 2011 .open = ab8500_gpadc_vbus_v_open, 2012 .read = seq_read, 2013 .llseek = seq_lseek, 2014 .release = single_release, 2015 .owner = THIS_MODULE, 2016}; 2017 2018static int ab8500_gpadc_main_charger_c_print(struct seq_file *s, void *p) 2019{ 2020 int main_charger_c_raw; 2021 int main_charger_c_convert; 2022 struct ab8500_gpadc *gpadc; 2023 2024 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2025 main_charger_c_raw = ab8500_gpadc_read_raw(gpadc, MAIN_CHARGER_C, 2026 avg_sample, trig_edge, trig_timer, conv_type); 2027 main_charger_c_convert = ab8500_gpadc_ad_to_voltage(gpadc, 2028 MAIN_CHARGER_C, main_charger_c_raw); 2029 2030 seq_printf(s, "%d,0x%X\n", main_charger_c_convert, main_charger_c_raw); 2031 2032 return 0; 2033} 2034 2035static int ab8500_gpadc_main_charger_c_open(struct inode *inode, 2036 struct file *file) 2037{ 2038 return single_open(file, ab8500_gpadc_main_charger_c_print, 2039 inode->i_private); 2040} 2041 2042static const struct file_operations ab8500_gpadc_main_charger_c_fops = { 2043 .open = ab8500_gpadc_main_charger_c_open, 2044 .read = seq_read, 2045 .llseek = seq_lseek, 2046 .release = single_release, 2047 .owner = THIS_MODULE, 2048}; 2049 2050static int ab8500_gpadc_usb_charger_c_print(struct seq_file *s, void *p) 2051{ 2052 int usb_charger_c_raw; 2053 int usb_charger_c_convert; 2054 struct ab8500_gpadc *gpadc; 2055 2056 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2057 usb_charger_c_raw = ab8500_gpadc_read_raw(gpadc, USB_CHARGER_C, 2058 avg_sample, trig_edge, trig_timer, conv_type); 2059 usb_charger_c_convert = ab8500_gpadc_ad_to_voltage(gpadc, 2060 USB_CHARGER_C, usb_charger_c_raw); 2061 2062 seq_printf(s, "%d,0x%X\n", usb_charger_c_convert, usb_charger_c_raw); 2063 2064 return 0; 2065} 2066 2067static int ab8500_gpadc_usb_charger_c_open(struct inode *inode, 2068 struct file *file) 2069{ 2070 return single_open(file, ab8500_gpadc_usb_charger_c_print, 2071 inode->i_private); 2072} 2073 2074static const struct file_operations ab8500_gpadc_usb_charger_c_fops = { 2075 .open = ab8500_gpadc_usb_charger_c_open, 2076 .read = seq_read, 2077 .llseek = seq_lseek, 2078 .release = single_release, 2079 .owner = THIS_MODULE, 2080}; 2081 2082static int ab8500_gpadc_bk_bat_v_print(struct seq_file *s, void *p) 2083{ 2084 int bk_bat_v_raw; 2085 int bk_bat_v_convert; 2086 struct ab8500_gpadc *gpadc; 2087 2088 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2089 bk_bat_v_raw = ab8500_gpadc_read_raw(gpadc, BK_BAT_V, 2090 avg_sample, trig_edge, trig_timer, conv_type); 2091 bk_bat_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, 2092 BK_BAT_V, bk_bat_v_raw); 2093 2094 seq_printf(s, "%d,0x%X\n", bk_bat_v_convert, bk_bat_v_raw); 2095 2096 return 0; 2097} 2098 2099static int ab8500_gpadc_bk_bat_v_open(struct inode *inode, struct file *file) 2100{ 2101 return single_open(file, ab8500_gpadc_bk_bat_v_print, 2102 inode->i_private); 2103} 2104 2105static const struct file_operations ab8500_gpadc_bk_bat_v_fops = { 2106 .open = ab8500_gpadc_bk_bat_v_open, 2107 .read = seq_read, 2108 .llseek = seq_lseek, 2109 .release = single_release, 2110 .owner = THIS_MODULE, 2111}; 2112 2113static int ab8500_gpadc_die_temp_print(struct seq_file *s, void *p) 2114{ 2115 int die_temp_raw; 2116 int die_temp_convert; 2117 struct ab8500_gpadc *gpadc; 2118 2119 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2120 die_temp_raw = ab8500_gpadc_read_raw(gpadc, DIE_TEMP, 2121 avg_sample, trig_edge, trig_timer, conv_type); 2122 die_temp_convert = ab8500_gpadc_ad_to_voltage(gpadc, DIE_TEMP, 2123 die_temp_raw); 2124 2125 seq_printf(s, "%d,0x%X\n", die_temp_convert, die_temp_raw); 2126 2127 return 0; 2128} 2129 2130static int ab8500_gpadc_die_temp_open(struct inode *inode, struct file *file) 2131{ 2132 return single_open(file, ab8500_gpadc_die_temp_print, 2133 inode->i_private); 2134} 2135 2136static const struct file_operations ab8500_gpadc_die_temp_fops = { 2137 .open = ab8500_gpadc_die_temp_open, 2138 .read = seq_read, 2139 .llseek = seq_lseek, 2140 .release = single_release, 2141 .owner = THIS_MODULE, 2142}; 2143 2144static int ab8500_gpadc_usb_id_print(struct seq_file *s, void *p) 2145{ 2146 int usb_id_raw; 2147 int usb_id_convert; 2148 struct ab8500_gpadc *gpadc; 2149 2150 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2151 usb_id_raw = ab8500_gpadc_read_raw(gpadc, USB_ID, 2152 avg_sample, trig_edge, trig_timer, conv_type); 2153 usb_id_convert = ab8500_gpadc_ad_to_voltage(gpadc, USB_ID, 2154 usb_id_raw); 2155 2156 seq_printf(s, "%d,0x%X\n", usb_id_convert, usb_id_raw); 2157 2158 return 0; 2159} 2160 2161static int ab8500_gpadc_usb_id_open(struct inode *inode, struct file *file) 2162{ 2163 return single_open(file, ab8500_gpadc_usb_id_print, inode->i_private); 2164} 2165 2166static const struct file_operations ab8500_gpadc_usb_id_fops = { 2167 .open = ab8500_gpadc_usb_id_open, 2168 .read = seq_read, 2169 .llseek = seq_lseek, 2170 .release = single_release, 2171 .owner = THIS_MODULE, 2172}; 2173 2174static int ab8540_gpadc_xtal_temp_print(struct seq_file *s, void *p) 2175{ 2176 int xtal_temp_raw; 2177 int xtal_temp_convert; 2178 struct ab8500_gpadc *gpadc; 2179 2180 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2181 xtal_temp_raw = ab8500_gpadc_read_raw(gpadc, XTAL_TEMP, 2182 avg_sample, trig_edge, trig_timer, conv_type); 2183 xtal_temp_convert = ab8500_gpadc_ad_to_voltage(gpadc, XTAL_TEMP, 2184 xtal_temp_raw); 2185 2186 seq_printf(s, "%d,0x%X\n", xtal_temp_convert, xtal_temp_raw); 2187 2188 return 0; 2189} 2190 2191static int ab8540_gpadc_xtal_temp_open(struct inode *inode, struct file *file) 2192{ 2193 return single_open(file, ab8540_gpadc_xtal_temp_print, 2194 inode->i_private); 2195} 2196 2197static const struct file_operations ab8540_gpadc_xtal_temp_fops = { 2198 .open = ab8540_gpadc_xtal_temp_open, 2199 .read = seq_read, 2200 .llseek = seq_lseek, 2201 .release = single_release, 2202 .owner = THIS_MODULE, 2203}; 2204 2205static int ab8540_gpadc_vbat_true_meas_print(struct seq_file *s, void *p) 2206{ 2207 int vbat_true_meas_raw; 2208 int vbat_true_meas_convert; 2209 struct ab8500_gpadc *gpadc; 2210 2211 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2212 vbat_true_meas_raw = ab8500_gpadc_read_raw(gpadc, VBAT_TRUE_MEAS, 2213 avg_sample, trig_edge, trig_timer, conv_type); 2214 vbat_true_meas_convert = 2215 ab8500_gpadc_ad_to_voltage(gpadc, VBAT_TRUE_MEAS, 2216 vbat_true_meas_raw); 2217 2218 seq_printf(s, "%d,0x%X\n", vbat_true_meas_convert, vbat_true_meas_raw); 2219 2220 return 0; 2221} 2222 2223static int ab8540_gpadc_vbat_true_meas_open(struct inode *inode, 2224 struct file *file) 2225{ 2226 return single_open(file, ab8540_gpadc_vbat_true_meas_print, 2227 inode->i_private); 2228} 2229 2230static const struct file_operations ab8540_gpadc_vbat_true_meas_fops = { 2231 .open = ab8540_gpadc_vbat_true_meas_open, 2232 .read = seq_read, 2233 .llseek = seq_lseek, 2234 .release = single_release, 2235 .owner = THIS_MODULE, 2236}; 2237 2238static int ab8540_gpadc_bat_ctrl_and_ibat_print(struct seq_file *s, void *p) 2239{ 2240 int bat_ctrl_raw; 2241 int bat_ctrl_convert; 2242 int ibat_raw; 2243 int ibat_convert; 2244 struct ab8500_gpadc *gpadc; 2245 2246 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2247 bat_ctrl_raw = ab8500_gpadc_double_read_raw(gpadc, BAT_CTRL_AND_IBAT, 2248 avg_sample, trig_edge, trig_timer, conv_type, &ibat_raw); 2249 2250 bat_ctrl_convert = ab8500_gpadc_ad_to_voltage(gpadc, BAT_CTRL, 2251 bat_ctrl_raw); 2252 ibat_convert = ab8500_gpadc_ad_to_voltage(gpadc, IBAT_VIRTUAL_CHANNEL, 2253 ibat_raw); 2254 2255 seq_printf(s, 2256 "%d,0x%X\n" 2257 "%d,0x%X\n", 2258 bat_ctrl_convert, bat_ctrl_raw, 2259 ibat_convert, ibat_raw); 2260 2261 return 0; 2262} 2263 2264static int ab8540_gpadc_bat_ctrl_and_ibat_open(struct inode *inode, 2265 struct file *file) 2266{ 2267 return single_open(file, ab8540_gpadc_bat_ctrl_and_ibat_print, 2268 inode->i_private); 2269} 2270 2271static const struct file_operations ab8540_gpadc_bat_ctrl_and_ibat_fops = { 2272 .open = ab8540_gpadc_bat_ctrl_and_ibat_open, 2273 .read = seq_read, 2274 .llseek = seq_lseek, 2275 .release = single_release, 2276 .owner = THIS_MODULE, 2277}; 2278 2279static int ab8540_gpadc_vbat_meas_and_ibat_print(struct seq_file *s, void *p) 2280{ 2281 int vbat_meas_raw; 2282 int vbat_meas_convert; 2283 int ibat_raw; 2284 int ibat_convert; 2285 struct ab8500_gpadc *gpadc; 2286 2287 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2288 vbat_meas_raw = ab8500_gpadc_double_read_raw(gpadc, VBAT_MEAS_AND_IBAT, 2289 avg_sample, trig_edge, trig_timer, conv_type, &ibat_raw); 2290 vbat_meas_convert = ab8500_gpadc_ad_to_voltage(gpadc, MAIN_BAT_V, 2291 vbat_meas_raw); 2292 ibat_convert = ab8500_gpadc_ad_to_voltage(gpadc, IBAT_VIRTUAL_CHANNEL, 2293 ibat_raw); 2294 2295 seq_printf(s, 2296 "%d,0x%X\n" 2297 "%d,0x%X\n", 2298 vbat_meas_convert, vbat_meas_raw, 2299 ibat_convert, ibat_raw); 2300 2301 return 0; 2302} 2303 2304static int ab8540_gpadc_vbat_meas_and_ibat_open(struct inode *inode, 2305 struct file *file) 2306{ 2307 return single_open(file, ab8540_gpadc_vbat_meas_and_ibat_print, 2308 inode->i_private); 2309} 2310 2311static const struct file_operations ab8540_gpadc_vbat_meas_and_ibat_fops = { 2312 .open = ab8540_gpadc_vbat_meas_and_ibat_open, 2313 .read = seq_read, 2314 .llseek = seq_lseek, 2315 .release = single_release, 2316 .owner = THIS_MODULE, 2317}; 2318 2319static int ab8540_gpadc_vbat_true_meas_and_ibat_print(struct seq_file *s, 2320 void *p) 2321{ 2322 int vbat_true_meas_raw; 2323 int vbat_true_meas_convert; 2324 int ibat_raw; 2325 int ibat_convert; 2326 struct ab8500_gpadc *gpadc; 2327 2328 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2329 vbat_true_meas_raw = ab8500_gpadc_double_read_raw(gpadc, 2330 VBAT_TRUE_MEAS_AND_IBAT, avg_sample, trig_edge, 2331 trig_timer, conv_type, &ibat_raw); 2332 vbat_true_meas_convert = ab8500_gpadc_ad_to_voltage(gpadc, 2333 VBAT_TRUE_MEAS, vbat_true_meas_raw); 2334 ibat_convert = ab8500_gpadc_ad_to_voltage(gpadc, IBAT_VIRTUAL_CHANNEL, 2335 ibat_raw); 2336 2337 seq_printf(s, 2338 "%d,0x%X\n" 2339 "%d,0x%X\n", 2340 vbat_true_meas_convert, vbat_true_meas_raw, 2341 ibat_convert, ibat_raw); 2342 2343 return 0; 2344} 2345 2346static int ab8540_gpadc_vbat_true_meas_and_ibat_open(struct inode *inode, 2347 struct file *file) 2348{ 2349 return single_open(file, ab8540_gpadc_vbat_true_meas_and_ibat_print, 2350 inode->i_private); 2351} 2352 2353static const struct file_operations 2354ab8540_gpadc_vbat_true_meas_and_ibat_fops = { 2355 .open = ab8540_gpadc_vbat_true_meas_and_ibat_open, 2356 .read = seq_read, 2357 .llseek = seq_lseek, 2358 .release = single_release, 2359 .owner = THIS_MODULE, 2360}; 2361 2362static int ab8540_gpadc_bat_temp_and_ibat_print(struct seq_file *s, void *p) 2363{ 2364 int bat_temp_raw; 2365 int bat_temp_convert; 2366 int ibat_raw; 2367 int ibat_convert; 2368 struct ab8500_gpadc *gpadc; 2369 2370 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2371 bat_temp_raw = ab8500_gpadc_double_read_raw(gpadc, BAT_TEMP_AND_IBAT, 2372 avg_sample, trig_edge, trig_timer, conv_type, &ibat_raw); 2373 bat_temp_convert = ab8500_gpadc_ad_to_voltage(gpadc, BTEMP_BALL, 2374 bat_temp_raw); 2375 ibat_convert = ab8500_gpadc_ad_to_voltage(gpadc, IBAT_VIRTUAL_CHANNEL, 2376 ibat_raw); 2377 2378 seq_printf(s, 2379 "%d,0x%X\n" 2380 "%d,0x%X\n", 2381 bat_temp_convert, bat_temp_raw, 2382 ibat_convert, ibat_raw); 2383 2384 return 0; 2385} 2386 2387static int ab8540_gpadc_bat_temp_and_ibat_open(struct inode *inode, 2388 struct file *file) 2389{ 2390 return single_open(file, ab8540_gpadc_bat_temp_and_ibat_print, 2391 inode->i_private); 2392} 2393 2394static const struct file_operations ab8540_gpadc_bat_temp_and_ibat_fops = { 2395 .open = ab8540_gpadc_bat_temp_and_ibat_open, 2396 .read = seq_read, 2397 .llseek = seq_lseek, 2398 .release = single_release, 2399 .owner = THIS_MODULE, 2400}; 2401 2402static int ab8540_gpadc_otp_cal_print(struct seq_file *s, void *p) 2403{ 2404 struct ab8500_gpadc *gpadc; 2405 u16 vmain_l, vmain_h, btemp_l, btemp_h; 2406 u16 vbat_l, vbat_h, ibat_l, ibat_h; 2407 2408 gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); 2409 ab8540_gpadc_get_otp(gpadc, &vmain_l, &vmain_h, &btemp_l, &btemp_h, 2410 &vbat_l, &vbat_h, &ibat_l, &ibat_h); 2411 seq_printf(s, 2412 "VMAIN_L:0x%X\n" 2413 "VMAIN_H:0x%X\n" 2414 "BTEMP_L:0x%X\n" 2415 "BTEMP_H:0x%X\n" 2416 "VBAT_L:0x%X\n" 2417 "VBAT_H:0x%X\n" 2418 "IBAT_L:0x%X\n" 2419 "IBAT_H:0x%X\n", 2420 vmain_l, vmain_h, btemp_l, btemp_h, 2421 vbat_l, vbat_h, ibat_l, ibat_h); 2422 2423 return 0; 2424} 2425 2426static int ab8540_gpadc_otp_cal_open(struct inode *inode, struct file *file) 2427{ 2428 return single_open(file, ab8540_gpadc_otp_cal_print, inode->i_private); 2429} 2430 2431static const struct file_operations ab8540_gpadc_otp_calib_fops = { 2432 .open = ab8540_gpadc_otp_cal_open, 2433 .read = seq_read, 2434 .llseek = seq_lseek, 2435 .release = single_release, 2436 .owner = THIS_MODULE, 2437}; 2438 2439static int ab8500_gpadc_avg_sample_print(struct seq_file *s, void *p) 2440{ 2441 seq_printf(s, "%d\n", avg_sample); 2442 2443 return 0; 2444} 2445 2446static int ab8500_gpadc_avg_sample_open(struct inode *inode, struct file *file) 2447{ 2448 return single_open(file, ab8500_gpadc_avg_sample_print, 2449 inode->i_private); 2450} 2451 2452static ssize_t ab8500_gpadc_avg_sample_write(struct file *file, 2453 const char __user *user_buf, 2454 size_t count, loff_t *ppos) 2455{ 2456 struct device *dev = ((struct seq_file *)(file->private_data))->private; 2457 unsigned long user_avg_sample; 2458 int err; 2459 2460 err = kstrtoul_from_user(user_buf, count, 0, &user_avg_sample); 2461 if (err) 2462 return err; 2463 2464 if ((user_avg_sample == SAMPLE_1) || (user_avg_sample == SAMPLE_4) 2465 || (user_avg_sample == SAMPLE_8) 2466 || (user_avg_sample == SAMPLE_16)) { 2467 avg_sample = (u8) user_avg_sample; 2468 } else { 2469 dev_err(dev, 2470 "debugfs err input: should be egal to 1, 4, 8 or 16\n"); 2471 return -EINVAL; 2472 } 2473 2474 return count; 2475} 2476 2477static const struct file_operations ab8500_gpadc_avg_sample_fops = { 2478 .open = ab8500_gpadc_avg_sample_open, 2479 .read = seq_read, 2480 .write = ab8500_gpadc_avg_sample_write, 2481 .llseek = seq_lseek, 2482 .release = single_release, 2483 .owner = THIS_MODULE, 2484}; 2485 2486static int ab8500_gpadc_trig_edge_print(struct seq_file *s, void *p) 2487{ 2488 seq_printf(s, "%d\n", trig_edge); 2489 2490 return 0; 2491} 2492 2493static int ab8500_gpadc_trig_edge_open(struct inode *inode, struct file *file) 2494{ 2495 return single_open(file, ab8500_gpadc_trig_edge_print, 2496 inode->i_private); 2497} 2498 2499static ssize_t ab8500_gpadc_trig_edge_write(struct file *file, 2500 const char __user *user_buf, 2501 size_t count, loff_t *ppos) 2502{ 2503 struct device *dev = ((struct seq_file *)(file->private_data))->private; 2504 unsigned long user_trig_edge; 2505 int err; 2506 2507 err = kstrtoul_from_user(user_buf, count, 0, &user_trig_edge); 2508 if (err) 2509 return err; 2510 2511 if ((user_trig_edge == RISING_EDGE) 2512 || (user_trig_edge == FALLING_EDGE)) { 2513 trig_edge = (u8) user_trig_edge; 2514 } else { 2515 dev_err(dev, "Wrong input:\n" 2516 "Enter 0. Rising edge\n" 2517 "Enter 1. Falling edge\n"); 2518 return -EINVAL; 2519 } 2520 2521 return count; 2522} 2523 2524static const struct file_operations ab8500_gpadc_trig_edge_fops = { 2525 .open = ab8500_gpadc_trig_edge_open, 2526 .read = seq_read, 2527 .write = ab8500_gpadc_trig_edge_write, 2528 .llseek = seq_lseek, 2529 .release = single_release, 2530 .owner = THIS_MODULE, 2531}; 2532 2533static int ab8500_gpadc_trig_timer_print(struct seq_file *s, void *p) 2534{ 2535 seq_printf(s, "%d\n", trig_timer); 2536 2537 return 0; 2538} 2539 2540static int ab8500_gpadc_trig_timer_open(struct inode *inode, struct file *file) 2541{ 2542 return single_open(file, ab8500_gpadc_trig_timer_print, 2543 inode->i_private); 2544} 2545 2546static ssize_t ab8500_gpadc_trig_timer_write(struct file *file, 2547 const char __user *user_buf, 2548 size_t count, loff_t *ppos) 2549{ 2550 struct device *dev = ((struct seq_file *)(file->private_data))->private; 2551 unsigned long user_trig_timer; 2552 int err; 2553 2554 err = kstrtoul_from_user(user_buf, count, 0, &user_trig_timer); 2555 if (err) 2556 return err; 2557 2558 if (user_trig_timer & ~0xFF) { 2559 dev_err(dev, 2560 "debugfs error input: should be beetween 0 to 255\n"); 2561 return -EINVAL; 2562 } 2563 2564 trig_timer = (u8) user_trig_timer; 2565 2566 return count; 2567} 2568 2569static const struct file_operations ab8500_gpadc_trig_timer_fops = { 2570 .open = ab8500_gpadc_trig_timer_open, 2571 .read = seq_read, 2572 .write = ab8500_gpadc_trig_timer_write, 2573 .llseek = seq_lseek, 2574 .release = single_release, 2575 .owner = THIS_MODULE, 2576}; 2577 2578static int ab8500_gpadc_conv_type_print(struct seq_file *s, void *p) 2579{ 2580 seq_printf(s, "%d\n", conv_type); 2581 2582 return 0; 2583} 2584 2585static int ab8500_gpadc_conv_type_open(struct inode *inode, struct file *file) 2586{ 2587 return single_open(file, ab8500_gpadc_conv_type_print, 2588 inode->i_private); 2589} 2590 2591static ssize_t ab8500_gpadc_conv_type_write(struct file *file, 2592 const char __user *user_buf, 2593 size_t count, loff_t *ppos) 2594{ 2595 struct device *dev = ((struct seq_file *)(file->private_data))->private; 2596 unsigned long user_conv_type; 2597 int err; 2598 2599 err = kstrtoul_from_user(user_buf, count, 0, &user_conv_type); 2600 if (err) 2601 return err; 2602 2603 if ((user_conv_type == ADC_SW) 2604 || (user_conv_type == ADC_HW)) { 2605 conv_type = (u8) user_conv_type; 2606 } else { 2607 dev_err(dev, "Wrong input:\n" 2608 "Enter 0. ADC SW conversion\n" 2609 "Enter 1. ADC HW conversion\n"); 2610 return -EINVAL; 2611 } 2612 2613 return count; 2614} 2615 2616static const struct file_operations ab8500_gpadc_conv_type_fops = { 2617 .open = ab8500_gpadc_conv_type_open, 2618 .read = seq_read, 2619 .write = ab8500_gpadc_conv_type_write, 2620 .llseek = seq_lseek, 2621 .release = single_release, 2622 .owner = THIS_MODULE, 2623}; 2624 2625/* 2626 * return length of an ASCII numerical value, 0 is string is not a 2627 * numerical value. 2628 * string shall start at value 1st char. 2629 * string can be tailed with \0 or space or newline chars only. 2630 * value can be decimal or hexadecimal (prefixed 0x or 0X). 2631 */ 2632static int strval_len(char *b) 2633{ 2634 char *s = b; 2635 2636 if ((*s == '0') && ((*(s+1) == 'x') || (*(s+1) == 'X'))) { 2637 s += 2; 2638 for (; *s && (*s != ' ') && (*s != '\n'); s++) { 2639 if (!isxdigit(*s)) 2640 return 0; 2641 } 2642 } else { 2643 if (*s == '-') 2644 s++; 2645 for (; *s && (*s != ' ') && (*s != '\n'); s++) { 2646 if (!isdigit(*s)) 2647 return 0; 2648 } 2649 } 2650 return (int) (s-b); 2651} 2652 2653/* 2654 * parse hwreg input data. 2655 * update global hwreg_cfg only if input data syntax is ok. 2656 */ 2657static ssize_t hwreg_common_write(char *b, struct hwreg_cfg *cfg, 2658 struct device *dev) 2659{ 2660 uint write, val = 0; 2661 u8 regvalue; 2662 int ret; 2663 struct hwreg_cfg loc = { 2664 .bank = 0, /* default: invalid phys addr */ 2665 .addr = 0, /* default: invalid phys addr */ 2666 .fmt = 0, /* default: 32bit access, hex output */ 2667 .mask = 0xFFFFFFFF, /* default: no mask */ 2668 .shift = 0, /* default: no bit shift */ 2669 }; 2670 2671 /* read or write ? */ 2672 if (!strncmp(b, "read ", 5)) { 2673 write = 0; 2674 b += 5; 2675 } else if (!strncmp(b, "write ", 6)) { 2676 write = 1; 2677 b += 6; 2678 } else 2679 return -EINVAL; 2680 2681 /* OPTIONS -l|-w|-b -s -m -o */ 2682 while ((*b == ' ') || (*b == '-')) { 2683 if (*(b-1) != ' ') { 2684 b++; 2685 continue; 2686 } 2687 if ((!strncmp(b, "-d ", 3)) || 2688 (!strncmp(b, "-dec ", 5))) { 2689 b += (*(b+2) == ' ') ? 3 : 5; 2690 loc.fmt |= (1<<0); 2691 } else if ((!strncmp(b, "-h ", 3)) || 2692 (!strncmp(b, "-hex ", 5))) { 2693 b += (*(b+2) == ' ') ? 3 : 5; 2694 loc.fmt &= ~(1<<0); 2695 } else if ((!strncmp(b, "-m ", 3)) || 2696 (!strncmp(b, "-mask ", 6))) { 2697 b += (*(b+2) == ' ') ? 3 : 6; 2698 if (strval_len(b) == 0) 2699 return -EINVAL; 2700 ret = kstrtoul(b, 0, &loc.mask); 2701 if (ret) 2702 return ret; 2703 } else if ((!strncmp(b, "-s ", 3)) || 2704 (!strncmp(b, "-shift ", 7))) { 2705 b += (*(b+2) == ' ') ? 3 : 7; 2706 if (strval_len(b) == 0) 2707 return -EINVAL; 2708 ret = kstrtol(b, 0, &loc.shift); 2709 if (ret) 2710 return ret; 2711 } else { 2712 return -EINVAL; 2713 } 2714 } 2715 /* get arg BANK and ADDRESS */ 2716 if (strval_len(b) == 0) 2717 return -EINVAL; 2718 ret = kstrtouint(b, 0, &loc.bank); 2719 if (ret) 2720 return ret; 2721 while (*b == ' ') 2722 b++; 2723 if (strval_len(b) == 0) 2724 return -EINVAL; 2725 ret = kstrtoul(b, 0, &loc.addr); 2726 if (ret) 2727 return ret; 2728 2729 if (write) { 2730 while (*b == ' ') 2731 b++; 2732 if (strval_len(b) == 0) 2733 return -EINVAL; 2734 ret = kstrtouint(b, 0, &val); 2735 if (ret) 2736 return ret; 2737 } 2738 2739 /* args are ok, update target cfg (mainly for read) */ 2740 *cfg = loc; 2741 2742#ifdef ABB_HWREG_DEBUG 2743 pr_warn("HWREG request: %s, %s,\n" 2744 " addr=0x%08X, mask=0x%X, shift=%d" "value=0x%X\n", 2745 (write) ? "write" : "read", 2746 REG_FMT_DEC(cfg) ? "decimal" : "hexa", 2747 cfg->addr, cfg->mask, cfg->shift, val); 2748#endif 2749 2750 if (!write) 2751 return 0; 2752 2753 ret = abx500_get_register_interruptible(dev, 2754 (u8)cfg->bank, (u8)cfg->addr, ®value); 2755 if (ret < 0) { 2756 dev_err(dev, "abx500_get_reg fail %d, %d\n", 2757 ret, __LINE__); 2758 return -EINVAL; 2759 } 2760 2761 if (cfg->shift >= 0) { 2762 regvalue &= ~(cfg->mask << (cfg->shift)); 2763 val = (val & cfg->mask) << (cfg->shift); 2764 } else { 2765 regvalue &= ~(cfg->mask >> (-cfg->shift)); 2766 val = (val & cfg->mask) >> (-cfg->shift); 2767 } 2768 val = val | regvalue; 2769 2770 ret = abx500_set_register_interruptible(dev, 2771 (u8)cfg->bank, (u8)cfg->addr, (u8)val); 2772 if (ret < 0) { 2773 pr_err("abx500_set_reg failed %d, %d", ret, __LINE__); 2774 return -EINVAL; 2775 } 2776 2777 return 0; 2778} 2779 2780static ssize_t ab8500_hwreg_write(struct file *file, 2781 const char __user *user_buf, size_t count, loff_t *ppos) 2782{ 2783 struct device *dev = ((struct seq_file *)(file->private_data))->private; 2784 char buf[128]; 2785 int buf_size, ret; 2786 2787 /* Get userspace string and assure termination */ 2788 buf_size = min(count, (sizeof(buf)-1)); 2789 if (copy_from_user(buf, user_buf, buf_size)) 2790 return -EFAULT; 2791 buf[buf_size] = 0; 2792 2793 /* get args and process */ 2794 ret = hwreg_common_write(buf, &hwreg_cfg, dev); 2795 return (ret) ? ret : buf_size; 2796} 2797 2798/* 2799 * - irq subscribe/unsubscribe stuff 2800 */ 2801static int ab8500_subscribe_unsubscribe_print(struct seq_file *s, void *p) 2802{ 2803 seq_printf(s, "%d\n", irq_first); 2804 2805 return 0; 2806} 2807 2808static int ab8500_subscribe_unsubscribe_open(struct inode *inode, 2809 struct file *file) 2810{ 2811 return single_open(file, ab8500_subscribe_unsubscribe_print, 2812 inode->i_private); 2813} 2814 2815/* 2816 * Userspace should use poll() on this file. When an event occur 2817 * the blocking poll will be released. 2818 */ 2819static ssize_t show_irq(struct device *dev, 2820 struct device_attribute *attr, char *buf) 2821{ 2822 unsigned long name; 2823 unsigned int irq_index; 2824 int err; 2825 2826 err = kstrtoul(attr->attr.name, 0, &name); 2827 if (err) 2828 return err; 2829 2830 irq_index = name - irq_first; 2831 if (irq_index >= num_irqs) 2832 return -EINVAL; 2833 2834 return sprintf(buf, "%u\n", irq_count[irq_index]); 2835} 2836 2837static ssize_t ab8500_subscribe_write(struct file *file, 2838 const char __user *user_buf, 2839 size_t count, loff_t *ppos) 2840{ 2841 struct device *dev = ((struct seq_file *)(file->private_data))->private; 2842 unsigned long user_val; 2843 int err; 2844 unsigned int irq_index; 2845 2846 err = kstrtoul_from_user(user_buf, count, 0, &user_val); 2847 if (err) 2848 return err; 2849 2850 if (user_val < irq_first) { 2851 dev_err(dev, "debugfs error input < %d\n", irq_first); 2852 return -EINVAL; 2853 } 2854 if (user_val > irq_last) { 2855 dev_err(dev, "debugfs error input > %d\n", irq_last); 2856 return -EINVAL; 2857 } 2858 2859 irq_index = user_val - irq_first; 2860 if (irq_index >= num_irqs) 2861 return -EINVAL; 2862 2863 /* 2864 * This will create a sysfs file named <irq-nr> which userspace can 2865 * use to select or poll and get the AB8500 events 2866 */ 2867 dev_attr[irq_index] = kmalloc(sizeof(struct device_attribute), 2868 GFP_KERNEL); 2869 if (!dev_attr[irq_index]) 2870 return -ENOMEM; 2871 2872 event_name[irq_index] = kmalloc(count, GFP_KERNEL); 2873 if (!event_name[irq_index]) 2874 return -ENOMEM; 2875 2876 sprintf(event_name[irq_index], "%lu", user_val); 2877 dev_attr[irq_index]->show = show_irq; 2878 dev_attr[irq_index]->store = NULL; 2879 dev_attr[irq_index]->attr.name = event_name[irq_index]; 2880 dev_attr[irq_index]->attr.mode = S_IRUGO; 2881 err = sysfs_create_file(&dev->kobj, &dev_attr[irq_index]->attr); 2882 if (err < 0) { 2883 pr_info("sysfs_create_file failed %d\n", err); 2884 return err; 2885 } 2886 2887 err = request_threaded_irq(user_val, NULL, ab8500_debug_handler, 2888 IRQF_SHARED | IRQF_NO_SUSPEND, 2889 "ab8500-debug", &dev->kobj); 2890 if (err < 0) { 2891 pr_info("request_threaded_irq failed %d, %lu\n", 2892 err, user_val); 2893 sysfs_remove_file(&dev->kobj, &dev_attr[irq_index]->attr); 2894 return err; 2895 } 2896 2897 return count; 2898} 2899 2900static ssize_t ab8500_unsubscribe_write(struct file *file, 2901 const char __user *user_buf, 2902 size_t count, loff_t *ppos) 2903{ 2904 struct device *dev = ((struct seq_file *)(file->private_data))->private; 2905 unsigned long user_val; 2906 int err; 2907 unsigned int irq_index; 2908 2909 err = kstrtoul_from_user(user_buf, count, 0, &user_val); 2910 if (err) 2911 return err; 2912 2913 if (user_val < irq_first) { 2914 dev_err(dev, "debugfs error input < %d\n", irq_first); 2915 return -EINVAL; 2916 } 2917 if (user_val > irq_last) { 2918 dev_err(dev, "debugfs error input > %d\n", irq_last); 2919 return -EINVAL; 2920 } 2921 2922 irq_index = user_val - irq_first; 2923 if (irq_index >= num_irqs) 2924 return -EINVAL; 2925 2926 /* Set irq count to 0 when unsubscribe */ 2927 irq_count[irq_index] = 0; 2928 2929 if (dev_attr[irq_index]) 2930 sysfs_remove_file(&dev->kobj, &dev_attr[irq_index]->attr); 2931 2932 2933 free_irq(user_val, &dev->kobj); 2934 kfree(event_name[irq_index]); 2935 kfree(dev_attr[irq_index]); 2936 2937 return count; 2938} 2939 2940/* 2941 * - several deubgfs nodes fops 2942 */ 2943 2944static const struct file_operations ab8500_bank_fops = { 2945 .open = ab8500_bank_open, 2946 .write = ab8500_bank_write, 2947 .read = seq_read, 2948 .llseek = seq_lseek, 2949 .release = single_release, 2950 .owner = THIS_MODULE, 2951}; 2952 2953static const struct file_operations ab8500_address_fops = { 2954 .open = ab8500_address_open, 2955 .write = ab8500_address_write, 2956 .read = seq_read, 2957 .llseek = seq_lseek, 2958 .release = single_release, 2959 .owner = THIS_MODULE, 2960}; 2961 2962static const struct file_operations ab8500_val_fops = { 2963 .open = ab8500_val_open, 2964 .write = ab8500_val_write, 2965 .read = seq_read, 2966 .llseek = seq_lseek, 2967 .release = single_release, 2968 .owner = THIS_MODULE, 2969}; 2970 2971static const struct file_operations ab8500_interrupts_fops = { 2972 .open = ab8500_interrupts_open, 2973 .read = seq_read, 2974 .llseek = seq_lseek, 2975 .release = single_release, 2976 .owner = THIS_MODULE, 2977}; 2978 2979static const struct file_operations ab8500_subscribe_fops = { 2980 .open = ab8500_subscribe_unsubscribe_open, 2981 .write = ab8500_subscribe_write, 2982 .read = seq_read, 2983 .llseek = seq_lseek, 2984 .release = single_release, 2985 .owner = THIS_MODULE, 2986}; 2987 2988static const struct file_operations ab8500_unsubscribe_fops = { 2989 .open = ab8500_subscribe_unsubscribe_open, 2990 .write = ab8500_unsubscribe_write, 2991 .read = seq_read, 2992 .llseek = seq_lseek, 2993 .release = single_release, 2994 .owner = THIS_MODULE, 2995}; 2996 2997static const struct file_operations ab8500_hwreg_fops = { 2998 .open = ab8500_hwreg_open, 2999 .write = ab8500_hwreg_write, 3000 .read = seq_read, 3001 .llseek = seq_lseek, 3002 .release = single_release, 3003 .owner = THIS_MODULE, 3004}; 3005 3006static struct dentry *ab8500_dir; 3007static struct dentry *ab8500_gpadc_dir; 3008 3009static int ab8500_debug_probe(struct platform_device *plf) 3010{ 3011 struct dentry *file; 3012 struct ab8500 *ab8500; 3013 struct resource *res; 3014 3015 debug_bank = AB8500_MISC; 3016 debug_address = AB8500_REV_REG & 0x00FF; 3017 3018 ab8500 = dev_get_drvdata(plf->dev.parent); 3019 num_irqs = ab8500->mask_size; 3020 3021 irq_count = devm_kzalloc(&plf->dev, 3022 sizeof(*irq_count)*num_irqs, GFP_KERNEL); 3023 if (!irq_count) 3024 return -ENOMEM; 3025 3026 dev_attr = devm_kzalloc(&plf->dev, 3027 sizeof(*dev_attr)*num_irqs, GFP_KERNEL); 3028 if (!dev_attr) 3029 return -ENOMEM; 3030 3031 event_name = devm_kzalloc(&plf->dev, 3032 sizeof(*event_name)*num_irqs, GFP_KERNEL); 3033 if (!event_name) 3034 return -ENOMEM; 3035 3036 res = platform_get_resource_byname(plf, 0, "IRQ_AB8500"); 3037 if (!res) { 3038 dev_err(&plf->dev, "AB8500 irq not found, err %d\n", irq_first); 3039 return -ENXIO; 3040 } 3041 irq_ab8500 = res->start; 3042 3043 irq_first = platform_get_irq_byname(plf, "IRQ_FIRST"); 3044 if (irq_first < 0) { 3045 dev_err(&plf->dev, "First irq not found, err %d\n", irq_first); 3046 return irq_first; 3047 } 3048 3049 irq_last = platform_get_irq_byname(plf, "IRQ_LAST"); 3050 if (irq_last < 0) { 3051 dev_err(&plf->dev, "Last irq not found, err %d\n", irq_last); 3052 return irq_last; 3053 } 3054 3055 ab8500_dir = debugfs_create_dir(AB8500_NAME_STRING, NULL); 3056 if (!ab8500_dir) 3057 goto err; 3058 3059 ab8500_gpadc_dir = debugfs_create_dir(AB8500_ADC_NAME_STRING, 3060 ab8500_dir); 3061 if (!ab8500_gpadc_dir) 3062 goto err; 3063 3064 file = debugfs_create_file("all-bank-registers", S_IRUGO, ab8500_dir, 3065 &plf->dev, &ab8500_registers_fops); 3066 if (!file) 3067 goto err; 3068 3069 file = debugfs_create_file("all-banks", S_IRUGO, ab8500_dir, 3070 &plf->dev, &ab8500_all_banks_fops); 3071 if (!file) 3072 goto err; 3073 3074 file = debugfs_create_file("register-bank", 3075 (S_IRUGO | S_IWUSR | S_IWGRP), 3076 ab8500_dir, &plf->dev, &ab8500_bank_fops); 3077 if (!file) 3078 goto err; 3079 3080 file = debugfs_create_file("register-address", 3081 (S_IRUGO | S_IWUSR | S_IWGRP), 3082 ab8500_dir, &plf->dev, &ab8500_address_fops); 3083 if (!file) 3084 goto err; 3085 3086 file = debugfs_create_file("register-value", 3087 (S_IRUGO | S_IWUSR | S_IWGRP), 3088 ab8500_dir, &plf->dev, &ab8500_val_fops); 3089 if (!file) 3090 goto err; 3091 3092 file = debugfs_create_file("irq-subscribe", 3093 (S_IRUGO | S_IWUSR | S_IWGRP), ab8500_dir, 3094 &plf->dev, &ab8500_subscribe_fops); 3095 if (!file) 3096 goto err; 3097 3098 if (is_ab8500(ab8500)) { 3099 debug_ranges = ab8500_debug_ranges; 3100 num_interrupt_lines = AB8500_NR_IRQS; 3101 } else if (is_ab8505(ab8500)) { 3102 debug_ranges = ab8505_debug_ranges; 3103 num_interrupt_lines = AB8505_NR_IRQS; 3104 } else if (is_ab9540(ab8500)) { 3105 debug_ranges = ab8505_debug_ranges; 3106 num_interrupt_lines = AB9540_NR_IRQS; 3107 } else if (is_ab8540(ab8500)) { 3108 debug_ranges = ab8540_debug_ranges; 3109 num_interrupt_lines = AB8540_NR_IRQS; 3110 } 3111 3112 file = debugfs_create_file("interrupts", (S_IRUGO), ab8500_dir, 3113 &plf->dev, &ab8500_interrupts_fops); 3114 if (!file) 3115 goto err; 3116 3117 file = debugfs_create_file("irq-unsubscribe", 3118 (S_IRUGO | S_IWUSR | S_IWGRP), ab8500_dir, 3119 &plf->dev, &ab8500_unsubscribe_fops); 3120 if (!file) 3121 goto err; 3122 3123 file = debugfs_create_file("hwreg", (S_IRUGO | S_IWUSR | S_IWGRP), 3124 ab8500_dir, &plf->dev, &ab8500_hwreg_fops); 3125 if (!file) 3126 goto err; 3127 3128 file = debugfs_create_file("all-modem-registers", 3129 (S_IRUGO | S_IWUSR | S_IWGRP), 3130 ab8500_dir, &plf->dev, &ab8500_modem_fops); 3131 if (!file) 3132 goto err; 3133 3134 file = debugfs_create_file("bat_ctrl", (S_IRUGO | S_IWUSR | S_IWGRP), 3135 ab8500_gpadc_dir, &plf->dev, 3136 &ab8500_gpadc_bat_ctrl_fops); 3137 if (!file) 3138 goto err; 3139 3140 file = debugfs_create_file("btemp_ball", (S_IRUGO | S_IWUSR | S_IWGRP), 3141 ab8500_gpadc_dir, 3142 &plf->dev, &ab8500_gpadc_btemp_ball_fops); 3143 if (!file) 3144 goto err; 3145 3146 file = debugfs_create_file("main_charger_v", 3147 (S_IRUGO | S_IWUSR | S_IWGRP), 3148 ab8500_gpadc_dir, &plf->dev, 3149 &ab8500_gpadc_main_charger_v_fops); 3150 if (!file) 3151 goto err; 3152 3153 file = debugfs_create_file("acc_detect1", 3154 (S_IRUGO | S_IWUSR | S_IWGRP), 3155 ab8500_gpadc_dir, &plf->dev, 3156 &ab8500_gpadc_acc_detect1_fops); 3157 if (!file) 3158 goto err; 3159 3160 file = debugfs_create_file("acc_detect2", 3161 (S_IRUGO | S_IWUSR | S_IWGRP), 3162 ab8500_gpadc_dir, &plf->dev, 3163 &ab8500_gpadc_acc_detect2_fops); 3164 if (!file) 3165 goto err; 3166 3167 file = debugfs_create_file("adc_aux1", (S_IRUGO | S_IWUSR | S_IWGRP), 3168 ab8500_gpadc_dir, &plf->dev, 3169 &ab8500_gpadc_aux1_fops); 3170 if (!file) 3171 goto err; 3172 3173 file = debugfs_create_file("adc_aux2", (S_IRUGO | S_IWUSR | S_IWGRP), 3174 ab8500_gpadc_dir, &plf->dev, 3175 &ab8500_gpadc_aux2_fops); 3176 if (!file) 3177 goto err; 3178 3179 file = debugfs_create_file("main_bat_v", (S_IRUGO | S_IWUSR | S_IWGRP), 3180 ab8500_gpadc_dir, &plf->dev, 3181 &ab8500_gpadc_main_bat_v_fops); 3182 if (!file) 3183 goto err; 3184 3185 file = debugfs_create_file("vbus_v", (S_IRUGO | S_IWUSR | S_IWGRP), 3186 ab8500_gpadc_dir, &plf->dev, 3187 &ab8500_gpadc_vbus_v_fops); 3188 if (!file) 3189 goto err; 3190 3191 file = debugfs_create_file("main_charger_c", 3192 (S_IRUGO | S_IWUSR | S_IWGRP), 3193 ab8500_gpadc_dir, &plf->dev, 3194 &ab8500_gpadc_main_charger_c_fops); 3195 if (!file) 3196 goto err; 3197 3198 file = debugfs_create_file("usb_charger_c", 3199 (S_IRUGO | S_IWUSR | S_IWGRP), 3200 ab8500_gpadc_dir, 3201 &plf->dev, &ab8500_gpadc_usb_charger_c_fops); 3202 if (!file) 3203 goto err; 3204 3205 file = debugfs_create_file("bk_bat_v", (S_IRUGO | S_IWUSR | S_IWGRP), 3206 ab8500_gpadc_dir, &plf->dev, 3207 &ab8500_gpadc_bk_bat_v_fops); 3208 if (!file) 3209 goto err; 3210 3211 file = debugfs_create_file("die_temp", (S_IRUGO | S_IWUSR | S_IWGRP), 3212 ab8500_gpadc_dir, &plf->dev, 3213 &ab8500_gpadc_die_temp_fops); 3214 if (!file) 3215 goto err; 3216 3217 file = debugfs_create_file("usb_id", (S_IRUGO | S_IWUSR | S_IWGRP), 3218 ab8500_gpadc_dir, &plf->dev, 3219 &ab8500_gpadc_usb_id_fops); 3220 if (!file) 3221 goto err; 3222 3223 if (is_ab8540(ab8500)) { 3224 file = debugfs_create_file("xtal_temp", 3225 (S_IRUGO | S_IWUSR | S_IWGRP), 3226 ab8500_gpadc_dir, &plf->dev, 3227 &ab8540_gpadc_xtal_temp_fops); 3228 if (!file) 3229 goto err; 3230 file = debugfs_create_file("vbattruemeas", 3231 (S_IRUGO | S_IWUSR | S_IWGRP), 3232 ab8500_gpadc_dir, &plf->dev, 3233 &ab8540_gpadc_vbat_true_meas_fops); 3234 if (!file) 3235 goto err; 3236 file = debugfs_create_file("batctrl_and_ibat", 3237 (S_IRUGO | S_IWUGO), 3238 ab8500_gpadc_dir, 3239 &plf->dev, 3240 &ab8540_gpadc_bat_ctrl_and_ibat_fops); 3241 if (!file) 3242 goto err; 3243 file = debugfs_create_file("vbatmeas_and_ibat", 3244 (S_IRUGO | S_IWUGO), 3245 ab8500_gpadc_dir, &plf->dev, 3246 &ab8540_gpadc_vbat_meas_and_ibat_fops); 3247 if (!file) 3248 goto err; 3249 file = debugfs_create_file("vbattruemeas_and_ibat", 3250 (S_IRUGO | S_IWUGO), 3251 ab8500_gpadc_dir, 3252 &plf->dev, 3253 &ab8540_gpadc_vbat_true_meas_and_ibat_fops); 3254 if (!file) 3255 goto err; 3256 file = debugfs_create_file("battemp_and_ibat", 3257 (S_IRUGO | S_IWUGO), 3258 ab8500_gpadc_dir, 3259 &plf->dev, &ab8540_gpadc_bat_temp_and_ibat_fops); 3260 if (!file) 3261 goto err; 3262 file = debugfs_create_file("otp_calib", 3263 (S_IRUGO | S_IWUSR | S_IWGRP), 3264 ab8500_gpadc_dir, 3265 &plf->dev, &ab8540_gpadc_otp_calib_fops); 3266 if (!file) 3267 goto err; 3268 } 3269 file = debugfs_create_file("avg_sample", (S_IRUGO | S_IWUSR | S_IWGRP), 3270 ab8500_gpadc_dir, &plf->dev, 3271 &ab8500_gpadc_avg_sample_fops); 3272 if (!file) 3273 goto err; 3274 3275 file = debugfs_create_file("trig_edge", (S_IRUGO | S_IWUSR | S_IWGRP), 3276 ab8500_gpadc_dir, &plf->dev, 3277 &ab8500_gpadc_trig_edge_fops); 3278 if (!file) 3279 goto err; 3280 3281 file = debugfs_create_file("trig_timer", (S_IRUGO | S_IWUSR | S_IWGRP), 3282 ab8500_gpadc_dir, &plf->dev, 3283 &ab8500_gpadc_trig_timer_fops); 3284 if (!file) 3285 goto err; 3286 3287 file = debugfs_create_file("conv_type", (S_IRUGO | S_IWUSR | S_IWGRP), 3288 ab8500_gpadc_dir, &plf->dev, 3289 &ab8500_gpadc_conv_type_fops); 3290 if (!file) 3291 goto err; 3292 3293 return 0; 3294 3295err: 3296 debugfs_remove_recursive(ab8500_dir); 3297 dev_err(&plf->dev, "failed to create debugfs entries.\n"); 3298 3299 return -ENOMEM; 3300} 3301 3302static int ab8500_debug_remove(struct platform_device *plf) 3303{ 3304 debugfs_remove_recursive(ab8500_dir); 3305 3306 return 0; 3307} 3308 3309static struct platform_driver ab8500_debug_driver = { 3310 .driver = { 3311 .name = "ab8500-debug", 3312 }, 3313 .probe = ab8500_debug_probe, 3314 .remove = ab8500_debug_remove 3315}; 3316 3317static int __init ab8500_debug_init(void) 3318{ 3319 return platform_driver_register(&ab8500_debug_driver); 3320} 3321 3322static void __exit ab8500_debug_exit(void) 3323{ 3324 platform_driver_unregister(&ab8500_debug_driver); 3325} 3326subsys_initcall(ab8500_debug_init); 3327module_exit(ab8500_debug_exit); 3328 3329MODULE_AUTHOR("Mattias WALLIN <mattias.wallin@stericsson.com"); 3330MODULE_DESCRIPTION("AB8500 DEBUG"); 3331MODULE_LICENSE("GPL v2"); 3332