hc
2024-05-09 b9d5c334faa47a75f1f28e72d203fc0334e8471d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) ST-Ericsson SA 2010
 *
 * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
 */
#ifndef MFD_AB8500_H
#define MFD_AB8500_H
 
#include <linux/atomic.h>
#include <linux/mutex.h>
#include <linux/irqdomain.h>
 
struct device;
 
/*
 * AB IC versions
 *
 * AB8500_VERSION_AB8500 should be 0xFF but will never be read as need a
 * non-supported multi-byte I2C access via PRCMU. Set to 0x00 to ease the
 * print of version string.
 */
enum ab8500_version {
   AB8500_VERSION_AB8500 = 0x0,
   AB8500_VERSION_AB8505 = 0x1,
   AB8500_VERSION_AB9540 = 0x2,
   AB8500_VERSION_AB8540 = 0x4,
   AB8500_VERSION_UNDEFINED,
};
 
/* AB8500 CIDs*/
#define AB8500_CUTEARLY    0x00
#define AB8500_CUT1P0    0x10
#define AB8500_CUT1P1    0x11
#define AB8500_CUT1P2    0x12 /* Only valid for AB8540 */
#define AB8500_CUT2P0    0x20
#define AB8500_CUT3P0    0x30
#define AB8500_CUT3P3    0x33
 
/*
 * AB8500 bank addresses
 */
#define AB8500_M_FSM_RANK    0x0
#define AB8500_SYS_CTRL1_BLOCK    0x1
#define AB8500_SYS_CTRL2_BLOCK    0x2
#define AB8500_REGU_CTRL1    0x3
#define AB8500_REGU_CTRL2    0x4
#define AB8500_USB        0x5
#define AB8500_TVOUT        0x6
#define AB8500_DBI        0x7
#define AB8500_ECI_AV_ACC    0x8
#define AB8500_RESERVED        0x9
#define AB8500_GPADC        0xA
#define AB8500_CHARGER        0xB
#define AB8500_GAS_GAUGE    0xC
#define AB8500_AUDIO        0xD
#define AB8500_INTERRUPT    0xE
#define AB8500_RTC        0xF
#define AB8500_MISC        0x10
#define AB8500_DEVELOPMENT    0x11
#define AB8500_DEBUG        0x12
#define AB8500_PROD_TEST    0x13
#define AB8500_STE_TEST        0x14
#define AB8500_OTP_EMUL        0x15
 
#define AB8500_DEBUG_FIELD_LAST    0x16
 
/*
 * Interrupts
 * Values used to index into array ab8500_irq_regoffset[] defined in
 * drivers/mdf/ab8500-core.c
 */
