3 #ifndef _BAYTRAIL_GPIO_H_
4 #define _BAYTRAIL_GPIO_H_
12 #define CROS_GPIO_DEVICE_NAME "BayTrail"
15 #define GPSCORE_PAD_BASE (IO_BASE_ADDRESS + IO_BASE_OFFSET_GPSCORE)
16 #define GPNCORE_PAD_BASE (IO_BASE_ADDRESS + IO_BASE_OFFSET_GPNCORE)
17 #define GPSSUS_PAD_BASE (IO_BASE_ADDRESS + IO_BASE_OFFSET_GPSSUS)
20 #define PAD_BASE_DIRQ_OFFSET 0x980
23 #define PAD_CONF0_REG 0x0
24 #define PAD_CONF1_REG 0x4
25 #define PAD_VAL_REG 0x8
28 #define GPSCORE_LEGACY_BASE (GPIO_BASE_ADDRESS + 0x00)
29 #define GPSSUS_LEGACY_BASE (GPIO_BASE_ADDRESS + 0x80)
31 #define GP_LEGACY_BASE_NONE 0xFFFF
33 #define LEGACY_USE_SEL_REG 0x00
34 #define LEGACY_IO_SEL_REG 0x04
35 #define LEGACY_GP_LVL_REG 0x08
36 #define LEGACY_TPE_REG 0x0C
37 #define LEGACY_TNE_REG 0x10
38 #define LEGACY_TS_REG 0x14
39 #define LEGACY_WAKE_EN_REG 0x18
42 #define GPNCORE_COUNT 27
43 #define GPSCORE_COUNT 102
44 #define GPSSUS_COUNT 44
47 #define GPIO_USE_MMIO 0
48 #define GPIO_USE_LEGACY 1
50 #define GPIO_DIR_OUTPUT 0
51 #define GPIO_DIR_INPUT 1
53 #define GPIO_LEVEL_LOW 0
54 #define GPIO_LEVEL_HIGH 1
56 #define GPIO_PEDGE_DISABLE 0
57 #define GPIO_PEDGE_ENABLE 1
59 #define GPIO_NEDGE_DISABLE 0
60 #define GPIO_NEDGE_ENABLE 1
63 #define PAD_MASK2_DISABLE (1 << 29)
66 #define PAD_IRQ_EN (1 << 27)
69 #define PAD_TNE_IRQ (1 << 26)
72 #define PAD_TPE_IRQ (1 << 25)
75 #define PAD_LEVEL_IRQ (1 << 24)
76 #define PAD_EDGE_IRQ (0 << 24)
79 #define PAD_SLOWGF_ENABLE (1 << 17)
82 #define PAD_FASTGF_ENABLE (1 << 16)
85 #define PAD_HYST_DISABLE (1 << 15)
86 #define PAD_HYST_ENABLE (0 << 15)
89 #define PAD_HYST_CTRL_DEFAULT (2 << 13)
92 #define PAD_FLOP_BYPASS (1 << 11)
93 #define PAD_FLOP_ENABLE (0 << 11)
96 #define PAD_PU_2K (0 << 9)
97 #define PAD_PU_10K (1 << 9)
98 #define PAD_PU_20K (2 << 9)
99 #define PAD_PU_40K (3 << 9)
102 #define PAD_PULL_DISABLE (0 << 7)
103 #define PAD_PULL_UP (1 << 7)
104 #define PAD_PULL_DOWN (2 << 7)
107 #define PAD_FUNC0 0x0
108 #define PAD_FUNC1 0x1
109 #define PAD_FUNC2 0x2
110 #define PAD_FUNC3 0x3
111 #define PAD_FUNC4 0x4
112 #define PAD_FUNC5 0x5
113 #define PAD_FUNC6 0x6
116 #define PAD_CONFIG0_DEFAULT (PAD_MASK2_DISABLE | PAD_SLOWGF_ENABLE | \
117 PAD_FASTGF_ENABLE | PAD_HYST_DISABLE | \
118 PAD_HYST_CTRL_DEFAULT | PAD_FLOP_BYPASS)
121 #define PAD_CONFIG1_DEFAULT 0x8000
124 #define PAD_VAL_INPUT_DISABLE (1 << 2)
125 #define PAD_VAL_INPUT_ENABLE (0 << 2)
128 #define PAD_VAL_OUTPUT_DISABLE (1 << 1)
129 #define PAD_VAL_OUTPUT_ENABLE (0 << 1)
132 #define PAD_VAL_INPUT (PAD_VAL_INPUT_ENABLE | PAD_VAL_OUTPUT_DISABLE)
133 #define PAD_VAL_OUTPUT (PAD_VAL_OUTPUT_ENABLE | PAD_VAL_INPUT_DISABLE)
136 #define PAD_VAL_HIGH (1 << 0)
137 #define PAD_VAL_LOW (0 << 0)
141 #define PAD_VAL_DEFAULT PAD_VAL_INPUT
144 #define GPIO_INPUT_PU_10K \
145 { .pad_conf0 = PAD_PU_10K | PAD_PULL_UP | PAD_CONFIG0_DEFAULT, \
146 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
147 .pad_val = PAD_VAL_INPUT, \
148 .use_sel = GPIO_USE_MMIO, \
151 #define GPIO_INPUT_PU_20K \
152 { .pad_conf0 = PAD_PU_20K | PAD_PULL_UP | PAD_CONFIG0_DEFAULT, \
153 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
154 .pad_val = PAD_VAL_INPUT, \
155 .use_sel = GPIO_USE_MMIO, \
158 #define GPIO_INPUT_PD_10K \
159 { .pad_conf0 = PAD_PU_10K | PAD_PULL_DOWN | PAD_CONFIG0_DEFAULT, \
160 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
161 .pad_val = PAD_VAL_INPUT, \
162 .use_sel = GPIO_USE_MMIO, \
165 #define GPIO_INPUT_PD_20K \
166 { .pad_conf0 = PAD_PU_20K | PAD_PULL_DOWN | PAD_CONFIG0_DEFAULT, \
167 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
168 .pad_val = PAD_VAL_INPUT, \
169 .use_sel = GPIO_USE_MMIO, \
172 #define GPIO_INPUT_NOPU \
173 { .pad_conf0 = PAD_PU_20K | PAD_PULL_DISABLE | PAD_CONFIG0_DEFAULT, \
174 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
175 .pad_val = PAD_VAL_INPUT, \
176 .use_sel = GPIO_USE_MMIO, \
179 #define GPIO_INPUT_LEGACY_NOPU \
180 { .pad_conf0 = PAD_PU_20K | PAD_PULL_DISABLE | PAD_CONFIG0_DEFAULT, \
181 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
182 .pad_val = PAD_VAL_INPUT, \
183 .use_sel = GPIO_USE_LEGACY, \
184 .io_sel = GPIO_DIR_INPUT, \
189 { .pad_conf0 = PAD_PU_20K | PAD_PULL_DISABLE | PAD_CONFIG0_DEFAULT \
190 | PAD_FUNC0 | PAD_IRQ_EN | PAD_TPE_IRQ | PAD_LEVEL_IRQ, \
191 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
192 .pad_val = PAD_VAL_INPUT, }
195 #define GPIO_DIRQ_LEVELHIGH_NO_PULL \
196 { .pad_conf0 = PAD_PULL_DISABLE | PAD_CONFIG0_DEFAULT \
197 | PAD_FUNC0 | PAD_IRQ_EN | PAD_TPE_IRQ | PAD_LEVEL_IRQ, \
198 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
199 .pad_val = PAD_VAL_INPUT, }
202 #define GPIO_DIRQ_LEVELLOW_PU_20K \
203 { .pad_conf0 = PAD_PU_20K | PAD_PULL_UP | PAD_CONFIG0_DEFAULT \
204 | PAD_FUNC0 | PAD_IRQ_EN | PAD_TNE_IRQ | PAD_LEVEL_IRQ, \
205 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
206 .pad_val = PAD_VAL_INPUT, }
209 #define GPIO_DIRQ_EDGELOW_PU_20K \
210 { .pad_conf0 = PAD_PU_20K | PAD_PULL_UP | PAD_CONFIG0_DEFAULT \
211 | PAD_FUNC0 | PAD_IRQ_EN | PAD_TNE_IRQ | PAD_EDGE_IRQ, \
212 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
213 .pad_val = PAD_VAL_INPUT, }
216 #define GPIO_DIRQ_EDGEHIGH_PD_20K \
217 { .pad_conf0 = PAD_PU_20K | PAD_PULL_DOWN | PAD_CONFIG0_DEFAULT \
218 | PAD_FUNC0 | PAD_IRQ_EN | PAD_TPE_IRQ | PAD_EDGE_IRQ, \
219 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
220 .pad_val = PAD_VAL_INPUT, }
223 #define GPIO_DIRQ_EDGELOW_PD_20K \
224 { .pad_conf0 = PAD_PU_20K | PAD_PULL_DOWN | PAD_CONFIG0_DEFAULT \
225 | PAD_FUNC0 | PAD_IRQ_EN | PAD_TNE_IRQ | PAD_EDGE_IRQ, \
226 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
227 .pad_val = PAD_VAL_INPUT, }
230 #define GPIO_DIRQ_EDGEBOTH_PU_20K \
231 { .pad_conf0 = PAD_PU_20K | PAD_PULL_UP | PAD_CONFIG0_DEFAULT \
232 | PAD_FUNC0 | PAD_IRQ_EN | PAD_TPE_IRQ| PAD_TNE_IRQ | PAD_EDGE_IRQ, \
233 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
234 .pad_val = PAD_VAL_INPUT, }
236 #define GPIO_OUT_LOW \
237 { .pad_conf0 = PAD_PULL_DISABLE | PAD_CONFIG0_DEFAULT, \
238 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
239 .pad_val = PAD_VAL_OUTPUT | PAD_VAL_LOW, \
240 .use_sel = GPIO_USE_LEGACY, \
241 .io_sel = GPIO_DIR_OUTPUT, \
242 .gp_lvl = GPIO_LEVEL_LOW, \
245 #define GPIO_OUT_HIGH \
246 { .pad_conf0 = PAD_PULL_DISABLE | PAD_CONFIG0_DEFAULT, \
247 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
248 .pad_val = PAD_VAL_OUTPUT | PAD_VAL_HIGH, \
249 .use_sel = GPIO_USE_LEGACY, \
250 .io_sel = GPIO_DIR_OUTPUT, \
251 .gp_lvl = GPIO_LEVEL_HIGH, \
255 #define GPIO_FUNC(_func, _pudir, _str) \
256 { .use_sel = GPIO_USE_MMIO, \
257 .pad_conf0 = PAD_FUNC##_func | PAD_##_pudir | PAD_PU_##_str | \
258 PAD_CONFIG0_DEFAULT, \
259 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
260 .pad_val = PAD_VAL_DEFAULT }
263 #define GPIO_FUNC0 GPIO_FUNC(0, PULL_DISABLE, 20K)
264 #define GPIO_FUNC1 GPIO_FUNC(1, PULL_DISABLE, 20K)
265 #define GPIO_FUNC2 GPIO_FUNC(2, PULL_DISABLE, 20K)
266 #define GPIO_FUNC3 GPIO_FUNC(3, PULL_DISABLE, 20K)
267 #define GPIO_FUNC4 GPIO_FUNC(4, PULL_DISABLE, 20K)
268 #define GPIO_FUNC5 GPIO_FUNC(5, PULL_DISABLE, 20K)
269 #define GPIO_FUNC6 GPIO_FUNC(6, PULL_DISABLE, 20K)
273 #define GPIO_ACPI_SCI \
274 { .pad_conf0 = PAD_PULL_DISABLE | PAD_CONFIG0_DEFAULT | PAD_FUNC0, \
275 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
276 .pad_val = PAD_VAL_INPUT, \
277 .use_sel = GPIO_USE_LEGACY, \
278 .io_sel = GPIO_DIR_INPUT, \
282 #define GPIO_ACPI_WAKE \
283 { .pad_conf0 = PAD_PULL_DISABLE | PAD_CONFIG0_DEFAULT | PAD_FUNC0, \
284 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
285 .pad_val = PAD_VAL_INPUT, \
286 .use_sel = GPIO_USE_LEGACY, \
287 .io_sel = GPIO_DIR_INPUT, \
290 #define GPIO_ACPI_SMI \
291 { .pad_conf0 = PAD_PULL_DISABLE | PAD_CONFIG0_DEFAULT | PAD_FUNC0, \
292 .pad_conf1 = PAD_CONFIG1_DEFAULT, \
293 .pad_val = PAD_VAL_INPUT, \
294 .use_sel = GPIO_USE_LEGACY, \
295 .io_sel = GPIO_DIR_INPUT, \
300 #define GPIO_LIST_END 0xffffffff
303 { .pad_conf0 = GPIO_LIST_END }
306 #define GPIO_INPUT GPIO_INPUT_NOPU
307 #define GPIO_INPUT_LEGACY GPIO_INPUT_LEGACY_NOPU
308 #define GPIO_INPUT_PU GPIO_INPUT_PU_20K
309 #define GPIO_INPUT_PD GPIO_INPUT_PD_20K
310 #define GPIO_NC GPIO_OUT_HIGH
311 #define GPIO_DEFAULT GPIO_FUNC0
314 #define GPIO_MAX_DIRQS 16
318 #define GPIO_NONE 255
320 #define GPNCORE_GPIO_F1_RANGE_START GPIO_NONE
321 #define GPNCORE_GPIO_F1_RANGE_END GPIO_NONE
323 #define GPSCORE_GPIO_F1_RANGE_START 92
324 #define GPSCORE_GPIO_F1_RANGE_END 93
326 #define GPSSUS_GPIO_F1_RANGE_START 11
327 #define GPSSUS_GPIO_F1_RANGE_END 21
369 #define UART_RXD_PAD 82
370 #define UART_TXD_PAD 83
371 #define PCU_SMB_CLK_PAD 88
372 #define PCU_SMB_DATA_PAD 90
373 #define SOC_DDI1_VDDEN_PAD 16
385 reg =
read32(pconf0_addr);
406 reg =
read32(pconf0_addr);
417 reg =
read32(pconf0_addr);
440 const uint32_t pull_mask = ~(0xf << 7);
446 const int pull_mask = ~(0xf << 7);
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
static void ssus_enable_internal_pull(int pad, int mask)
static u32 * ssus_pconf0(int pad_num)
static int ssus_get_gpio(int pad)
static void ssus_disable_internal_pull(int pad)
struct soc_gpio_config * mainboard_get_gpios(void)
struct soc_gpio_map __packed
static u32 * ncore_pconf0(int pad_num)
void setup_soc_gpios(struct soc_gpio_config *config, u8 enable_xdp_tap)
static u32 * score_pconf0(int pad_num)
static void ssus_select_func(int pad, int func)
static int score_get_gpio(int pad)
static void score_select_func(int pad, int func)
static void ncore_select_func(int pad, int func)
const unsigned long pad_base
const u8 gpio_f1_range_start
const u8 gpio_f1_range_end
const struct soc_gpio_map * ncore
const struct soc_gpio_map * score
const u8(* sus_dirq)[GPIO_MAX_DIRQS]
const u8(* core_dirq)[GPIO_MAX_DIRQS]
const struct soc_gpio_map * ssus