summaryrefslogtreecommitdiff
path: root/chip/mec1322/registers.h
blob: 055eb74fff114eb8912a2766514e656f1ede2013 (plain)
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
/* Copyright 2013 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * Register map for MEC1322 processor
 */

#ifndef __CROS_EC_REGISTERS_H
#define __CROS_EC_REGISTERS_H

#include "common.h"

/* Helper function for RAM address aliasing */
#define MEC1322_RAM_ALIAS(x) ((x) >= 0x118000 ? (x)-0x118000 + 0x20000000 : (x))

/* EC Chip Configuration */
#define MEC1322_CHIP_BASE 0x400fff00
#define MEC1322_CHIP_DEV_ID REG8(MEC1322_CHIP_BASE + 0x20)
#define MEC1322_CHIP_DEV_REV REG8(MEC1322_CHIP_BASE + 0x21)

/* Power/Clocks/Resets */
#define MEC1322_PCR_BASE 0x40080100
#define MEC1322_PCR_CHIP_SLP_EN REG32(MEC1322_PCR_BASE + 0x0)
#define MEC1322_PCR_CHIP_CLK_REQ REG32(MEC1322_PCR_BASE + 0x4)
#define MEC1322_PCR_EC_SLP_EN REG32(MEC1322_PCR_BASE + 0x8)
/* Command all blocks to sleep */
#define MEC1322_PCR_EC_SLP_EN_SLEEP 0xe0700ff7
#define MEC1322_PCR_EC_SLP_EN_PWM(n) (1 << ((n) ? (19 + (n)) : 4))
#define MEC1322_PCR_EC_SLP_EN_PWM3 BIT(22)
#define MEC1322_PCR_EC_SLP_EN_PWM2 BIT(21)
#define MEC1322_PCR_EC_SLP_EN_PWM1 BIT(20)
#define MEC1322_PCR_EC_SLP_EN_PWM0 BIT(4)
/* Allow all blocks to request clocks */
#define MEC1322_PCR_EC_SLP_EN_WAKE (~0xe0700ff7)
#define MEC1322_PCR_EC_CLK_REQ REG32(MEC1322_PCR_BASE + 0xc)
#define MEC1322_PCR_HOST_SLP_EN REG32(MEC1322_PCR_BASE + 0x10)
/* Command all blocks to sleep */
#define MEC1322_PCR_HOST_SLP_EN_SLEEP 0x5f003
/* Allow all blocks to request clocks */
#define MEC1322_PCR_HOST_SLP_EN_WAKE (~0x5f003)
#define MEC1322_PCR_HOST_CLK_REQ REG32(MEC1322_PCR_BASE + 0x14)
#define MEC1322_PCR_SYS_SLP_CTL REG32(MEC1322_PCR_BASE + 0x18)
#define MEC1322_PCR_PROC_CLK_CTL REG32(MEC1322_PCR_BASE + 0x20)
#define MEC1322_PCR_EC_SLP_EN2 REG32(MEC1322_PCR_BASE + 0x24)
/* Mask to command all blocks to sleep */
#define MEC1322_PCR_EC_SLP_EN2_SLEEP 0x1ffffff8
/* Allow all blocks to request clocks */
#define MEC1322_PCR_EC_SLP_EN2_WAKE (~0x03fffff8)
#define MEC1322_PCR_EC_CLK_REQ2 REG32(MEC1322_PCR_BASE + 0x28)
#define MEC1322_PCR_SLOW_CLK_CTL REG32(MEC1322_PCR_BASE + 0x2c)
#define MEC1322_PCR_CHIP_OSC_ID REG32(MEC1322_PCR_BASE + 0x30)
#define MEC1322_PCR_CHIP_PWR_RST REG32(MEC1322_PCR_BASE + 0x34)
#define MEC1322_PCR_CHIP_RST_EN REG32(MEC1322_PCR_BASE + 0x38)
#define MEC1322_PCR_HOST_RST_EN REG32(MEC1322_PCR_BASE + 0x3c)
#define MEC1322_PCR_EC_RST_EN REG32(MEC1322_PCR_BASE + 0x40)
#define MEC1322_PCR_EC_RST_EN2 REG32(MEC1322_PCR_BASE + 0x44)
#define MEC1322_PCR_PWR_RST_CTL REG32(MEC1322_PCR_BASE + 0x48)

