1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #define GPIO_INTERRUPT_POLARITY_SHIFT   16
8 #define PINS_PER_BLOCK                  32
9 #define ALT_FUNCTION_MAX                6
10 #define MAX_GPIO_INDEX                  255
11 #define BITS_PER_GPIO_INTERRUPT         8
12 
13 #define S912_GPIOX_PINS     19
14 #define S912_GPIODV_PINS    30
15 #define S912_GPIOH_PINS     10
16 #define S912_GPIOBOOT_PINS  16
17 #define S912_GPIOCARD_PINS  7
18 #define S912_GPIOCLK_PINS   2
19 #define S912_GPIOZ_PINS     16
20 #define S912_GPIOAO_PINS    10
21 
22 #define S912_GPIOX_START    (0 * 32)
23 #define S912_GPIODV_START   (1 * 32)
24 #define S912_GPIOH_START    (2 * 32)
25 #define S912_GPIOBOOT_START (3 * 32)
26 #define S912_GPIOCARD_START (4 * 32)
27 #define S912_GPIOCLK_START  (5 * 32)
28 #define S912_GPIOZ_START    (6 * 32)
29 #define S912_GPIOAO_START   (7 * 32)
30 
31 #define S912_GPIOX(n)       (S912_GPIOX_START + n)
32 #define S912_GPIODV(n)      (S912_GPIODV_START + n)
33 #define S912_GPIOH(n)      (S912_GPIOH_START + n)
34 #define S912_GPIOBOOT(n)    (S912_GPIOBOOT_START + n)
35 #define S912_GPIOCARD(n)    (S912_GPIOCARD_START + n)
36 #define S912_GPIOCLK(n)     (S912_GPIOCLK_START + n)
37 #define S912_GPIOZ(n)       (S912_GPIOZ_START + n)
38 #define S912_GPIOAO(n)      (S912_GPIOAO_START + n)
39 
40 #define S912_GPIOX_0EN      0x18
41 #define S912_GPIOX_OUT      0x19
42 #define S912_GPIOX_IN       0x1a
43 #define S912_GPIODV_0EN     0x0c
44 #define S912_GPIODV_OUT     0x0d
45 #define S912_GPIODV_IN      0x0e
46 #define S912_GPIOH_0EN      0x0f
47 #define S912_GPIOH_OUT      0x10
48 #define S912_GPIOH_IN       0x11
49 #define S912_GPIOBOOT_0EN   0x12
50 #define S912_GPIOBOOT_OUT   0x13
51 #define S912_GPIOBOOT_IN    0x14
52 #define S912_GPIOCARD_0EN   0x12
53 #define S912_GPIOCARD_OUT   0x13
54 #define S912_GPIOCARD_IN    0x14
55 #define S912_GPIOCLK_0EN    0x15
56 #define S912_GPIOCLK_OUT    0x16
57 #define S912_GPIOCLK_IN     0x17
58 #define S912_GPIOZ_0EN      0x15
59 #define S912_GPIOZ_OUT      0x16
60 #define S912_GPIOZ_IN       0x17
61 
62 #define S912_PERIPHS_PIN_MUX_0 0x2C
63 #define S912_PERIPHS_PIN_MUX_1 0x2D
64 #define S912_PERIPHS_PIN_MUX_2 0x2E
65 #define S912_PERIPHS_PIN_MUX_3 0x2F
66 #define S912_PERIPHS_PIN_MUX_4 0x30
67 #define S912_PERIPHS_PIN_MUX_5 0x31
68 #define S912_PERIPHS_PIN_MUX_6 0x32
69 #define S912_PERIPHS_PIN_MUX_7 0x33
70 #define S912_PERIPHS_PIN_MUX_8 0x34
71 #define S912_PERIPHS_PIN_MUX_9 0x35
72 
73 #define S912_PULL_UP_REG0   0x3A
74 #define S912_PULL_UP_REG1   0x3B
75 #define S912_PULL_UP_REG2   0x3C
76 #define S912_PULL_UP_REG3   0x3D
77 #define S912_PULL_UP_REG4   0x3E
78 
79 #define S912_PULL_UP_EN_REG0   0x48
80 #define S912_PULL_UP_EN_REG1   0x49
81 #define S912_PULL_UP_EN_REG2   0x4A
82 #define S912_PULL_UP_EN_REG3   0x4B
83 #define S912_PULL_UP_EN_REG4   0x4C
84 
85 // These are relative to base address 0xc1100000 and in sizeof(uint32_t)
86 #define S912_GPIO_INT_STATUS            0x2618
87 #define S912_GPIO_INT_CLEAR             0x2619
88 #define S912_GPIO_INT_MASK              0x261A
89 #define S912_GPIO_INT_EDGE_POLARITY     0x2620
90 #define S912_GPIO_0_3_PIN_SELECT        0x2621
91 #define S912_GPIO_4_7_PIN_SELECT        0x2622
92 #define S912_GPIO_FILTER_SELECT         0x2623
93 
94 #define S912_GPIOA0_PIN_START      0
95 #define S912_GPIOZ_PIN_START       10
96 #define S912_GPIOH_PIN_START       26
97 #define S912_GPIOBOOT_PIN_START    36
98 #define S912_GPIOCARD_PIN_START    52
99 #define S912_GPIODV_PIN_START      59
100 #define S912_GPIOX_PIN_START       89
101 #define S912_GPIOCLK_PIN_START     108
102 
103 // GPIO AO registers live in a separate register bank.
104 #define S912_AO_RTI_PIN_MUX_REG  0x05
105 #define S912_AO_RTI_PIN_MUX_REG2 0x06
106 #define S912_AO_GPIO_OEN_OUT     0x09   // OEN: [9:0], OUT: [25:16]
107 #define S912_AO_GPIO_IN          0x0a
108 #define S912_A0_GPIO_OUT_OFFSET  16
109 
110 // Alternate Functions for SDIO
111 #define S912_WIFI_SDIO_D0           S912_GPIOX(0)
112 #define S912_WIFI_SDIO_D0_FN        1
113 #define S912_WIFI_SDIO_D1           S912_GPIOX(1)
114 #define S912_WIFI_SDIO_D1_FN        1
115 #define S912_WIFI_SDIO_D2           S912_GPIOX(2)
116 #define S912_WIFI_SDIO_D2_FN        1
117 #define S912_WIFI_SDIO_D3           S912_GPIOX(3)
118 #define S912_WIFI_SDIO_D3_FN        1
119 #define S912_WIFI_SDIO_CLK          S912_GPIOX(4)
120 #define S912_WIFI_SDIO_CLK_FN       1
121 #define S912_WIFI_SDIO_CMD          S912_GPIOX(5)
122 #define S912_WIFI_SDIO_CMD_FN       1
123 #define S912_WIFI_SDIO_WAKE_HOST    S912_GPIOX(7)
124 #define S912_WIFI_SDIO_WAKE_HOST_FN 1
125