1/* SPDX-License-Identifier: GPL-2.0-only */ 2 3#include <gpio.h> 4#include <soc/intel/common/acpi/gpio.asl> 5#include <soc/intel/common/block/acpi/acpi/gpio_op.asl> 6#include <soc/irq.h> 7#include <soc/pcr_ids.h> 8 9Device (GPIO) 10{ 11 Name (_HID, CROS_GPIO_NAME) 12 Name (_UID, 0) 13 Name (_DDN, "GPIO Controller") 14 15 Name (RBUF, ResourceTemplate() 16 { 17 Memory32Fixed (ReadWrite, 0, 0, COM0) 18 Memory32Fixed (ReadWrite, 0, 0, COM1) 19 Memory32Fixed (ReadWrite, 0, 0, COM2) 20 Memory32Fixed (ReadWrite, 0, 0, COM3) 21 Memory32Fixed (ReadWrite, 0, 0, COM4) 22 Memory32Fixed (ReadWrite, 0, 0, COM5) 23 Interrupt (ResourceConsumer, Level, ActiveLow, Shared,,, GIRQ) 24 { GPIO_IRQ14 } 25 }) 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 2 */ 42 CreateDWordField (^RBUF, ^COM2._BAS, BAS2) 43 CreateDWordField (^RBUF, ^COM2._LEN, LEN2) 44 BAS2 = ^^PCRB (PID_GPIOCOM2) 45 LEN2 = GPIO_BASE_SIZE 46 47 /* GPIO Community 3 */ 48 CreateDWordField (^RBUF, ^COM3._BAS, BAS3) 49 CreateDWordField (^RBUF, ^COM3._LEN, LEN3) 50 BAS3 = ^^PCRB (PID_GPIOCOM3) 51 LEN3 = GPIO_BASE_SIZE 52 53 /* GPIO Community 4 */ 54 CreateDWordField (^RBUF, ^COM4._BAS, BAS4) 55 CreateDWordField (^RBUF, ^COM4._LEN, LEN4) 56 BAS4 = ^^PCRB (PID_GPIOCOM4) 57 LEN4 = GPIO_BASE_SIZE 58 59 /* GPIO Community 5 */ 60 CreateDWordField (^RBUF, ^COM5._BAS, BAS5) 61 CreateDWordField (^RBUF, ^COM5._LEN, LEN5) 62 BAS5 = ^^PCRB (PID_GPIOCOM5) 63 LEN5 = GPIO_BASE_SIZE 64 65 Return (RBUF) 66 } 67 68 Method (_STA, 0, NotSerialized) 69 { 70 Return (0xF) 71 } 72} 73/* 74 * Get GPIO DW0 Address 75 * Arg0 - GPIO Number 76 */ 77Method (GADD, 1, NotSerialized) 78{ 79 /* GPIO Community 0 */ 80 If (Arg0 >= GPIO_COM0_START && Arg0 <= GPIO_COM0_END) 81 { 82 Local0 = PID_GPIOCOM0 83 Local1 = Arg0 - GPIO_COM0_START 84 } 85 /* GPIO Community 1 */ 86 If (Arg0 >= GPIO_COM1_START && Arg0 <= GPIO_COM1_END) 87 { 88 Local0 = PID_GPIOCOM1 89 Local1 = Arg0 - GPIO_COM1_START 90 } 91 /* GPIO Community 2 */ 92 If (Arg0 >= GPIO_COM2_START && Arg0 <= GPIO_COM2_END) 93 { 94 Local0 = PID_GPIOCOM2 95 Local1 = Arg0 - GPIO_COM2_START 96 } 97 /* GPIO Community 3 */ 98 If (Arg0 >= GPIO_COM3_START && Arg0 <= GPIO_COM3_END) 99 { 100 Local0 = PID_GPIOCOM3 101 Local1 = Arg0 - GPIO_COM3_START 102 } 103 /* GPIO Community 4 */ 104 If (Arg0 >= GPIO_COM4_START && Arg0 <= GPIO_COM4_END) 105 { 106 Local0 = PID_GPIOCOM4 107 Local1 = Arg0 - GPIO_COM4_START 108 } 109 /* GPIO Community 5 */ 110 If (Arg0 >= GPIO_COM5_START && Arg0 <= GPIO_COM5_END) 111 { 112 Local0 = PID_GPIOCOM5 113 Local1 = Arg0 - GPIO_COM5_START 114 } 115 116 Local2 = PCRB(Local0) + PAD_CFG_BASE + (Local1 * 16) 117 Return (Local2) 118} 119 120/* 121 * Return PCR Port ID of GPIO Communities 122 * 123 * Arg0: GPIO Community (0-5) 124 */ 125Method (GPID, 1, Serialized) 126{ 127 Switch (ToInteger (Arg0)) 128 { 129 Case (COMM_0) { 130 Local0 = PID_GPIOCOM0 131 } 132 Case (COMM_1) { 133 Local0 = PID_GPIOCOM1 134 } 135 Case (COMM_2) { 136 Local0 = PID_GPIOCOM2 137 } 138 Case (COMM_3) { 139 Local0 = PID_GPIOCOM3 140 } 141 Case (COMM_4) { 142 Local0 = PID_GPIOCOM4 143 } 144 Case (COMM_5) { 145 Local0 = PID_GPIOCOM5 146 } 147 Default { 148 Return (0) 149 } 150 } 151 152 Return (Local0) 153} 154