/* Bit defines for MEC1322_PCR_CHIP_PWR_RST */
#define MEC1322_PWR_RST_STS_VCC1 BIT(6)
#define MEC1322_PWR_RST_STS_VBAT BIT(5)

/* EC Subsystem */
#define MEC1322_EC_BASE 0x4000fc00
#define MEC1322_EC_INT_CTRL REG32(MEC1322_EC_BASE + 0x18)
#define MEC1322_EC_TRACE_EN REG32(MEC1322_EC_BASE + 0x1c)
#define MEC1322_EC_JTAG_EN REG32(MEC1322_EC_BASE + 0x20)
#define MEC1322_EC_WDT_CNT REG32(MEC1322_EC_BASE + 0x28)
#define MEC1322_EC_ADC_VREF_PD REG32(MEC1322_EC_BASE + 0x38)

/* Interrupt aggregator */
#define MEC1322_INT_BASE 0x4000c000
#define MEC1322_INTx_BASE(x) (MEC1322_INT_BASE + ((x)-8) * 0x14)
#define MEC1322_INT_SOURCE(x) REG32(MEC1322_INTx_BASE(x) + 0x0)
#define MEC1322_INT_ENABLE(x) REG32(MEC1322_INTx_BASE(x) + 0x4)
#define MEC1322_INT_RESULT(x) REG32(MEC1322_INTx_BASE(x) + 0x8)
#define MEC1322_INT_DISABLE(x) REG32(MEC1322_INTx_BASE(x) + 0xc)
#define MEC1322_INT_BLK_EN REG32(MEC1322_INT_BASE + 0x200)
#define MEC1322_INT_BLK_DIS REG32(MEC1322_INT_BASE + 0x204)
#define MEC1322_INT_BLK_IRQ REG32(MEC1322_INT_BASE + 0x208)

/* UART */
#define MEC1322_UART_CONFIG_BASE 0x400f1f00
#define MEC1322_UART_RUNTIME_BASE 0x400f1c00

#define MEC1322_UART_ACT REG8(MEC1322_UART_CONFIG_BASE + 0x30)
#define MEC1322_UART_CFG REG8(MEC1322_UART_CONFIG_BASE + 0xf0)

/* DLAB=0 */
#define MEC1322_UART_RB /*R*/ REG8(MEC1322_UART_RUNTIME_BASE + 0x0)
#define MEC1322_UART_TB /*W*/ REG8(MEC1322_UART_RUNTIME_BASE + 0x0)
#define MEC1322_UART_IER REG8(MEC1322_UART_RUNTIME_BASE + 0x1)
/* DLAB=1 */
#define MEC1322_UART_PBRG0 REG8(MEC1322_UART_RUNTIME_BASE + 0x0)
#define MEC1322_UART_PBRG1 REG8(MEC1322_UART_RUNTIME_BASE + 0x1)

#define MEC1322_UART_FCR /*W*/ REG8(MEC1322_UART_RUNTIME_BASE + 0x2)
#define MEC1322_UART_IIR /*R*/ REG8(MEC1322_UART_RUNTIME_BASE + 0x2)
#define MEC1322_UART_LCR REG8(MEC1322_UART_RUNTIME_BASE + 0x3)
#define MEC1322_UART_MCR REG8(MEC1322_UART_RUNTIME_BASE + 0x4)
#define MEC1322_UART_LSR REG8(MEC1322_UART_RUNTIME_BASE + 0x5)
#define MEC1322_UART_MSR REG8(MEC1322_UART_RUNTIME_BASE + 0x6)
#define MEC1322_UART_SCR REG8(MEC1322_UART_RUNTIME_BASE + 0x7)

/* Bit defines for MEC1322_UART_LSR */
#define MEC1322_LSR_TX_EMPTY BIT(5)

/* GPIO */
#define MEC1322_GPIO_BASE 0x40081000

static inline uintptr_t gpio_port_base(int port_id)
{
	int oct = (port_id / 10) * 8 + port_id % 10;
	return MEC1322_GPIO_BASE + oct * 0x20;
}
#define MEC1322_GPIO_CTL(port, id) REG32(gpio_port_base(port) + (id << 2))

