summaryrefslogtreecommitdiffstats
blob: a66e36e9d31a80359408b937e9a44e8a9c38fc3f (plain) (blame)
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
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
/*
** =============================================================================
** Copyright (c) 2016  Texas Instruments Inc.
**
** This program is free software; you can redistribute it and/or modify it under
** the terms of the GNU General Public License as published by the Free Software
** Foundation; version 2.
**
** This program is distributed in the hope that it will be useful, but WITHOUT
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
**
** File:
**     tas2557.h
**
** Description:
**     definitions and data structures for TAS2557 Android Linux driver
**
** =============================================================================
*/

#ifndef _TAS2557_H
#define _TAS2557_H

#include <linux/regmap.h>
#include <linux/workqueue.h>
#include <linux/timer.h>

/* Page Control Register */
#define TAS2557_PAGECTL_REG			0

/* Book Control Register (available in page0 of each book) */
#define TAS2557_BOOKCTL_PAGE			0
#define TAS2557_BOOKCTL_REG			127

/* 0000 0000 0BBB BBBB BPPP PPPP PRRR RRRR */

#define TAS2557_REG(book, page, reg)		((((unsigned int)book * 256 * 128) + \
						 ((unsigned int)page * 128)) + reg)

#define TAS2557_BOOK_ID(reg)			((unsigned char)(reg / (256 * 128)))
#define TAS2557_PAGE_ID(reg)			((unsigned char)((reg % (256 * 128)) / 128))
#define TAS2557_BOOK_REG(reg)			((unsigned char)(reg % (256 * 128)))
#define TAS2557_PAGE_REG(reg)			((unsigned char)((reg % (256 * 128)) % 128))

/* Book0, Page0 registers */
#define TAS2557_SW_RESET_REG			TAS2557_REG(0, 0, 1)

#define TAS2557_REV_PGID_REG			TAS2557_REG(0, 0, 3)
#define TAS2557_PG_VERSION_1P0			0x80
#define TAS2557_PG_VERSION_2P0			0x90
#define TAS2557_PG_VERSION_2P1			0xa0

#define TAS2557_POWER_CTRL1_REG			TAS2557_REG(0, 0, 4)
#define TAS2557_POWER_CTRL2_REG			TAS2557_REG(0, 0, 5)

#define TAS2557_SPK_CTRL_REG			TAS2557_REG(0, 0, 6)
/* B0P0R6 - TAS2557_SPK_CTRL_REG */
#define TAS2557_DAC_GAIN_MASK			(0xf << 3)
#define TAS2557_DAC_GAIN_SHIFT			0x03

#define TAS2557_MUTE_REG			TAS2557_REG(0, 0, 7)
#define TAS2557_SNS_CTRL_REG			TAS2557_REG(0, 0, 8)
#define TAS2557_ADC_INPUT_SEL_REG		TAS2557_REG(0, 0, 9)
#define TAS2557_DBOOST_CTL_REG			TAS2557_REG(0, 0, 10)
#define TAS2557_NONAME11_REG			TAS2557_REG(0, 0, 11)
#define TAS2557_NONAME12_REG			TAS2557_REG(0, 0, 12)
#define TAS2557_NONAME13_REG			TAS2557_REG(0, 0, 13)
#define TAS2557_NONAME14_REG			TAS2557_REG(0, 0, 14)
#define TAS2557_NONAME15_REG			TAS2557_REG(0, 0, 15)
#define TAS2557_NONAME16_REG			TAS2557_REG(0, 0, 16)
#define TAS2557_NONAME17_REG			TAS2557_REG(0, 0, 17)
#define TAS2557_NONAME18_REG			TAS2557_REG(0, 0, 18)
#define TAS2557_SAR_SAMPLING_TIME_REG		TAS2557_REG(0, 0, 19)
#define TAS2557_SAR_ADC1_REG			TAS2557_REG(0, 0, 20)
#define TAS2557_SAR_ADC2_REG			TAS2557_REG(0, 0, 21)	/* B0_P0_R0x15*/
#define TAS2557_CRC_CHECKSUM_REG		TAS2557_REG(0, 0, 32)
#define TAS2557_CRC_RESET_REG			TAS2557_REG(0, 0, 33)
#define TAS2557_DSP_MODE_SELECT_REG		TAS2557_REG(0, 0, 34)
#define TAS2557_SAFE_GUARD_REG			TAS2557_REG(0, 0, 37)
#define TAS2557_ASI_CTL1_REG			TAS2557_REG(0, 0, 42)
#define TAS2557_CLK_ERR_CTRL			TAS2557_REG(0, 0, 44)	/* B0_P0_R0x2c*/
#define TAS2557_CLK_ERR_CTRL2			TAS2557_REG(0, 0, 45)	/* B0_P0_R0x2d*/
#define TAS2557_CLK_ERR_CTRL3			TAS2557_REG(0, 0, 46)	/* B0_P0_R0x2e*/
#define TAS2557_DBOOST_CFG_REG			TAS2557_REG(0, 0, 52)
#define TAS2557_POWER_UP_FLAG_REG		TAS2557_REG(0, 0, 100)
#define TAS2557_FLAGS_1				TAS2557_REG(0, 0, 104)	/* B0_P0_R0x68*/
#define TAS2557_FLAGS_2				TAS2557_REG(0, 0, 108)	/* B0_P0_R0x6c*/