/* Definitions for AB8500, AB9540 and AB8540 */
/* ab8500_irq_regoffset[0] -> IT[Source|Latch|Mask]1 */
#define AB8500_INT_MAIN_EXT_CH_NOT_OK    0 /* not 8505/9540 */
#define AB8500_INT_UN_PLUG_TV_DET    1 /* not 8505/9540/8540 */
#define AB8500_INT_PLUG_TV_DET        2 /* not 8505/9540/8540 */
#define AB8500_INT_TEMP_WARM        3
#define AB8500_INT_PON_KEY2DB_F        4
#define AB8500_INT_PON_KEY2DB_R        5
#define AB8500_INT_PON_KEY1DB_F        6
#define AB8500_INT_PON_KEY1DB_R        7
/* ab8500_irq_regoffset[1] -> IT[Source|Latch|Mask]2 */
#define AB8500_INT_BATT_OVV        8
#define AB8500_INT_MAIN_CH_UNPLUG_DET    10 /* not 8505/8540 */
#define AB8500_INT_MAIN_CH_PLUG_DET    11 /* not 8505/8540 */
#define AB8500_INT_VBUS_DET_F        14
#define AB8500_INT_VBUS_DET_R        15
/* ab8500_irq_regoffset[2] -> IT[Source|Latch|Mask]3 */
#define AB8500_INT_VBUS_CH_DROP_END    16
#define AB8500_INT_RTC_60S        17
#define AB8500_INT_RTC_ALARM        18
#define AB8540_INT_BIF_INT        19
#define AB8500_INT_BAT_CTRL_INDB    20
#define AB8500_INT_CH_WD_EXP        21
#define AB8500_INT_VBUS_OVV        22
#define AB8500_INT_MAIN_CH_DROP_END    23 /* not 8505/9540/8540 */
/* ab8500_irq_regoffset[3] -> IT[Source|Latch|Mask]4 */
#define AB8500_INT_CCN_CONV_ACC        24
#define AB8500_INT_INT_AUD        25
#define AB8500_INT_CCEOC        26
#define AB8500_INT_CC_INT_CALIB        27
#define AB8500_INT_LOW_BAT_F        28
#define AB8500_INT_LOW_BAT_R        29
#define AB8500_INT_BUP_CHG_NOT_OK    30
#define AB8500_INT_BUP_CHG_OK        31
/* ab8500_irq_regoffset[4] -> IT[Source|Latch|Mask]5 */
#define AB8500_INT_GP_HW_ADC_CONV_END    32 /* not 8505/8540 */
#define AB8500_INT_ACC_DETECT_1DB_F    33
#define AB8500_INT_ACC_DETECT_1DB_R    34
#define AB8500_INT_ACC_DETECT_22DB_F    35
#define AB8500_INT_ACC_DETECT_22DB_R    36
#define AB8500_INT_ACC_DETECT_21DB_F    37
#define AB8500_INT_ACC_DETECT_21DB_R    38
#define AB8500_INT_GP_SW_ADC_CONV_END    39
/* ab8500_irq_regoffset[5] -> IT[Source|Latch|Mask]7 */
#define AB8500_INT_GPIO6R        40 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO7R        41 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO8R        42 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO9R        43 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO10R        44 /* not 8540 */
#define AB8500_INT_GPIO11R        45 /* not 8540 */
#define AB8500_INT_GPIO12R        46 /* not 8505/8540 */
#define AB8500_INT_GPIO13R        47 /* not 8540 */
/* ab8500_irq_regoffset[6] -> IT[Source|Latch|Mask]8 */
#define AB8500_INT_GPIO24R        48 /* not 8505/8540 */
#define AB8500_INT_GPIO25R        49 /* not 8505/8540 */
#define AB8500_INT_GPIO36R        50 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO37R        51 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO38R        52 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO39R        53 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO40R        54 /* not 8540 */
#define AB8500_INT_GPIO41R        55 /* not 8540 */
/* ab8500_irq_regoffset[7] -> IT[Source|Latch|Mask]9 */
#define AB8500_INT_GPIO6F        56 /* not 8505/9540 */
#define AB8500_INT_GPIO7F        57 /* not 8505/9540 */
#define AB8500_INT_GPIO8F        58 /* not 8505/9540 */
#define AB8500_INT_GPIO9F        59 /* not 8505/9540 */
#define AB8500_INT_GPIO10F        60
#define AB8500_INT_GPIO11F        61
#define AB8500_INT_GPIO12F        62 /* not 8505 */
#define AB8500_INT_GPIO13F        63
/* ab8500_irq_regoffset[8] -> IT[Source|Latch|Mask]10 */
#define AB8500_INT_GPIO24F        64 /* not 8505/8540 */
#define AB8500_INT_GPIO25F        65 /* not 8505/8540 */
#define AB8500_INT_GPIO36F        66 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO37F        67 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO38F        68 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO39F        69 /* not 8505/9540/8540 */
#define AB8500_INT_GPIO40F        70 /* not 8540 */
#define AB8500_INT_GPIO41F        71 /* not 8540 */
/* ab8500_irq_regoffset[9] -> IT[Source|Latch|Mask]12 */
#define AB8500_INT_ADP_SOURCE_ERROR    72
#define AB8500_INT_ADP_SINK_ERROR    73
#define AB8500_INT_ADP_PROBE_PLUG    74
#define AB8500_INT_ADP_PROBE_UNPLUG    75
#define AB8500_INT_ADP_SENSE_OFF    76
#define AB8500_INT_USB_PHY_POWER_ERR    78
#define AB8500_INT_USB_LINK_STATUS    79
/* ab8500_irq_regoffset[10] -> IT[Source|Latch|Mask]19 */
#define AB8500_INT_BTEMP_LOW        80
#define AB8500_INT_BTEMP_LOW_MEDIUM    81
#define AB8500_INT_BTEMP_MEDIUM_HIGH    82
#define AB8500_INT_BTEMP_HIGH        83
/* ab8500_irq_regoffset[11] -> IT[Source|Latch|Mask]20 */
#define AB8500_INT_SRP_DETECT        88
#define AB8500_INT_USB_CHARGER_NOT_OKR    89
#define AB8500_INT_ID_WAKEUP_R        90
#define AB8500_INT_ID_DET_PLUGR         91 /* 8505/9540 cut2.0 */
#define AB8500_INT_ID_DET_R1R        92
#define AB8500_INT_ID_DET_R2R        93
#define AB8500_INT_ID_DET_R3R        94
#define AB8500_INT_ID_DET_R4R        95
/* ab8500_irq_regoffset[12] -> IT[Source|Latch|Mask]21 */
#define AB8500_INT_ID_WAKEUP_F        96 /* not 8505/9540 */
#define AB8500_INT_ID_DET_PLUGF        97 /* 8505/9540 cut2.0 */
#define AB8500_INT_ID_DET_R1F        98 /* not 8505/9540 */
#define AB8500_INT_ID_DET_R2F        99 /* not 8505/9540 */
#define AB8500_INT_ID_DET_R3F        100 /* not 8505/9540 */
#define AB8500_INT_ID_DET_R4F        101 /* not 8505/9540 */
#define AB8500_INT_CHAUTORESTARTAFTSEC    102 /* not 8505/9540 */
#define AB8500_INT_CHSTOPBYSEC        103
/* ab8500_irq_regoffset[13] -> IT[Source|Latch|Mask]22 */
#define AB8500_INT_USB_CH_TH_PROT_F    104
#define AB8500_INT_USB_CH_TH_PROT_R    105
#define AB8500_INT_MAIN_CH_TH_PROT_F    106 /* not 8505/9540 */
#define AB8500_INT_MAIN_CH_TH_PROT_R    107 /* not 8505/9540 */
#define AB8500_INT_CHCURLIMNOHSCHIRP    109
#define AB8500_INT_CHCURLIMHSCHIRP    110
#define AB8500_INT_XTAL32K_KO        111
 