#define UNIMPLEMENTED_GPIO_BANK 0

/* Timer */
#define MEC1322_TMR16_BASE(x) (0x40000c00 + (x)*0x20)
#define MEC1322_TMR32_BASE(x) (0x40000c80 + (x)*0x20)

#define MEC1322_TMR16_CNT(x) REG32(MEC1322_TMR16_BASE(x) + 0x0)
#define MEC1322_TMR16_PRE(x) REG32(MEC1322_TMR16_BASE(x) + 0x4)
#define MEC1322_TMR16_STS(x) REG32(MEC1322_TMR16_BASE(x) + 0x8)
#define MEC1322_TMR16_IEN(x) REG32(MEC1322_TMR16_BASE(x) + 0xc)
#define MEC1322_TMR16_CTL(x) REG32(MEC1322_TMR16_BASE(x) + 0x10)
#define MEC1322_TMR32_CNT(x) REG32(MEC1322_TMR32_BASE(x) + 0x0)
#define MEC1322_TMR32_PRE(x) REG32(MEC1322_TMR32_BASE(x) + 0x4)
#define MEC1322_TMR32_STS(x) REG32(MEC1322_TMR32_BASE(x) + 0x8)
#define MEC1322_TMR32_IEN(x) REG32(MEC1322_TMR32_BASE(x) + 0xc)
#define MEC1322_TMR32_CTL(x) REG32(MEC1322_TMR32_BASE(x) + 0x10)

/* Watchdog */
#define MEC1322_WDG_BASE 0x40000400
#define MEC1322_WDG_LOAD REG16(MEC1322_WDG_BASE + 0x0)
#define MEC1322_WDG_CTL REG8(MEC1322_WDG_BASE + 0x4)
#define MEC1322_WDG_KICK REG8(MEC1322_WDG_BASE + 0x8)
#define MEC1322_WDG_CNT REG16(MEC1322_WDG_BASE + 0xc)

/* VBAT */
#define MEC1322_VBAT_BASE 0x4000a400
#define MEC1322_VBAT_STS REG32(MEC1322_VBAT_BASE + 0x0)
#define MEC1322_VBAT_CE REG32(MEC1322_VBAT_BASE + 0x8)
#define MEC1322_VBAT_RAM(x) REG32(MEC1322_VBAT_BASE + 0x400 + 4 * (x))

/* Bit definition for MEC1322_VBAT_STS */
#define MEC1322_VBAT_STS_WDT BIT(5)

/* Miscellaneous firmware control fields
 * scratch pad index cannot be more than 16 as
 * mec has 64 bytes = 16 indexes of scratchpad RAM
 */
#define MEC1322_IMAGETYPE_IDX 15

/* LPC */
#define MEC1322_LPC_CFG_BASE 0x400f3300
#define MEC1322_LPC_ACT REG8(MEC1322_LPC_CFG_BASE + 0x30)
#define MEC1322_LPC_SIRQ(x) REG8(MEC1322_LPC_CFG_BASE + 0x40 + (x))
#define MEC1322_LPC_CFG_BAR REG32(MEC1322_LPC_CFG_BASE + 0x60)
#define MEC1322_LPC_EMI_BAR REG32(MEC1322_LPC_CFG_BASE + 0x64)
#define MEC1322_LPC_UART_BAR REG32(MEC1322_LPC_CFG_BASE + 0x68)
#define MEC1322_LPC_8042_BAR REG32(MEC1322_LPC_CFG_BASE + 0x78)
#define MEC1322_LPC_ACPI_EC0_BAR REG32(MEC1322_LPC_CFG_BASE + 0x88)
#define MEC1322_LPC_ACPI_EC1_BAR REG32(MEC1322_LPC_CFG_BASE + 0x8c)
#define MEC1322_LPC_ACPI_PM1_BAR REG32(MEC1322_LPC_CFG_BASE + 0x90)
#define MEC1322_LPC_PORT92_BAR REG32(MEC1322_LPC_CFG_BASE + 0x94)
#define MEC1322_LPC_MAILBOX_BAR REG32(MEC1322_LPC_CFG_BASE + 0x98)
#define MEC1322_LPC_RTC_BAR REG32(MEC1322_LPC_CFG_BASE + 0x9c)
#define MEC1322_LPC_MEM_BAR REG32(MEC1322_LPC_CFG_BASE + 0xa0)
#define MEC1322_LPC_MEM_BAR_CFG REG32(MEC1322_LPC_CFG_BASE + 0xa4)