/* Book0, Page1 registers */
#define TAS2557_ASI1_DAC_FORMAT_REG		TAS2557_REG(0, 1, 1)
#define TAS2557_ASI1_ADC_FORMAT_REG		TAS2557_REG(0, 1, 2)
#define TAS2557_ASI1_OFFSET1_REG		TAS2557_REG(0, 1, 3)
#define TAS2557_ASI1_ADC_PATH_REG		TAS2557_REG(0, 1, 7)
#define TAS2557_ASI1_DAC_BCLK_REG		TAS2557_REG(0, 1, 8)
#define TAS2557_ASI1_DAC_WCLK_REG		TAS2557_REG(0, 1, 9)
#define TAS2557_ASI1_ADC_BCLK_REG		TAS2557_REG(0, 1, 10)
#define TAS2557_ASI1_ADC_WCLK_REG		TAS2557_REG(0, 1, 11)
#define TAS2557_ASI1_DIN_DOUT_MUX_REG		TAS2557_REG(0, 1, 12)
#define TAS2557_ASI1_BDIV_CLK_SEL_REG		TAS2557_REG(0, 1, 13)
#define TAS2557_ASI1_BDIV_CLK_RATIO_REG		TAS2557_REG(0, 1, 14)
#define TAS2557_ASI1_WDIV_CLK_RATIO_REG		TAS2557_REG(0, 1, 15)
#define TAS2557_ASI1_DAC_CLKOUT_REG		TAS2557_REG(0, 1, 16)
#define TAS2557_ASI1_ADC_CLKOUT_REG		TAS2557_REG(0, 1, 17)
#define TAS2557_ASI2_DAC_FORMAT_REG		TAS2557_REG(0, 1, 21)
#define TAS2557_ASI2_ADC_FORMAT_REG		TAS2557_REG(0, 1, 22)
#define TAS2557_ASI2_OFFSET1_REG		TAS2557_REG(0, 1, 23)
#define TAS2557_ASI2_ADC_PATH_REG		TAS2557_REG(0, 1, 27)
#define TAS2557_ASI2_DAC_BCLK_REG		TAS2557_REG(0, 1, 28)
#define TAS2557_ASI2_DAC_WCLK_REG		TAS2557_REG(0, 1, 29)
#define TAS2557_ASI2_ADC_BCLK_REG		TAS2557_REG(0, 1, 30)
#define TAS2557_ASI2_ADC_WCLK_REG		TAS2557_REG(0, 1, 31)
#define TAS2557_ASI2_DIN_DOUT_MUX_REG		TAS2557_REG(0, 1, 32)
#define TAS2557_ASI2_BDIV_CLK_SEL_REG		TAS2557_REG(0, 1, 33)
#define TAS2557_ASI2_BDIV_CLK_RATIO_REG		TAS2557_REG(0, 1, 34)
#define TAS2557_ASI2_WDIV_CLK_RATIO_REG		TAS2557_REG(0, 1, 35)
#define TAS2557_ASI2_DAC_CLKOUT_REG		TAS2557_REG(0, 1, 36)
#define TAS2557_ASI2_ADC_CLKOUT_REG		TAS2557_REG(0, 1, 37)
#define TAS2557_GPIO1_PIN_REG			TAS2557_REG(0, 1, 61)	/*B0_P1_R0x3d */
#define TAS2557_GPIO2_PIN_REG			TAS2557_REG(0, 1, 62)	/*B0_P1_R0x3e */
#define TAS2557_GPIO3_PIN_REG			TAS2557_REG(0, 1, 63)	/*B0_P1_R0x3f */
#define TAS2557_GPIO4_PIN_REG			TAS2557_REG(0, 1, 64)	/*B0_P1_R0x40 */
#define TAS2557_GPIO5_PIN_REG			TAS2557_REG(0, 1, 65)
#define TAS2557_GPIO6_PIN_REG			TAS2557_REG(0, 1, 66)
#define TAS2557_GPIO7_PIN_REG			TAS2557_REG(0, 1, 67)
#define TAS2557_GPIO8_PIN_REG			TAS2557_REG(0, 1, 68)
#define TAS2557_GPIO9_PIN_REG			TAS2557_REG(0, 1, 69)
#define TAS2557_GPIO10_PIN_REG			TAS2557_REG(0, 1, 70)
#define TAS2557_GPI_PIN_REG				TAS2557_REG(0, 1, 77)	/*B0_P1_R0x4d */
#define TAS2557_GPIO_HIZ_CTRL1_REG		TAS2557_REG(0, 1, 79)
#define TAS2557_GPIO_HIZ_CTRL2_REG		TAS2557_REG(0, 1, 80)	/*B0_P1_R0x50 */
#define TAS2557_GPIO_HIZ_CTRL3_REG		TAS2557_REG(0, 1, 81)
#define TAS2557_GPIO_HIZ_CTRL4_REG		TAS2557_REG(0, 1, 82)
#define TAS2557_GPIO_HIZ_CTRL5_REG		TAS2557_REG(0, 1, 83)
#define TAS2557_BIT_BANG_CTRL_REG		TAS2557_REG(0, 1, 87)
#define TAS2557_BIT_BANG_OUT1_REG		TAS2557_REG(0, 1, 88)
#define TAS2557_BIT_BANG_OUT2_REG		TAS2557_REG(0, 1, 89)
#define TAS2557_BIT_BANG_IN1_REG		TAS2557_REG(0, 1, 90)
#define TAS2557_BIT_BANG_IN2_REG		TAS2557_REG(0, 1, 91)
#define TAS2557_BIT_BANG_IN3_REG		TAS2557_REG(0, 1, 92)
#define TAS2557_PDM_IN_CLK_REG			TAS2557_REG(0, 1, 94)
#define TAS2557_PDM_IN_PIN_REG			TAS2557_REG(0, 1, 95)
#define TAS2557_ASIM_IFACE1_REG			TAS2557_REG(0, 1, 98)
#define TAS2557_ASIM_FORMAT_REG			TAS2557_REG(0, 1, 99)
#define TAS2557_ASIM_IFACE3_REG			TAS2557_REG(0, 1, 100)
#define TAS2557_ASIM_IFACE4_REG			TAS2557_REG(0, 1, 101)
#define TAS2557_ASIM_IFACE5_REG			TAS2557_REG(0, 1, 102)
#define TAS2557_ASIM_IFACE6_REG			TAS2557_REG(0, 1, 103)
#define TAS2557_ASIM_IFACE7_REG			TAS2557_REG(0, 1, 104)
#define TAS2557_ASIM_IFACE8_REG			TAS2557_REG(0, 1, 105)
#define TAS2557_CLK_HALT_REG			TAS2557_REG(0, 1, 106)	/* B0_P1_R0x6a */
#define TAS2557_INT_GEN1_REG			TAS2557_REG(0, 1, 108)	/* B0_P1_R0x6c */
#define TAS2557_INT_GEN2_REG			TAS2557_REG(0, 1, 109)	/* B0_P1_R0x6d */
#define TAS2557_INT_GEN3_REG			TAS2557_REG(0, 1, 110)	/* B0_P1_R0x6e */
#define TAS2557_INT_GEN4_REG			TAS2557_REG(0, 1, 111)	/* B0_P1_R0x6f */
#define TAS2557_INT_MODE_REG			TAS2557_REG(0, 1, 114)	/* B0_P1_R0x72 */
#define TAS2557_MAIN_CLKIN_REG			TAS2557_REG(0, 1, 115)
#define TAS2557_PLL_CLKIN_REG			TAS2557_REG(0, 1, 116)
#define TAS2557_CLKOUT_MUX_REG			TAS2557_REG(0, 1, 117)
#define TAS2557_CLKOUT_CDIV_REG			TAS2557_REG(0, 1, 118)
#define TAS2557_HACK_GP01_REG			TAS2557_REG(0, 1, 122)