/* Definitions for AB9540 / AB8505 */
/* ab8500_irq_regoffset[14] -> IT[Source|Latch|Mask]13 */
#define AB9540_INT_GPIO50R        113 /* not 8540 */
#define AB9540_INT_GPIO51R        114 /* not 8505/8540 */
#define AB9540_INT_GPIO52R        115 /* not 8540 */
#define AB9540_INT_GPIO53R        116 /* not 8540 */
#define AB9540_INT_GPIO54R        117 /* not 8505/8540 */
#define AB9540_INT_IEXT_CH_RF_BFN_R    118
/* ab8500_irq_regoffset[15] -> IT[Source|Latch|Mask]14 */
#define AB9540_INT_GPIO50F        121 /* not 8540 */
#define AB9540_INT_GPIO51F        122 /* not 8505/8540 */
#define AB9540_INT_GPIO52F        123 /* not 8540 */
#define AB9540_INT_GPIO53F        124 /* not 8540 */
#define AB9540_INT_GPIO54F        125 /* not 8505/8540 */
#define AB9540_INT_IEXT_CH_RF_BFN_F    126
/* ab8500_irq_regoffset[16] -> IT[Source|Latch|Mask]25 */
#define AB8505_INT_KEYSTUCK        128
#define AB8505_INT_IKR            129
#define AB8505_INT_IKP            130
#define AB8505_INT_KP            131
#define AB8505_INT_KEYDEGLITCH        132
#define AB8505_INT_MODPWRSTATUSF    134
#define AB8505_INT_MODPWRSTATUSR    135
/* ab8500_irq_regoffset[17] -> IT[Source|Latch|Mask]6 */
#define AB8500_INT_HOOK_DET_NEG_F    138
#define AB8500_INT_HOOK_DET_NEG_R    139
#define AB8500_INT_HOOK_DET_POS_F    140
#define AB8500_INT_HOOK_DET_POS_R    141
#define AB8500_INT_PLUG_DET_COMP_F    142
#define AB8500_INT_PLUG_DET_COMP_R    143
/* ab8500_irq_regoffset[18] -> IT[Source|Latch|Mask]23 */
#define AB8505_INT_COLL            144
#define AB8505_INT_RESERR        145
#define AB8505_INT_FRAERR        146
#define AB8505_INT_COMERR        147
#define AB8505_INT_SPDSET        148
#define AB8505_INT_DSENT        149
#define AB8505_INT_DREC            150
#define AB8505_INT_ACC_INT        151
/* ab8500_irq_regoffset[19] -> IT[Source|Latch|Mask]24 */
#define AB8505_INT_NOPINT        152
/* ab8540_irq_regoffset[20] -> IT[Source|Latch|Mask]26 */
#define AB8540_INT_IDPLUGDETCOMPF    160
#define AB8540_INT_IDPLUGDETCOMPR    161
#define AB8540_INT_FMDETCOMPLOF        162
#define AB8540_INT_FMDETCOMPLOR        163
#define AB8540_INT_FMDETCOMPHIF        164
#define AB8540_INT_FMDETCOMPHIR        165
#define AB8540_INT_ID5VDETCOMPF        166
#define AB8540_INT_ID5VDETCOMPR        167
/* ab8540_irq_regoffset[21] -> IT[Source|Latch|Mask]27 */
#define AB8540_INT_GPIO43F        168
#define AB8540_INT_GPIO43R        169
#define AB8540_INT_GPIO44F        170
#define AB8540_INT_GPIO44R        171
#define AB8540_INT_KEYPOSDETCOMPF    172
#define AB8540_INT_KEYPOSDETCOMPR    173
#define AB8540_INT_KEYNEGDETCOMPF    174
#define AB8540_INT_KEYNEGDETCOMPR    175
/* ab8540_irq_regoffset[22] -> IT[Source|Latch|Mask]28 */
#define AB8540_INT_GPIO1VBATF        176
#define AB8540_INT_GPIO1VBATR        177
#define AB8540_INT_GPIO2VBATF        178
#define AB8540_INT_GPIO2VBATR        179
#define AB8540_INT_GPIO3VBATF        180
#define AB8540_INT_GPIO3VBATR        181
#define AB8540_INT_GPIO4VBATF        182
#define AB8540_INT_GPIO4VBATR        183
/* ab8540_irq_regoffset[23] -> IT[Source|Latch|Mask]29 */
#define AB8540_INT_SYSCLKREQ2F        184
#define AB8540_INT_SYSCLKREQ2R        185
#define AB8540_INT_SYSCLKREQ3F        186
#define AB8540_INT_SYSCLKREQ3R        187
#define AB8540_INT_SYSCLKREQ4F        188
#define AB8540_INT_SYSCLKREQ4R        189
#define AB8540_INT_SYSCLKREQ5F        190
#define AB8540_INT_SYSCLKREQ5R        191
/* ab8540_irq_regoffset[24] -> IT[Source|Latch|Mask]30 */
#define AB8540_INT_PWMOUT1F        192
#define AB8540_INT_PWMOUT1R        193
#define AB8540_INT_PWMCTRL0F        194
#define AB8540_INT_PWMCTRL0R        195
#define AB8540_INT_PWMCTRL1F        196
#define AB8540_INT_PWMCTRL1R        197
#define AB8540_INT_SYSCLKREQ6F        198
#define AB8540_INT_SYSCLKREQ6R        199
/* ab8540_irq_regoffset[25] -> IT[Source|Latch|Mask]31 */
#define AB8540_INT_PWMEXTVIBRA1F    200
#define AB8540_INT_PWMEXTVIBRA1R    201
#define AB8540_INT_PWMEXTVIBRA2F    202
#define AB8540_INT_PWMEXTVIBRA2R    203
#define AB8540_INT_PWMOUT2F        204
#define AB8540_INT_PWMOUT2R        205
#define AB8540_INT_PWMOUT3F        206
#define AB8540_INT_PWMOUT3R        207
/* ab8540_irq_regoffset[26] -> IT[Source|Latch|Mask]32 */
#define AB8540_INT_ADDATA2F        208
#define AB8540_INT_ADDATA2R        209
#define AB8540_INT_DADATA2F        210
#define AB8540_INT_DADATA2R        211
#define AB8540_INT_FSYNC2F        212
#define AB8540_INT_FSYNC2R        213
#define AB8540_INT_BITCLK2F        214
#define AB8540_INT_BITCLK2R        215
/* ab8540_irq_regoffset[27] -> IT[Source|Latch|Mask]33 */
#define AB8540_INT_RTC_1S        216
 
