1 /* SPDX-License-Identifier: GPL-2.0-only */
2 #include <intelblocks/gpio.h>
3 #include <soc/gpio_defs.h>
4 #include <soc/intel/common/acpi/gpio.asl>
5 #include <soc/intel/common/block/acpi/acpi/gpio_op.asl>
7 #include <soc/pcr_ids.h>
11 Name (_HID, CROS_GPIO_NAME)
13 Name (_DDN, "GPIO Controller")
15 Name (RBUF, ResourceTemplate()
17 Memory32Fixed (ReadWrite, 0, 0, COM0)
18 Memory32Fixed (ReadWrite, 0, 0, COM1)
19 Memory32Fixed (ReadWrite, 0, 0, COM4)
20 Memory32Fixed (ReadWrite, 0, 0, COM5)
21 Interrupt (ResourceConsumer, Level, ActiveLow, Shared,,, GIRQ)
24 Method (_CRS, 0, NotSerialized)
26 /* GPIO Community 0 */
27 CreateDWordField (^RBUF, ^COM0._BAS, BAS0)
28 CreateDWordField (^RBUF, ^COM0._LEN, LEN0)
29 BAS0 = ^^PCRB (PID_GPIOCOM0)
32 /* GPIO Community 1 */
33 CreateDWordField (^RBUF, ^COM1._BAS, BAS1)
34 CreateDWordField (^RBUF, ^COM1._LEN, LEN1)
35 BAS1 = ^^PCRB (PID_GPIOCOM1)
38 /* GPIO Community 4 */
39 CreateDWordField (^RBUF, ^COM4._BAS, BAS4)
40 CreateDWordField (^RBUF, ^COM4._LEN, LEN4)
41 BAS4 = ^^PCRB (PID_GPIOCOM4)
44 /* GPIO Community 5 */
45 CreateDWordField (^RBUF, ^COM5._BAS, BAS5)
46 CreateDWordField (^RBUF, ^COM5._LEN, LEN5)
47 BAS5 = ^^PCRB (PID_GPIOCOM5)
53 Method (_STA, 0, NotSerialized)
60 * Get GPIO DW0 Address
63 Method (GADD, 1, NotSerialized)
65 /* GPIO Community 0 */
66 If (Arg0 >= GPIO_COM0_START && Arg0 <= GPIO_COM0_END)
69 Local1 = Arg0 - GPIO_COM0_START
71 /* GPIO Community 1 */
72 If (Arg0 >= GPIO_COM1_START && Arg0 <= GPIO_COM1_END)
75 Local1 = Arg0 - GPIO_COM1_START
77 /* GPIO Community 2 */
78 If (Arg0 >= GPIO_COM2_START && Arg0 <= GPIO_COM2_END)
81 Local1 = Arg0 - GPIO_COM2_START
83 /* GPIO Community 3 */
84 If (Arg0 >= GPIO_COM3_START && Arg0 <= GPIO_COM3_END)
87 Local1 = Arg0 - GPIO_COM3_START
89 /* GPIO Community 4 */
90 If (Arg0 >= GPIO_COM4_START && Arg0 <= GPIO_COM4_END)
93 Local1 = Arg0 - GPIO_COM4_START
96 If (Arg0 >= GPIO_COM5_START && Arg0 <= GPIO_COM5_END)
99 Local1 = Arg0 - GPIO_COM5_START
102 Local2 = PCRB(Local0) + PAD_CFG_BASE + (Local1 * 16)
107 * Return PCR Port ID of GPIO Communities
109 * Arg0: GPIO Community (0-5)
111 Method (GPID, 1, Serialized)
113 Switch (ToInteger (Arg0))
116 Local0 = PID_GPIOCOM0
119 Local0 = PID_GPIOCOM1
122 Local0 = PID_GPIOCOM2
125 Local0 = PID_GPIOCOM3
128 Local0 = PID_GPIOCOM4
131 Local0 = PID_GPIOCOM5
141 /* GPIO Power Management bits */
142 Name(GPMB, Package(TOTAL_GPIO_COMM) {0, 0, 0, 0, 0, 0})
145 * Save GPIO Power Management bits
147 Method (SGPM, 0, Serialized)
149 For (Local0 = 0, Local0 < TOTAL_GPIO_COMM, Local0++)
151 Local1 = GPID (Local0)
152 GPMB[Local0] = PCRR (Local1, GPIO_MISCCFG)
157 * Restore GPIO Power Management bits
159 Method (RGPM, 0, Serialized)
161 For (Local0 = 0, Local0 < TOTAL_GPIO_COMM, Local0++)
163 CGPM (Local0, DerefOf(GPMB[Local0]))
168 * Save current setting of GPIO Power Management bits and
169 * enable all Power Management bits for all communities
171 Method (EGPM, 0, Serialized)
173 /* Save current setting and will restore it when resuming */
176 For (Local0 = 0, Local0 < TOTAL_GPIO_COMM, Local0++)
178 CGPM (Local0, MISCCFG_GPIO_PM_CONFIG_BITS)