#define TAS2557_SLEEPMODE_CTL_REG		TAS2557_REG(0, 2, 7)
#define TAS2557_HACK01_REG			TAS2557_REG(0, 2, 10)

#define TAS2557_ISENSE_THRESHOLD		TAS2557_REG(0, 50, 104)
#define TAS2557_BOOSTON_EFFICIENCY		TAS2557_REG(0, 51, 16)
#define TAS2557_BOOSTOFF_EFFICIENCY		TAS2557_REG(0, 51, 20)
#define TAS2557_BOOST_HEADROOM			TAS2557_REG(0, 51, 24)
#define TAS2557_THERMAL_FOLDBACK_REG	TAS2557_REG(0, 51, 100)

#define TAS2557_SA_PG2P1_CHL_CTRL_REG	TAS2557_REG(0, 53, 20)	/* B0_P0x35_R0x14 */
#define TAS2557_SA_COEFF_SWAP_REG		TAS2557_REG(0, 53, 44)	/* B0_P0x35_R0x2c */

#define TAS2557_SA_PG1P0_CHL_CTRL_REG	TAS2557_REG(0, 58, 120)	/* B0_P0x3a_R0x78 */

#define TAS2557_TEST_MODE_REG			TAS2557_REG(0, 253, 13)	/* B0_P0xfd_R0x0d */
#define TAS2557_BROADCAST_REG			TAS2557_REG(0, 253, 54)	/* B0_P0xfd_R0x36 */
#define TAS2557_VBST_VOLT_REG			TAS2557_REG(0, 253, 58)
#define TAS2557_CRYPTIC_REG				TAS2557_REG(0, 253, 71)

