Linux Audio

Check our new training course

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