#define MEC1322_LPC_RT_BASE 0x400f3100
#define MEC1322_LPC_BUS_MONITOR REG32(MEC1322_LPC_RT_BASE + 0x4)
#define MEC1322_LPC_CLK_CTRL REG32(MEC1322_LPC_RT_BASE + 0x10)
#define MEC1322_LPC_MEM_HOST_CFG REG32(MEC1322_LPC_RT_BASE + 0xfc)

/* EMI */
#define MEC1322_EMI_BASE 0x400f0100
#define MEC1322_EMI_H2E_MBX REG8(MEC1322_EMI_BASE + 0x0)
#define MEC1322_EMI_E2H_MBX REG8(MEC1322_EMI_BASE + 0x1)
#define MEC1322_EMI_MBA0 REG32(MEC1322_EMI_BASE + 0x4)
#define MEC1322_EMI_MRL0 REG16(MEC1322_EMI_BASE + 0x8)
#define MEC1322_EMI_MWL0 REG16(MEC1322_EMI_BASE + 0xa)
#define MEC1322_EMI_MBA1 REG32(MEC1322_EMI_BASE + 0xc)
#define MEC1322_EMI_MRL1 REG16(MEC1322_EMI_BASE + 0x10)
#define MEC1322_EMI_MWL1 REG16(MEC1322_EMI_BASE + 0x12)
#define MEC1322_EMI_ISR REG16(MEC1322_EMI_BASE + 0x14)
#define MEC1322_EMI_HCE REG16(MEC1322_EMI_BASE + 0x16)

#define MEC1322_EMI_RT_BASE 0x400f0000
#define MEC1322_EMI_ISR_B0 REG8(MEC1322_EMI_RT_BASE + 0x8)
#define MEC1322_EMI_ISR_B1 REG8(MEC1322_EMI_RT_BASE + 0x9)
#define MEC1322_EMI_IMR_B0 REG8(MEC1322_EMI_RT_BASE + 0xa)
#define MEC1322_EMI_IMR_B1 REG8(MEC1322_EMI_RT_BASE + 0xb)

/* Mailbox */
#define MEC1322_MBX_RT_BASE 0x400f2400
#define MEC1322_MBX_INDEX REG8(MEC1322_MBX_RT_BASE + 0x0)
#define MEC1322_MBX_DATA REG8(MEC1322_MBX_RT_BASE + 0x1)

#define MEC1322_MBX_BASE 0x400f2500
#define MEC1322_MBX_H2E_MBX REG8(MEC1322_MBX_BASE + 0x0)
#define MEC1322_MBX_E2H_MBX REG8(MEC1322_MBX_BASE + 0x4)
#define MEC1322_MBX_ISR REG8(MEC1322_MBX_BASE + 0x8)
#define MEC1322_MBX_IMR REG8(MEC1322_MBX_BASE + 0xc)
#define MEC1322_MBX_REG(x) REG8(MEC1322_MBX_BASE + 0x10 + (x))

/* PWM */
#define MEC1322_PWM_BASE(x) (0x40005800 + (x)*0x10)
#define MEC1322_PWM_ON(x) REG32(MEC1322_PWM_BASE(x) + 0x00)
#define MEC1322_PWM_OFF(x) REG32(MEC1322_PWM_BASE(x) + 0x04)
#define MEC1322_PWM_CFG(x) REG32(MEC1322_PWM_BASE(x) + 0x08)

/* ACPI */
#define MEC1322_ACPI_EC_BASE(x) (0x400f0c00 + (x)*0x400)
#define MEC1322_ACPI_EC_EC2OS(x, y) REG8(MEC1322_ACPI_EC_BASE(x) + 0x100 + (y))
#define MEC1322_ACPI_EC_STATUS(x) REG8(MEC1322_ACPI_EC_BASE(x) + 0x104)
#define MEC1322_ACPI_EC_BYTE_CTL(x) REG8(MEC1322_ACPI_EC_BASE(x) + 0x105)
#define MEC1322_ACPI_EC_OS2EC(x, y) REG8(MEC1322_ACPI_EC_BASE(x) + 0x108 + (y))