/*
 * AB8500_AB9540_NR_IRQS is used when configuring the IRQ numbers for the
 * entire platform. This is a "compile time" constant so this must be set to
 * the largest possible value that may be encountered with different AB SOCs.
 * Of the currently supported AB devices, AB8500 and AB9540, it is the AB9540
 * which is larger.
 */
#define AB8500_NR_IRQS            112
#define AB8505_NR_IRQS            153
#define AB9540_NR_IRQS            153
#define AB8540_NR_IRQS            216
/* This is set to the roof of any AB8500 chip variant IRQ counts */
#define AB8500_MAX_NR_IRQS        AB8540_NR_IRQS
 
#define AB8500_NUM_IRQ_REGS        14
#define AB9540_NUM_IRQ_REGS        20
#define AB8540_NUM_IRQ_REGS        27
 
/* Turn On Status Event */
#define AB8500_POR_ON_VBAT        0x01
#define AB8500_POW_KEY_1_ON        0x02
#define AB8500_POW_KEY_2_ON        0x04
#define AB8500_RTC_ALARM        0x08
#define AB8500_MAIN_CH_DET        0x10
#define AB8500_VBUS_DET            0x20
#define AB8500_USB_ID_DET        0x40
 
/**
 * struct ab8500 - ab8500 internal structure
 * @dev: parent device
 * @lock: read/write operations lock
 * @irq_lock: genirq bus lock
 * @transfer_ongoing: 0 if no transfer ongoing
 * @irq: irq line
 * @irq_domain: irq domain
 * @version: chip version id (e.g. ab8500 or ab9540)
 * @chip_id: chip revision id
 * @write: register write
 * @write_masked: masked register write
 * @read: register read
 * @rx_buf: rx buf for SPI
 * @tx_buf: tx buf for SPI
 * @mask: cache of IRQ regs for bus lock
 * @oldmask: cache of previous IRQ regs for bus lock
 * @mask_size: Actual number of valid entries in mask[], oldmask[] and
 * irq_reg_offset
 * @irq_reg_offset: Array of offsets into IRQ registers
 */