#define TAS2557_XMEM_687_REG				TAS2557_REG(78, 23, 116)	/* B0x78_P0x23_R0x40 */

#define TAS2557_PG2P1_CALI_R0_REG		TAS2557_REG(0x8c, 0x2f, 0x40)
#define TAS2557_PG1P0_CALI_R0_REG		TAS2557_REG(0x8c, 0x2f, 0x28)
#define TAS2557_PG2P1_CALI_T_REG		TAS2557_REG(0x8c, 0x30, 0x20)
#define TAS2557_PG1P0_CALI_T_REG		TAS2557_REG(0x8c, 0x30, 0x08)

#define TAS2557_DAC_INTERPOL_REG		TAS2557_REG(100, 0, 1)
#define TAS2557_SOFT_MUTE_REG			TAS2557_REG(100, 0, 7)
#define TAS2557_PLL_P_VAL_REG			TAS2557_REG(100, 0, 27)
#define TAS2557_PLL_J_VAL_REG			TAS2557_REG(100, 0, 28)
#define TAS2557_PLL_D_VAL_MSB_REG		TAS2557_REG(100, 0, 29)
#define TAS2557_PLL_D_VAL_LSB_REG		TAS2557_REG(100, 0, 30)
#define TAS2557_CLK_MISC_REG			TAS2557_REG(100, 0, 31)
#define TAS2557_PLL_N_VAL_REG			TAS2557_REG(100, 0, 32)
#define TAS2557_DAC_MADC_VAL_REG		TAS2557_REG(100, 0, 33)
#define TAS2557_ISENSE_DIV_REG			TAS2557_REG(100, 0, 42)
#define TAS2557_RAMP_CLK_DIV_MSB_REG		TAS2557_REG(100, 0, 43)
#define TAS2557_RAMP_CLK_DIV_LSB_REG		TAS2557_REG(100, 0, 44)