#define MEC1322_ACPI_PM_RT_BASE 0x400f1400
#define MEC1322_ACPI_PM1_STS1 REG8(MEC1322_ACPI_PM_RT_BASE + 0x0)
#define MEC1322_ACPI_PM1_STS2 REG8(MEC1322_ACPI_PM_RT_BASE + 0x1)
#define MEC1322_ACPI_PM1_EN1 REG8(MEC1322_ACPI_PM_RT_BASE + 0x2)
#define MEC1322_ACPI_PM1_EN2 REG8(MEC1322_ACPI_PM_RT_BASE + 0x3)
#define MEC1322_ACPI_PM1_CTL1 REG8(MEC1322_ACPI_PM_RT_BASE + 0x4)
#define MEC1322_ACPI_PM1_CTL2 REG8(MEC1322_ACPI_PM_RT_BASE + 0x5)
#define MEC1322_ACPI_PM2_CTL1 REG8(MEC1322_ACPI_PM_RT_BASE + 0x6)
#define MEC1322_ACPI_PM2_CTL2 REG8(MEC1322_ACPI_PM_RT_BASE + 0x7)
#define MEC1322_ACPI_PM_EC_BASE 0x400f1500
#define MEC1322_ACPI_PM_STS REG8(MEC1322_ACPI_PM_EC_BASE + 0x10)

/* 8042 */
#define MEC1322_8042_BASE 0x400f0400
#define MEC1322_8042_OBF_CLR REG8(MEC1322_8042_BASE + 0x0)
#define MEC1322_8042_H2E REG8(MEC1322_8042_BASE + 0x100)
#define MEC1322_8042_E2H REG8(MEC1322_8042_BASE + 0x100)
#define MEC1322_8042_STS REG8(MEC1322_8042_BASE + 0x104)
#define MEC1322_8042_KB_CTRL REG8(MEC1322_8042_BASE + 0x108)
#define MEC1322_8042_PCOBF REG8(MEC1322_8042_BASE + 0x114)
#define MEC1322_8042_ACT REG8(MEC1322_8042_BASE + 0x330)

/* FAN */
#define MEC1322_FAN_BASE 0x4000a000
#define MEC1322_FAN_SETTING REG8(MEC1322_FAN_BASE + 0x0)
#define MEC1322_FAN_PWM_DIVIDE REG8(MEC1322_FAN_BASE + 0x1)
#define MEC1322_FAN_CFG1 REG8(MEC1322_FAN_BASE + 0x2)
#define MEC1322_FAN_CFG2 REG8(MEC1322_FAN_BASE + 0x3)
#define MEC1322_FAN_GAIN REG8(MEC1322_FAN_BASE + 0x5)
#define MEC1322_FAN_SPIN_UP REG8(MEC1322_FAN_BASE + 0x6)
#define MEC1322_FAN_STEP REG8(MEC1322_FAN_BASE + 0x7)
#define MEC1322_FAN_MIN_DRV REG8(MEC1322_FAN_BASE + 0x8)
#define MEC1322_FAN_VALID_CNT REG8(MEC1322_FAN_BASE + 0x9)
#define MEC1322_FAN_DRV_FAIL REG16(MEC1322_FAN_BASE + 0xa)
#define MEC1322_FAN_TARGET REG16(MEC1322_FAN_BASE + 0xc)
#define MEC1322_FAN_READING REG16(MEC1322_FAN_BASE + 0xe)
#define MEC1322_FAN_BASE_FREQ REG8(MEC1322_FAN_BASE + 0x10)
#define MEC1322_FAN_STATUS REG8(MEC1322_FAN_BASE + 0x11)

/* I2C */
#define MEC1322_I2C0_BASE 0x40001800
#define MEC1322_I2C1_BASE 0x4000ac00
#define MEC1322_I2C2_BASE 0x4000b000
#define MEC1322_I2C3_BASE 0x4000b400
#define MEC1322_I2C_BASESEP 0x00000400
#define MEC1322_I2C_ADDR(controller, offset) \
	(offset +                            \
	 (controller == 0 ?                  \
		  MEC1322_I2C0_BASE :        \
		  MEC1322_I2C1_BASE + MEC1322_I2C_BASESEP * (controller - 1)))