struct ab8500 {
   struct device    *dev;
   struct mutex    lock;
   struct mutex    irq_lock;
   atomic_t    transfer_ongoing;
   int        irq;
   struct irq_domain  *domain;
   enum ab8500_version version;
   u8        chip_id;
 
   int (*write)(struct ab8500 *ab8500, u16 addr, u8 data);
   int (*write_masked)(struct ab8500 *ab8500, u16 addr, u8 mask, u8 data);
   int (*read)(struct ab8500 *ab8500, u16 addr);
 
   unsigned long    tx_buf[4];
   unsigned long    rx_buf[4];
 
   u8 *mask;
   u8 *oldmask;
   int mask_size;
   const int *irq_reg_offset;
   int it_latchhier_num;
};
 
struct ab8500_regulator_platform_data;
struct ab8500_codec_platform_data;
struct ab8500_sysctrl_platform_data;
 
/**
 * struct ab8500_platform_data - AB8500 platform data
 * @irq_base: start of AB8500 IRQs, AB8500_NR_IRQS will be used
 * @init: board-specific initialization after detection of ab8500
 * @regulator: machine-specific constraints for regulators
 */
struct ab8500_platform_data {
   void (*init) (struct ab8500 *);
   struct ab8500_regulator_platform_data *regulator;
   struct ab8500_codec_platform_data *codec;
   struct ab8500_sysctrl_platform_data *sysctrl;
};
 
extern int ab8500_init(struct ab8500 *ab8500,
                enum ab8500_version version);
extern int ab8500_exit(struct ab8500 *ab8500);
 
