blob: 488a0db27816539465777c403d39373209fca1f6 [file] [log] [blame]
Felix Held3f3eca92020-01-23 17:12:32 +01001/* SPDX-License-Identifier: GPL-2.0-only */
Nico Huberae7c9682013-05-23 18:13:23 +02002
3#ifndef SUPERIO_ACPI_PNP_DEFS_ASL
4#define SUPERIO_ACPI_PNP_DEFS_ASL
5
6#define _SUPERIO_ID(name, ldn) name ## ldn
7#define SUPERIO_ID(name, ldn) _SUPERIO_ID(name, ldn)
8
9#define STRINGIFY(x) #x
10#define EXPAND_AND_STRINGIFY(x) STRINGIFY(x)
11#define SUPERIO_UID(name, ldn) \
12 EXPAND_AND_STRINGIFY(SUPERIO_CHIP_NAME-SUPERIO_ID(name, ldn))
13#define SUPERIO_NAME(name) EXPAND_AND_STRINGIFY(SUPERIO_CHIP_NAME name)
14
15/* Some longer identifiers for readability */
16#define PNP_ADDR_REG ADDR
17#define PNP_DATA_REG DATA
18#define PNP_LOGICAL_DEVICE LDN
19#define PNP_DEVICE_ACTIVE ACTR
20#define PNP_IO0_HIGH_BYTE IO0H
21#define PNP_IO0_LOW_BYTE IO0L
22#define PNP_IO1_HIGH_BYTE IO1H
23#define PNP_IO1_LOW_BYTE IO1L
Samuel Hollandeeef6452017-06-03 05:51:10 -050024#define PNP_IO2_HIGH_BYTE IO2H
25#define PNP_IO2_LOW_BYTE IO2L
Nico Huberae7c9682013-05-23 18:13:23 +020026#define PNP_IRQ0 IRQ0
27#define PNP_IRQ1 IRQ1
28#define PNP_DMA0 DMA0
29
Elyes HAOUAS251514d2019-01-23 11:36:44 +010030#define CONF_MODE_MUTEX CMMX
Nico Huberae7c9682013-05-23 18:13:23 +020031#define ENTER_CONFIG_MODE ENCM
32#define EXIT_CONFIG_MODE EXCM
33#define SWITCH_LDN SWLD
34#define PNP_NO_LDN_CHANGE 0xff
35
36/* Values for ACPI's _STA method */
37#define DEVICE_NOT_PRESENT 0x00
38#define DEVICE_PRESENT_ACTIVE 0x0f
39#define DEVICE_PRESENT_INACTIVE 0x0d
40
41
42/* ================== Generic Method bodies ================= */
43
44#define PNP_GENERIC_STA(LDN) \
45 ENTER_CONFIG_MODE (LDN)\
46 If (PNP_DEVICE_ACTIVE) {\
Felix Singerfacf7d02022-12-12 02:34:43 +010047 Local0 = DEVICE_PRESENT_ACTIVE \
Nico Huberae7c9682013-05-23 18:13:23 +020048 }\
49 Else\
50 {\
Felix Singerfacf7d02022-12-12 02:34:43 +010051 Local0 = DEVICE_PRESENT_INACTIVE \
Nico Huberae7c9682013-05-23 18:13:23 +020052 }\
53 EXIT_CONFIG_MODE ()\
54 Return (Local0)\
55
56#define PNP_GENERIC_DIS(LDN) \
57 ENTER_CONFIG_MODE (LDN)\
Felix Singer42efd7f2022-12-26 09:38:45 +010058 PNP_DEVICE_ACTIVE = 0 \
Nico Huberae7c9682013-05-23 18:13:23 +020059 EXIT_CONFIG_MODE ()\
60
61
62/*
63 * Current power state (returns the chip's state)
64 */
65#define PNP_DEFAULT_PSC \
Felix Singerfacf7d02022-12-12 02:34:43 +010066 Local0 = ^^_PSC () \
Nico Huberae7c9682013-05-23 18:13:23 +020067 Return (Local0)
68
69/*
70 * Current power state (returns the chip's state, if it's in
Nico Huber79dfa902020-03-22 01:17:54 +010071 * power saving mode, 3 if this LDN is in power saving mode,
Nico Huberae7c9682013-05-23 18:13:23 +020072 * 0 else)
73 *
74 * PM_REG Identifier of a register which powers down the device
75 * PM_LDN The logical device number to access the PM_REG
76 * bit
77 */
Nico Huberdd94fa92013-07-01 16:29:16 +020078#define PNP_GENERIC_PSC(PM_REG, PM_VAL, PM_LDN) \
Felix Singerfacf7d02022-12-12 02:34:43 +010079 Local0 = ^^_PSC () \
Nico Huberae7c9682013-05-23 18:13:23 +020080 If (Local0) { Return (Local0) }\
81 ENTER_CONFIG_MODE (PM_LDN)\
Felix Singerfacf7d02022-12-12 02:34:43 +010082 Local0 = PM_REG \
Nico Huberae7c9682013-05-23 18:13:23 +020083 EXIT_CONFIG_MODE ()\
Felix Singer8ef8a3e2022-01-02 00:29:41 +010084 If (Local0 == PM_VAL) { Return (3) }\
Nico Huberae7c9682013-05-23 18:13:23 +020085 Else { Return (0) }\
86
87/* Disable power saving mode */
Nico Huberdd94fa92013-07-01 16:29:16 +020088#define PNP_GENERIC_PS0(PM_REG, PM_VAL, PM_LDN) \
Nico Huberae7c9682013-05-23 18:13:23 +020089 ENTER_CONFIG_MODE (PM_LDN)\
Elyes Haouascfdd4882022-12-25 08:14:39 +010090 PM_REG = ~PM_VAL \
Nico Huberae7c9682013-05-23 18:13:23 +020091 EXIT_CONFIG_MODE ()
92
93/* Enable power saving mode */
Nico Huber79dfa902020-03-22 01:17:54 +010094#define PNP_GENERIC_PS3(PM_REG, PM_VAL, PM_LDN) \
Nico Huberae7c9682013-05-23 18:13:23 +020095 ENTER_CONFIG_MODE (PM_LDN)\
Felix Singerfacf7d02022-12-12 02:34:43 +010096 PM_REG = PM_VAL \
Nico Huberae7c9682013-05-23 18:13:23 +020097 EXIT_CONFIG_MODE ()
98
99
100/* ==================== Resource helpers ==================== */
101
102#define PNP_READ_IO(IO_FROM, RESOURCE_TEMPLATE, IO_TAG) \
103 CreateWordField (RESOURCE_TEMPLATE, IO_TAG._MIN, IO_TAG##I)\
104 CreateWordField (RESOURCE_TEMPLATE, IO_TAG._MAX, IO_TAG##A)\
Felix Singer86bc2e72022-12-16 04:40:39 +0100105 Local0 = (IO_FROM##_HIGH_BYTE << 8) | IO_FROM##_LOW_BYTE \
Felix Singerfacf7d02022-12-12 02:34:43 +0100106 IO_TAG##I = Local0 \
107 IO_TAG##A = Local0
Nico Huberae7c9682013-05-23 18:13:23 +0200108
109#define PNP_READ_IRQ(IRQ_FROM, RESOURCE_TEMPLATE, IRQ_TAG) \
110 CreateWordField (RESOURCE_TEMPLATE, IRQ_TAG._INT, IRQ_TAG##W)\
Felix Singerca4b5872022-12-26 08:17:06 +0100111 IRQ_TAG##W = 1 << IRQ_FROM
Nico Huberae7c9682013-05-23 18:13:23 +0200112
113#define PNP_READ_DMA(DMA_FROM, RESOURCE_TEMPLATE, DMA_TAG) \
Keith Hui74d8ed02017-10-16 17:14:25 -0400114 CreateByteField (RESOURCE_TEMPLATE, DMA_TAG._DMA, DMA_TAG##W)\
Felix Singerca4b5872022-12-26 08:17:06 +0100115 DMA_TAG##W = 1 << DMA_FROM
Nico Huberae7c9682013-05-23 18:13:23 +0200116
117#define PNP_WRITE_IO(IO_TO, RESOURCE, IO_TAG) \
118 CreateWordField (RESOURCE, IO_TAG._MIN, IO_TAG##I)\
Felix Singerd2527762022-12-16 07:54:16 +0100119 IO_TO##_LOW_BYTE = IO_TAG##I & 0xff \
Felix Singerfacf7d02022-12-12 02:34:43 +0100120 IO_TO##_HIGH_BYTE = IO_TAG##I >> 8
Nico Huberae7c9682013-05-23 18:13:23 +0200121
122#define PNP_WRITE_IRQ(IRQ_TO, RESOURCE, IRQ_TAG) \
123 CreateWordField (RESOURCE, IRQ_TAG._INT, IRQ_TAG##W)\
Felix Singerbf1de402022-12-12 01:18:31 +0100124 IRQ_TO = FindSetLeftBit (IRQ_TAG##W) - 1
Nico Huberae7c9682013-05-23 18:13:23 +0200125
126#define PNP_WRITE_DMA(DMA_TO, RESOURCE, DMA_TAG) \
Keith Hui74d8ed02017-10-16 17:14:25 -0400127 CreateByteField (RESOURCE, DMA_TAG._DMA, DMA_TAG##W)\
Felix Singerbf1de402022-12-12 01:18:31 +0100128 DMA_TO = FindSetLeftBit (DMA_TAG##W) - 1
Nico Huberae7c9682013-05-23 18:13:23 +0200129
130#endif