mfd: ab8500-debugfs: Remove the racy fiddling with irq_desc
[linux-2.6-microblaze.git] / drivers / mfd / ab8500-debugfs.c
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
93 static u32 debug_bank;
94 static u32 debug_address;
95
96 static int irq_ab8500;
97 static int irq_first;
98 static int irq_last;
99 static u32 *irq_count;
100 static int num_irqs;
101
102 static struct device_attribute **dev_attr;
103 static 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  */
111 struct 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  */
123 struct 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 */
130 struct 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
141 static 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
153 static struct ab8500_prcmu_ranges *debug_ranges;
154
155 static 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
478 static 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
839 static 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
1254 static 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 */
1273 static 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
1313 static 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
1325 DEFINE_SHOW_ATTRIBUTE(ab8500_bank_registers);
1326
1327 static 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 */
1346 void 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
1358 static 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
1377 static 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
1385 static 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
1391 static int ab8500_bank_open(struct inode *inode, struct file *file)
1392 {
1393         return single_open(file, ab8500_bank_print, inode->i_private);
1394 }
1395
1396 static 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
1418 static 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
1424 static int ab8500_address_open(struct inode *inode, struct file *file)
1425 {
1426         return single_open(file, ab8500_address_print, inode->i_private);
1427 }
1428
1429 static 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
1450 static 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
1468 static int ab8500_val_open(struct inode *inode, struct file *file)
1469 {
1470         return single_open(file, ab8500_val_print, inode->i_private);
1471 }
1472
1473 static 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  */
1502 static u32 num_interrupts[AB8500_MAX_NR_IRQS];
1503 static u32 num_wake_interrupts[AB8500_MAX_NR_IRQS];
1504 static int num_interrupt_lines;
1505
1506 void ab8500_debug_register_interrupt(int line)
1507 {
1508         if (line < num_interrupt_lines)
1509                 num_interrupts[line]++;
1510 }
1511
1512 static int ab8500_interrupts_show(struct seq_file *s, void *p)
1513 {
1514         int line;
1515
1516         seq_puts(s, "name: number: irq: number of: wake:\n");
1517
1518         for (line = 0; line < num_interrupt_lines; line++) {
1519                 seq_printf(s, "%3i:  %4i %6i %4i\n",
1520                            line,
1521                            line + irq_first,
1522                            num_interrupts[line],
1523                            num_wake_interrupts[line]);
1524                 }
1525                 seq_putc(s, '\n');
1526         }
1527
1528         return 0;
1529 }
1530
1531 DEFINE_SHOW_ATTRIBUTE(ab8500_interrupts);
1532
1533 /*
1534  * - HWREG DB8500 formated routines
1535  */
1536 static int ab8500_hwreg_print(struct seq_file *s, void *d)
1537 {
1538         struct device *dev = s->private;
1539         int ret;
1540         u8 regvalue;
1541
1542         ret = abx500_get_register_interruptible(dev,
1543                 (u8)hwreg_cfg.bank, (u8)hwreg_cfg.addr, &regvalue);
1544         if (ret < 0) {
1545                 dev_err(dev, "abx500_get_reg fail %d, %d\n",
1546                         ret, __LINE__);
1547                 return -EINVAL;
1548         }
1549
1550         if (hwreg_cfg.shift >= 0)
1551                 regvalue >>= hwreg_cfg.shift;
1552         else
1553                 regvalue <<= -hwreg_cfg.shift;
1554         regvalue &= hwreg_cfg.mask;
1555
1556         if (REG_FMT_DEC(&hwreg_cfg))
1557                 seq_printf(s, "%d\n", regvalue);
1558         else
1559                 seq_printf(s, "0x%02X\n", regvalue);
1560         return 0;
1561 }
1562
1563 static int ab8500_hwreg_open(struct inode *inode, struct file *file)
1564 {
1565         return single_open(file, ab8500_hwreg_print, inode->i_private);
1566 }
1567
1568 #define AB8500_SUPPLY_CONTROL_CONFIG_1 0x01
1569 #define AB8500_SUPPLY_CONTROL_REG 0x00
1570 #define AB8500_FIRST_SIM_REG 0x80
1571 #define AB8500_LAST_SIM_REG 0x8B
1572 #define AB8505_LAST_SIM_REG 0x8C
1573
1574 static int ab8500_modem_show(struct seq_file *s, void *p)
1575 {
1576         struct device *dev = s->private;
1577         struct ab8500 *ab8500;
1578         int err;
1579         u8 value;
1580         u8 orig_value;
1581         u32 bank = AB8500_REGU_CTRL2;
1582         u32 last_sim_reg = AB8500_LAST_SIM_REG;
1583         u32 reg;
1584
1585         ab8500 = dev_get_drvdata(dev->parent);
1586         dev_warn(dev, "WARNING! This operation can interfer with modem side\n"
1587                 "and should only be done with care\n");
1588
1589         err = abx500_get_register_interruptible(dev,
1590                 AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, &orig_value);
1591         if (err < 0)
1592                 goto report_read_failure;
1593
1594         /* Config 1 will allow APE side to read SIM registers */
1595         err = abx500_set_register_interruptible(dev,
1596                 AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG,
1597                 AB8500_SUPPLY_CONTROL_CONFIG_1);
1598         if (err < 0)
1599                 goto report_write_failure;
1600
1601         seq_printf(s, " bank 0x%02X:\n", bank);
1602
1603         if (is_ab9540(ab8500) || is_ab8505(ab8500))
1604                 last_sim_reg = AB8505_LAST_SIM_REG;
1605
1606         for (reg = AB8500_FIRST_SIM_REG; reg <= last_sim_reg; reg++) {
1607                 err = abx500_get_register_interruptible(dev,
1608                         bank, reg, &value);
1609                 if (err < 0)
1610                         goto report_read_failure;
1611
1612                 seq_printf(s, "  [0x%02X/0x%02X]: 0x%02X\n", bank, reg, value);
1613         }
1614         err = abx500_set_register_interruptible(dev,
1615                 AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, orig_value);
1616         if (err < 0)
1617                 goto report_write_failure;
1618
1619         return 0;
1620
1621 report_read_failure:
1622         dev_err(dev, "ab->read fail %d\n", err);
1623         return err;
1624
1625 report_write_failure:
1626         dev_err(dev, "ab->write fail %d\n", err);
1627         return err;
1628 }
1629
1630 DEFINE_SHOW_ATTRIBUTE(ab8500_modem);
1631
1632 /*
1633  * return length of an ASCII numerical value, 0 is string is not a
1634  * numerical value.
1635  * string shall start at value 1st char.
1636  * string can be tailed with \0 or space or newline chars only.
1637  * value can be decimal or hexadecimal (prefixed 0x or 0X).
1638  */
1639 static int strval_len(char *b)
1640 {
1641         char *s = b;
1642
1643         if ((*s == '0') && ((*(s+1) == 'x') || (*(s+1) == 'X'))) {
1644                 s += 2;
1645                 for (; *s && (*s != ' ') && (*s != '\n'); s++) {
1646                         if (!isxdigit(*s))
1647                                 return 0;
1648                 }
1649         } else {
1650                 if (*s == '-')
1651                         s++;
1652                 for (; *s && (*s != ' ') && (*s != '\n'); s++) {
1653                         if (!isdigit(*s))
1654                                 return 0;
1655                 }
1656         }
1657         return (int) (s-b);
1658 }
1659
1660 /*
1661  * parse hwreg input data.
1662  * update global hwreg_cfg only if input data syntax is ok.
1663  */
1664 static ssize_t hwreg_common_write(char *b, struct hwreg_cfg *cfg,
1665                 struct device *dev)
1666 {
1667         uint write, val = 0;
1668         u8  regvalue;
1669         int ret;
1670         struct hwreg_cfg loc = {
1671                 .bank = 0,          /* default: invalid phys addr */
1672                 .addr = 0,          /* default: invalid phys addr */
1673                 .fmt = 0,           /* default: 32bit access, hex output */
1674                 .mask = 0xFFFFFFFF, /* default: no mask */
1675                 .shift = 0,         /* default: no bit shift */
1676         };
1677
1678         /* read or write ? */
1679         if (!strncmp(b, "read ", 5)) {
1680                 write = 0;
1681                 b += 5;
1682         } else if (!strncmp(b, "write ", 6)) {
1683                 write = 1;
1684                 b += 6;
1685         } else
1686                 return -EINVAL;
1687
1688         /* OPTIONS -l|-w|-b -s -m -o */
1689         while ((*b == ' ') || (*b == '-')) {
1690                 if (*(b-1) != ' ') {
1691                         b++;
1692                         continue;
1693                 }
1694                 if ((!strncmp(b, "-d ", 3)) ||
1695                                 (!strncmp(b, "-dec ", 5))) {
1696                         b += (*(b+2) == ' ') ? 3 : 5;
1697                         loc.fmt |= (1<<0);
1698                 } else if ((!strncmp(b, "-h ", 3)) ||
1699                                 (!strncmp(b, "-hex ", 5))) {
1700                         b += (*(b+2) == ' ') ? 3 : 5;
1701                         loc.fmt &= ~(1<<0);
1702                 } else if ((!strncmp(b, "-m ", 3)) ||
1703                                 (!strncmp(b, "-mask ", 6))) {
1704                         b += (*(b+2) == ' ') ? 3 : 6;
1705                         if (strval_len(b) == 0)
1706                                 return -EINVAL;
1707                         ret = kstrtoul(b, 0, &loc.mask);
1708                         if (ret)
1709                                 return ret;
1710                 } else if ((!strncmp(b, "-s ", 3)) ||
1711                                 (!strncmp(b, "-shift ", 7))) {
1712                         b += (*(b+2) == ' ') ? 3 : 7;
1713                         if (strval_len(b) == 0)
1714                                 return -EINVAL;
1715                         ret = kstrtol(b, 0, &loc.shift);
1716                         if (ret)
1717                                 return ret;
1718                 } else {
1719                         return -EINVAL;
1720                 }
1721         }
1722         /* get arg BANK and ADDRESS */
1723         if (strval_len(b) == 0)
1724                 return -EINVAL;
1725         ret = kstrtouint(b, 0, &loc.bank);
1726         if (ret)
1727                 return ret;
1728         while (*b == ' ')
1729                 b++;
1730         if (strval_len(b) == 0)
1731                 return -EINVAL;
1732         ret = kstrtoul(b, 0, &loc.addr);
1733         if (ret)
1734                 return ret;
1735
1736         if (write) {
1737                 while (*b == ' ')
1738                         b++;
1739                 if (strval_len(b) == 0)
1740                         return -EINVAL;
1741                 ret = kstrtouint(b, 0, &val);
1742                 if (ret)
1743                         return ret;
1744         }
1745
1746         /* args are ok, update target cfg (mainly for read) */
1747         *cfg = loc;
1748
1749 #ifdef ABB_HWREG_DEBUG
1750         pr_warn("HWREG request: %s, %s,\n", (write) ? "write" : "read",
1751                 REG_FMT_DEC(cfg) ? "decimal" : "hexa");
1752         pr_warn("  addr=0x%08X, mask=0x%X, shift=%d" "value=0x%X\n",
1753                 cfg->addr, cfg->mask, cfg->shift, val);
1754 #endif
1755
1756         if (!write)
1757                 return 0;
1758
1759         ret = abx500_get_register_interruptible(dev,
1760                         (u8)cfg->bank, (u8)cfg->addr, &regvalue);
1761         if (ret < 0) {
1762                 dev_err(dev, "abx500_get_reg fail %d, %d\n",
1763                         ret, __LINE__);
1764                 return -EINVAL;
1765         }
1766
1767         if (cfg->shift >= 0) {
1768                 regvalue &= ~(cfg->mask << (cfg->shift));
1769                 val = (val & cfg->mask) << (cfg->shift);
1770         } else {
1771                 regvalue &= ~(cfg->mask >> (-cfg->shift));
1772                 val = (val & cfg->mask) >> (-cfg->shift);
1773         }
1774         val = val | regvalue;
1775
1776         ret = abx500_set_register_interruptible(dev,
1777                         (u8)cfg->bank, (u8)cfg->addr, (u8)val);
1778         if (ret < 0) {
1779                 pr_err("abx500_set_reg failed %d, %d", ret, __LINE__);
1780                 return -EINVAL;
1781         }
1782
1783         return 0;
1784 }
1785
1786 static ssize_t ab8500_hwreg_write(struct file *file,
1787         const char __user *user_buf, size_t count, loff_t *ppos)
1788 {
1789         struct device *dev = ((struct seq_file *)(file->private_data))->private;
1790         char buf[128];
1791         int buf_size, ret;
1792
1793         /* Get userspace string and assure termination */
1794         buf_size = min((int)count, (int)(sizeof(buf)-1));
1795         if (copy_from_user(buf, user_buf, buf_size))
1796                 return -EFAULT;
1797         buf[buf_size] = 0;
1798
1799         /* get args and process */
1800         ret = hwreg_common_write(buf, &hwreg_cfg, dev);
1801         return (ret) ? ret : buf_size;
1802 }
1803
1804 /*
1805  * - irq subscribe/unsubscribe stuff
1806  */
1807 static int ab8500_subscribe_unsubscribe_print(struct seq_file *s, void *p)
1808 {
1809         seq_printf(s, "%d\n", irq_first);
1810
1811         return 0;
1812 }
1813
1814 static int ab8500_subscribe_unsubscribe_open(struct inode *inode,
1815                                              struct file *file)
1816 {
1817         return single_open(file, ab8500_subscribe_unsubscribe_print,
1818                 inode->i_private);
1819 }
1820
1821 /*
1822  * Userspace should use poll() on this file. When an event occur
1823  * the blocking poll will be released.
1824  */
1825 static ssize_t show_irq(struct device *dev,
1826                         struct device_attribute *attr, char *buf)
1827 {
1828         unsigned long name;
1829         unsigned int irq_index;
1830         int err;
1831
1832         err = kstrtoul(attr->attr.name, 0, &name);
1833         if (err)
1834                 return err;
1835
1836         irq_index = name - irq_first;
1837         if (irq_index >= num_irqs)
1838                 return -EINVAL;
1839
1840         return sprintf(buf, "%u\n", irq_count[irq_index]);
1841 }
1842
1843 static ssize_t ab8500_subscribe_write(struct file *file,
1844                                       const char __user *user_buf,
1845                                       size_t count, loff_t *ppos)
1846 {
1847         struct device *dev = ((struct seq_file *)(file->private_data))->private;
1848         unsigned long user_val;
1849         int err;
1850         unsigned int irq_index;
1851
1852         err = kstrtoul_from_user(user_buf, count, 0, &user_val);
1853         if (err)
1854                 return err;
1855
1856         if (user_val < irq_first) {
1857                 dev_err(dev, "debugfs error input < %d\n", irq_first);
1858                 return -EINVAL;
1859         }
1860         if (user_val > irq_last) {
1861                 dev_err(dev, "debugfs error input > %d\n", irq_last);
1862                 return -EINVAL;
1863         }
1864
1865         irq_index = user_val - irq_first;
1866         if (irq_index >= num_irqs)
1867                 return -EINVAL;
1868
1869         /*
1870          * This will create a sysfs file named <irq-nr> which userspace can
1871          * use to select or poll and get the AB8500 events
1872          */
1873         dev_attr[irq_index] = kmalloc(sizeof(struct device_attribute),
1874                 GFP_KERNEL);
1875         if (!dev_attr[irq_index])
1876                 return -ENOMEM;
1877
1878         event_name[irq_index] = kasprintf(GFP_KERNEL, "%lu", user_val);
1879         if (!event_name[irq_index])
1880                 return -ENOMEM;
1881
1882         dev_attr[irq_index]->show = show_irq;
1883         dev_attr[irq_index]->store = NULL;
1884         dev_attr[irq_index]->attr.name = event_name[irq_index];
1885         dev_attr[irq_index]->attr.mode = S_IRUGO;
1886         err = sysfs_create_file(&dev->kobj, &dev_attr[irq_index]->attr);
1887         if (err < 0) {
1888                 pr_info("sysfs_create_file failed %d\n", err);
1889                 return err;
1890         }
1891
1892         err = request_threaded_irq(user_val, NULL, ab8500_debug_handler,
1893                                    IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
1894                                    "ab8500-debug", &dev->kobj);
1895         if (err < 0) {
1896                 pr_info("request_threaded_irq failed %d, %lu\n",
1897                         err, user_val);
1898                 sysfs_remove_file(&dev->kobj, &dev_attr[irq_index]->attr);
1899                 return err;
1900         }
1901
1902         return count;
1903 }
1904
1905 static ssize_t ab8500_unsubscribe_write(struct file *file,
1906                                         const char __user *user_buf,
1907                                         size_t count, loff_t *ppos)
1908 {
1909         struct device *dev = ((struct seq_file *)(file->private_data))->private;
1910         unsigned long user_val;
1911         int err;
1912         unsigned int irq_index;
1913
1914         err = kstrtoul_from_user(user_buf, count, 0, &user_val);
1915         if (err)
1916                 return err;
1917
1918         if (user_val < irq_first) {
1919                 dev_err(dev, "debugfs error input < %d\n", irq_first);
1920                 return -EINVAL;
1921         }
1922         if (user_val > irq_last) {
1923                 dev_err(dev, "debugfs error input > %d\n", irq_last);
1924                 return -EINVAL;
1925         }
1926
1927         irq_index = user_val - irq_first;
1928         if (irq_index >= num_irqs)
1929                 return -EINVAL;
1930
1931         /* Set irq count to 0 when unsubscribe */
1932         irq_count[irq_index] = 0;
1933
1934         if (dev_attr[irq_index])
1935                 sysfs_remove_file(&dev->kobj, &dev_attr[irq_index]->attr);
1936
1937
1938         free_irq(user_val, &dev->kobj);
1939         kfree(event_name[irq_index]);
1940         kfree(dev_attr[irq_index]);
1941
1942         return count;
1943 }
1944
1945 /*
1946  * - several debugfs nodes fops
1947  */
1948
1949 static const struct file_operations ab8500_bank_fops = {
1950         .open = ab8500_bank_open,
1951         .write = ab8500_bank_write,
1952         .read = seq_read,
1953         .llseek = seq_lseek,
1954         .release = single_release,
1955         .owner = THIS_MODULE,
1956 };
1957
1958 static const struct file_operations ab8500_address_fops = {
1959         .open = ab8500_address_open,
1960         .write = ab8500_address_write,
1961         .read = seq_read,
1962         .llseek = seq_lseek,
1963         .release = single_release,
1964         .owner = THIS_MODULE,
1965 };
1966
1967 static const struct file_operations ab8500_val_fops = {
1968         .open = ab8500_val_open,
1969         .write = ab8500_val_write,
1970         .read = seq_read,
1971         .llseek = seq_lseek,
1972         .release = single_release,
1973         .owner = THIS_MODULE,
1974 };
1975
1976 static const struct file_operations ab8500_subscribe_fops = {
1977         .open = ab8500_subscribe_unsubscribe_open,
1978         .write = ab8500_subscribe_write,
1979         .read = seq_read,
1980         .llseek = seq_lseek,
1981         .release = single_release,
1982         .owner = THIS_MODULE,
1983 };
1984
1985 static const struct file_operations ab8500_unsubscribe_fops = {
1986         .open = ab8500_subscribe_unsubscribe_open,
1987         .write = ab8500_unsubscribe_write,
1988         .read = seq_read,
1989         .llseek = seq_lseek,
1990         .release = single_release,
1991         .owner = THIS_MODULE,
1992 };
1993
1994 static const struct file_operations ab8500_hwreg_fops = {
1995         .open = ab8500_hwreg_open,
1996         .write = ab8500_hwreg_write,
1997         .read = seq_read,
1998         .llseek = seq_lseek,
1999         .release = single_release,
2000         .owner = THIS_MODULE,
2001 };
2002
2003 static int ab8500_debug_probe(struct platform_device *plf)
2004 {
2005         struct dentry *ab8500_dir;
2006         struct ab8500 *ab8500;
2007         struct resource *res;
2008
2009         debug_bank = AB8500_MISC;
2010         debug_address = AB8500_REV_REG & 0x00FF;
2011
2012         ab8500 = dev_get_drvdata(plf->dev.parent);
2013         num_irqs = ab8500->mask_size;
2014
2015         irq_count = devm_kcalloc(&plf->dev,
2016                                  num_irqs, sizeof(*irq_count), GFP_KERNEL);
2017         if (!irq_count)
2018                 return -ENOMEM;
2019
2020         dev_attr = devm_kcalloc(&plf->dev,
2021                                 num_irqs, sizeof(*dev_attr), GFP_KERNEL);
2022         if (!dev_attr)
2023                 return -ENOMEM;
2024
2025         event_name = devm_kcalloc(&plf->dev,
2026                                   num_irqs, sizeof(*event_name), GFP_KERNEL);
2027         if (!event_name)
2028                 return -ENOMEM;
2029
2030         res = platform_get_resource_byname(plf, 0, "IRQ_AB8500");
2031         if (!res) {
2032                 dev_err(&plf->dev, "AB8500 irq not found, err %d\n", irq_first);
2033                 return -ENXIO;
2034         }
2035         irq_ab8500 = res->start;
2036
2037         irq_first = platform_get_irq_byname(plf, "IRQ_FIRST");
2038         if (irq_first < 0)
2039                 return irq_first;
2040
2041         irq_last = platform_get_irq_byname(plf, "IRQ_LAST");
2042         if (irq_last < 0)
2043                 return irq_last;
2044
2045         ab8500_dir = debugfs_create_dir(AB8500_NAME_STRING, NULL);
2046
2047         debugfs_create_file("all-bank-registers", S_IRUGO, ab8500_dir,
2048                             &plf->dev, &ab8500_bank_registers_fops);
2049         debugfs_create_file("all-banks", S_IRUGO, ab8500_dir,
2050                             &plf->dev, &ab8500_all_banks_fops);
2051         debugfs_create_file("register-bank", (S_IRUGO | S_IWUSR | S_IWGRP),
2052                             ab8500_dir, &plf->dev, &ab8500_bank_fops);
2053         debugfs_create_file("register-address", (S_IRUGO | S_IWUSR | S_IWGRP),
2054                             ab8500_dir, &plf->dev, &ab8500_address_fops);
2055         debugfs_create_file("register-value", (S_IRUGO | S_IWUSR | S_IWGRP),
2056                             ab8500_dir, &plf->dev, &ab8500_val_fops);
2057         debugfs_create_file("irq-subscribe", (S_IRUGO | S_IWUSR | S_IWGRP),
2058                             ab8500_dir, &plf->dev, &ab8500_subscribe_fops);
2059
2060         if (is_ab8500(ab8500)) {
2061                 debug_ranges = ab8500_debug_ranges;
2062                 num_interrupt_lines = AB8500_NR_IRQS;
2063         } else if (is_ab8505(ab8500)) {
2064                 debug_ranges = ab8505_debug_ranges;
2065                 num_interrupt_lines = AB8505_NR_IRQS;
2066         } else if (is_ab9540(ab8500)) {
2067                 debug_ranges = ab8505_debug_ranges;
2068                 num_interrupt_lines = AB9540_NR_IRQS;
2069         } else if (is_ab8540(ab8500)) {
2070                 debug_ranges = ab8540_debug_ranges;
2071                 num_interrupt_lines = AB8540_NR_IRQS;
2072         }
2073
2074         debugfs_create_file("interrupts", (S_IRUGO), ab8500_dir, &plf->dev,
2075                             &ab8500_interrupts_fops);
2076         debugfs_create_file("irq-unsubscribe", (S_IRUGO | S_IWUSR | S_IWGRP),
2077                             ab8500_dir, &plf->dev, &ab8500_unsubscribe_fops);
2078         debugfs_create_file("hwreg", (S_IRUGO | S_IWUSR | S_IWGRP), ab8500_dir,
2079                             &plf->dev, &ab8500_hwreg_fops);
2080         debugfs_create_file("all-modem-registers", (S_IRUGO | S_IWUSR | S_IWGRP),
2081                             ab8500_dir, &plf->dev, &ab8500_modem_fops);
2082
2083         return 0;
2084 }
2085
2086 static struct platform_driver ab8500_debug_driver = {
2087         .driver = {
2088                 .name = "ab8500-debug",
2089                 .suppress_bind_attrs = true,
2090         },
2091         .probe  = ab8500_debug_probe,
2092 };
2093
2094 static int __init ab8500_debug_init(void)
2095 {
2096         return platform_driver_register(&ab8500_debug_driver);
2097 }
2098 subsys_initcall(ab8500_debug_init);