1/* SPDX-License-Identifier: GPL-2.0-only */ 2#include <gpio.h> 3#include <soc/intel/common/acpi/gpio.asl> 4#include <soc/intel/common/block/acpi/acpi/gpio_op.asl> 5#include <soc/irq.h> 6#include <soc/pcr_ids.h> 7 8Device (GPIO) 9{ 10 Name (_HID, CROS_GPIO_NAME) 11 Name (_UID, 0) 12 Name (_DDN, "GPIO Controller") 13 14 Name (RBUF, ResourceTemplate() 15 { 16 Memory32Fixed (ReadWrite, 0, 0, COM0) 17 Memory32Fixed (ReadWrite, 0, 0, COM1) 18#if CONFIG(SOC_INTEL_ALDERLAKE_PCH_S) 19 Memory32Fixed (ReadWrite, 0, 0, COM3) 20#endif 21 Memory32Fixed (ReadWrite, 0, 0, COM4) 22 Memory32Fixed (ReadWrite, 0, 0, COM5) 23 Interrupt (ResourceConsumer, Level, ActiveLow, Shared,,, GIRQ) 24 { GPIO_IRQ14 } 25 }) 26 Method (_CRS, 0, NotSerialized) 27 { 28 /* GPIO Community 0 */ 29 CreateDWordField (^RBUF, ^COM0._BAS, BAS0) 30 CreateDWordField (^RBUF, ^COM0._LEN, LEN0) 31 BAS0 = ^^PCRB (PID_GPIOCOM0) 32 LEN0 = GPIO_BASE_SIZE 33 34 /* GPIO Community 1 */ 35 CreateDWordField (^RBUF, ^COM1._BAS, BAS1) 36 CreateDWordField (^RBUF, ^COM1._LEN, LEN1) 37 BAS1 = ^^PCRB (PID_GPIOCOM1) 38 LEN1 = GPIO_BASE_SIZE 39 40#if CONFIG(SOC_INTEL_ALDERLAKE_PCH_S) 41 /* GPIO Community 3 */ 42 CreateDWordField (^RBUF, ^COM3._BAS, BAS3) 43 CreateDWordField (^RBUF, ^COM3._LEN, LEN3) 44 BAS3 = ^^PCRB (PID_GPIOCOM3) 45 LEN3 = GPIO_BASE_SIZE 46#endif 47 48 /* GPIO Community 4 */ 49 CreateDWordField (^RBUF, ^COM4._BAS, BAS4) 50 CreateDWordField (^RBUF, ^COM4._LEN, LEN4) 51 BAS4 = ^^PCRB (PID_GPIOCOM4) 52 LEN4 = GPIO_BASE_SIZE 53 54 /* GPIO Community 5 */ 55 CreateDWordField (^RBUF, ^COM5._BAS, BAS5) 56 CreateDWordField (^RBUF, ^COM5._LEN, LEN5) 57 BAS5 = ^^PCRB (PID_GPIOCOM5) 58 LEN5 = GPIO_BASE_SIZE 59 60 Return (RBUF) 61 } 62 63 Method (_STA, 0, NotSerialized) 64 { 65 Return (0xF) 66 } 67} 68 69/* 70 * Get GPIO DW0 Address 71 * Arg0 - GPIO Number 72 */ 73Method (GADD, 1, NotSerialized) 74{ 75 /* GPIO Community 0 */ 76 If (Arg0 >= GPIO_COM0_START && Arg0 <= GPIO_COM0_END) 77 { 78 Local0 = PID_GPIOCOM0 79 Local1 = Arg0 - GPIO_COM0_START 80 } 81 /* GPIO Community 1 */ 82 If (Arg0 >= GPIO_COM1_START && Arg0 <= GPIO_COM1_END) 83 { 84 Local0 = PID_GPIOCOM1 85 Local1 = Arg0 - GPIO_COM1_START 86 } 87 /* GPIO Community 2 */ 88 If (Arg0 >= GPIO_COM2_START && Arg0 <= GPIO_COM2_END) 89 { 90 Local0 = PID_GPIOCOM2 91 Local1 = Arg0 - GPIO_COM2_START 92 } 93 /* GPIO Community 3 */ 94 If (Arg0 >= GPIO_COM3_START && Arg0 <= GPIO_COM3_END) 95 { 96 Local0 = PID_GPIOCOM3 97 Local1 = Arg0 - GPIO_COM3_START 98 } 99 /* GPIO Community 4 */ 100 If (Arg0 >= GPIO_COM4_START && Arg0 <= GPIO_COM4_END) 101 { 102 Local0 = PID_GPIOCOM4 103 Local1 = Arg0 - GPIO_COM4_START 104 } 105 /* GPIO Community 5*/ 106 If (Arg0 >= GPIO_COM5_START && Arg0 <= GPIO_COM5_END) 107 { 108 Local0 = PID_GPIOCOM5 109 Local1 = Arg0 - GPIO_COM5_START 110 } 111 112 Local2 = PCRB(Local0) + PAD_CFG_BASE + (Local1 * 16) 113 Return (Local2) 114} 115 116/* 117 * Return PCR Port ID of GPIO Communities 118 * 119 * Arg0: GPIO Community (0-5) 120 */ 121Method (GPID, 1, Serialized) 122{ 123 Switch (ToInteger (Arg0)) 124 { 125 Case (COMM_0) { 126 Local0 = PID_GPIOCOM0 127 } 128 Case (COMM_1) { 129 Local0 = PID_GPIOCOM1 130 } 131 Case (COMM_2) { 132 Local0 = PID_GPIOCOM2 133 } 134 Case (COMM_3) { 135 Local0 = PID_GPIOCOM3 136 } 137 Case (COMM_4) { 138 Local0 = PID_GPIOCOM4 139 } 140 Case (COMM_5) { 141 Local0 = PID_GPIOCOM5 142 } 143 Default { 144 Return (0) 145 } 146 } 147 148 Return (Local0) 149} 150 151/* GPIO Power Management bits */ 152Name(GPMB, Package(TOTAL_GPIO_COMM) {0, 0, 0, 0, 0, 0}) 153 154/* 155 * Save GPIO Power Management bits 156 */ 157Method (SGPM, 0, Serialized) 158{ 159 For (Local0 = 0, Local0 < TOTAL_GPIO_COMM, Local0++) 160 { 161 Local1 = GPID (Local0) 162 GPMB[Local0] = PCRR (Local1, GPIO_MISCCFG) 163 } 164} 165 166/* 167 * Restore GPIO Power Management bits 168 */ 169Method (RGPM, 0, Serialized) 170{ 171 For (Local0 = 0, Local0 < TOTAL_GPIO_COMM, Local0++) 172 { 173 CGPM (Local0, DerefOf(GPMB[Local0])) 174 } 175} 176 177/* 178 * Save current setting of GPIO Power Management bits and 179 * enable all Power Management bits for all communities 180 */ 181Method (EGPM, 0, Serialized) 182{ 183 /* Save current setting and will restore it when resuming */ 184 SGPM () 185 /* Enable PM bits */ 186 For (Local0 = 0, Local0 < TOTAL_GPIO_COMM, Local0++) 187 { 188 CGPM (Local0, MISCCFG_GPIO_PM_CONFIG_BITS) 189 } 190} 191