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