blob: 7c76962d98d03cddfb60c3294abda7ec65f8955b [file] [log] [blame]
Angel Ponsf5627e82020-04-05 15:46:52 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Bora Guvendik5d11cc92017-09-25 14:33:17 -07002#include <soc/gpio_defs.h>
Subrata Banik8ff80b22020-09-23 19:17:12 +05303#include <soc/intel/common/block/acpi/acpi/gpio_op.asl>
Bora Guvendik5d11cc92017-09-25 14:33:17 -07004#include <soc/irq.h>
5#include <soc/pcr_ids.h>
Tim Wawrzynczaka1724252019-07-10 09:12:05 -06006#include <intelblocks/gpio.h>
Bora Guvendik5d11cc92017-09-25 14:33:17 -07007
8Device (GPIO)
9{
10 Name (_HID, "INT34BB")
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 Memory32Fixed (ReadWrite, 0, 0, COM4)
19 Interrupt (ResourceConsumer, Level, ActiveLow, Shared,,, GIRQ)
20 { GPIO_IRQ14 }
21 })
22
Duncan Laurief63c3f62018-12-08 11:58:32 -080023 /*
24 * GPIO communities 0, 1, and 4 are exported for the OS.
25 * This is based on the Linux kernel provided community map at
26 * drivers/pinctrl/intel/pinctrl-cannonlake.c:cnllp_communities[]
27 */
Bora Guvendik5d11cc92017-09-25 14:33:17 -070028 Method (_CRS, 0, NotSerialized)
29 {
30 /* GPIO Community 0 */
31 CreateDWordField (^RBUF, ^COM0._BAS, BAS0)
Bora Guvendik630b6442017-10-11 17:54:58 -070032 CreateDWordField (^RBUF, ^COM0._LEN, LEN0)
Felix Singer3dc4d842022-12-12 07:36:41 +010033 BAS0 = ^^PCRB (PID_GPIOCOM0)
34 LEN0 = GPIO_BASE_SIZE
Bora Guvendik5d11cc92017-09-25 14:33:17 -070035
36 /* GPIO Community 1 */
37 CreateDWordField (^RBUF, ^COM1._BAS, BAS1)
Bora Guvendik630b6442017-10-11 17:54:58 -070038 CreateDWordField (^RBUF, ^COM1._LEN, LEN1)
Felix Singer3dc4d842022-12-12 07:36:41 +010039 BAS1 = ^^PCRB (PID_GPIOCOM1)
40 LEN1 = GPIO_BASE_SIZE
Bora Guvendik5d11cc92017-09-25 14:33:17 -070041
42 /* GPIO Community 4 */
43 CreateDWordField (^RBUF, ^COM4._BAS, BAS4)
Lijian Zhaoe1b82212018-02-08 16:58:47 -080044 CreateDWordField (^RBUF, ^COM4._LEN, LEN4)
Felix Singer3dc4d842022-12-12 07:36:41 +010045 BAS4 = ^^PCRB (PID_GPIOCOM4)
46 LEN4 = GPIO_BASE_SIZE
Bora Guvendik5d11cc92017-09-25 14:33:17 -070047
48 Return (RBUF)
49 }
50
51 Method (_STA, 0, NotSerialized)
52 {
53 Return (0xF)
54 }
55}
56
57/*
58 * Get GPIO DW0 Address
59 * Arg0 - GPIO Number
60 */
61Method (GADD, 1, NotSerialized)
62{
63 /* GPIO Community 0 */
Felix Singerb1557e82022-01-02 03:51:21 +010064 If (Arg0 >= GPP_A0 && Arg0 <= SPI0_CLK_LOOPBK)
Bora Guvendik5d11cc92017-09-25 14:33:17 -070065 {
Felix Singer3dc4d842022-12-12 07:36:41 +010066 Local0 = PID_GPIOCOM0
Felix Singera6fe3f82021-12-29 23:29:18 +010067 Local1 = Arg0 - GPP_A0
Bora Guvendik5d11cc92017-09-25 14:33:17 -070068 }
69 /* GPIO Community 1 */
Felix Singerb1557e82022-01-02 03:51:21 +010070 If (Arg0 >= GPP_D0 && Arg0 <= vSD3_CD_B)
Bora Guvendik5d11cc92017-09-25 14:33:17 -070071 {
Felix Singer3dc4d842022-12-12 07:36:41 +010072 Local0 = PID_GPIOCOM1
Felix Singera6fe3f82021-12-29 23:29:18 +010073 Local1 = Arg0 - GPP_D0
Bora Guvendik5d11cc92017-09-25 14:33:17 -070074 }
Lijian Zhaoe1b82212018-02-08 16:58:47 -080075 /* GPIO Community 2 */
Felix Singerb1557e82022-01-02 03:51:21 +010076 If (Arg0 >= GPD0 && Arg0 <= DRAM_RESET_B)
Lijian Zhaoe1b82212018-02-08 16:58:47 -080077 {
Felix Singer3dc4d842022-12-12 07:36:41 +010078 Local0 = PID_GPIOCOM2
Felix Singera6fe3f82021-12-29 23:29:18 +010079 Local1 = Arg0 - GPD0
Lijian Zhaoe1b82212018-02-08 16:58:47 -080080 }
81 /* GPIO Community 3 */
Felix Singerb1557e82022-01-02 03:51:21 +010082 If (Arg0 >= HDA_BCLK && Arg0 <= TRIGGER_OUT)
Lijian Zhaoe1b82212018-02-08 16:58:47 -080083 {
Felix Singer3dc4d842022-12-12 07:36:41 +010084 Local0 = PID_GPIOCOM3
Felix Singera6fe3f82021-12-29 23:29:18 +010085 Local1 = Arg0 - HDA_BCLK
Lijian Zhaoe1b82212018-02-08 16:58:47 -080086 }
Michael Niewöhner1c2b1b92020-09-09 21:34:05 +020087 /* GPIO Community 4*/
Felix Singerb1557e82022-01-02 03:51:21 +010088 If (Arg0 >= GPP_C0 && Arg0 <= CL_RST_B)
Bora Guvendik5d11cc92017-09-25 14:33:17 -070089 {
Felix Singer3dc4d842022-12-12 07:36:41 +010090 Local0 = PID_GPIOCOM4
Felix Singera6fe3f82021-12-29 23:29:18 +010091 Local1 = Arg0 - GPP_C0
Bora Guvendik5d11cc92017-09-25 14:33:17 -070092 }
Felix Singer3dc4d842022-12-12 07:36:41 +010093 Local2 = PCRB (Local0)
Felix Singer3a8f0872021-12-30 01:27:07 +010094 Local2 += PAD_CFG_BASE
Felix Singer3d3d4982021-12-31 11:52:19 +010095 Return (Local2 + Local1 * 16)
Bora Guvendik5d11cc92017-09-25 14:33:17 -070096}
Tim Wawrzynczaka1724252019-07-10 09:12:05 -060097
98/*
99 * Return PCR Port ID of GPIO Communities
100 *
101 * Arg0: GPIO Community (0-4)
102 */
103Method (GPID, 1, Serialized)
104{
105 Switch (ToInteger (Arg0))
106 {
107 Case (0) {
Felix Singer3dc4d842022-12-12 07:36:41 +0100108 Local0 = PID_GPIOCOM0
Tim Wawrzynczaka1724252019-07-10 09:12:05 -0600109 }
110 Case (1) {
Felix Singer3dc4d842022-12-12 07:36:41 +0100111 Local0 = PID_GPIOCOM1
Tim Wawrzynczaka1724252019-07-10 09:12:05 -0600112 }
113 Case (2) {
Felix Singer3dc4d842022-12-12 07:36:41 +0100114 Local0 = PID_GPIOCOM2
Tim Wawrzynczaka1724252019-07-10 09:12:05 -0600115 }
116 Case (3) {
Felix Singer3dc4d842022-12-12 07:36:41 +0100117 Local0 = PID_GPIOCOM3
Tim Wawrzynczaka1724252019-07-10 09:12:05 -0600118 }
119 Case (4) {
Felix Singer3dc4d842022-12-12 07:36:41 +0100120 Local0 = PID_GPIOCOM4
Tim Wawrzynczaka1724252019-07-10 09:12:05 -0600121 }
122 Default {
123 Return (0)
124 }
125 }
126
127 Return (Local0)
128}
129
130/*
131 * Configure GPIO Power Management bits
132 *
133 * Arg0: GPIO community (0-4)
134 * Arg1: PM bits in MISCCFG
135 */
136Method (CGPM, 2, Serialized)
137{
Felix Singer3dc4d842022-12-12 07:36:41 +0100138 Local0 = GPID (Arg0)
Felix Singer07677472022-01-02 02:55:22 +0100139 If (Local0 != 0) {
Tim Wawrzynczaka1724252019-07-10 09:12:05 -0600140 /* Mask off current PM bits */
Felix Singerc87c1ab2022-12-25 16:25:06 +0100141 PCRA (Local0, GPIO_MISCCFG, ~MISCCFG_GPIO_PM_CONFIG_BITS)
Tim Wawrzynczaka1724252019-07-10 09:12:05 -0600142 /* Mask in requested bits */
Felix Singerd2527762022-12-16 07:54:16 +0100143 PCRO (Local0, GPIO_MISCCFG, Arg1 & MISCCFG_GPIO_PM_CONFIG_BITS)
Tim Wawrzynczaka1724252019-07-10 09:12:05 -0600144 }
145}
Eric Lai086f0fa2019-12-13 12:31:46 +0800146
147/* GPIO Power Management bits */
Subrata Banik2883f7a2020-01-13 10:56:58 +0530148Name(GPMB, Package(TOTAL_GPIO_COMM) {0, 0, 0, 0, 0})
Eric Lai086f0fa2019-12-13 12:31:46 +0800149
150/*
151 * Save GPIO Power Management bits
152 */
153Method (SGPM, 0, Serialized)
154{
155 For (Local0 = 0, Local0 < TOTAL_GPIO_COMM, Local0++)
156 {
157 Local1 = GPID (Local0)
158 GPMB[Local0] = PCRR (Local1, GPIO_MISCCFG)
159 }
160}
161
162/*
163 * Restore GPIO Power Management bits
164 */
165Method (RGPM, 0, Serialized)
166{
167 For (Local0 = 0, Local0 < TOTAL_GPIO_COMM, Local0++)
168 {
169 CGPM (Local0, DerefOf(GPMB[Local0]))
170 }
171}
172
173/*
174 * Save current setting of GPIO Power Management bits and
175 * enable all Power Management bits for all communities
176 */
177Method (EGPM, 0, Serialized)
178{
179 /* Save current setting and will restore it when resuming */
180 SGPM ()
181 /* Enable PM bits */
182 For (Local0 = 0, Local0 < TOTAL_GPIO_COMM, Local0++)
183 {
Subrata Banik2ccc0a42021-03-25 20:01:47 +0530184 CGPM (Local0, MISCCFG_GPIO_PM_CONFIG_BITS)
Eric Lai086f0fa2019-12-13 12:31:46 +0800185 }
186}