#define TAS2557_VBOOST_CTL_REG		TAS2557_REG(100, 0, 64)

#define TAS2557_DIE_TEMP_REG			TAS2557_REG(130, 2, 124)	/* B0x82_P0x02_R0x7C */

/* Bits */
/* B0P0R4 - TAS2557_POWER_CTRL1_REG */
#define TAS2557_SW_SHUTDOWN			(0x1 << 0)
#define TAS2557_MADC_POWER_UP			(0x1 << 3)
#define TAS2557_MDAC_POWER_UP			(0x1 << 4)
#define TAS2557_NDIV_POWER_UP			(0x1 << 5)
#define TAS2557_PLL_POWER_UP			(0x1 << 6)
#define TAS2557_DSP_POWER_UP			(0x1 << 7)

/* B0P0R5 - TAS2557_POWER_CTRL2_REG */
#define TAS2557_VSENSE_ENABLE			(0x1 << 0)
#define TAS2557_ISENSE_ENABLE			(0x1 << 1)
#define TAS2557_BOOST_ENABLE			(0x1 << 5)
#define TAS2557_CLASSD_ENABLE			(0x1 << 7)

/* B0P0R7 - TAS2557_MUTE_REG */
#define TAS2557_CLASSD_MUTE			(0x1 << 0)
#define TAS2557_ISENSE_MUTE			(0x1 << 1)

/* B0P253R13 - TAS2557_TEST_MODE_REG */
#define TAS2557_TEST_MODE_ENABLE		(13)
#define TAS2557_TEST_MODE_MASK			(0xf << 0)

/* B0P253R71 - TAS2557_CRYPTIC_REG */
#define TAS2557_OSC_TRIM_CAP(x)			((x & 0x3f) << 0)
#define TAS2557_DISABLE_ENCRYPTION		(0x1 << 6)
#define TAS2557_SL_COMP				(0x1 << 7)

/* B0P1R115/6 - TAS2557_MAIN/PLL_CLKIN_REG */
#define TAS2557_XXX_CLKIN_GPIO1			(0)
#define TAS2557_XXX_CLKIN_GPIO2			(1)
#define TAS2557_XXX_CLKIN_GPIO3			(2)
#define TAS2557_XXX_CLKIN_GPIO4			(3)
#define TAS2557_XXX_CLKIN_GPIO5			(4)
#define TAS2557_XXX_CLKIN_GPIO6			(5)
#define TAS2557_XXX_CLKIN_GPIO7			(6)
#define TAS2557_XXX_CLKIN_GPIO8			(7)
#define TAS2557_XXX_CLKIN_GPIO9			(8)
#define TAS2557_XXX_CLKIN_GPIO10		(9)
#define TAS2557_XXX_CLKIN_GPI1			(12)
#define TAS2557_XXX_CLKIN_GPI2			(13)
#define TAS2557_XXX_CLKIN_GPI3			(14)
#define TAS2557_NDIV_CLKIN_PLL			(15)
#define TAS2557_PLL_CLKIN_INT_OSC		(15)

#define TAS2557_MCLK_CLKIN_SRC_GPIO1       (0)
#define TAS2557_MCLK_CLKIN_SRC_GPIO2       (1)
#define TAS2557_MCLK_CLKIN_SRC_GPIO3       (2)
#define TAS2557_MCLK_CLKIN_SRC_GPIO4       (3)
#define TAS2557_MCLK_CLKIN_SRC_GPIO5       (4)
#define TAS2557_MCLK_CLKIN_SRC_GPIO6       (5)
#define TAS2557_MCLK_CLKIN_SRC_GPIO7       (6)
#define TAS2557_MCLK_CLKIN_SRC_GPIO8       (7)
#define TAS2557_MCLK_CLKIN_SRC_GPIO9       (8)
#define TAS2557_MCLK_CLKIN_SRC_GPIO10      (9)
#define TAS2557_MCLK_CLKIN_SRC_GPI1        (12)
#define TAS2557_MCLK_CLKIN_SRC_GPI2        (13)
#define TAS2557_MCLK_CLKIN_SRC_GPI3        (14)

