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