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 seperate 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