#define TAS2557_FORMAT_I2S			(0x0 << 5)
#define TAS2557_FORMAT_DSP			(0x1 << 5)
#define TAS2557_FORMAT_RIGHT_J			(0x2 << 5)
#define TAS2557_FORMAT_LEFT_J			(0x3 << 5)
#define TAS2557_FORMAT_MONO_PCM			(0x4 << 5)
#define TAS2557_FORMAT_MASK			(0x7 << 5)

#define TAS2557_WORDLENGTH_16BIT		(0x0 << 3)
#define TAS2557_WORDLENGTH_20BIT		(0x1 << 3)
#define TAS2557_WORDLENGTH_24BIT		(0x2 << 3)
#define TAS2557_WORDLENGTH_32BIT		(0x3 << 3)
#define TAS2557_WORDLENGTH_MASK			TAS2557_WORDLENGTH_32BIT

/* B100P0R7 - TAS2557_SOFT_MUTE_REG */
#define TAS2557_PDM_SOFT_MUTE			(0x1 << 0)
#define TAS2557_VSENSE_SOFT_MUTE		(0x1 << 1)
#define TAS2557_ISENSE_SOFT_MUTE		(0x1 << 2)
#define TAS2557_CLASSD_SOFT_MUTE		(0x1 << 3)

/* B100P0R27 - TAS2557_PLL_P_VAL_REG */
#define TAS2557_PLL_P_VAL_MASK			(0x3f << 0)

/* B100P0R28 - TAS2557_PLL_J_VAL_REG */
#define TAS2557_PLL_J_VAL_MASK			((unsigned int) (0x7f << 0))
#define TAS2557_PLL_J_VAL_MASKX	0x00

/* B100P0R29-30 - TAS2557_PLL_D_VAL_MSB/LSB_REG */
#define TAS2557_PLL_D_MSB_VAL(x)		((x >> 8) & 0x3f)
#define TAS2557_PLL_D_LSB_VAL(x)		(x & 0xff)

/* B100P0R31 - TAS2557_CLK_MISC_REG */
#define TAS2557_DSP_CLK_FROM_PLL		(0x1 << 5)

#define TAS2557_FW_NAME     "tas2557s_uCDSP.bin"

#define TAS2557_BROADCAST_ADDR	0x4c

#define	TAS2557_APP_ROM1MODE	0
#define	TAS2557_APP_ROM2MODE	1
#define	TAS2557_APP_TUNINGMODE	2
#define	TAS2557_APP_ROM1_96KHZ	3
#define	TAS2557_APP_ROM2_96KHZ	4
#define	TAS2557_APP_RAMMODE		5

#define	TAS2557_BOOST_OFF		0
#define	TAS2557_BOOST_DEVA		1
#define	TAS2557_BOOST_DEVB		2
#define	TAS2557_BOOST_BOTH		3

#define	TAS2557_DM_AD_BD		0	/* DevA default, DevB default */
#define	TAS2557_DM_AM_BM		1	/* DevA mute, DevB mute */
#define	TAS2557_DM_AL_BR		2	/* DevA left channel, DevB right channel */
#define	TAS2557_DM_AR_BL		3	/* DevA right channel, DevB left channel */
#define	TAS2557_DM_AH_BH		4	/* DevA (L+R)/2, DevB (L+R)/2 */