/*
 * MEC1322 has five ports distributed among four controllers. Locking must
 * occur by-controller (not by-port).
 */
enum mec1322_i2c_port {
	MEC1322_I2C0_0 = 0, /* Controller 0, port 0 */
	MEC1322_I2C0_1 = 1, /* Controller 0, port 1 */
	MEC1322_I2C1 = 2, /* Controller 1 */
	MEC1322_I2C2 = 3, /* Controller 2 */
	MEC1322_I2C3 = 4, /* Controller 3 */
	MEC1322_I2C_PORT_COUNT,
};

#define MEC1322_I2C_CTRL(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x0))
#define MEC1322_I2C_STATUS(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x0))
#define MEC1322_I2C_OWN_ADDR(ctrl) REG16(MEC1322_I2C_ADDR(ctrl, 0x4))
#define MEC1322_I2C_DATA(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x8))
#define MEC1322_I2C_MASTER_CMD(ctrl) REG32(MEC1322_I2C_ADDR(ctrl, 0xc))
#define MEC1322_I2C_SLAVE_CMD(ctrl) REG32(MEC1322_I2C_ADDR(ctrl, 0x10))
#define MEC1322_I2C_PEC(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x14))
#define MEC1322_I2C_DATA_TIM_2(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x18))
#define MEC1322_I2C_COMPLETE(ctrl) REG32(MEC1322_I2C_ADDR(ctrl, 0x20))
#define MEC1322_I2C_IDLE_SCALE(ctrl) REG32(MEC1322_I2C_ADDR(ctrl, 0x24))
#define MEC1322_I2C_CONFIG(ctrl) REG32(MEC1322_I2C_ADDR(ctrl, 0x28))
#define MEC1322_I2C_BUS_CLK(ctrl) REG16(MEC1322_I2C_ADDR(ctrl, 0x2c))
#define MEC1322_I2C_BLK_ID(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x30))
#define MEC1322_I2C_REV(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x34))
#define MEC1322_I2C_BB_CTRL(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x38))
#define MEC1322_I2C_DATA_TIM(ctrl) REG32(MEC1322_I2C_ADDR(ctrl, 0x40))
#define MEC1322_I2C_TOUT_SCALE(ctrl) REG32(MEC1322_I2C_ADDR(ctrl, 0x44))
#define MEC1322_I2C_SLAVE_TX_BUF(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x48))
#define MEC1322_I2C_SLAVE_RX_BUF(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x4c))
#define MEC1322_I2C_MASTER_TX_BUF(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x50))
#define MEC1322_I2C_MASTER_RX_BUF(ctrl) REG8(MEC1322_I2C_ADDR(ctrl, 0x54))

/* Keyboard scan matrix */
#define MEC1322_KS_BASE 0x40009c00
#define MEC1322_KS_KSO_SEL REG32(MEC1322_KS_BASE + 0x4)
#define MEC1322_KS_KSI_INPUT REG32(MEC1322_KS_BASE + 0x8)
#define MEC1322_KS_KSI_STATUS REG32(MEC1322_KS_BASE + 0xc)
#define MEC1322_KS_KSI_INT_EN REG32(MEC1322_KS_BASE + 0x10)
#define MEC1322_KS_EXT_CTRL REG32(MEC1322_KS_BASE + 0x14)

/* ADC */
#define MEC1322_ADC_BASE 0x40007c00
#define MEC1322_ADC_CTRL REG32(MEC1322_ADC_BASE + 0x0)
#define MEC1322_ADC_DELAY REG32(MEC1322_ADC_BASE + 0x4)
#define MEC1322_ADC_STS REG32(MEC1322_ADC_BASE + 0x8)
#define MEC1322_ADC_SINGLE REG32(MEC1322_ADC_BASE + 0xc)
#define MEC1322_ADC_REPEAT REG32(MEC1322_ADC_BASE + 0x10)
#define MEC1322_ADC_READ(x) REG32(MEC1322_ADC_BASE + 0x14 + (x)*0x4)