extern int ab8500_suspend(struct ab8500 *ab8500);
 
static inline int is_ab8500(struct ab8500 *ab)
{
   return ab->version == AB8500_VERSION_AB8500;
}
 
static inline int is_ab8505(struct ab8500 *ab)
{
   return ab->version == AB8500_VERSION_AB8505;
}
 
static inline int is_ab9540(struct ab8500 *ab)
{
   return ab->version == AB8500_VERSION_AB9540;
}
 
static inline int is_ab8540(struct ab8500 *ab)
{
   return ab->version == AB8500_VERSION_AB8540;
}
 
/* exclude also ab8505, ab9540... */
static inline int is_ab8500_1p0_or_earlier(struct ab8500 *ab)
{
   return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT1P0));
}
 
/* exclude also ab8505, ab9540... */
static inline int is_ab8500_1p1_or_earlier(struct ab8500 *ab)
{
   return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT1P1));
}
 
/* exclude also ab8505, ab9540... */
static inline int is_ab8500_2p0_or_earlier(struct ab8500 *ab)
{
   return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT2P0));
}
 
static inline int is_ab8500_3p3_or_earlier(struct ab8500 *ab)
{
   return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT3P3));
}
 
/* exclude also ab8505, ab9540... */
static inline int is_ab8500_2p0(struct ab8500 *ab)
{
   return (is_ab8500(ab) && (ab->chip_id == AB8500_CUT2P0));
}
 
static inline int is_ab8505_1p0_or_earlier(struct ab8500 *ab)
{
   return (is_ab8505(ab) && (ab->chip_id <= AB8500_CUT1P0));
}
 
static inline int is_ab8505_2p0(struct ab8500 *ab)
{
   return (is_ab8505(ab) && (ab->chip_id == AB8500_CUT2P0));
}
 
static inline int is_ab9540_1p0_or_earlier(struct ab8500 *ab)
{
   return (is_ab9540(ab) && (ab->chip_id <= AB8500_CUT1P0));
}
 
static inline int is_ab9540_2p0(struct ab8500 *ab)
{
   return (is_ab9540(ab) && (ab->chip_id == AB8500_CUT2P0));
}
 
/*
 * Be careful, the marketing name for this chip is 2.1
 * but the value read from the chip is 3.0 (0x30)
 */
static inline int is_ab9540_3p0(struct ab8500 *ab)
{
   return (is_ab9540(ab) && (ab->chip_id == AB8500_CUT3P0));
}
 
static inline int is_ab8540_1p0_or_earlier(struct ab8500 *ab)
{
   return is_ab8540(ab) && (ab->chip_id <= AB8500_CUT1P0);
}
 
static inline int is_ab8540_1p1_or_earlier(struct ab8500 *ab)
{
   return is_ab8540(ab) && (ab->chip_id <= AB8500_CUT1P1);
}
 
static inline int is_ab8540_1p2_or_earlier(struct ab8500 *ab)
{
   return is_ab8540(ab) && (ab->chip_id <= AB8500_CUT1P2);
}
 
static inline int is_ab8540_2p0_or_earlier(struct ab8500 *ab)
{
   return is_ab8540(ab) && (ab->chip_id <= AB8500_CUT2P0);
}
 
static inline int is_ab8540_2p0(struct ab8500 *ab)
{
   return is_ab8540(ab) && (ab->chip_id == AB8500_CUT2P0);
}
 
static inline int is_ab8505_2p0_earlier(struct ab8500 *ab)
{
   return (is_ab8505(ab) && (ab->chip_id < AB8500_CUT2P0));
}
 
static inline int is_ab9540_2p0_or_earlier(struct ab8500 *ab)
{
   return (is_ab9540(ab) && (ab->chip_id < AB8500_CUT2P0));
}
 
void ab8500_override_turn_on_stat(u8 mask, u8 set);
 
#ifdef CONFIG_AB8500_DEBUG
extern int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size);
void ab8500_dump_all_banks(struct device *dev);
void ab8500_debug_register_interrupt(int line);
#else
static inline void ab8500_dump_all_banks(struct device *dev) {}
static inline void ab8500_debug_register_interrupt(int line) {}
#endif
 
#endif /* MFD_AB8500_H */