blob: 62d57fe772becfa9547674257c620220baaaa349 [file] [log] [blame]
Patrick Georgiac959032020-05-05 22:49:26 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Subrata Banik91e89c52019-11-01 18:30:01 +05302
Shaunak Sahae8338da2020-01-15 11:43:19 -08003#include <intelblocks/gpio.h>
4#include <intelblocks/pcr.h>
5#include <soc/pcr_ids.h>
6#include <soc/pmc.h>
7
Tim Wawrzynczak8d3cc1b2021-05-03 13:05:12 -06008#define DEFAULT_VW_BASE 0x10
9
Subrata Banik91e89c52019-11-01 18:30:01 +053010/*
11 * This file is created based on Intel Tiger Lake Processor PCH Datasheet
12 * Document number: 575857
13 * Chapter number: 27
14 */
15
Subrata Banik91e89c52019-11-01 18:30:01 +053016static const struct reset_mapping rst_map[] = {
17 { .logical = PAD_CFG0_LOGICAL_RESET_RSMRST, .chipset = 0U << 30 },
18 { .logical = PAD_CFG0_LOGICAL_RESET_DEEP, .chipset = 1U << 30 },
19 { .logical = PAD_CFG0_LOGICAL_RESET_PLTRST, .chipset = 2U << 30 },
20};
Shaunak Sahae8338da2020-01-15 11:43:19 -080021static const struct reset_mapping rst_map_com2[] = {
Subrata Banik91e89c52019-11-01 18:30:01 +053022 { .logical = PAD_CFG0_LOGICAL_RESET_PWROK, .chipset = 0U << 30 },
23 { .logical = PAD_CFG0_LOGICAL_RESET_DEEP, .chipset = 1U << 30 },
24 { .logical = PAD_CFG0_LOGICAL_RESET_PLTRST, .chipset = 2U << 30 },
25 { .logical = PAD_CFG0_LOGICAL_RESET_RSMRST, .chipset = 3U << 30 },
26};
27
28/*
Shaunak Saha56e3df42020-03-24 00:24:59 -070029 * The GPIO pinctrl driver for Tiger Lake on Linux expects 32 GPIOs per pad
30 * group, regardless of whether or not there is a physical pad for each
31 * exposed GPIO number.
32 *
33 * This results in the OS having a sparse GPIO map, and devices that need
34 * to export an ACPI GPIO must use the OS expected number.
35 *
36 * Not all pins are usable as GPIO and those groups do not have a pad base.
37 *
38 * This layout matches the Linux kernel pinctrl map for TGL at:
Subrata Banik91e89c52019-11-01 18:30:01 +053039 * linux/drivers/pinctrl/intel/pinctrl-tigerlake.c
40 */
41static const struct pad_group tgl_community0_groups[] = {
Shaunak Saha56e3df42020-03-24 00:24:59 -070042 INTEL_GPP_BASE(GPP_B0, GPP_B0, GPP_B25, 0), /* GPP_B */
43 INTEL_GPP_BASE(GPP_B0, GPP_T0, GPP_T15, 32), /* GPP_T */
44 INTEL_GPP_BASE(GPP_B0, GPP_A0, GPP_A24, 64), /* GPP_A */
Subrata Banik91e89c52019-11-01 18:30:01 +053045};
46
Tim Wawrzynczak8d3cc1b2021-05-03 13:05:12 -060047static const struct vw_entries tgl_community0_vw[] = {
48 {GPP_A0, GPP_A23},
49 {GPP_B0, GPP_B23},
50};
51
Subrata Banik91e89c52019-11-01 18:30:01 +053052static const struct pad_group tgl_community1_groups[] = {
Shaunak Saha56e3df42020-03-24 00:24:59 -070053 INTEL_GPP_BASE(GPP_S0, GPP_S0, GPP_S7, 96), /* GPP_S */
54 INTEL_GPP_BASE(GPP_S0, GPP_H0, GPP_H23, 128), /* GPP_H */
55 INTEL_GPP_BASE(GPP_S0, GPP_D0, GPP_GSPI2_CLK_LOOPBK, 160), /* GPP_D */
56 INTEL_GPP_BASE(GPP_S0, GPP_U0, GPP_GSPI6_CLK_LOOPBK, 192), /* GPP_U */
57 INTEL_GPP_BASE(GPP_S0, CNV_BTEN, vI2S2_RXD, 224), /* GPP_VGPIO */
Subrata Banik91e89c52019-11-01 18:30:01 +053058};
59
Tim Wawrzynczak8d3cc1b2021-05-03 13:05:12 -060060static const struct vw_entries tgl_community1_vw[] = {
61 {GPP_D0, GPP_D19},
62 {GPP_H0, GPP_H23},
63};
64
Subrata Banik91e89c52019-11-01 18:30:01 +053065/* This community is not visible to the OS */
66static const struct pad_group tgl_community2_groups[] = {
Shaunak Sahae8338da2020-01-15 11:43:19 -080067 INTEL_GPP(GPD0, GPD0, GPD_DRAM_RESETB), /* GPD */
Subrata Banik91e89c52019-11-01 18:30:01 +053068};
69
Subrata Banik91e89c52019-11-01 18:30:01 +053070static const struct pad_group tgl_community4_groups[] = {
Shaunak Saha56e3df42020-03-24 00:24:59 -070071 INTEL_GPP_BASE(GPP_C0, GPP_C0, GPP_C23, 256), /* GPP_C */
72 INTEL_GPP_BASE(GPP_C0, GPP_F0, GPP_F_CLK_LOOPBK, 288), /* GPP_F */
Shaunak Sahae8338da2020-01-15 11:43:19 -080073 INTEL_GPP(GPP_C0, GPP_L_BKLTEN, GPP_MLK_RSTB), /* GPP_HVCMOS */
Shaunak Saha56e3df42020-03-24 00:24:59 -070074 INTEL_GPP_BASE(GPP_C0, GPP_E0, GPP_E_CLK_LOOPBK, 320), /* GPP_E */
Shaunak Sahae8338da2020-01-15 11:43:19 -080075 INTEL_GPP(GPP_C0, GPP_JTAG_TDO, GPP_DBG_PMODE), /* GPP_JTAG */
Subrata Banik91e89c52019-11-01 18:30:01 +053076};
77
Tim Wawrzynczak8d3cc1b2021-05-03 13:05:12 -060078static const struct vw_entries tgl_community4_vw[] = {
79 {GPP_F0, GPP_F23},
80 {GPP_C0, GPP_C23},
81 {GPP_E0, GPP_E23},
82};
83
Subrata Banik91e89c52019-11-01 18:30:01 +053084static const struct pad_group tgl_community5_groups[] = {
Shaunak Saha56e3df42020-03-24 00:24:59 -070085 INTEL_GPP_BASE(GPP_R0, GPP_R0, GPP_R7, 352), /* GPP_R */
Shaunak Sahae8338da2020-01-15 11:43:19 -080086 INTEL_GPP(GPP_R0, GPP_SPI_IO_2, GPP_CLK_LOOPBK), /* GPP_SPI */
Subrata Banik91e89c52019-11-01 18:30:01 +053087};
88
Shaunak Sahae8338da2020-01-15 11:43:19 -080089static const struct pad_community tgl_communities[] = {
90 [COMM_0] = { /* GPP B, T, A */
Subrata Banik91e89c52019-11-01 18:30:01 +053091 .port = PID_GPIOCOM0,
Tim Wawrzynczaka1372012021-04-21 13:52:50 -060092 .cpu_port = PID_CPU_GPIOCOM0,
Shaunak Sahae8338da2020-01-15 11:43:19 -080093 .first_pad = GPP_B0,
94 .last_pad = GPP_A24,
Subrata Banik91e89c52019-11-01 18:30:01 +053095 .num_gpi_regs = NUM_GPIO_COM0_GPI_REGS,
96 .pad_cfg_base = PAD_CFG_BASE,
97 .host_own_reg_0 = HOSTSW_OWN_REG_0,
98 .gpi_int_sts_reg_0 = GPI_INT_STS_0,
99 .gpi_int_en_reg_0 = GPI_INT_EN_0,
100 .gpi_smi_sts_reg_0 = GPI_SMI_STS_0,
101 .gpi_smi_en_reg_0 = GPI_SMI_EN_0,
102 .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
Shaunak Sahae8338da2020-01-15 11:43:19 -0800103 .name = "GPP_BTA",
Subrata Banik91e89c52019-11-01 18:30:01 +0530104 .acpi_path = "\\_SB.PCI0.GPIO",
Shaunak Sahae8338da2020-01-15 11:43:19 -0800105 .reset_map = rst_map,
106 .num_reset_vals = ARRAY_SIZE(rst_map),
Subrata Banik91e89c52019-11-01 18:30:01 +0530107 .groups = tgl_community0_groups,
108 .num_groups = ARRAY_SIZE(tgl_community0_groups),
Tim Wawrzynczak8d3cc1b2021-05-03 13:05:12 -0600109 .vw_base = DEFAULT_VW_BASE,
110 .vw_entries = tgl_community0_vw,
111 .num_vw_entries = ARRAY_SIZE(tgl_community0_vw),
Subrata Banik91e89c52019-11-01 18:30:01 +0530112 },
Shaunak Sahae8338da2020-01-15 11:43:19 -0800113 [COMM_1] = { /* GPP S, D, H, U, VGPIO */
Subrata Banik91e89c52019-11-01 18:30:01 +0530114 .port = PID_GPIOCOM1,
Tim Wawrzynczaka1372012021-04-21 13:52:50 -0600115 .cpu_port = PID_CPU_GPIOCOM1,
Shaunak Sahae8338da2020-01-15 11:43:19 -0800116 .first_pad = GPP_S0,
117 .last_pad = vI2S2_RXD,
Subrata Banik91e89c52019-11-01 18:30:01 +0530118 .num_gpi_regs = NUM_GPIO_COM1_GPI_REGS,
119 .pad_cfg_base = PAD_CFG_BASE,
120 .host_own_reg_0 = HOSTSW_OWN_REG_0,
121 .gpi_int_sts_reg_0 = GPI_INT_STS_0,
122 .gpi_int_en_reg_0 = GPI_INT_EN_0,
123 .gpi_smi_sts_reg_0 = GPI_SMI_STS_0,
124 .gpi_smi_en_reg_0 = GPI_SMI_EN_0,
125 .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
Shaunak Sahae8338da2020-01-15 11:43:19 -0800126 .name = "GPP_SDHU",
Subrata Banik91e89c52019-11-01 18:30:01 +0530127 .acpi_path = "\\_SB.PCI0.GPIO",
128 .reset_map = rst_map,
129 .num_reset_vals = ARRAY_SIZE(rst_map),
130 .groups = tgl_community1_groups,
131 .num_groups = ARRAY_SIZE(tgl_community1_groups),
Tim Wawrzynczak8d3cc1b2021-05-03 13:05:12 -0600132 .vw_base = DEFAULT_VW_BASE,
133 .vw_entries = tgl_community1_vw,
134 .num_vw_entries = ARRAY_SIZE(tgl_community1_vw),
Subrata Banik91e89c52019-11-01 18:30:01 +0530135 },
Shaunak Sahae8338da2020-01-15 11:43:19 -0800136 [COMM_2] = { /* GPD */
Subrata Banik91e89c52019-11-01 18:30:01 +0530137 .port = PID_GPIOCOM2,
138 .first_pad = GPD0,
Shaunak Sahae8338da2020-01-15 11:43:19 -0800139 .last_pad = GPD_DRAM_RESETB,
Subrata Banik91e89c52019-11-01 18:30:01 +0530140 .num_gpi_regs = NUM_GPIO_COM2_GPI_REGS,
141 .pad_cfg_base = PAD_CFG_BASE,
142 .host_own_reg_0 = HOSTSW_OWN_REG_0,
143 .gpi_int_sts_reg_0 = GPI_INT_STS_0,
144 .gpi_int_en_reg_0 = GPI_INT_EN_0,
145 .gpi_smi_sts_reg_0 = GPI_SMI_STS_0,
146 .gpi_smi_en_reg_0 = GPI_SMI_EN_0,
147 .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
148 .name = "GPD",
149 .acpi_path = "\\_SB.PCI0.GPIO",
Shaunak Sahae8338da2020-01-15 11:43:19 -0800150 .reset_map = rst_map_com2,
151 .num_reset_vals = ARRAY_SIZE(rst_map_com2),
Subrata Banik91e89c52019-11-01 18:30:01 +0530152 .groups = tgl_community2_groups,
153 .num_groups = ARRAY_SIZE(tgl_community2_groups),
154 },
Shaunak Sahae8338da2020-01-15 11:43:19 -0800155 [COMM_4] = { /* GPP F, C, HVCOS, E, JTAG */
Subrata Banik91e89c52019-11-01 18:30:01 +0530156 .port = PID_GPIOCOM4,
Tim Wawrzynczaka1372012021-04-21 13:52:50 -0600157 .cpu_port = PID_CPU_GPIOCOM4,
Subrata Banik91e89c52019-11-01 18:30:01 +0530158 .first_pad = GPP_C0,
Shaunak Sahae8338da2020-01-15 11:43:19 -0800159 .last_pad = GPP_DBG_PMODE,
Subrata Banik91e89c52019-11-01 18:30:01 +0530160 .num_gpi_regs = NUM_GPIO_COM4_GPI_REGS,
161 .pad_cfg_base = PAD_CFG_BASE,
162 .host_own_reg_0 = HOSTSW_OWN_REG_0,
163 .gpi_int_sts_reg_0 = GPI_INT_STS_0,
164 .gpi_int_en_reg_0 = GPI_INT_EN_0,
165 .gpi_smi_sts_reg_0 = GPI_SMI_STS_0,
166 .gpi_smi_en_reg_0 = GPI_SMI_EN_0,
167 .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
Shaunak Sahae8338da2020-01-15 11:43:19 -0800168 .name = "GPP_FCE",
Subrata Banik91e89c52019-11-01 18:30:01 +0530169 .acpi_path = "\\_SB.PCI0.GPIO",
170 .reset_map = rst_map,
171 .num_reset_vals = ARRAY_SIZE(rst_map),
172 .groups = tgl_community4_groups,
173 .num_groups = ARRAY_SIZE(tgl_community4_groups),
Tim Wawrzynczak8d3cc1b2021-05-03 13:05:12 -0600174 .vw_base = DEFAULT_VW_BASE,
175 .vw_entries = tgl_community4_vw,
176 .num_vw_entries = ARRAY_SIZE(tgl_community4_vw),
Subrata Banik91e89c52019-11-01 18:30:01 +0530177 },
Shaunak Sahae8338da2020-01-15 11:43:19 -0800178 [COMM_5] = { /* GPP R, SPI */
Subrata Banik91e89c52019-11-01 18:30:01 +0530179 .port = PID_GPIOCOM5,
Tim Wawrzynczaka1372012021-04-21 13:52:50 -0600180 .cpu_port = PID_CPU_GPIOCOM5,
Subrata Banik91e89c52019-11-01 18:30:01 +0530181 .first_pad = GPP_R0,
Shaunak Sahae8338da2020-01-15 11:43:19 -0800182 .last_pad = GPP_CLK_LOOPBK,
Subrata Banik91e89c52019-11-01 18:30:01 +0530183 .num_gpi_regs = NUM_GPIO_COM5_GPI_REGS,
184 .pad_cfg_base = PAD_CFG_BASE,
185 .host_own_reg_0 = HOSTSW_OWN_REG_0,
186 .gpi_int_sts_reg_0 = GPI_INT_STS_0,
187 .gpi_int_en_reg_0 = GPI_INT_EN_0,
188 .gpi_smi_sts_reg_0 = GPI_SMI_STS_0,
189 .gpi_smi_en_reg_0 = GPI_SMI_EN_0,
190 .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
Shaunak Sahae8338da2020-01-15 11:43:19 -0800191 .name = "GPP_CPU_VBPIO",
Subrata Banik91e89c52019-11-01 18:30:01 +0530192 .acpi_path = "\\_SB.PCI0.GPIO",
193 .reset_map = rst_map,
194 .num_reset_vals = ARRAY_SIZE(rst_map),
195 .groups = tgl_community5_groups,
196 .num_groups = ARRAY_SIZE(tgl_community5_groups),
197 }
198};
199
200const struct pad_community *soc_gpio_get_community(size_t *num_communities)
201{
202 *num_communities = ARRAY_SIZE(tgl_communities);
203 return tgl_communities;
204}
205
206const struct pmc_to_gpio_route *soc_pmc_gpio_routes(size_t *num)
207{
208 static const struct pmc_to_gpio_route routes[] = {
Subrata Banik91e89c52019-11-01 18:30:01 +0530209 { PMC_GPP_B, GPP_B },
Ravi Sarawadi9d678f22019-12-17 00:07:33 -0800210 { PMC_GPP_T, GPP_T },
Subrata Banik91e89c52019-11-01 18:30:01 +0530211 { PMC_GPP_A, GPP_A },
Ravi Sarawadi9d678f22019-12-17 00:07:33 -0800212 { PMC_GPP_R, GPP_R },
213 { PMC_GPD, GPD },
214 { PMC_GPP_S, GPP_S },
Subrata Banik91e89c52019-11-01 18:30:01 +0530215 { PMC_GPP_H, GPP_H },
216 { PMC_GPP_D, GPP_D },
Ravi Sarawadi9d678f22019-12-17 00:07:33 -0800217 { PMC_GPP_U, GPP_U },
Subrata Banik91e89c52019-11-01 18:30:01 +0530218 { PMC_GPP_F, GPP_F },
Subrata Banik91e89c52019-11-01 18:30:01 +0530219 { PMC_GPP_C, GPP_C },
220 { PMC_GPP_E, GPP_E },
Subrata Banik91e89c52019-11-01 18:30:01 +0530221 };
222 *num = ARRAY_SIZE(routes);
223 return routes;
224}