/* Hibernation timer */
#define MEC1322_HTIMER_BASE 0x40009800
#define MEC1322_HTIMER_PRELOAD REG16(MEC1322_HTIMER_BASE + 0x0)
#define MEC1322_HTIMER_CONTROL REG16(MEC1322_HTIMER_BASE + 0x4)
#define MEC1322_HTIMER_COUNT REG16(MEC1322_HTIMER_BASE + 0x8)

/* SPI */
#define MEC1322_SPI_BASE(port) (0x40009400 + 0x80 * (port))
#define MEC1322_SPI_AR(port) REG8(MEC1322_SPI_BASE(port) + 0x00)
#define MEC1322_SPI_CR(port) REG8(MEC1322_SPI_BASE(port) + 0x04)
#define MEC1322_SPI_SR(port) REG8(MEC1322_SPI_BASE(port) + 0x08)
#define MEC1322_SPI_TD(port) REG8(MEC1322_SPI_BASE(port) + 0x0c)
#define MEC1322_SPI_RD(port) REG8(MEC1322_SPI_BASE(port) + 0x10)
#define MEC1322_SPI_CC(port) REG8(MEC1322_SPI_BASE(port) + 0x14)
#define MEC1322_SPI_CG(port) REG8(MEC1322_SPI_BASE(port) + 0x18)

/* DMA */
#define MEC1322_DMA_BASE 0x40002400

/*
 * Available DMA channels.
 *
 * On MEC1322, any DMA channel may serve any device. Since we have
 * 12 channels and 12 devices, we make each channel dedicated to the
 * device of the same number.
 */
enum dma_channel {
	/* Channel numbers */
	MEC1322_DMAC_I2C0_SLAVE = 0,
	MEC1322_DMAC_I2C0_MASTER = 1,
	MEC1322_DMAC_I2C1_SLAVE = 2,
	MEC1322_DMAC_I2C1_MASTER = 3,
	MEC1322_DMAC_I2C2_SLAVE = 4,
	MEC1322_DMAC_I2C2_MASTER = 5,
	MEC1322_DMAC_I2C3_SLAVE = 6,
	MEC1322_DMAC_I2C3_MASTER = 7,
	MEC1322_DMAC_SPI0_TX = 8,
	MEC1322_DMAC_SPI0_RX = 9,
	MEC1322_DMAC_SPI1_TX = 10,
	MEC1322_DMAC_SPI1_RX = 11,

	/* Channel count */
	MEC1322_DMAC_COUNT = 12,
};

/* Registers for a single channel of the DMA controller */
struct mec1322_dma_chan {
	uint32_t act; /* Activate */
	uint32_t mem_start; /* Memory start address */
	uint32_t mem_end; /* Memory end address */
	uint32_t dev; /* Device address */
	uint32_t ctrl; /* Control */
	uint32_t int_status; /* Interrupt status */
	uint32_t int_enabled; /* Interrupt enabled */
	uint32_t pad;
};

/* Always use mec1322_dma_chan_t so volatile keyword is included! */
typedef volatile struct mec1322_dma_chan mec1322_dma_chan_t;

/* Common code and header file must use this */
typedef mec1322_dma_chan_t dma_chan_t;

/* Registers for the DMA controller */
struct mec1322_dma_regs {
	uint32_t ctrl;
	uint32_t data;
	uint32_t pad[2];
	mec1322_dma_chan_t chan[MEC1322_DMAC_COUNT];
};

/* Always use mec1322_dma_regs_t so volatile keyword is included! */
typedef volatile struct mec1322_dma_regs mec1322_dma_regs_t;

#define MEC1322_DMA_REGS ((mec1322_dma_regs_t *)MEC1322_DMA_BASE)

/* Bits for DMA channel regs */
#define MEC1322_DMA_ACT_EN BIT(0)
#define MEC1322_DMA_XFER_SIZE(x) ((x) << 20)
#define MEC1322_DMA_INC_DEV BIT(17)
#define MEC1322_DMA_INC_MEM BIT(16)
#define MEC1322_DMA_DEV(x) ((x) << 9)
#define MEC1322_DMA_TO_DEV BIT(8)
#define MEC1322_DMA_DONE BIT(2)
#define MEC1322_DMA_RUN BIT(0)