#define	TAS2557_VBST_DEFAULT		0	/* firmware default */
#define	TAS2557_VBST_A_ON			1	/* DevA always 8.5V, DevB default */
#define	TAS2557_VBST_B_ON			2	/* DevA default, DevB always 8.5V */
#define	TAS2557_VBST_A_ON_B_ON		(TAS2557_VBST_A_ON | TAS2557_VBST_B_ON)	/* both DevA and DevB always 8.5V */
#define	TAS2557_VBST_NEED_DEFAULT	0xff	/* need default value */

#define	TAS2557_VBST_8P5V	0	/* coresponding PPG 0dB */
#define	TAS2557_VBST_8P1V	1	/* coresponding PPG -1dB */
#define	TAS2557_VBST_7P6V	2	/* coresponding PPG -2dB */
#define	TAS2557_VBST_6P6V	3	/* coresponding PPG -3dB */
#define	TAS2557_VBST_5P6V	4	/* coresponding PPG -4dB */

#define	ERROR_NONE			0x00000000
#define	ERROR_PLL_ABSENT	0x00000001
#define	ERROR_DEVA_I2C_COMM	0x00000002
#define	ERROR_DEVB_I2C_COMM	0x00000004
#define	ERROR_PRAM_CRCCHK	0x00000008
#define	ERROR_YRAM_CRCCHK	0x00000010
#define	ERROR_CLK_DET2		0x00000020
#define	ERROR_CLK_DET1		0x00000040
#define	ERROR_CLK_LOST		0x00000080
#define	ERROR_BROWNOUT		0x00000100
#define	ERROR_DIE_OVERTEMP	0x00000200
#define	ERROR_CLK_HALT		0x00000400
#define	ERROR_UNDER_VOLTAGE	0x00000800
#define	ERROR_OVER_CURRENT	0x00001000
#define	ERROR_CLASSD_PWR	0x00002000
#define	ERROR_SAFE_GUARD	0x00004000
#define	ERROR_FAILSAFE		0x40000000

#define	FLAG_CHECK_COUNTER	25

struct TBlock {
	unsigned int mnType;
	unsigned char mbPChkSumPresent;
	unsigned char mnPChkSum;
	unsigned char mbYChkSumPresent;
	unsigned char mnYChkSum;
	unsigned int mnCommands;
	unsigned char *mpData;
};

struct TData {
	char mpName[64];
	char *mpDescription;
	unsigned int mnBlocks;
	struct TBlock *mpBlocks;
};

struct TProgram {
	char mpName[64];
	char *mpDescription;
	unsigned char mnAppMode;
	unsigned short mnBoost;
	struct TData mData;
};

struct TPLL {
	char mpName[64];
	char *mpDescription;
	struct TBlock mBlock;
};

struct TConfiguration {
	char mpName[64];
	char *mpDescription;
	unsigned int mnDevices;
	unsigned int mnProgram;
	unsigned int mnPLL;
	unsigned int mnSamplingRate;
	unsigned char mnPLLSrc;
	unsigned int mnPLLSrcRate;
	struct TData mData;
};

struct TCalibration {
	char mpName[64];
	char *mpDescription;
	unsigned int mnProgram;
	unsigned int mnConfiguration;
	struct TData mData;
};

struct TFirmware {
	unsigned int mnFWSize;
	unsigned int mnChecksum;
	unsigned int mnPPCVersion;
	unsigned int mnFWVersion;
	unsigned int mnDriverVersion;
	unsigned int mnTimeStamp;
	char mpDDCName[64];
	char *mpDescription;
	unsigned int mnDeviceFamily;
	unsigned int mnDevice;
	unsigned int mnPLLs;
	struct TPLL *mpPLLs;
	unsigned int mnPrograms;
	struct TProgram *mpPrograms;
	unsigned int mnConfigurations;
	struct TConfiguration *mpConfigurations;
	unsigned int mnCalibrations;
	struct TCalibration *mpCalibrations;
};

struct tas2557_register {
	int book;
	int page;
	int reg;
};

enum channel {
	channel_left = 0x01,
	channel_right = 0x02,
	channel_both = (channel_left|channel_right),
	channel_broadcast = 0x4,
};

enum echo_reference {
	echoref_left = 0x00,
	echoref_right = 0x01,
	echoref_both = 0x02
};

