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