/* IRQ Numbers */
#define MEC1322_IRQ_I2C_0 0
#define MEC1322_IRQ_I2C_1 1
#define MEC1322_IRQ_I2C_2 2
#define MEC1322_IRQ_I2C_3 3
#define MEC1322_IRQ_DMA_0 4
#define MEC1322_IRQ_DMA_1 5
#define MEC1322_IRQ_DMA_2 6
#define MEC1322_IRQ_DMA_3 7
#define MEC1322_IRQ_DMA_4 8
#define MEC1322_IRQ_DMA_5 9
#define MEC1322_IRQ_DMA_6 10
#define MEC1322_IRQ_DMA_7 11
#define MEC1322_IRQ_LPC 12
#define MEC1322_IRQ_UART 13
#define MEC1322_IRQ_EMI 14
#define MEC1322_IRQ_ACPIEC0_IBF 15
#define MEC1322_IRQ_ACPIEC0_OBF 16
#define MEC1322_IRQ_ACPIEC1_IBF 17
#define MEC1322_IRQ_ACPIEC1_OBF 18
#define MEC1322_IRQ_ACPIPM1_CTL 19
#define MEC1322_IRQ_ACPIPM1_EN 20
#define MEC1322_IRQ_ACPIPM1_STS 21
#define MEC1322_IRQ_8042EM_OBF 22
#define MEC1322_IRQ_8042EM_IBF 23
#define MEC1322_IRQ_MAILBOX 24
#define MEC1322_IRQ_PECI_HOST 25
#define MEC1322_IRQ_TACH_0 26
#define MEC1322_IRQ_TACH_1 27
#define MEC1322_IRQ_ADC_SNGL 28
#define MEC1322_IRQ_ADC_RPT 29
#define MEC1322_IRQ_PS2_0 32
#define MEC1322_IRQ_PS2_1 33
#define MEC1322_IRQ_PS2_2 34
#define MEC1322_IRQ_PS2_3 35
#define MEC1322_IRQ_SPI0_TX 36
#define MEC1322_IRQ_SPI0_RX 37
#define MEC1322_IRQ_HTIMER 38
#define MEC1322_IRQ_KSC_INT 39
#define MEC1322_IRQ_MAILBOX_DATA 40
#define MEC1322_IRQ_TIMER16_0 49
#define MEC1322_IRQ_TIMER16_1 50
#define MEC1322_IRQ_TIMER16_2 51
#define MEC1322_IRQ_TIMER16_3 52
#define MEC1322_IRQ_TIMER32_0 53
#define MEC1322_IRQ_TIMER32_1 54
#define MEC1322_IRQ_SPI1_TX 55
#define MEC1322_IRQ_SPI1_RX 56
#define MEC1322_IRQ_GIRQ8 57
#define MEC1322_IRQ_GIRQ9 58
#define MEC1322_IRQ_GIRQ10 59
#define MEC1322_IRQ_GIRQ11 60
#define MEC1322_IRQ_GIRQ12 61
#define MEC1322_IRQ_GIRQ13 62
#define MEC1322_IRQ_GIRQ14 63
#define MEC1322_IRQ_GIRQ15 64
#define MEC1322_IRQ_GIRQ16 65
#define MEC1322_IRQ_GIRQ17 66
#define MEC1322_IRQ_GIRQ18 67
#define MEC1322_IRQ_GIRQ19 68
#define MEC1322_IRQ_GIRQ20 69
#define MEC1322_IRQ_GIRQ21 70
#define MEC1322_IRQ_GIRQ22 71
#define MEC1322_IRQ_GIRQ23 72
#define MEC1322_IRQ_DMA_8 81
#define MEC1322_IRQ_DMA_9 82
#define MEC1322_IRQ_DMA_10 83
#define MEC1322_IRQ_DMA_11 84
#define MEC1322_IRQ_PWM_WDT3 85
#define MEC1322_IRQ_RTC 91
#define MEC1322_IRQ_RTC_ALARM 92

/* Wake pin definitions, defined at board-level */
#ifndef CONFIG_HIBERNATE_WAKE_PINS_DYNAMIC
extern const enum gpio_signal hibernate_wake_pins[];
extern const int hibernate_wake_pins_used;
#else
extern enum gpio_signal hibernate_wake_pins[];
extern int hibernate_wake_pins_used;
#endif

#endif /* __CROS_EC_REGISTERS_H */