struct tas2557_priv {
	struct device *dev;
	struct regmap *mpRegmap;
	struct i2c_client *client;
	int mnLPGID;
	int mnRPGID;
	int mnLeftChlGpioRst;
	int mnRightChlGpioRst;
	struct mutex dev_lock;
	struct TFirmware *mpFirmware;
	struct TFirmware *mpCalFirmware;
	unsigned int mnCurrentProgram;
	unsigned int mnCurrentSampleRate;
	unsigned int mnNewConfiguration;
	unsigned int mnCurrentConfiguration;
	unsigned int mnCurrentCalibration;
	enum channel mnCurrentChannel;
	unsigned char mnLAddr;
	unsigned char mnRAddr;
	unsigned char mnLCurrentBook;
	unsigned char mnLCurrentPage;
	unsigned char mnRCurrentBook;
	unsigned char mnRCurrentPage;
	unsigned int mnLBroadcastSet;
	unsigned int mnRBroadcastSet;
	bool mbTILoadActive;
	bool mbPowerUp;
	bool mbLoadConfigurationPrePowerUp;
	bool mbLoadCalibrationPostPowerUp;
	bool mbCalibrationLoaded;
	int (*read)(struct tas2557_priv *pTAS2557,
		enum channel chn,
		unsigned int reg,
		unsigned int *pValue);
	int (*write)(struct tas2557_priv *pTAS2557,
		enum channel chn,
		unsigned int reg,
		unsigned int Value);
	int (*bulk_read)(struct tas2557_priv *pTAS2557,
		enum channel chn,
		unsigned int reg,
		unsigned char *pData,
		unsigned int len);
	int (*bulk_write)(struct tas2557_priv *pTAS2557,
		enum channel chn,
		unsigned int reg,
		unsigned char *pData,
		unsigned int len);
	int (*update_bits)(struct tas2557_priv *pTAS2557,
		enum channel chn,
		unsigned int reg,
		unsigned int mask,
		unsigned int value);
	int (*set_config)(struct tas2557_priv *pTAS2557,
		int config);
	int (*set_calibration)(struct tas2557_priv *pTAS2557,
		int calibration);
	void (*clearIRQ)(struct tas2557_priv *pTAS2557);
	void (*enableIRQ)(struct tas2557_priv *pTAS2557,
		enum channel chl, bool enable);
	void (*hw_reset)(struct tas2557_priv *pTAS2557);
	/* device is working, but system is suspended */
	int (*runtime_suspend)(struct tas2557_priv *pTAS2557);
	int (*runtime_resume)(struct tas2557_priv *pTAS2557);

	int mnLeftChlGpioINT;
	int mnRightChlGpioINT;
	struct delayed_work irq_work;
	unsigned int mnLeftChlIRQ;
	unsigned int mnRightChlIRQ;
	bool mbIRQEnable;
	enum echo_reference mnEchoRef;
	unsigned char mnI2SBits;

	unsigned int mnChannelState;
	unsigned char mnDevAChlData[16];
	unsigned char mnDevBChlData[16];

	unsigned int mnVBoostState;
	bool mbLoadVBoostPrePowerUp;
	unsigned int mnVBoostVoltage;
	unsigned int mnVBoostNewState;
	unsigned int mnVBoostDefaultCfg[4];

	/* for low temperature check */
	unsigned int mnDevGain;
	unsigned int mnDevCurrentGain;
	unsigned int mnDieTvReadCounter;
	struct hrtimer mtimer;
	struct work_struct mtimerwork;

	/* device is working, but system is suspended */
	bool mbRuntimeSuspend;

	unsigned int mnErrCode;

	/* for configurations with maximum TLimit 0x7fffffff,
	 * bypass calibration update, usually used in factory test
	*/
	bool mbBypassTMax;

	unsigned int mnRestart;
#ifdef CONFIG_TAS2557_CODEC_STEREO
	struct mutex codec_lock;
#endif

#ifdef CONFIG_TAS2557_MISC_STEREO
	int mnDBGCmd;
	int mnCurrentReg;
	struct mutex file_lock;
#endif

};

#endif /* _TAS2557_H */